Persistent Invidious Settings

Makes Invidious settings persist across instances and in private browsing.

目前为 2023-02-14 提交的版本。查看 最新版本

// ==UserScript==
// @name         Persistent Invidious Settings
// @namespace    http://tampermonkey.net/
// @version      1.01
// @description  Makes Invidious settings persist across instances and in private browsing.
// @author       Veeno
// @license      GPLv3
// @match        invidious.snopyta.org/*
// @match        yewtu.be/*
// @match        invidious.kavin.rocks/*
// @match        vid.puffyan.us/*
// @match        invidious.namazso.eu/*
// @match        inv.riverside.rocks/*
// @match        yt.artemislena.eu/*
// @match        invidious.flokinet.to/*
// @match        invidious.esmailelbob.xyz/*
// @match        inv.bp.projectsegfau.lt/*
// @match        y.com.sb/*
// @match        invidious.tiekoetter.com/*
// @match        invidious.nerdvpn.de/*
// @match        inv.vern.cc/*
// @match        invidious.slipfox.xyz/*
// @match        watch.thekitty.zone/*
// @match        invidious.dhusch.de/*
// @match        inv.odyssey346.dev/*
// @match        invidious.baczek.me/*
// @match        invidious.weblibre.org/*
// @match        invidious.privacydev.net/*
// @match        yt.funami.tech/*
// @match        invidious.drivet.xyz/*
// @match        vid.priv.au/*
// @match        invidious.lidarshield.cloud/*
// @match        invidious.silur.me/*
// @match        iv.melmac.space/*
// @match        iv.ggtyler.dev/*
// @match        invidious.epicsite.xyz/*
// @match        invidious.sethforprivacy.com/*
// @match        yt.oelrichsgarcia.de/*
// @icon         https://invidious.io/invidious-colored-vector.svg
// @run-at       document-start
// @grant        GM_getValue
// @grant        GM_setValue
// ==/UserScript==

/* jshint esversion: 11 */

(function() {
    'use strict';

    if(window.self !== window.top) return;

    const domain = location.hostname;

    const defaultDomainUpToDate = {
        "invidious.snopyta.org": true,
        "yewtu.be": true,
        "invidious.kavin.rocks": true,
        "vid.puffyan.us": true,
        "invidious.namazso.eu": true,
        "inv.riverside.rocks": true,
        "yt.artemislena.eu": true,
        "invidious.flokinet.to": true,
        "invidious.esmailelbob.xyz": true,
        "inv.bp.projectsegfau.lt": true,
        "y.com.sb": true,
        "invidious.tiekoetter.com": true,
        "invidious.nerdvpn.de": true,
        "inv.vern.cc": true,
        "invidious.slipfox.xyz": true,
        "watch.thekitty.zone": true,
        "invidious.dhusch.de": true,
        "inv.odyssey346.dev": true,
        "invidious.baczek.me": true,
        "invidious.weblibre.org": true,
        "invidious.privacydev.net": true,
        "yt.funami.tech": true,
        "invidious.drivet.xyz": true,
        "vid.priv.au": true,
        "invidious.lidarshield.cloud": true,
        "invidious.silur.me": true,
        "iv.melmac.space": true,
        "iv.ggtyler.dev": true,
        "invidious.epicsite.xyz": true,
        "invidious.sethforprivacy.com": true,
        "yt.oelrichsgarcia.de": true
    };

    const domainUpToDate = GM_getValue("Invidious_DomainUpToDate", defaultDomainUpToDate);

    function validateCurrentDomain(){
        domainUpToDate[domain] = true;
        GM_setValue("Invidious_DomainUpToDate", domainUpToDate);
    }

    function invalidateOtherDomains(){
        Object.keys(domainUpToDate).forEach(key => { domainUpToDate[key] = false; });
        validateCurrentDomain();
    }

    const defaultSettings = encodeURIComponent(JSON.stringify({
        "annotations": false,
        "annotations_subscribed": false,
        "autoplay": true,
        "automatic_instance_redirect": false,
        "captions": [
            "",
            "",
            ""
        ],
        "comments": [
            "youtube",
            ""
        ],
        "continue": false,
        "continue_autoplay": true,
        "dark_mode": "",
        "latest_only": false,
        "listen": false,
        "local": false,
        "watch_history": false,
        "vr_mode": true,
        "show_nick": false,
        "locale": "en-US",
        "region": "US",
        "max_results": 40,
        "notifications_only": false,
        "player_style": "invidious",
        "quality": "hd720",
        "quality_dash": "auto",
        "default_home": "Popular",
        "feed_menu": [
            "Popular",
            "Trending"
        ],
        "related_videos": true,
        "sort": "published",
        "speed": 1,
        "thin_mode": false,
        "unseen_only": false,
        "video_loop": false,
        "extend_desc": false,
        "volume": 100,
        "save_player_pos": false
    }));

    const storedSettings = GM_getValue("Invidious_Settings", defaultSettings);

    const cookieSettings = document.cookie
                                   .split("; ")
                                   .find((entry) => entry.startsWith("PREFS="))
                                   ?.split("=")[1];

    if(cookieSettings && domainUpToDate[domain]){
        if(cookieSettings !== storedSettings){
            GM_setValue("Invidious_Settings", cookieSettings);
            invalidateOtherDomains();
        }
    } else{
        const date = new Date();
        date.setFullYear(date.getFullYear() + 2);
        document.cookie = "PREFS=" + storedSettings + "; domain=" + domain + "; path=/; expires=" + date.toGMTString() + "; Secure; SameSite=Lax";
        validateCurrentDomain();
        location.reload();
    }
})();