// ==UserScript== // @name Youtube title translate reverser // @namespace http://tampermonkey.net/ // @version 0.1 // @description Remove auto-translated youtube titles // @author Pierre Couy // @match https://www.youtube.com/* // @grant GM_setValue // @grant GM_getValue // @downloadURL none // ==/UserScript== (function() { 'use strict'; /* Get a YouTube Data v3 API key from https://console.developers.google.com/apis/library/youtube.googleapis.com?q=YoutubeData */ while(GM_getValue("api_key") === undefined || GM_getValue("api_key") === null || GM_getValue("api_key") === ""){ GM_setValue("api_key", prompt("Enter your API key. Go to https://developers.google.com/youtube/v3/getting-started to know how to obtain an API key.")); } const API_KEY = GM_getValue("api_key"); var url_template = "https://www.googleapis.com/youtube/v3/videos?part=snippet&id={IDs}&key=" + API_KEY; var alreadyChanged = []; var running = true; function changeTitles(){ var links = Array.prototype.slice.call(document.getElementsByTagName("a")).filter( a => { return a.id == 'video-title' && alreadyChanged.indexOf(a) == -1; } ); var spans = Array.prototype.slice.call(document.getElementsByTagName("span")).filter( a => { return a.id == 'video-title' && alreadyChanged.indexOf(a) == -1; } ); links = links.concat(spans).slice(0,30); if(links.length > 0){ console.log('Changing titles'); var IDs = links.map( a => { while(a.tagName != "A"){ a = a.parentNode; } var href = a.href; var tmp = href.split('v=')[1]; return tmp.split('&')[0]; } ); console.log(links); var requestUrl = url_template.replace("{IDs}", IDs.join(',')); var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { var data = JSON.parse(xhr.responseText); if(data.kind == "youtube#videoListResponse"){ data = data.items; var titleStore = {} data = data.forEach( v => { titleStore[v.id] = v.snippet.title; } ); console.log(titleStore); for(var i=0 ; i < links.length ; i++){ if(titleStore[IDs[i]] !== undefined){ links[i].innerText = titleStore[IDs[i]]; alreadyChanged.push(links[i]); } } }else{ console.log(requestUrl); console.log(data); if(data.error != undefined && (data.error.errors[0].domain == "usageLimits" || data.error.errors[0].reason == "keyInvalid")){ clearInterval(intervalID); if(running){ running = false; var tmp = prompt("Enter your API key. Go to https://developers.google.com/youtube/v3/getting-started to know how to obtain an API key."); if(tmp !== null && tmp !== "" && tmp !== undefined){ GM_setValue("api_key", tmp); url_template = "https://www.googleapis.com/youtube/v3/videos?part=snippet&id={IDs}&key=" + GM_getValue("api_key"); } running = true; } intervalID = setInterval(changeTitles, 1000); } } } }; xhr.open('GET', requestUrl); xhr.send(); } } var intervalID = setInterval(changeTitles, 1000); })();