您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Makes Invidious settings persist across instances and in private browsing.
当前为
- // ==UserScript==
- // @name Persistent Invidious Settings
- // @namespace http://tampermonkey.net/
- // @version 1.20
- // @description Makes Invidious settings persist across instances and in private browsing.
- // @author Veeno
- // @license GPLv3
- // @connect api.invidious.io
- // @match https://*/*
- // @icon https://invidious.io/invidious-colored-vector.svg
- // @run-at document-start
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM_xmlhttpRequest
- // ==/UserScript==
- /* jshint esversion: 11 */
- (() => {
- 'use strict';
- if(window.self !== window.top) return;
- function execute(domainUpToDate){
- const domain = location.hostname;
- if(!Object.hasOwn(domainUpToDate, domain)) return;
- function validateCurrentDomain(){
- domainUpToDate[domain] = true;
- GM_setValue("Invidious_DomainUpToDate", domainUpToDate);
- }
- function invalidateOtherDomains(){
- Object.keys(domainUpToDate).forEach(key => { domainUpToDate[key] = false; });
- validateCurrentDomain();
- }
- const storedSettings = GM_getValue(
- "Invidious_Settings",
- 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 cookieSettings = document.cookie
- .split("; ")
- .find(entry => entry.startsWith("PREFS="))
- ?.slice(6);
- 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();
- }
- }
- const now = (new Date()).getTime();
- if(now - GM_getValue("Invidious_InstancesUpdatedAt", 0) > 172800000){
- GM_xmlhttpRequest({
- method: "GET",
- url: "https://api.invidious.io/instances.json",
- responseType: "json",
- onload: function(response){
- execute((() => {
- const storedDomainUpToDate = GM_getValue("Invidious_DomainUpToDate", {});
- try{
- const domainUpToDate = Object.fromEntries(
- response.response
- .filter(instance => instance[1].type === "https")
- .map(instance => [instance[0], storedDomainUpToDate[instance[0]] || false])
- );
- GM_setValue("Invidious_DomainUpToDate", domainUpToDate);
- GM_setValue("Invidious_InstancesUpdatedAt", now);
- return domainUpToDate;
- } catch(e){
- console.error("Error parsing Invidious instances", e, response);
- return storedDomainUpToDate;
- }
- })());
- },
- onerror: function(response){
- console.error("Error loading Invidious instances", response);
- }
- });
- } else{
- execute(GM_getValue("Invidious_DomainUpToDate", {}));
- }
- })();