YouTube Title formatted for filename

reformats the titles of YouTube videos to be windows filename compatible on click.

目前為 2020-06-21 提交的版本,檢視 最新版本

// ==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);
    }
}