8.1/10 (275,300 votes), - Metascore
Released: 17 Oct 2017 Box Office: $123,456,789 Genre: Adventure, Comedy, Drama Awards:
Rated: PG-13, Runtime: 144 min Actors: Matt Damon, Jessica Chastain, Kristen Wiig, Jeff Daniels Director: Ridley Scott Plot: During a manned mission to Mars, Astronaut Mark Watney is presumed dead after a fierce storm and left behind by his crew. But Watney has survived and finds himself stranded and alone on the hostile planet. With only meager supplies, he must draw upon his ingenuity, wit and spirit to subsist and find a way to signal to Earth that he is alive.
`);
previewNode.querySelector('.preview--poster--img').onclick = (e) => {
e.preventDefault();
const poster = e.currentTarget.src;
if (poster === posterPlaceholder || !poster.startsWidth('http')) return;
window.open(poster, '', 'width=600, height=600');
};
previewNode.querySelector('.preview--info--trailer').onclick = (e) => {
e.preventDefault();
window.open(e.currentTarget.getAttribute('data-trailer-url'), '', 'width=900, height=500');
};
previewNode.show = () => {
previewNode.classList.add('visible');
clearTimeout(previewNode.hiding);
};
previewNode.hide = () => {
previewNode.hiding = setTimeout(
() => previewNode.classList.remove('visible'),
1500
);
};
previewNode.onmouseover = previewNode.show;
previewNode.onmouseout = () => {
previewNode.hide();
};
previewNode.setMovie = movie => {
previewNode.querySelector('.preview--info--title > a').setAttribute('href', `http://www.imdb.com/title/${movie.imdbID}`);
previewNode.querySelector('.preview--info--title .title').textContent = movie.Title;
previewNode.querySelector('.preview--info--title .year').textContent = movie.Year;
const imageNode = previewNode.querySelector('.preview--poster--img');
if (!movie.Poster) previewNode.classList.add('no-poster'); else previewNode.classList.remove('no-poster');
imageNode.src = movie.Poster || posterPlaceholder;
imageNode.onerror = (e) => {
if (!imageNode.src.startsWith('http')) return;
GM_xmlhttpRequest({
url: imageNode.src,
method: 'GET',
responseType: 'blob',
onload: (data) => {
const reader = new FileReader();
reader.onloadend = () => (imageNode.src = reader.result);
reader.readAsDataURL(data.response);
}
});
};
if (!movie.Trailer) previewNode.classList.add('no-trailer'); else previewNode.classList.remove('no-trailer');
previewNode.querySelector('.preview--info--trailer').dataset.trailerUrl = movie.Trailer || '';
previewNode.querySelector('.preview--info--imdb-rating').textContent = movie.imdbRating;
previewNode.querySelector('.preview--info--imdb-votes').textContent = movie.imdbVotes;
previewNode.querySelector('.preview--info--imdb-metascore').textContent = movie.Metascore;
previewNode.querySelector('.preview--info--released').innerHTML = movie.Released;
previewNode.querySelector('.preview--info--boxofficegross').innerHTML = movie.BoxOffice || 'N/A';
previewNode.querySelector('.preview--info--genre').textContent = movie.Genre;
previewNode.querySelector('.preview--info--mpaa-rating').textContent = movie.Rated;
previewNode.querySelector('.preview--info--runtime').textContent = movie.Runtime;
previewNode.querySelector('.preview--info--awards').innerHTML = movie.Awards
.replace('Oscars.', 'Oscars.')
.replace('Oscar.', 'Oscar.')
.replace('Another ', ' Another ');
previewNode.querySelector('.preview--info--actors').textContent = movie.Actors;
previewNode.querySelector('.preview--info--director').textContent = movie.Director;
previewNode.querySelector('.preview--info--plot').textContent = movie.Plot;
};
const getMovieHashFromTitleAndYear = (title, year = '') => {
return `${title}_${year}`.trim().replace(/[^a-zA-Z0-9]+/g, '-');
};
const getMovieTitleAndYearFromLinkNode = (linkNode) => {
const linkText = linkNode.textContent;
const linkHref = linkNode.getAttribute('href');
const boxofficemojo = /^\/movies\/\?id=(.+)\.htm/i.exec(linkHref);
let title = linkText.toLowerCase().replace(',', ' ').replace('.', ' ').replace('(', ' ').replace('1080p', '').replace('720p', '');
let year = '';
if (boxofficemojo) {
title = linkText.toLowerCase();
if (!year) {
year = /\(([0-9]{4}).*\)/.exec(title);
if (year) { // year from link text (if available)
title = title.replace(year[0], ' ').trim();
year = year[1];
} else {
year = /([0-9]{4})\.htm$/.exec(linkHref);
if (year) { // year from link href (if available)
year = year[1];
// } else { // year from GET parameter (if available)
// year = $.urlParam('yr');
// if (!year) { // year is current year
// //year = '-';
// year = (new Date()).getFullYear();
// }
}
}
}
return { title, year };
} else {
const reM = /[0-9]{4}/i;
const reS = /S[0-9]{2}E[0-9]{2}|[0-9]{1}x[0-9]{2}/i;
const matchYear = reM.exec(title);
const matchSeries = reS.exec(title);
if (matchYear >= 1900) {
year = matchYear;
title = title.substr(0, title.search(reM)).trim();
return { title, year };
} else if (matchSeries) {
year = '-';
title = title.substr(0, title.search(reS)).trim();
return { title, year };
}
}
return { title: null, year: null };
};
const storage = localStorage.getItem('movie_preview');
const fetchSafe = (url) => {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
url,
method: 'GET',
onload: (data) => {
resolve(data.responseText);
},
onerror: reject
});
});
};
const loadMovie = (title, year) => {
const url = `https://www.omdbapi.com/?apikey=c989d08d&t=${title}&y=${year}&plot=full&r=json`;
// const url = 'http://www.imdb.com/xml/find?json=1&nr=1&tt=on&q=' + encodeURIComponent(title + ' (' + year + ')');
return fetchSafe(url)
.then(responseText => JSON.parse(responseText))
.then(movieResolvedData => {
return movieResolvedData;
});
};
const updateLinkNodesWithMovieData = (nodes, resolvedMovieData) => {
for (let linkNode of nodes) {
if (resolvedMovieData.Error) continue;
linkNode.onmouseover = () => {
previewNode.setMovie(resolvedMovieData);
previewNode.show();
};
linkNode.onmouseout = () => {
previewNode.hide();
};
const enhancementNode = linkNode.parentNode.querySelector('.movie-preview-enhancement');
enhancementNode.classList.remove('loading');
const awards_text = resolvedMovieData.Awards.toLowerCase(); //awards_text = awards_text ? awards_text : 'N/A';
const el_tip = `${resolvedMovieData.imdbVotes} votes - ${resolvedMovieData.Runtime} - Rated ${resolvedMovieData.Rated} - Awards: ${awards_text}`;
let star = '';
const reg_wins = /([0-9]+) win(s|)/;
const reg_noms = /([0-9]+) nomination(s|)/;
const reg_wins_sig = /Won ([0-9]+) Oscar(s|)/;
const reg_noms_sig = /Nominated for ([0-9]+) Oscar(s|)/;
let wins = reg_wins.exec(awards_text); if (wins) wins = parseFloat(wins[1]);
let noms = reg_noms.exec(awards_text); if (noms) noms = parseFloat(noms[1]);
let wins_sig = reg_wins_sig.exec(awards_text); if (wins_sig) wins_sig = parseFloat(wins_sig[1]);
let noms_sig = reg_noms_sig.exec(awards_text); if (noms_sig) noms_sig = parseFloat(noms_sig[1]);
const rating = parseFloat(resolvedMovieData.imdbRating);
const votes = parseFloat(resolvedMovieData.imdbVotes.replace(',', ''));
if (rating >= 7.0 && votes > 50000) {
enhancementNode.classList.add('remarkable');
}
if ((wins_sig >= 1 || noms_sig >= 2) && (wins >= 5 || noms >= 10)) {
star = '★';
} else if (wins >= 10 || (noms_sig >= 1 && noms >= 5) || (rating > 8.0 && votes > 50000)) {
star = '★';
} else if (wins >= 5 || noms >= 10 || noms_sig >= 1 || votes > 150000) {
star = '★';
} else if (wins + noms >= 1) {
star = '☆';
}
enhancementNode.innerHTML = `${resolvedMovieData.imdbRating}${star}`;
let opacity = 1.0;
if (rating <= 5.0 || votes <= 1000) {
opacity = Math.max(0.15, Math.min(rating / 10, votes / 1000));
} else if (resolvedMovieData.imdbRating == "N/A" || resolvedMovieData.imdbVotes == "N/A") {
opacity = 0.15;
}
enhancementNode.style.opacity = opacity;
}
};
const moviesData = new Map();
for (let linkNode of document.querySelectorAll('a')) {
const href = linkNode.getAttribute('href');
const torrentz = /^\/([a-zA-Z0-9]{40})/i.exec(href);
const piratebay = /^\/torrent\/([0-9])/i.exec(href);
const hashMatch = /(^\/|^magnet\:\?xt\=urn\:btih\:)([a-zA-Z0-9]{40})/i.exec(href);
const cleanupPorn = (node) => {
const innerHTML = node.innerHTML.toLowerCase();
if (innerHTML.includes('xxx') || innerHTML.includes('porn')) node.outerHTML = '';
};
cleanupPorn(linkNode);
const linkText = linkNode.textContent;
if (hashMatch) {
const hash = hashMatch[2].toUpperCase();
/////////////////////////////////////////////////////// Loading Magnet from piratebay
const assistingNode = document.createElement('div');
assistingNode.classList.add('torrent-download-links');
assistingNode.insertAdjacentHTML('beforeend', `
t1t1m
`);
linkNode.parentNode && linkNode.parentNode.classList.add('assisted-torrent-link');
linkNode.parentNode && linkNode.parentNode.append(assistingNode);
}
let { title, year } = getMovieTitleAndYearFromLinkNode(linkNode);
if (title && year) {
const movieHash = getMovieHashFromTitleAndYear(title, year);
linkNode.classList.add('movie-preview');
linkNode.dataset.movieHash = movieHash;
linkNode.style.display = (linkNode.style.display === 'block') ? 'inline-block' : linkNode.style.display;
const movieLinkEnhancementNode = document.createElement('div');
movieLinkEnhancementNode.classList.add('movie-preview-enhancement');
movieLinkEnhancementNode.classList.add('loading');
linkNode.parentNode && linkNode.parentNode.insertBefore(movieLinkEnhancementNode, linkNode);
if (!moviesData.has(movieHash)) {
moviesData.set(
movieHash,
{
title,
year,
hash: movieHash,
promise: loadMovie(title, year)
}
);
}
}
}
console.log(moviesData);
for (let movieData of moviesData.values()) {
movieData.promise.then(resolvedData => {
updateLinkNodesWithMovieData(
document.querySelectorAll(`.movie-preview[data-movie-hash="${movieData.hash}"]`),
resolvedData
);
});
}
document.body.append(previewNode);
};
}
})(document, window.location.hostname);