// ==UserScript==
// @name YouTube Title formatted for filename
// @namespace sm
// @version 0.16
// @description reformats the titles of YouTube videos to be windows filename compatible on click.
// @match http*://www.youtube.com/watch*
// @copyright 2020, sm
// ==/UserScript==
// @require http://code.jquery.com/jquery-3.4.1.min.js
console.log("docReady waiting ")
var bidClickTimer = 0;
var numBidClicks = 0;
function runFunctionTimer () //because setTimeout doesn't work in Tampermonkey - use of it below is let untouched for now || this works for the first few minutes
{
var interval = 4000;
runFunctionTimer = setInterval (function() {runFunction (); }, interval);
}
let counter = 1;
let count4 = 1;
let count5 = 0;
let count6 = 0;
function runFunction (){ //creates buttons and runs the actual logic
let buttons = ""
buttons = addButtons(buttons)
let DescriptionBox = document.getElementById("meta");
if(DescriptionBox != null){
console.log("found box")
if(counter < 2){
DescriptionBox.insertAdjacentHTML('beforebegin', buttons);
counter = 2;
}
function2();
}else{
console.log("could not find box")
}
function addButtons(strin){
let button1 = "<span><button id='formatTitleButton'>Format Title</button></span>"
let button2 = "<span><button id='formatDescriptionButton'>Format Description</button></span>"
let button3 = "<span><button id='appendName'>Append Channel Name</button></span>"
let button4 = "<span><button id='appendName2'>Prepend Channel Name</button></span>"
strin = strin + "<br />" + button1 + button2 + "<br>" + button4 + button3;
return strin
}
}
function function2(){ // logic, looks for button presses and replaces text
if( count4 < 7){
count4 = count4 + 1;
docReady(function() {
// DOM is loaded and ready for manipulation here
console.log("running title fix ")
let count = 1;
let count3 = 1;
let count2 = 1;
//Code to run After timeout elapses
console.log("finding title ")
console.log("YouTube Title formatter v1.001")
let title = document.querySelector("#formatTitleButton");
let discriptionbutton = document.querySelector("#formatDescriptionButton");
let appendNameButton = document.querySelector("#appendName");
let appendNameButton2 = document.querySelector("#appendName2");
let discription = document.querySelector("#description");
let discription2 = document.querySelector("#description > yt-formatted-string");
let channelNameHolder = document.querySelector("#ytd-channel-name");
if(count < 3){
title.onclick = function(e){//turn title into button
console.log("count of times called on title = ",count)
//your handler here
if(count < 3){//prevent from running too many times
let title2 = document.querySelector("#container > h1");// The title can sometimes be missing the class title
let newTitle2 = isValid(title2.innerHTML) //pull title again due to js idiosyncrasies
let title3 = document.querySelector("#title"); // if the title class is applied
let newTitle3 = false; //to make the if statement false unless we pull a title
if(title3){
newTitle3 = isValid(title3.innerHTML) //pull title again due to js idiosyncrasies
}
if(newTitle3 != false && newTitle3 != null){
console.log("newTitle3 == ", newTitle3)
title3.innerHTML = newTitle3
}else{
console.log("newTitle2 == ", newTitle2)
if(newTitle2 != null){
title2.innerHTML = newTitle2
}
}
console.log(count)
count = count + 1;
}
}
}
discriptionbutton.onclick = function(e){//turn title into button
//your handler here
console.log("fix text called")
if(count3 < 7){
if(discription2.innerHTML){
let discription2 = document.querySelector("#description > yt-formatted-string");
let newdiscription2 = isValid(discription2.innerHTML) //pull title again due to js idiosyncrasies
console.log("newTitle == ", newdiscription2)
if(newdiscription2 != null){
discription2.innerHTML = newdiscription2
}
console.log(count)
count2 = count2 + 1;
}else{
title = document.querySelector("#container > h1");
discription2 = document.querySelector("#description > yt-formatted-string");
}
if(title.innerHTML){
if(count < 3){//prevent from running too many times
let title2 = document.querySelector("#container > h1");
let newTitle2 = isValid(title2.innerHTML) //pull title again due to js idiosyncrasies
console.log("newTitle == ", newTitle2)
if(newTitle2 != null){
title2.innerHTML = newTitle2
}
console.log(count)
count3 = count + 1;
}}
}
}
appendNameButton.onclick = function(e){//turn title into button
//your handler here
console.log("fix text called")
if(count5 < 1){
if(title.innerHTML){
if(count5 < 1){//prevent from running too many times
let title2 = document.querySelector("#container > h1");
console.log(title2, " == title2")
let newTitle2 = isValid(title2.innerHTML) //pull title again due to js idiosyncrasies
console.log(newTitle2, " == newTitle2")
let channelName2 = document.querySelector("#text > a");
console.log(channelName2, " == channelName2")
let channelName3 = isValid(channelName2.innerHTML) //pull title again due to js idiosyncrasies
console.log(channelName3, " == channelName3")
console.log("newTitle == ", newTitle2 + " - " + channelName3)
if(newTitle2 != null){
title2.innerHTML = newTitle2 + " - " + channelName3
}
count5 = count5 + 1;
}}
}else{
if(count5 = 1){
let title2 = document.querySelector("#container > h1");
console.log(title2, " == title2")
let newTitle2 = isValid(title2.innerHTML) //pull title again due to js idiosyncrasies
console.log(newTitle2, " == newTitle2")
let channelName2 = document.querySelector("#text > a");
console.log(channelName2, " == channelName2")
let channelName3 = isValid(channelName2.innerHTML) //pull title again due to js idiosyncrasies
console.log(channelName3, " == channelName3")
if(newTitle2 != null){
title2.innerHTML = newTitle2.replace(" - " + channelName3 , "");
}
count5 = count5 - 1;
}}
}
appendNameButton2.onclick = function(e){//turn title into button
//your handler here
console.log("fix text called")
if(count6 < 1){
if(title.innerHTML){
if(count6 < 1){//prevent from running too many times
let title2 = document.querySelector("#container > h1");
console.log(title2, " == title2")
let newTitle2 = isValid(title2.innerHTML) //pull title again due to js idiosyncrasies
console.log(newTitle2, " == newTitle2")
let channelName2 = document.querySelector("#text > a");
console.log(channelName2, " == channelName2")
let channelName3 = isValid(channelName2.innerHTML) //pull title again due to js idiosyncrasies
console.log(channelName3, " == channelName3")
console.log("newTitle == ", newTitle2 + " - " + channelName3)
if(newTitle2 != null){
title2.innerHTML = channelName3 + " - " + newTitle2
}
count6 = count6 + 1;
}}
}else{
if(count6 = 1){
let title2 = document.querySelector("#container > h1");
console.log(title2, " == title2")
let newTitle2 = isValid(title2.innerHTML) //pull title again due to js idiosyncrasies
console.log(newTitle2, " == newTitle2")
let channelName2 = document.querySelector("#text > a");
console.log(channelName2, " == channelName2")
let channelName3 = isValid(channelName2.innerHTML) //pull title again due to js idiosyncrasies
console.log(channelName3, " == channelName3")
if(newTitle2 != null){
title2.innerHTML = newTitle2.replace(channelName3 + " - " , "");
}
count6 = count6 - 1;
}}
}
function isValid(fname){
console.log("fname type is ", typeof fname);
console.log("fname input is ", fname);
for(let i = 0; i < 20; i++){
fname = fname.replace("&"," and ")
fname = fname.replace("|"," ")
fname = fname.replace("||"," ")
fname = fname.replace(","," ")
fname = fname.replace("?"," ")
fname = fname.replace("!"," ")
fname = fname.replace('"'," ")
fname = fname.replace("@"," ")
//fname = fname.replace("<","(")
// fname = fname.replace(">",")")
fname = fname.replace(".","")
fname = fname.replace("'","")
fname = fname.replace("►","")
fname = fname.replace("`","")
fname = fname.replace("/","")
fname = fname.replace("\\","")
fname = fname.replace(":","")
fname = fname.replace(";","")
fname = fname.replace("*","")
fname = fname.replace("^","")
fname = fname.replace("%","")
fname = fname.replace("$","")
fname = fname.replace("#","")
fname = fname.replace("+","")
fname = fname.replace("_","")
fname = fname.replace("’","")
fname = fname.replace("→"," - ")
fname = fname.replace("」"," ")
fname = fname.replace("「"," ")
fname = fname.replace("}",")")
fname = fname.replace("{"," (")
fname = fname.replace(" "," ")
fname = fname.replace("ー","-")
fname = fname.replace("/","-")
fname = fname.replace("『"," (")
fname = fname.replace("』",")")
fname = fname.replace("!","")
fname = fname.replace("【"," (")
fname = fname.replace("■","-")
fname = fname.replace("】",")")
fname = fname.replace("and amp "," and ")
fname = fname.replace("☆","")
}
return fname
}
});
}
}
runFunctionTimer ();
function docReady(fn) {
// see if DOM is already available
if (document.readyState === "complete" || document.readyState === "interactive") {
// call on next available tick
setTimeout(fn, 1);
} else {
document.addEventListener("DOMContentLoaded", fn);
}
}