您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Enable or disable features which may or may not be experimental/web version only.
- // ==UserScript==
- // @name Toggle Features
- // @description Enable or disable features which may or may not be experimental/web version only.
- // @author bertigert
- // @version 1.0.2
- // @icon https://www.google.com/s2/favicons?sz=64&domain=deezer.com
- // @namespace Violentmonkey Scripts
- // @match https://www.deezer.com/*
- // @grant none
- // @run-at document-start
- // ==/UserScript==
- (function() {
- "use strict";
- // ======= Settings START =======
- const LOG_ALL_FEATURES_DEBUG = true; // useful to see all features (gets logged in the (dev tools) console, use https://github.com/bertigert/DeezMod/blob/main/plugins/enable_dev_mode.js to view)
- const DEEZER_CUSTOM_FEATURES = {
- // gapless_playback: true,
- deeztools: true, // simple way to toggle most of the custom features
- }
- const SPECIAL_FEATURES = {
- spoof_family: false, // Spoof your account to be the head of a family plan if you are a child account of a family account, opening up more features for you. (e.g. linking to last.fm)
- }
- // ======= Settings END =======
- function log(...args) {
- console.log("[Toggle Features]", ...args);
- }
- function error(...args) {
- console.error("[Toggle Features]", ...args);
- }
- function debug(...args) {
- console.debug("[Toggle Features]", ...args);
- }
- const original_fetch = window.fetch;
- log("Hooking fetch");
- window.fetch = async function (...args) {
- try {
- const url = new URL(args[0]);
- if (url.pathname !== "/ajax/gw-light.php" ||
- url.searchParams.get("method") !== "deezer.getUserData" ||
- url.searchParams.get("api_token") !== "" ||
- !url.searchParams.has("cid") ||
- typeof args[1].body !== "string"
- ) {
- return original_fetch.apply(window, args);
- }
- debug('Catched user data fetch call');
- const response = await original_fetch.apply(window, args);
- const resp_json = await response.json();
- if (resp_json.results) {
- // Special features
- if (SPECIAL_FEATURES.spoof_family) {
- resp_json.results.USER.MULTI_ACCOUNT = {"ENABLED": true,"ACTIVE": true,"CHILD_COUNT": 0,"MAX_CHILDREN": 0,"PARENT": null,"IS_KID": false,"IS_SUB_ACCOUNT": false}
- }
- // Deezer custom features
- const features = resp_json.results.__DZR_GATEKEEPS__;
- if (LOG_ALL_FEATURES_DEBUG) {
- log('All Features:', features, "Special Features:", SPECIAL_FEATURES);
- }
- for (let feature of Object.entries(DEEZER_CUSTOM_FEATURES)) {
- features[feature[0]] = feature[1];
- log(feature[1] ? 'Enabled' : 'Disabled', feature[0]);
- }
- }
- // since this request is only made once, we can unhook now
- log("Unhooking fetch");
- window.fetch = original_fetch;
- return new Response(JSON.stringify(resp_json), {
- status: response.status,
- statusText: response.statusText,
- headers: response.headers,
- });
- } catch (e) {
- error("Error in fetch hook:", e);
- return original_fetch.apply(window, args);
- }
- }
- })();