Greasy Fork is available in English.

IMDb Actor Age redux

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);
})();