"newest" filter restorer

well, what do you think it does, buddy?

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         "newest" filter restorer
// @namespace    http://tampermonkey.net/
// @version      v0.1
// @description  well, what do you think it does, buddy?
// @author       cv
// @match        *://*.youtube.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=youtube.com
// @run-at       document-start
// ==/UserScript==

(function() {
    "use strict";

    let isnewestselected = false;
    let newestfilterelement = null;

    function checkurlfornewest() {
        try {
            const url = new URL(window.location.href);
            const spparam = url.searchParams.get("sp");
            isnewestselected = (spparam === "CAI%3D" || spparam === "CAI%253D" ||
                               decodeURIComponent(spparam || "") === "CAI=" ||
                               decodeURIComponent(decodeURIComponent(spparam || "")) === "CAI=");
        } catch (e) {
            isnewestselected = false;
        }
    }
    checkurlfornewest();

    function addnewestfilter() {
        const dialog = document.querySelector("ytd-search-filter-options-dialog-renderer");
        if (!dialog) return false;
        const isopen = dialog.hasAttribute("opened") ||
            (window.getComputedStyle(dialog).display !== "none" &&
            window.getComputedStyle(dialog).visibility !== "hidden");
        if (!isopen) return false;
        let filtergoops = dialog.querySelectorAll("ytd-search-filter-group-renderer");
        let filtergoop = null;
        for (const group of filtergoops) {
            const header = group.querySelector("h4 yt-formatted-string");
            if (header && header.textContent.trim() === "Prioritize") {
                filtergoop = group;
                break;
            }
        }
        if (!filtergoop) {
            filtergoops = document.querySelectorAll("ytd-search-filter-group-renderer");
            for (const group of filtergoops) {
                const header = group.querySelector("h4 yt-formatted-string");
                if (header && header.textContent.trim() === "Prioritize") {
                    filtergoop = group;
                    break;
                }
            }
        }
        if (!filtergoop) return false;
        const existingnewest = filtergoop.querySelector("[data-filter='newest']");
        if (existingnewest) {
            const fs = existingnewest.querySelector("yt-formatted-string");
            if (fs) {
                fs.removeAttribute("is-empty");
                if (!fs.textContent || fs.textContent.trim() === "") {
                    const as = fs.querySelector("yt-attributed-string");
                    if (as && (!as.textContent || as.textContent.trim() === "")) as.remove();
                    fs.textContent = "Newest";
                }
            }
            checkurlfornewest();
            if (isnewestselected) {
                existingnewest.classList.add("selected");
                const link = existingnewest.querySelector("a");
                if (link) {
                    link.setAttribute("aria-selected", "true");
                }
                const dismissicon = existingnewest.querySelector("#dismiss-x");
                if (dismissicon) {
                    dismissicon.setAttribute("hidden", "");
                }
            } else {
                existingnewest.classList.remove("selected");
                const link = existingnewest.querySelector("a");
                if (link) {
                    link.removeAttribute("aria-selected");
                }
                const dismissicon = existingnewest.querySelector("#dismiss-x");
                if (dismissicon) {
                    dismissicon.removeAttribute("hidden");
                }
            }

            const filters = filtergoop.querySelectorAll("ytd-search-filter-renderer:not([data-filter='newest'])");
            const firstfilter = filters[0];
            if (firstfilter && existingnewest.nextSibling !== firstfilter && existingnewest.previousSibling !== firstfilter) {
                firstfilter.parentNode.insertBefore(existingnewest, firstfilter);
            }
            return true;
        }
        const filters = filtergoop.querySelectorAll("ytd-search-filter-renderer");
        let filtertoclone = null;
        for (const filter of filters) {
            const fs = filter.querySelector("yt-formatted-string");
            if (fs && fs.textContent && fs.textContent.trim() !== "" && !fs.hasAttribute("is-empty")) {
                filtertoclone = filter;
                break;
            }
        }
        if (!filtertoclone) filtertoclone = filters[0];
        if (!filtertoclone) return false;
        const firstfilter = filters[0];
        try {
            const currenturl = new URL(window.location.href);
            const spparam = currenturl.searchParams.get("sp");
            isnewestselected = (spparam === "CAI%3D" || spparam === "CAI%253D" ||
                               decodeURIComponent(spparam || "") === "CAI=" ||
                               decodeURIComponent(decodeURIComponent(spparam || "")) === "CAI=");
        } catch (e) {
            isnewestselected = false;
        }
        const newestfilter = filtertoclone.cloneNode(true);
        newestfilter.setAttribute("data-filter", "newest");
        newestfilter.classList.remove("selected");
        if (isnewestselected) {
            newestfilter.classList.add("selected");
            const link = newestfilter.querySelector("a");
            if (link) {
                link.setAttribute("aria-selected", "true");
            }
            const dismissicon = newestfilter.querySelector("#dismiss-x");
            if (dismissicon) {
                dismissicon.setAttribute("hidden", "");
            }
            filtergoop.querySelectorAll("ytd-search-filter-renderer").forEach(filter => {
                if (filter !== newestfilter) {
                    filter.classList.remove("selected");
                    const otherlink = filter.querySelector("a");
                    if (otherlink) {
                        otherlink.removeAttribute("aria-selected");
                    }
                }
            });
        } else {
            newestfilter.classList.remove("selected");
            const link = newestfilter.querySelector("a");
            if (link) {
                link.removeAttribute("aria-selected");
            }
            const dismissicon = newestfilter.querySelector("#dismiss-x");
            if (dismissicon && !isnewestselected) {
                dismissicon.removeAttribute("hidden");
            }
        }
        const formattedstring = newestfilter.querySelector("yt-formatted-string");
        if (formattedstring) {
            formattedstring.removeAttribute("is-empty");
            const attributedstring = formattedstring.querySelector("yt-attributed-string");
            if (attributedstring) attributedstring.remove();
            formattedstring.textContent = "Newest";
            if (!formattedstring.textContent || formattedstring.textContent.trim() === "") {
                formattedstring.innerHTML = "Newest";
            }
        }
        const label = newestfilter.querySelector("#label");
        if (label) {label.setAttribute("title", "Prioritize by upload date")}
        const link = newestfilter.querySelector("a");
        if (link) {
            const currenturl = new URL(window.location.href);
            const searchquery = currenturl.searchParams.get("search_query") || "";
            const newhref = `/results?search_query=${encodeURIComponent(searchquery)}&sp=CAI%253D`; // CAI= stands for.. uh.. CneAwestI=.. according to youtube
            link.href = newhref;
            link.setAttribute("href", newhref);
            if (!link.classList.contains("yt-simple-endpoint")) {
                link.classList.add("yt-simple-endpoint");
            }
            const otherlink = filtergoop.querySelector("ytd-search-filter-renderer:not([data-filter='newest']) a");
            if (otherlink && otherlink.hasAttribute("endpoint")) {
                try {
                    const endpointdata = otherlink.getAttribute("endpoint");
                    if (endpointdata) link.setAttribute("endpoint", endpointdata);
                } catch (e) {}
            }
            link.addEventListener("click", (e) => {
                isnewestselected = true;
                setTimeout(() => {
                    const currenturl = window.location.href;
                    if (!currenturl.includes("sp=CAI") && !currenturl.includes("sp=CAI%3D")) {
                        const url = new URL(window.location.href);
                        url.searchParams.set("sp", "CAI%3D");
                        window.location.href = url.href;
                    }
                }, 100);
            }, false);
        }
        try {
            firstfilter.parentNode.insertBefore(newestfilter, firstfilter);
            newestfilterelement = newestfilter;
            for (let delay of [10, 50, 100, 200]) {
                setTimeout(() => {
                    const fs = newestfilter.querySelector("yt-formatted-string");
                    if (fs) {
                        fs.removeAttribute("is-empty");
                        const as = fs.querySelector("yt-attributed-string");
                        if (as && (!as.textContent || as.textContent.trim() === "")) as.remove();
                        if (!fs.textContent || fs.textContent.trim() === "") {
                            fs.textContent = "Newest";
                        }
                    }
                    const linkafter = newestfilter.querySelector("a");
                    if (linkafter) {
                        const currenturl = new URL(window.location.href);
                        const searchquery = currenturl.searchParams.get("search_query") || "";
                        const newhref = `/results?search_query=${encodeURIComponent(searchquery)}&sp=CAI%253D`;
                        linkafter.href = newhref;
                        linkafter.setAttribute("href", newhref);
                    }
                    const currenturl = new URL(window.location.href);
                    const spparam = currenturl.searchParams.get("sp");
                    const isselected = (spparam === "CAI%3D" || spparam === "CAI%253D" ||
                                       decodeURIComponent(spparam || "") === "CAI=" ||
                                       decodeURIComponent(decodeURIComponent(spparam || "")) === "CAI=");

                    if (isselected) {
                        newestfilter.classList.add("selected");
                        const linkafter = newestfilter.querySelector("a");
                        if (linkafter) {
                            linkafter.setAttribute("aria-selected", "true");
                        }
                        const dismissicon = newestfilter.querySelector("#dismiss-x");
                        if (dismissicon) {
                            dismissicon.setAttribute("hidden", "");
                        }
                    } else {
                        newestfilter.classList.remove("selected");
                        const linkafter = newestfilter.querySelector("a");
                        if (linkafter) {
                            linkafter.removeAttribute("aria-selected");
                        }
                        const dismissicon = newestfilter.querySelector("#dismiss-x");
                        if (dismissicon) {
                            dismissicon.removeAttribute("hidden");
                        }
                    }
                }, delay);
            }
            const goopobserver = new MutationObserver((mutations) => {
                const currentgroup = document.querySelector("ytd-search-filter-group-renderer");
                const currentnewest = currentgroup && currentgroup.querySelector("[data-filter='newest']");
                const currentfirst = currentgroup && currentgroup.querySelector("ytd-search-filter-renderer:not([data-filter='newest'])");
                if (!currentnewest && currentfirst) {
                    setTimeout(() => addnewestfilter(), 50);
                }
            });
            if (filtergoop.parentNode) {
                goopobserver.observe(filtergoop, {
                    childList: true,
                    subtree: false
                });
                setTimeout(() => goopobserver.disconnect(), 10000);
            }
            return true;
        } catch (e) {return false}
    }

    function startfilter() {
        requestAnimationFrame(() => {
            let attempts = 0;
            const maxattempts = 10;
            const tryadd = () => {
                attempts++;
                if (addnewestfilter()) return true;
                if (attempts < maxattempts) {
                    setTimeout(tryadd, 150);
                } else {
                    const waitforbody = () => {
                        if (!document.body) {
                            setTimeout(waitforbody, 100);
                            return;
                        }
                        const observer = new MutationObserver(() => {
                            if (addnewestfilter()) {
                                observer.disconnect();
                            }
                        });
                        observer.observe(document.body, {
                            childList: true,
                            subtree: true
                        });
                        setTimeout(() => observer.disconnect(), 5000);
                    }; waitforbody();
                }
                return false;
            }; tryadd();
        });
    }

    if (document.readyState === "loading") {
        document.addEventListener("DOMContentLoaded", startfilter);
    } else {
        startfilter();
    }

    function setupobservers() {
        if (document.documentElement) {
            let lasturl = location.href;
            const navobserver = new MutationObserver(() => {
                const currenturl = location.href;
                if (currenturl !== lasturl) {
                    lasturl = currenturl;
                    checkurlfornewest();
                    setTimeout(startfilter, 300);
                }
            });
            navobserver.observe(document.documentElement, {
                subtree: true,
                childList: true
            });
        }
        const waitforbody = setInterval(() => {
            if (document.body) {
                clearInterval(waitforbody);
                const filterobserver = new MutationObserver((mutations) => {
                    const filterdialog = document.querySelector("ytd-search-filter-options-dialog-renderer");
                    const isopen = filterdialog && (
                        filterdialog.hasAttribute("opened") ||
                        window.getComputedStyle(filterdialog).display !== "none"
                    );
                    if (isopen) {
                        requestAnimationFrame(() => {
                            requestAnimationFrame(() => {
                                for (let i = 0; i < 8; i++) {
                                    setTimeout(() => {
                                        addnewestfilter();
                                    }, i * 100 + 50);
                                }
                            });
                        });
                    }
                    const filtergoop = document.querySelector("ytd-search-filter-group-renderer");
                    if (filtergoop && isopen) {
                        requestAnimationFrame(() => {
                            setTimeout(() => addnewestfilter(), 50);
                        });
                    }
                });
                filterobserver.observe(document.body, {
                    childList: true,
                    subtree: true,
                    attributes: true,
                    attributeFilter: ["opened", "style", "class"]
                });
                const dialogobserver = new MutationObserver(() => {
                    const filterdialog = document.querySelector("ytd-search-filter-options-dialog-renderer");
                    if (filterdialog) {
                        const dialogopenobserver = new MutationObserver(() => {
                            if (filterdialog.hasAttribute("opened")) {
                                requestAnimationFrame(() => {
                                    requestAnimationFrame(() => {
                                        for (let i = 0; i < 8; i++) {
                                            setTimeout(() => addnewestfilter(), i * 100 + 50);
                                        }
                                    });
                                });
                            }
                        });
                        dialogopenobserver.observe(filterdialog, {
                            attributes: true,
                            attributeFilter: ["opened"]
                        });
                    }
                });
                dialogobserver.observe(document.body, {
                    childList: true,
                    subtree: true
                });
            }
        }, 100);
        setTimeout(() => clearInterval(waitforbody), 10000);
    }

    if (document.readyState === "loading") {
        document.addEventListener("DOMContentLoaded", setupobservers);
    } else {
        setupobservers();
    }

})();