(Defunct/Replaced) YouTube Title formatted for filename 3

reformats the titles of YouTube videos to be windows filename compatible on click. - Rebuilt to work better.

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name       (Defunct/Replaced) YouTube Title formatted for filename 3
// @namespace  sm
// @version    1.05
// @description  reformats the titles of YouTube videos to be windows filename compatible on click. - Rebuilt to work better.
// @match      http*://www.youtube.com/watch*
// @copyright  2021, sm
// @license MIT
// ==/UserScript==
// @require http://code.jquery.com/jquery-3.4.1.min.js

console.log("docReady waiting ")

let i = 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 = 1000;
    runFunctionTimer = setInterval(function () {
        if (i < 20) {
            addButtonsAndWatch();
            i++
            if (interval < 7000){ interval += 1000}
        }
    }, interval);
}



function addButtonsAndWatch() { //creates buttons and runs the actual logic

    let buttons = ""
    buttons = addButtons(buttons)
    function addButtons(buttonsString) {
        let inputBox0 = "<h1 id='targetYTFormatter'></h1><span><input id='formatTitleInput' placeholder='Insert title here' /><button id='formatTitleButton1'>Format Title</button></span>"
        let button2 = "<span><button id='formatDescriptionButton' hidden>Format Description</button><button id='fetch'>Fetch Title</button></span>"
        let button3 = "<span><button id='appendName'>Append Channel Name</button></span>"
        let button4 = "<span><button id='prependName'>Prepend Channel Name</button></span>"
        let button5 = "<span><button id='removeName'>Remove Name</button></span>"
        buttonsString = buttonsString + "<br />" + inputBox0 + button2 + "<br>" + button4 + button3 + button5;
        return buttonsString
    }

    let DescriptionBox = document.getElementById("meta");
    let pageString = document.getElementById("columns");
    if (pageString != null) {
        pageString = pageString.innerHTML
        let regexTestCalled = new RegExp("appendName", "gmi")
        if (pageString && !pageString.match(regexTestCalled)) {
            console.log("indide box")
            DescriptionBox.insertAdjacentHTML('beforebegin', buttons)
            // pageString = document.getElementById("columns").innerHTML();
            function2();
        }
    }
}


function function2() { // logic, looks for button presses and replaces text
    docReady(function () {

        //Buttons
        let titleButton = document.querySelector("#formatTitleButton");
        let titleButton1 = document.querySelector("#formatTitleButton1");
        let prependName = document.querySelector("#appendName");
        let appendName = document.querySelector("#prependName");
        let removeName = document.querySelector("#removeName");
        let fetch = document.querySelector("#fetch");


        let discription = document.querySelector("#description > yt-formatted-string")
        if (discription != null) { discription = discription.innerHTML }
        let channelNameHolder = document.querySelector("#text > a");
        if (channelNameHolder != null) { channelNameHolder = channelNameHolder.innerHTML }


       function getUserTitle() {
            let userTitle = document.querySelector("#formatTitleInput")
            userTitle = userTitle.value

            return userTitle
        }

        function getChannelName() {
            let channelNameHolder = document.querySelector("#text > a");
            if (channelNameHolder != null) { channelNameHolder = channelNameHolder.innerHTML }
            return channelNameHolder
        }


        let userTitle = getUserTitle();


        let target = document.querySelector("#targetYTFormatter");

        function findTitle(){ // fetches title and rerturns to input
            let title = document.title
                    console.log("title = ",title)
            let trimTitle = title.split("- YouTube")
            title = trimTitle[0].trim()
                    console.log(title)

            document.querySelector("#formatTitleInput").value = title
        }




        function runTitle1(hide){
             let target = document.querySelector("#targetYTFormatter");
            if (target.innerHTML == "" || !hide) {
            userTitle = getUserTitle();
                channelNameHolder = getChannelName();
                target.innerHTML = ""
                let fixedTitle = isValid(userTitle)
                target.innerHTML = fixedTitle
            } else {
                target.innerHTML = ""
            }
        }
                fetch.onclick = function(e){
        console.log("fetch")
        findTitle()
            runTitle1(false)
        }


        titleButton1.onclick = function (e) {//turn title into button
            runTitle1(true)
        }

        appendName.onclick = function (e) {//turn title into button
            userTitle = getUserTitle();
            channelNameHolder = getChannelName();
            let target = document.querySelector("#targetYTFormatter");
            target.innerHTML = ""
            let fixedTitle = isValid(userTitle)
            let fixedChannelName = isValid(channelNameHolder)
            target.innerHTML = fixedChannelName + " - " + fixedTitle
        }


        prependName.onclick = function (e) {//turn title into button
            userTitle = getUserTitle();
            channelNameHolder = getChannelName();
            let target = document.querySelector("#targetYTFormatter");
           // target.innerHTML = ""
            let fixedTitle = isValid(userTitle)
            let fixedChannelName = isValid(channelNameHolder)
            target.innerHTML = fixedTitle + " - " + fixedChannelName
        }


        removeName.onclick = function (e) {//turn title into button
            userTitle = getUserTitle();
            channelNameHolder = getChannelName();
            let target = document.querySelector("#targetYTFormatter");
            target.innerHTML = ""
            let fixedTitle = isValid(userTitle)
            target.innerHTML = fixedTitle

        }


        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("and amp ", " and ")
                fname = fname.replace("|", " - ")
                fname = fname.replace("☆", " ")
                fname = fname.replace("<font>", " ")
                fname = fname.replace("</font>", " ")
                fname = fname.replace("< font>", " ")
                fname = fname.replace("</ font>", " ")
                fname = fname.replace("< /font>", " ")

            }
            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);
    }
}
// ==UserScript==
// @name         New Userscript
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        http://*/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    // Your code here...
})();