Greasy Fork镜像 支持简体中文。

IMDB works#

Shows number of credited works after names on IMDB site

目前為 2017-01-23 提交的版本,檢視 最新版本

// ==UserScript==//
// @name           IMDB works#
// @description    Shows number of credited works after names on IMDB site
// @match          *://*.imdb.com/*
// @version        1.0.4
// @author         wOxxOm
// @namespace      wOxxOm.scripts
// @license        MIT License
// @grant          GM_addStyle
// @grant          GM_xmlhttpRequest
// @run-at         document-start
// @require        https://gf.qytechs.cn/scripts/12228/code/setMutationHandler.js
// ==/UserScript==

var SELECTOR = 'a[href^="/name/nm"]';
var CACHE_DURATION = 30 * 24 * 3600 * 1000; // 1 month

GM_addStyle(
	'.number-of-works, .number-of-works span { opacity: 0.5; transition: opacity .25s ease-in-out .25s; }' +
	'.number-of-works span:before { content: "/"; }' +
	'.number-of-works:hover { opacity: 1.0; }' +
	'.number-of-works:hover span { opacity: 1.0; }' +
	'.number-of-works:before { content: " ["; opacity: 0.5; }' +
	'.number-of-works:after { content: "]"; opacity: 0.5; }'
);

process(document.querySelectorAll(SELECTOR));
setMutationHandler(document, SELECTOR, process);

function process(links) {
	var now = Date.now();
	for (var link, i = 0; (link = links[i++]); ) {
		if (link.querySelector('img') ||
			!link.textContent.trim() ||
			link.nextElementSibling && link.nextElementSibling.matches('.number-of-works'))
			continue;
		var id = (link.href.match(/\/name\/nm(\d+)\/?(?:\?.*)?$/) || [])[1];
		if (!id)
			continue;
		var cacheKey = 'works#' + id;
		var cache = (localStorage[cacheKey] || '').split('\t');
		if (cache.length == 2 && +cache[0] && cache[1]) {
			showWorksNum(link, cache[1]);
			var isFresh = +cache[0] > now;
			if (isFresh)
				continue;
		}
		doXHR({
			url: link.pathname,
			link: link,
			cacheKey: cacheKey,
			onload: parseNamePage,
		});
	}
}

function showWorksNum(link, num, needsUpdate) {
	if (link.nextElementSibling && link.nextElementSibling.matches('.number-of-works')) {
		link.nextElementSibling.textContent = num;
		delete link.nextElementSibling.dataset.updating;
	} else {
		link.insertAdjacentHTML('afterend',
								'<span class="number-of-works"' +
								(needsUpdate ? ' data-updating' : '') + '>' +
								num.toString().replace(/\/(\d+)/, '<span>$1</span>') +
								'</span>');
	}
}

function parseNamePage(doc, options) {
	var credits = [].map.call(doc.querySelectorAll('#filmography .head'), function(e) {
		return +(e.textContent.match(/\((\d+) credits?\)/i) || [])[1];
	});
	if (!credits.length)
		return;
	var creditsSum = credits.reduce(function(sum, e) { return sum + e; }, 0);
	var worksNum = credits[0] + (credits.length > 1 ? '/' + creditsSum : '');
	showWorksNum(options.link, worksNum);
	localStorage[options.cacheKey] = '' + (Date.now() + CACHE_DURATION) + '\t' + worksNum;
}

function doXHR(options) {
	if (document.readyState == 'complete') {
		sendRequest(options);
		return;
	}
	if (!doXHR.queue) {
		doXHR.queue = [];
		window.addEventListener('load', function docLoaded() {
			window.removeEventListener('load', docLoaded);
			while (doXHR.queue.length) {
				var req = doXHR.queue.shift();
				if (req.url) {
					sendRequest(req);
				} else {
					// this request's url was processed in the queue earlier so we'll reuse the result
					showWorksNum(req.link, localStorage[req.cacheKey]);
				}
			}
		});
	}
	doXHR.queue.some(function(e) {
		if (e.url == options.url) {
			// this request's link element will use the will-be-cached data from the earlier queued request
			options.url = '';
			return true;
		}
	});
	doXHR.queue.push(options);

	function sendRequest(options) {
		var xhr = new XMLHttpRequest();
		xhr.open('GET', options.url);
		xhr.responseType = 'document';
		xhr.onload = function(e) {
			options.onload(xhr.response, options);
		};
		xhr.send();
	}
}

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址