// ==UserScript==
// @name YouTube Title formatted for filename
// @namespace sm
// @version 0.14
// @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 = 2000;
runFunctionTimer = setInterval (function() {runFunction (); }, interval);
}
function runFunctionTimer2 () //because setTimeout doesn't work in Tampermonkey - use of it below is let untouched for now || so it keeps working throughout the video - runs every 2 min
{
var interval = 120000;
runFunctionTimer = setInterval (function() {runFunction (); }, interval);
}
let counter = 1;
let count4 = 1;
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>"
strin = strin + "<br />" + button1 + button2;
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 discription = document.querySelector("#description");
let discription2 = document.querySelector("#description > yt-formatted-string");
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;
}}
}
}
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 ")
}
return fname
}
});
}
}
runFunctionTimer ();
runFunctionTimer2();
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);
}
}