On pages of age-restricted videos, related videos are missing. This script re-adds the related videos.
// ==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); } } } } }); }