// ==UserScript==
// @name Youtube: Show related videos if missing
// @name:de Youtube: Zeige Videovorschläge an, falls sie fehlen
// @namespace tfr
// @description On pages of age-restricted videos, related videos are missing. This script re-adds the related videos.
// @description:de Auf Seiten altersbeschränkter Videos fehlen die Videovorschläge. Dieses Skript fügt sie wieder hinzu.
// @author tfr (https://github.com/t-fr/)
// @license CC0; https://creativecommons.org/publicdomain/zero/1.0/
// @license MIT license; https://pastebin.com/raw.php?i=4TMeeUXC
// @compatible firefox Works with Firefox and Greasemonkey
// @incompatible chrome Does not work with Chrome and Tampermonkey
// @compatible opera Works with Opera and Violent monkey, but not with Tampermonkey Beta
// @oujs:author tfr
// @include http://www.youtube.com/watch?*
// @include https://www.youtube.com/watch?*
// @version 4
// @grant GM_xmlhttpRequest
// ==/UserScript==
/* This script is dual-licensed under CC0 and the MIT license.
* You can choose which one you want to use.
* CC0 license: http://creativecommons.org/publicdomain/zero/1.0/deed.en
* MIT license: https://pastebin.com/raw.php?i=4TMeeUXC
*
* Dieses Skript steht sowohl unter CC0 als auch unter der MIT-Lizenz.
* Sie können sich aussuchen, welche Lizenz Sie nutzen.
* CC0-Lizenz: http://creativecommons.org/publicdomain/zero/1.0/deed.de
* MIT-Lizenz: https://pastebin.com/raw.php?i=4TMeeUXC
*/
/* Version 4: Do not write "by ..." in video title
* Version 3: Update license information
*/
if (window.document.getElementById('watch7-sidebar-modules') && !window.document.getElementById('watch-related'))
{
var videoid = window.location.search.substr(window.location.search.indexOf('v=') + 2);
if (videoid.indexOf('&') > - 1)
{
videoid = videoid.substr(0, videoid.indexOf('&'));
}
videoid = decodeURIComponent(videoid);
GM_xmlhttpRequest({
method: 'GET',
url: '//www.youtube.com/get_video_info?asv=3&video_id=' + videoid,
onload: function (response)
{
if (response.status == 200)
{
var relatedList = response.responseText.substr(response.responseText.indexOf('rvs=') + 4);
if (relatedList.indexOf('&') > - 1)
{
relatedList = relatedList.substr(0, relatedList.indexOf('&'));
}
relatedList = decodeURIComponent(relatedList);
relatedListS = relatedList.split(',');
var sidebarModules = window.document.getElementById('watch7-sidebar-modules');
var sidebarSection = window.document.createElement('div');
sidebarSection.setAttribute('class', 'watch-sidebar-section');
sidebarModules.appendChild(sidebarSection);
var sidebarBody = window.document.createElement('div');
sidebarBody.setAttribute('class', 'watch-sidebar-body');
sidebarSection.appendChild(sidebarBody);
var relatedVideoList = window.document.createElement('ul');
relatedVideoList.setAttribute('id', 'watch-related');
relatedVideoList.setAttribute('class', 'video-list');
sidebarBody.appendChild(relatedVideoList);
for (var i = 0; i < relatedListS.length; i++)
{
if (relatedListS[i].indexOf('id=') > - 1 && relatedListS[i].indexOf('title=') > - 1 && relatedListS[i].indexOf('author=') > - 1 && relatedListS[i].indexOf('length_seconds=') > - 1)
{
var relatedId = relatedListS[i].substr(relatedListS[i].indexOf('id=') + 3);
if (relatedId.indexOf('&') > - 1)
{
relatedId = relatedId.substr(0, relatedId.indexOf('&'));
}
relatedId = relatedId.replace(/\+/g, ' ');
relatedId = decodeURIComponent(relatedId);
var relatedTitle = relatedListS[i].substr(relatedListS[i].indexOf('title=') + 6);
if (relatedTitle.indexOf('&') > - 1)
{
relatedTitle = relatedTitle.substr(0, relatedTitle.indexOf('&'));
}
relatedTitle = relatedTitle.replace(/\+/g, ' ');
relatedTitle = decodeURIComponent(relatedTitle);
var relatedAuthor = relatedListS[i].substr(relatedListS[i].indexOf('author=') + 7);
if (relatedAuthor.indexOf('&') > - 1)
{
relatedAuthor = relatedAuthor.substr(0, relatedAuthor.indexOf('&'));
}
relatedAuthor = relatedAuthor.replace(/\+/g, ' ');
relatedAuthor = decodeURIComponent(relatedAuthor);
var relatedLength = relatedListS[i].substr(relatedListS[i].indexOf('length_seconds=') + 15);
if (relatedLength.indexOf('&') > - 1)
{
relatedLength = relatedLength.substr(0, relatedLength.indexOf('&'));
}
relatedLength = relatedLength.replace(/\+/g, ' ');
relatedLength = decodeURIComponent(relatedLength);
var relatedLengthRest = parseInt(relatedLength);
var relatedLengthStr = ':' + ((relatedLengthRest % 60) < 10 ? '0' : '') + (relatedLengthRest % 60).toString();
relatedLengthRest = Math.floor(relatedLengthRest / 60);
relatedLengthStr = (relatedLengthRest >= 60 && (relatedLengthRest % 60) < 10 ? '0' : '') + (relatedLengthRest % 60).toString() + relatedLengthStr;
relatedLengthRest = Math.floor(relatedLengthRest / 60);
relatedLengthStr = (relatedLengthRest > 0 ? relatedLengthRest.toString() + ':' + relatedLengthStr : relatedLengthStr);
var listElem = window.document.createElement('li');
listElem.setAttribute('class', 'video-list-item related-list-item show-video-time related-list-item-compact-video');
relatedVideoList.appendChild(listElem);
var listElemCont = window.document.createElement('div');
listElemCont.setAttribute('class', 'content-wrapper');
listElem.appendChild(listElemCont);
var listElemContLink = window.document.createElement('a');
listElemContLink.setAttribute('class', 'yt-uix-sessionlink content-link');
listElemContLink.setAttribute('title', relatedTitle);
listElemContLink.setAttribute('href', 'https://www.youtube.com/watch?v=' + relatedId);
listElemCont.appendChild(listElemContLink);
var listElemContLinkSpan1 = window.document.createElement('span');
listElemContLinkSpan1.setAttribute('class', 'title');
listElemContLinkSpan1.setAttribute('aria-describedby', 'description-id-' + i);
listElemContLinkSpan1.appendChild(window.document.createTextNode(relatedTitle));
listElemContLink.appendChild(listElemContLinkSpan1);
var listElemContLinkSpan2 = window.document.createElement('span');
listElemContLinkSpan2.setAttribute('id', 'description-id-' + i);
listElemContLinkSpan2.setAttribute('class', 'accessible-description');
listElemContLinkSpan2.appendChild(window.document.createTextNode((navigator.language.toLowerCase().substr(0, 2) == 'de' ? '- Dauer: ' : '- Duration: ') + relatedLengthStr));
listElemContLink.appendChild(listElemContLinkSpan2);
var listElemContLinkSpan3 = window.document.createElement('span');
listElemContLinkSpan3.setAttribute('class', 'stat attribution');
listElemContLinkSpan3.appendChild(window.document.createTextNode((navigator.language.toLowerCase().substr(0, 2) == 'de' ? 'von ' : 'by ') + relatedAuthor));
listElemContLink.appendChild(listElemContLinkSpan3);
var listElemThum = window.document.createElement('div');
listElemThum.setAttribute('class', 'thumb-wrapper');
listElem.appendChild(listElemThum);
var listElemThumLink = window.document.createElement('a');
listElemThumLink.setAttribute('class', 'yt-uix-sessionlink thumb-link');
listElemThumLink.setAttribute('aria-hidden', 'true');
listElemThumLink.setAttribute('tabindex', '-1');
listElemThumLink.setAttribute('href', 'https://www.youtube.com/watch?v=' + relatedId);
listElemThum.appendChild(listElemThumLink);
var listElemThumLinkSpan = window.document.createElement('span');
listElemThumLinkSpan.setAttribute('class', 'yt-uix-simple-thumb-wrap yt-uix-simple-thumb-related');
listElemThumLinkSpan.setAttribute('data-vid', relatedId);
listElemThumLinkSpan.setAttribute('tabindex', '0');
listElemThumLink.appendChild(listElemThumLinkSpan);
var listElemThumImg = window.document.createElement('img');
listElemThumImg.setAttribute('width', '120');
listElemThumImg.setAttribute('height', '90');
listElemThumImg.setAttribute('aria-hidden', 'true');
listElemThumImg.setAttribute('alt', '');
listElemThumImg.setAttribute('src', '//i.ytimg.com/vi/' + relatedId + '/default.jpg');
listElemThumLinkSpan.appendChild(listElemThumImg);
}
}
}
}
});
}