// ==UserScript== // @name ๐ŸŽธ Songsterr Ultimate // @namespace http://tampermonkey.net/ // @version 3.0 // @description Unlocks all Plus features (Speed, Loop, Solo) and Native Download (.gp7 and .midi). (Tested on Zen Browser) // @author Goulagman // @supportURL https://github.com/GoulagmanYt/Songsterr-Plus-Ultimate-Unlocker- // @match *://www.songsterr.com/* // @require https://cdn.jsdelivr.net/npm/@coderline/alphatab@1.8.1/dist/alphaTab.min.js // @connect dqsljvtekg760.cloudfront.net // @grant unsafeWindow // @grant GM_xmlhttpRequest // @grant GM_addStyle // @run-at document-start // @license MIT // @downloadURL none // ==/UserScript== (function () { 'use strict'; console.log('๐ŸŽธ Songsterr Ultimate โ€” Actif v3.1.0'); // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• // 0. NETTOYAGE PRร‰VENTIF // Supprime l'รฉtat Redux mis en cache pour forcer une session propre // et รฉviter que le profil "free" ne soit chargรฉ depuis le localStorage. // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• try { localStorage.removeItem('persist:root'); } catch (e) {} // Rรฉfรฉrence ร  la vraie fenรชtre (contourne l'isolation Tampermonkey) const targetWindow = typeof unsafeWindow !== 'undefined' ? unsafeWindow : window; // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• // 1. PROFIL "MAGIQUE" PLUS // ID alรฉatoire ร  chaque session pour contourner la limite de // tรฉlรฉchargements journaliers (HTTP 429 Too Many Requests). // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• const MAGIC_ID = Math.floor(Math.random() * 900000000) + 100000000; const MAGIC_PROFILE = { id : MAGIC_ID, uid : MAGIC_ID, email : `plususer${MAGIC_ID}@songsterr.com`, name : 'Plus User (Unlocked)', plan : 'plus', hasPlus : true, permissions : [], subscription : { plan: { id: 'plus' } }, bonusPurchasedFeatures: [], signature : 'patched_signature', hadPlusBeforeSE : true }; // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• // 2. INTERCEPTION Rร‰SEAU // On accroche fetch() trรจs tรดt (document-start) pour : // A. Renvoyer notre faux profil Plus sur /auth/profile // B. Bloquer les appels de logs/analytics/sentry (bruit inutile) // NOTE : on ne touche PAS ร  /api/edits/download โ€” notre tรฉlรฉchargeur // GP7/MIDI est supรฉrieur au .gp5 natif. // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• const fetchOriginal = targetWindow.fetch; const fetchHooked = async function (resource, options) { // Dรฉtermine si resource est un objet Request ou une simple URL string const isReqObj = typeof resource === 'object' && resource instanceof Request; const url = isReqObj ? resource.url : (resource || ''); // --- A. USURPATION DE PROFIL --- // Songsterr interroge cette route pour savoir si l'utilisateur a un abonnement. // On renvoie notre profil "plus" forgรฉ pour dรฉbloquer Speed, Loop, Solo. if (url.includes('/auth/profile')) { return new Response(JSON.stringify(MAGIC_PROFILE), { status : 200, headers: { 'Content-Type': 'application/json' } }); } // --- B. BLOCAGE DES LOGS & ANALYTICS --- // ร‰vite d'envoyer des donnรฉes de tรฉlรฉmรฉtrie pendant nos opรฉrations. if (url.match(/(sentry|logs|analytics|useraudio)/i)) { return new Response('{}', { status: 200 }); } // Toutes les autres requรชtes passent normalement return fetchOriginal(resource, options); }; // Mode furtif : toString() renvoie l'original pour dรฉjouer les dรฉtections fetchHooked.toString = () => fetchOriginal.toString(); // Injection robuste avec Object.defineProperty pour survivre aux re-dรฉfinitions try { Object.defineProperty(targetWindow, 'fetch', { value : fetchHooked, writable : true, configurable: true }); } catch (e) { targetWindow.fetch = fetchHooked; // Fallback navigateurs anciens } // โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• // 3. INJECTION D'ร‰TAT DOM // Songsterr stocke son รฉtat Redux dans