IMDb Utility Library (API)

Utility library for the Internet Movie Database. Provides an API for grabbing info from IMDb.com

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.gf.qytechs.cn/scripts/390115/733074/IMDb%20Utility%20Library%20%28API%29.js

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         IMDb Utility Library (API)
// @namespace    driver8.net
// @version      0.1.1
// @description  Utility library for the Internet Movie Database. Provides an API for grabbing info from IMDb.com
// @author       driver8
// @match        *://*.imdb.com/*
// @grant        GM_xmlhttpRequest
// @connect      imdb.com
// ==/UserScript==

function getImdbIdFromTitle(title, year) {
    return new Promise(function(resolve, reject) {
        GM_xmlhttpRequest({
            method: 'GET',
            responseType: 'document',
            synchronous: false,
            url: 'https://www.imdb.com/find?s=tt&q=' + title,
            onload: (resp) => {
                const doc = document.implementation.createHTMLDocument().documentElement;
                doc.innerHTML = resp.responseText;

                let links = Array.from(doc.querySelectorAll('.result_text > a'));

                // Filter out TV episodes, shorts, and video games
                links = links.filter((el) => !el.parentNode.textContent.trim().match(/\((?:TV Episode|Short|Video Game|Video)\)/));
                let a = links[0];
                if (year) {
                    console.log('year', year);
                    let sorted = links.map((el) => {
                        let m = el.parentNode.textContent.match(/\((\d{4})\)/);
                        let year = new Date().getFullYear();
                        if (m) {
                            year = parseInt(m[1]);
                        }
                        return { el: el, year: year };
                    });
                    sorted = sorted.sort((a, b) => Math.abs(year - a.year) - Math.abs(year - b.year));
                    a = sorted[0].el;
                }

                let id = a && a.href.match(/title\/(tt\d+)/)[1];
                if (id) {
                    resolve(id);
                } else {
                    reject(`Error getting IMDb id for ${title} ${year}`);
                }
            }
        });
    });
}

function getImdbInfoFromId(id) {
    return new Promise(function(resolve, reject) {
        GM_xmlhttpRequest({
            method: 'GET',
            responseType: 'document',
            synchronous: false,
            url: `https://www.imdb.com/title/${id}/`,
            onload: (resp) => {
                const doc = document.implementation.createHTMLDocument().documentElement;
                doc.innerHTML = resp.responseText;
                const parse = function(query, regex) {
                    try {
                        let el = doc.querySelector(query);
                        let text = (el.textContent || el.content).trim();
                        if (regex) {
                            text = text.match(regex)[1];
                        }
                        return text.trim();
                    } catch (e) {
                        //console.log('error', e);
                        return '';
                    }
                };
                let data = {
                    id: id,
                    title: parse('head meta[property="og:title"], .title_wrapper > h1', /([^()]+)/),
                    year: parse('head meta[property="og:title"], .title_wrapper > h1', /\((?:TV\s+(?:Series|Mini-Series|Episode|Movie)\s*)?(\d{4})/),
                    description: parse('.plot_summary > .summary_text').replace(/\s+See full summary\s*»/, ''),
                    rating: parse('.ratingValue > strong > span'),
                    votes: parse('.imdbRating > a > span'),
                    metascore: parse('.metacriticScore > span'),
                    popularity: parse('.titleReviewBarItem:last-of-type > .titleReviewBarSubItem > div > span', /^([0-9,]+)/),
                    dateFetched: new Date()
                };
                if (data && data.id && data.title) {
                    resolve(data);
                } else {
                    reject('Error getting IMDb data for id ' + id);
                }
            }
        });
    });
}

function getImdbInfoFromTitle(title, year) {
    return getImdbIdFromTitle(title, year).then((id) => {
        return getImdbInfoFromId(id);
    });
}