Greasy Fork is available in English.

JSON-LD from IMDb to QuickStatements

Get data from JSON-LD from IMDb to QuickStatements, to publish it on Wikidata

目前為 2021-10-19 提交的版本,檢視 最新版本

// ==UserScript==
// @name         JSON-LD from IMDb to QuickStatements
// @author       CennoxX
// @description  Get data from JSON-LD from IMDb to QuickStatements, to publish it on Wikidata
// @match        https://www.imdb.com/*
// @match        https://quickstatements.toolforge.org/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=wikidata.org
// @contact      cesar.bernard@gmx.de
// @namespace    https://greasyfork.org/users/21515
// @version      0.8.2
// @connect      www.wikidata.org
// @grant        GM.xmlHttpRequest
// @grant        GM_getValue
// @grant        GM_setValue
// @license      MIT
// ==/UserScript==
(function() {
    'use strict';
    //
    //QuickStatements
    //
    if (location.href == 'https://quickstatements.toolforge.org/#/batch') {
        var quickstatements = '';
        GM_setValue('quickstatements','');
        var checkForChanges = setInterval(function() {
            if (quickstatements) {
                var quickForm = document.querySelector('textarea.form-control');
                if (!quickForm.innerHTML.includes(quickstatements)){
                    quickForm.innerHTML += quickstatements;
                }
                GM_setValue('quickstatements','');
                quickstatements = '';
            }else{
                quickstatements = GM_getValue('quickstatements');
            }
        }, 250);
        //
        //IMDb
        //
    }else if (location.host == "www.imdb.com"){
        var request = 0;
        var done = 0;
        var i = 0;
        var val = [];
        var jsonld = JSON.parse(document.querySelector('script[type="application/ld+json"]').innerText);

        //item
        var item = '';
        getWikidataId(jsonld,'item');

        //startTime/publication date
        if (jsonld['@type'] == 'TVSeries') {
            pushQSString('P580', jsonld.datePublished);
        } else if (jsonld['@type'] == 'Movie' || jsonld['@type'] == 'TVEpisode') {
            pushQSString('P577', jsonld.datePublished);
        }

        //actor
        if (jsonld.actor) {
            for (i = 0; i < jsonld.actor.length; i++) {
                getWikidataId(jsonld.actor[i],'P161');
            }
        }

        //creator/writer
        if (jsonld.creator) {
            for (i = 0; i < 4; i++) {
                if (jsonld.creator[i] && jsonld.creator[i].name) {
                    if (jsonld['@type'] == 'TVSeries') {
                        getWikidataId(jsonld.creator[i],'P170');
                    } else if (jsonld['@type'] == 'Movie') {
                        getWikidataId(jsonld.creator[i],'P58');
                    }
                } else {
                    break;
                }
            }
        }

        //director
        if (jsonld.director) {
            for (i = 0; i < jsonld.director.length; i++) {
                getWikidataId(jsonld.director[i], 'P57');
            }
        }

        //birthdate
        pushQSString('P569', jsonld.birthDate);

        //deathdate
        pushQSString('P570', jsonld.deathDate);

        //duration
        getDuration(jsonld.timeRequired);
        getDuration(jsonld.duration);
        function getDuration(time) {
            if (time) {
                var regex = /PT(?:(\d+)H)?(?:(\d+)M)?/;
                var hours = parseInt(time.replace(regex, "$1"));
                hours = isNaN(hours)?0:hours;
                var minutes = parseInt(time.replace(regex, "$2"));
                minutes = isNaN(minutes)?0:minutes;
                minutes = minutes+60*hours;
                pushQSString('P2047', minutes +'U7727');
            }
        }
        //loop to check if ready to set data
        var checkIfComplete = setInterval(function() {
            if (request != 0 && (done/request) == 1 && GM_getValue('quickstatements')=='') {
                var tempQ = '';
                val.sort().forEach(function(entry) {
                    tempQ += item +entry;
                });
                if (tempQ && item){
                    GM_setValue('quickstatements',tempQ);
                }
                clearInterval(checkIfComplete);
            }
        }, 500);

        function getWikidataId(id,prop) {
            request++;
            GM.xmlHttpRequest({
                method: "GET",
                url: "https://www.wikidata.org/w/api.php?action=query&format=json&list=search&srsearch=haswbstatement:P345=" + id.url.split('/')[2] + "&type=" + prop,
                onload: function(response) {
                    done++;
                    if (response.responseText.length > 0) {
                        var jsonObj = JSON.parse(response.responseText);
                        if (jsonObj.query.search[0] != null) {
                            var qid = jsonObj.query.search[0].title;
                            var property = response.finalUrl.split('type=')[1].split('&')[0];
                            if (property == "item"){
                                item = qid;
                            } else {
                                pushQSString(property,qid);
                            }
                        }
                    }
                },
                onerror: function(response) {
                    done++;
                    console.log("Error in fetching contents: " + response.responseText);
                }

            });
        }

        function pushQSString(property, data) {
            if (data){
                val.push('|' + property + '|' + (!isNaN(Date.parse(data))? '+'+data+'T00:00:00Z/11':data) + '|S248|Q37312|S345|"'+location.href.split('/')[4]+'"|S813|+'+new Date().toISOString().substring(0, 11)+'00:00:00Z/11\n');
            }
        }
    }
})();