// ==UserScript== // @name tpb-top-imdb // @namespace uncleinf // @version 1.1 // @description Loads imdb rating info for top100 search results // @author UncleInf // @license MIT // @supportURL https://github.com/UncleInf/tpb-top-imdb // @contributionURL https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=HYV6Z2N9BA5V8 // @contributionAmount 5 // @require https://code.jquery.com/jquery-3.4.1.min.js // @include https://thepiratebay.*/torrent/* // @include https://thepiratebay.*/top/207 // @include https://thepiratebay.*/top/201 // @include https://thepiratebay.*/top/202 // @include https://thepiratebay.*/top/205 // @include https://thepiratebay.*/top/208 // @include https://thepiratebay.*/top/209 // @grant GM_xmlhttpRequest // @connect theimdbapi.org // @downloadURL https://update.greasyfork.icu/scripts/33901/tpb-top-imdb.user.js // @updateURL https://update.greasyfork.icu/scripts/33901/tpb-top-imdb.meta.js // ==/UserScript== (function () { 'use strict'; /* global $ */ $(() => { const $rows = getRows() $rows.each((_, r) => { const $row = $(r) const $td = constructCell($row); $row.prepend($td) }) const hasTpbLink = d => d.tpbLink const globalData = $rows.get() .map(constructData) .filter(hasTpbLink) .map(fillImdbData) $('th').parent().prepend(_ => constructHeader(globalData)) globalData.forEach(displayRating) }); function getRows() { return $('tbody tr') } function constructHeader(data) { const header = $('').attr('title', '6.5 - 7.2 - 8 | click to refresh') const refreshRatings = (e, d) => { e.preventDefault() localStorage.clear() d.forEach(item => { item.$rating.text('--') item.$element.css({ 'background-color': '' }) }) d.map(fillImdbData).forEach(displayRating) } const a = $('').attr('href', '#').text('Rating').click(e => refreshRatings(e, data)) return header.append(a) } function constructCell() { const $td = $('').addClass('vertTh tpb-top-imdb') const $rating = $('').attr('title', 'Initializing data').text('--') const $center = $('
').append($rating) return $td.append($center) } function constructData(r) { const $row = $(r) const $td = $row.find('.tpb-top-imdb') const $rating = $td.find('a') const link = $row.find('a.detLink').attr('href') const parseLinkId = l => { const split = l.split('/') return split && split.length >= 3 ? split[2] : null } return { tpbId: parseLinkId(link), tpbLink: link, $element: $td, $rating: $rating } } function fillImdbData(data) { const localData = getlocalImdbData(data.tpbId) const fetchSaveData = d => fetchImdbData(d.tpbLink).then(r => { if (r) saveLocalImdbData(d.tpbId, r) return r }) return { ...data, imdb: localData ? $.when(localData) : fetchSaveData(data) } } function getlocalImdbData(tpbId) { return JSON.parse(localStorage.getItem(tpbId)) } function saveLocalImdbData(tpbId, imdbData) { console.log('persisiting data') localStorage.setItem(tpbId, JSON.stringify(imdbData)) } function fetchImdbData(tpbLink) { const extractImdbId = r => { const regexp = 'www.imdb.com/title/(.*)/"' const regexFind = r.match(regexp) return regexFind && regexFind.length === 2 ? regexFind[1] : null } const fetchImdbApi = id => { if (!id) return null const apiUrl = `https://www.omdbapi.com/?apikey=fe430872&i=${id}` return $.getJSON(apiUrl).then(r => ({ rating: r.imdbRating, count: r.imdbVotes, link: `https://www.imdb.com/title/${id}` })) } return $.get(tpbLink) .then(extractImdbId) .then(fetchImdbApi) } function displayRating(data) { const getRatingStyles = rating => { let colour = '' if (rating >= 8) { colour = 'palegreen' } else if (rating >= 7.2) { colour = 'powderblue' } else if (rating >= 6.5) { colour = 'lightcyan' } return { 'background-color': colour }; } data.imdb.then(imdbData => { if (!imdbData) { data.$rating.attr('title', 'No data') return } data.$rating .text(imdbData.rating) .attr('href', imdbData.link) .attr('title', imdbData.count) data.$element.css(getRatingStyles(imdbData.rating)) }) } // function iDontKnow() { // return '¯\\_(ツ)_/¯'; // } })();