// ==UserScript==
// @name Filmografie von IMDb nach Wikipedia
// @namespace https://greasyfork.org/users/21515
// @description Wandle die Filmografie von IMDb mithilfe von Wikidata in Wikipedia-Quelltext um.
// @author CennoxX
// @contact cesar.bernard@gmx.de
// @version 1.1.1
// @connect www.wikidata.org
// @connect www.imdb.com
// @match https://www.imdb.com/name/*
// @grant GM.xmlHttpRequest
// @grant GM.setClipboard
// @grant GM.registerMenuCommand
// @grant unsafeWindow
// @license MIT
// @downloadURL none
// ==/UserScript==
/* jshint esversion: 6 */
(function() {
'use strict';
unsafeWindow.ladeFilmografie = function(episodeLabel,showShort,calledByMenu=false) {
var work = document.querySelector('#filmo-head-actor,#filmo-head-actress').nextElementSibling.children;
var filmography = [];
var progress =[];
progress.request = 0;
progress.done = 0;
document.links.forEach(link => {
if (link.href.slice(-1) == '#' && link.getAttribute('data-n') !== null){
link.click();
}
});
setTimeout(function(){
work.forEach( w => {
var credit = new Credit();
var years = w.querySelector('.year_column').innerText.trim().split('/')[0].split('-');
credit.yearFrom = years[0];
credit.yearTo = years[1]?years[1]:0;
credit.dt = w.querySelector('a').innerText.replace(' - ', ' – ').replace('...', '…');
var entry = w.innerHTML.split('')[1];
credit.type = entry.split('
')[0].replace(/\)?\n\(voice/,'').trim()///([A-Z][a-z]+ version, )?voice
.replace(/\(Documentary short\)/, 'Dokumentar-Kurzfilm')
.replace(/\((TV Movie d|D)ocumentary\)/, 'Dokumentarfilm')
.replace(/\(TV Series short\)/, 'Webserie')
.replace(/\(TV Series( documentary)?\)/, 'Fernsehserie')
.replace(/\(TV Mini-Series( documentary)?\)/, 'Miniserie')
.replace(/\(TV Movie\)/, 'Fernsehfilm')
.replace(/\((Video s|TV S|TV Mini-Series s|S)hort\)/, 'Kurzfilm')
.replace(/\((Video|uncredited)\)/, '').split('\n')[0];
if (!credit.type.includes('in_production') && !credit.type.includes('Video Game') && (showShort || !credit.type.includes('Kurzfilm'))) {
credit.imdbid = w.getAttribute('id').split('-')[1];
getItemFromWikidata(credit.imdbid);
if (credit.type.includes('serie')) {
var voiceEpisodes = 0;
var allEpisodes = w.querySelectorAll('.filmo-episodes');
allEpisodes.forEach(episode => {
if (!episode.innerText.includes('credit only') && episode.innerText != 'Show less') {
credit.numberOfEpisodes++;
credit.episodeName = episode.querySelector('a').href.split('/')[4];
if (episode.innerText.includes('voice')) {
voiceEpisodes++;
}
}
});
if (credit.numberOfEpisodes == 1) {
getEpisodeNumberFromIMDb(credit.episodeName);
} else {
credit.episodeName = '';
}
credit.voice = (credit.numberOfEpisodes && voiceEpisodes == credit.numberOfEpisodes);
} else {
credit.voice = (entry.split('
').length>1 && entry.split('
')[1].includes('voice')) || (entry.split('\n').length>1 && entry.split('\n')[1].includes('voice'));
}
filmography.push(credit);
}
});
filmography = filmography.reverse().sort(function(a,b) {
return a.yearFrom - b.yearFrom;
});
var checkIfCompleted = setInterval(function() {
console.clear();
if (progress.request === 0 || (progress.done/progress.request) != 1) {
(progress.request !== 0) && console.log(parseInt((progress.done / progress.request) * 100) + '%');
} else {
var formattedFilmography = '== Filmografie ==\n';
filmography.forEach(function(entry) {
formattedFilmography += entry.toString();
});
GM.setClipboard (formattedFilmography);
var successMessage = 'Filmografie wurde erfolgreich kopiert.';
if (calledByMenu){
alert(successMessage);
} else {
console.log(formattedFilmography);
console.log(successMessage);
}
clearInterval(checkIfCompleted);
}
}, 1000);
function getItemFromWikidata(imdbid) {
progress.request++;
GM.xmlHttpRequest({
method: 'GET',
url: 'https://www.wikidata.org/w/api.php?action=query&format=json&list=search&srsearch=haswbstatement:P345=' + imdbid,
onload: function(response) {
progress.done++;
if (response.responseText.length > 0) {
var jsonObj = JSON.parse(response.responseText);
var credit = filmography.find(c => {
return c.imdbid == imdbid || c.episodeid == imdbid;
});
if (jsonObj.query.searchinfo.totalhits > 0) {
var wikidataid = jsonObj.query.search[0].title;
if (credit.imdbid == imdbid){
credit.link = wikidataid;
} else {
credit.episodeid = wikidataid;
}
getDataFromWikidata(wikidataid);
} else if (credit.imdbid == imdbid){
getDataFromIMDb(imdbid);
}
}
},
onerror: function(response) {
progress.done++;
console.log('Error in fetching contents: ' + response.responseText);
}
});
}
function getDataFromWikidata(wikidataid) {
progress.request++;
GM.xmlHttpRequest({
method: 'GET',
url: 'https://www.wikidata.org/w/api.php?action=wbgetentities&format=json&props=sitelinks|claims|labels&sitefilter=dewiki&ids=' + wikidataid,
onload: function(response) {
progress.done++;
if (response.responseText.length > 0) {
var jsonObj = JSON.parse(response.responseText);
var credit = filmography.find(c => {
return c.link == wikidataid || c.episodeid == wikidataid;
});
if (credit.link == wikidataid) { //get dt, ot, link
if (typeof Object.values(jsonObj.entities)[0].sitelinks.dewiki != 'undefined') { //wikipedia article
credit.link = Object.values(jsonObj.entities)[0].sitelinks.dewiki.title;
} else if (typeof Object.values(jsonObj.entities)[0].labels.de != 'undefined') {//wikidata label
credit.link = '';
credit.dt = Object.values(jsonObj.entities)[0].labels.de.value;
} else {
credit.link = '';
}
if (typeof Object.values(jsonObj.entities)[0].claims.P1476 != 'undefined') { //check if OT of entity exists
credit.ot = Object.values(jsonObj.entities)[0].claims.P1476[0].mainsnak.datavalue.value.text.replace(/'/g,'’');
} else {
getDataFromIMDb(credit.imdbid);
}
} else { //get episode name
if (typeof Object.values(jsonObj.entities)[0].sitelinks.dewiki != 'undefined') { //wikipedia article
credit.episodeName += ` ''${Object.values(jsonObj.entities)[0].sitelinks.dewiki.title}''`;
if (credit.episodeName.slice(-1) ==')'){
credit.episodeName = credit.episodeName.split(' (')[0];
}
} else if (typeof Object.values(jsonObj.entities)[0].labels.de != 'undefined') {//wikidata label
credit.episodeName += ` ''${Object.values(jsonObj.entities)[0].labels.de.value}''`;
}
}
}
},
onerror: function(response) {
progress.done++;
console.log('Error in fetching contents: ' + response.responseText);
}
});
}
function getDataFromIMDb(imdbid) {
progress.request++;
GM.xmlHttpRequest({
method: 'GET',
url: 'https://www.imdb.com/title/' + imdbid,
onload: function(response) {
progress.done++;
if (response.responseText.length > 0) {
var htmlText = response.responseText;
var ot;
if (htmlText.indexOf('originalTitle') != -1) {
ot = (/