您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Display the actor's age next to movie credits.
// ==UserScript== // @name IMDb Actor Age redux // @namespace driver8.net // @description Display the actor's age next to movie credits. // @match *://*.imdb.com/name/nm* // @match *://*.imdb.com/title/tt*/ // @match *://*.imdb.com/title/tt*/fullcredits* // @version 0.1.1 // @grant GM_setValue // @grant GM_getValue // @require https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js // ==/UserScript== console.log('hi imdb actor age'); (function() { 'use strict'; var LOGGING = false; function log(...msg) { LOGGING && console.log(...msg); } /// ACTOR PAGES /// if (window.location.href.match(/\/name\/nm\d+\/(reference|\?|$)/)) { let actorNum = window.location.href.match(/\/name\/nm(\d+)/)[1]; let birthday = document.querySelector('#name-born-info time'); let birthTime = (birthday && birthday.textContent.trim()) || GM_getValue(actorNum); let birthMoment = moment(birthTime); log('birthTime', birthTime, 'mom', birthMoment); if (birthTime) { GM_setValue(actorNum, birthMoment.format('YYYY-MM-DD')); if (birthday) { let ageSpan = getAgeSpan(birthMoment, moment()); birthday.appendChild(ageSpan); } let yearCols = document.querySelectorAll('#filmography .year_column'); yearCols.forEach((yc) => { log('yc', yc); let br = yc.parentNode.querySelector('br'); let years = yc.textContent.trim(); log('years', years); log('br', br) if (years && years.length > 3 && br) { let ageSpan = getAgeSpan(birthMoment, years); br.parentNode.insertBefore(ageSpan, br); } }); } /// MOVIE PAGES /// } else if (window.location.href.match(/\/title\/tt\d+\/(reference|fullcredits)?/)) { let rows = document.querySelectorAll('.StyledComponents__CastItemWrapper-y9ygcu-7, table.cast tr.odd, table.cast tr.even, table.cast_list tr.odd, table.cast_list tr.even'); let m = document.title.match(/\((?:TV\s+(?:Series|Episode|Movie)\s*)?(\d{4}\s*(?:–|-)?\s*(?:\d{4})?)\s*\)/); if (m) { let titleYears = m[1]; rows.forEach((el) => { log(el); let actorLink = el.querySelector('a'); console.log(actorLink); let m = actorLink && actorLink.href.match(/\/name\/nm(\d+)/); if (m) { let actorNum = m[1]; log(actorNum); let birthTime = GM_getValue(actorNum); log(birthTime); if (birthTime) { let ageSpan = getAgeSpan(moment(birthTime), titleYears); log(ageSpan); el.querySelectorAll('td > a, div > a')[1].after(ageSpan);//.appendChild(ageSpan); } } }); } } function getAgeSpan(birth, years) { log('getAgeSpan', birth, years); if (typeof years == "string") { var m = years.match(/(\d{4})(?:–|-)?(\d{4})?/); } else { m = [ years.format('YYYY-MM-dd') ]; } log('match m', m, 'moment', moment(m[1])); let ageString = moment(m[1]).diff(birth, 'years'); if (m[2]) { ageString += '-' + moment(m[2]).diff(birth, 'years'); } ageString = '(age ' + ageString + ')'; let ageSpan = document.createElement('span'); ageSpan.classList.add('ageSpan'); ageSpan.textContent = ageString; return ageSpan; } function getFamousBirthday(name) { GM_xmlhttpRequest({ method: 'GET', url: 'https://www.famousbirthdays.com/search?q=' + encodeURIComponent(name), onload: function(response) { var parser = new DOMParser(); var h = parser.parseFromString(response.responseText, "text/html"); var age = h.querySelector('').lastElementChild; var html = ``; var new_div = document.createElement('div'); new_div.innerHTML = html; new_div = new_div.firstElementChild; document.querySelector('').insertBefore(new_div, document.querySelector('')); } }); } let s = document.createElement('style'); s.textContent = ` .ageSpan { font-size: 11px !important; font-weight: bold; } `; document.body.appendChild(s); })();