Author SHA1 Message Date
amd64fox 20668e69ef version bump to 1.3.3
- update css selectors
2026-10-02 06:08:24 +03:00
amd64fox 8d31a4e0ed fix: adapt native crossfade patches for spotify 1.3.3
- support updated x64 and arm64 crossfade layouts
- handle arm64 list player boolean reads and preserve older versions
2026-10-02 06:08:24 +03:00
amd64fox ddd9257d73 fix: adapt emptyblock and banner_home for spotify 1.3.3
- handle adsenabled assignments in emptyblock
- handle payload assignments in banner_home and preserve older patterns
2026-10-02 06:08:24 +03:00
amd64fox 893a1cca43 fix(js-helper): encode spotify app versions correctly 2026-10-02 03:13:33 +03:00
amd64fox bee81013be version bump to 1.3.1
- fix update request timeout coverage
- fix installer preparation and helper injection
- fixes #897 by disabling native list player for crossfade
2026-09-22 13:49:25 +03:00
amd64fox 15bf4355c2 fix: use curl for arm64 installer downloads 2026-09-10 00:32:15 +03:00
amd64fox 84be4206fd ops: add arm64 validation to spotx checks 2026-09-10 00:11:26 +03:00
amd64fox 1639ffb508 update logo
- refresh the existing logo and reference it from the readme
2026-09-09 04:28:14 +03:00
amd64fox 9fa954acd2 version bump to 1.3.0
- fix the banner_home patch
- update css selectors for hiding download buttons, menu items, and quality settings
- update css selectors for static lyrics themes
- skip snapshot creation in spicetify #892
2026-09-09 03:29:42 +03:00
amd64fox 9d34465886 fix: apply mirror mode to LoaderSpot manifest
#891
2026-09-03 21:04:39 +03:00
amd64fox fd064f5492 added arm support for binary patches crossfade_enabled and block_slots
#888
2026-09-02 01:17:13 +03:00
amd64fox 1d19a68f58 version bump to 1.2.99 2026-08-31 22:34:43 +03:00
amd64fox f4cf592bf0 version bump to 1.2.97 2026-08-16 11:13:54 +03:00
7 changed files with 1915 additions and 628 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 19 KiB

+64 -3
View File
@@ -15,7 +15,8 @@ jobs:
runs-on: windows-latest
steps:
- name: Run Spotx
- name: Prepare checks
id: prepare
shell: powershell
env:
SPOTIFY_VERSION: ${{ inputs.version }}
@@ -46,6 +47,7 @@ jobs:
# Incoming parameters
$parameters = @{
Verbose = $true
no_pause = $true
new_theme = $true
version = $spotifyVersion
confirm_spoti_recomended_over = $true
@@ -59,7 +61,66 @@ jobs:
lyrics_block = $true
}
# Run Spotx
$spotxUrl = "https://raw.githubusercontent.com/SpotX-Official/SpotX/refs/heads/main/run.ps1"
$spotxScript = [scriptblock]::Create((Invoke-WebRequest -UseBasicParsing -Uri $spotxUrl).Content)
Invoke-WebRequest -UseBasicParsing -Uri $spotxUrl -OutFile "$env:RUNNER_TEMP\spotx.ps1"
$parameters | Export-Clixml -LiteralPath "$env:RUNNER_TEMP\spotx-parameters.xml"
- name: Run SpotX (x64)
shell: powershell
run: |
$parameters = Import-Clixml -LiteralPath "$env:RUNNER_TEMP\spotx-parameters.xml"
$spotxScript = [scriptblock]::Create((Get-Content -LiteralPath "$env:RUNNER_TEMP\spotx.ps1" -Raw -Encoding UTF8))
& $spotxScript @parameters
- name: Run SpotX (ARM64 files)
if: ${{ !cancelled() && steps.prepare.outcome == 'success' }}
shell: powershell
run: |
$parameters = Import-Clixml -LiteralPath "$env:RUNNER_TEMP\spotx-parameters.xml"
$checkVersion = $parameters.version
$installedSpotify = Join-Path $env:APPDATA 'Spotify\Spotify.exe'
if (Test-Path -LiteralPath $installedSpotify) {
$checkVersion = (Get-Item -LiteralPath $installedSpotify).VersionInfo.FileVersion
}
$jsonUrl = 'https://raw.githubusercontent.com/LoaderSpot/table/refs/heads/main/table/versions.json'
$manifest = Invoke-RestMethod -Uri $jsonUrl
$entry = $manifest.PSObject.Properties | Where-Object {
$_.Name -eq $checkVersion -or $_.Value.fullversion -eq $checkVersion -or
($checkVersion -match '^\d+\.\d+\.\d+$' -and $_.Name.StartsWith("$checkVersion."))
} | Sort-Object { [version]$_.Name } -Descending | Select-Object -First 1
$installer = $entry.Value.win.arm64
if (-not $installer.url -or $installer.size -le 0) {
throw "No ARM64 installer found for Spotify $checkVersion"
}
if ($entry.Value.fullversion -notmatch '^\d+\.\d+\.\d+\.\d+\.g[0-9a-f]{8}$') {
throw "Invalid Spotify fullversion for $checkVersion"
}
$installerPath = Join-Path $env:RUNNER_TEMP 'SpotifySetup-arm64.exe'
Write-Host "ARM64 Spotify version: $($entry.Value.fullversion)"
Write-Host "Source: $($installer.url)"
for ($attempt = 1; $attempt -le 3; $attempt++) {
Write-Host "ARM64 installer download attempt $attempt/3"
curl.exe -q -L --fail-with-body --connect-timeout 15 --progress-bar -o $installerPath --url $installer.url
if ($LASTEXITCODE -eq 0) {
$downloadedSize = (Get-Item -LiteralPath $installerPath).Length
if ($downloadedSize -eq $installer.size) { break }
Write-Warning "ARM64 installer size mismatch: expected $($installer.size), got $downloadedSize"
}
if ($attempt -eq 3) { throw 'ARM64 installer download failed after 3 attempts' }
Start-Sleep -Seconds 5
}
$unpackerUrl = 'https://raw.githubusercontent.com/SpotX-Official/Spotify-EXE-Unpacker/refs/heads/main/spotify_exe_unpacker.py'
$unpackerPath = Join-Path $env:RUNNER_TEMP 'spotify_exe_unpacker.py'
Invoke-WebRequest -UseBasicParsing -Uri $unpackerUrl -OutFile $unpackerPath
$parameters.SpotifyPath = Join-Path $env:RUNNER_TEMP 'Spotify-arm64'
$parameters.version = $entry.Value.fullversion
$parameters.defender_exclusions_off = $true
python $unpackerPath $installerPath --output $parameters.SpotifyPath
if ($LASTEXITCODE -ne 0) { throw 'ARM64 installer extraction failed' }
$spotxScript = [scriptblock]::Create((Get-Content -LiteralPath "$env:RUNNER_TEMP\spotx.ps1" -Raw -Encoding UTF8))
& $spotxScript @parameters
+1 -1
View File
@@ -1,5 +1,5 @@
<p align="center">
<a href="https://github.com/SpotX-Official/SpotX/releases"><img src="https://spotx-official.github.io/images/logos/logo.png" /></a>
<a href="https://github.com/SpotX-Official/SpotX/releases"><img src=".github/Pic/logo.png" /></a>
</p>
<p align="center">
+42 -12
View File
@@ -4,7 +4,9 @@
.Li269NgzkU2gI4KOP9sM,
.I2WIloMMjsBeMaIS8H3v,
.McI3hD7aCfpq015LJa6X,
.gpDSOimnzH4zTJmE7UR5 {
.gpDSOimnzH4zTJmE7UR5,
.dh4zyndPBN0gul_w,
.zboE1ICtt8SJrJQEVHTf {
--lyrics-color-active: var(--current) !important;
--lyrics-color-inactive: var(--next) !important;
--lyrics-color-passed: var(--past) !important;
@@ -12,13 +14,18 @@
}
/* title unsynced */
p[class*="e-"][class*="-text"].encore-text-body-small {
[style*="--lyrics-color-active"] p[class*="e-"][class*="-text"].encore-text-body-small,
.ReC7DlF3I_k9g6Vv,
.WlotvRiQOV9Ps_vFbm14,
.main-view-container .FGdK_c0adS4IdZFuZd8Y,
.Zfb6QZfRV28Kz1RQ,
.b8IhQswrT49QTc5CuFif {
color: var(--musixmatch) !important;
margin-bottom: 8px !important;
}
/* fixed color of lyrics button */
[data-testid="lyrics-npv-section"]:not(._OhUGn8Plh3mRw4awIM5):not(.Sb2rC16jDkGc9eweOU8g):not(._YRfjT5prbRuSXcNK9WR):not(.RXRGSIFllAhUYWKYlANd) {
[data-testid="lyrics-npv-section"]:not(._OhUGn8Plh3mRw4awIM5):not(.Sb2rC16jDkGc9eweOU8g):not(._YRfjT5prbRuSXcNK9WR):not(.RXRGSIFllAhUYWKYlANd):not(.R28TH1mzH8k9Z3Ad):not(.oCWFPidreAoLBDsNRQuw) {
background-color:
#1f1f1f !important;
}
@@ -35,7 +42,10 @@ body .W_EplVEAbZrZURqfLiQC,
body .kGR_hu4tdj9PnUlSPaRL,
.GML6YUVCeJvRhGznLnqm,
body .iq4cgi0YEKr6DGaTtzUj,
body .KDhLFoEqoClhH12bsfrS {
body .KDhLFoEqoClhH12bsfrS,
.NUBq_wlyuwoDUsSg,
.upDNlpL8xEkxmKWWw9IF,
.main-view-container .LeoJGcLe14Es7fth7HG7 {
color: var(--musixmatch) !important;
}
@@ -44,7 +54,9 @@ body .KDhLFoEqoClhH12bsfrS {
.T67LFP0PElpfkkLuegQt,
.e7eFLioNSG5PAi1qVFT4,
.l2060qoyWU4J9ihSxHLE,
.hfTlyhd7WCIk9xmP {
.hfTlyhd7WCIk9xmP,
.bDlqrHmbHstExWu6T7Ms,
.main-view-container .lzSRPoTbAKaWG_T2CDlK {
color: var(--musixmatch) !important;
}
@@ -53,16 +65,21 @@ body .KDhLFoEqoClhH12bsfrS {
.tr8V5eHsUaIkOYVw7eSG,
.hW9km7ku6_iggdWDR_Lg,
.lofIAg8Ixko3mfBrbfej,
.bbJIIopLxggQmv5x {
.bbJIIopLxggQmv5x,
.bqldaBkacR41KxR2Z0jY,
.main-view-container .Pb9OM7BnosJTdj3KAIWE {
--lyrics-color-active: var(--current) !important;
--lyrics-color-inactive: var(--next) !important;
--lyrics-color-passed: var(--past) !important;
--lyrics-color-background: var(--background) !important;
}
/* fix previous lyrics for old versions */
/* previous lines */
.H2J92dVdr0ykdOX5azL1,
.KnFq2ijXFdOtyl4Iebjv {
.KnFq2ijXFdOtyl4Iebjv,
.XiH9KR6bhDwEFykV,
.loNizikBbaCKyI9Gv8xg,
.main-view-container .zYNpVrsABjnrvr7ZSJTd {
color: var(--past) !important;
opacity: 1 !important;
}
@@ -76,7 +93,11 @@ body .KDhLFoEqoClhH12bsfrS {
.PSyA4iign083ZV6vOqPj:hover,
.Plu0zvuRv7kOQwsQ02cC:hover,
.Mnf9PkrVHsX90BNf:hover,
.XiH9KR6bhDwEFykV:hover {
.XiH9KR6bhDwEFykV:hover,
.MZZCOz_ImVH1skMtX3aI:hover,
.loNizikBbaCKyI9Gv8xg:hover,
.main-view-container .qrRT38O7gAArS1n8grcl:hover,
.main-view-container .zYNpVrsABjnrvr7ZSJTd:hover {
color: var(--hover) !important;
/* remove underline */
text-decoration: none !important;
@@ -89,7 +110,10 @@ body .KDhLFoEqoClhH12bsfrS {
.AEfhRyqGa3vzQrgfdwWE.Re403AJffPPuZmX7LRJj,
.NHVfxGs2HwmI_fly2JC4.E64X_eoy6xsJmDdKKHja,
.gaHIufRWhoWbiT8S6zuM.Qo3OkrSis5IWlP9Tchbr,
.AEfhRyqGa3vzQrgfdwWE .Re403AJffPPuZmX7LRJj {
.AEfhRyqGa3vzQrgfdwWE .Re403AJffPPuZmX7LRJj,
.AQFBg9wNhDoKJHvS,
.aO2StTvteoZW3ixq2Fz4,
.main-view-container .jdk2I0q0Ac3yps7rqpMQ {
color: var(--next) !important;
}
@@ -132,8 +156,14 @@ body .KDhLFoEqoClhH12bsfrS {
/* read along podcasts */
.l6lFMYQteTVnTcHnLywc,
._nDkCIVgkWayq3tqiIuW,
.B_wut2Bw4HwLr3w8rNfM {
.B_wut2Bw4HwLr3w8rNfM,
.fhgdX2gD6kkUSiiX,
.ss3nDnn4UPsMVtFr,
.pvWgiS0R_7grz0VjKsSZ,
.qb9cvoyw3y6W2evemPij,
.MRV6jUuQgCXqrlnFuDBA,
.XzkBD72pfm2R6YsB2_6W {
--transcript-color-background: var(--background) !important;
--transcript-color-text: var(--next) !important;
--transcript-color-highlightText: var(--current) !important;
}
}
+98 -92
View File
@@ -3,7 +3,7 @@
window.oneTime = true;
const WORKER_BASE_URL = "https://spotify-ingest-admin.amd64fox1.workers.dev";
const SCRIPT_VERSION = "1.2.1";
const SCRIPT_VERSION = "1.2.2";
const SOURCE_LABELS = {
REMOTE: "latest.json",
@@ -113,14 +113,18 @@
return "";
}
const parts = shortVersion.split(".");
if (parts.length !== 4) {
if (typeof shortVersion !== "string" || !/^\d+\.\d+\.\d+\.\d+$/.test(shortVersion)) {
console.warn(`Invalid Spotify version format (${sourceLabel}):`, shortVersion);
return "";
}
const [major, minor, patch, build] = parts;
return major + minor + patch + "0".repeat(Math.max(0, 7 - patch.length - build.length)) + build;
const [major, minor, patch, build] = shortVersion.split(".").map(Number);
const appVersion = major * 100000000 + minor * 10000000 + patch * 100000 + build;
if (!Number.isSafeInteger(appVersion) || minor > 9 || patch > 99 || build > 99999) {
console.warn(`Unsupported Spotify version (${sourceLabel}):`, shortVersion);
return "";
}
return String(appVersion);
}
async function fetchJsonWithTimeout(url, timeoutMs) {
@@ -138,7 +142,7 @@
throw new Error(`HTTP error: ${response.status}`);
}
return response.json();
return await response.json();
} finally {
clearTimeout(timeoutId);
}
@@ -555,96 +559,98 @@
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), CONFIG.desktopUpdateTimeoutMs);
let response;
try {
response = await originalFetch(CONFIG.updateUrl, {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Spotify-App-Version": spotifyAppVersion,
"App-Platform": platform.code
},
signal: controller.signal
});
} catch (error) {
return buildRequestErrorResult({
finalUrl: CONFIG.updateUrl,
status: null,
headers: {},
contentType: null,
contentLength: null
}, formatDesktopUpdateError(platform, error));
let response;
try {
response = await originalFetch(CONFIG.updateUrl, {
method: "GET",
headers: {
Authorization: `Bearer ${token}`,
"Spotify-App-Version": spotifyAppVersion,
"App-Platform": platform.code
},
signal: controller.signal
});
} catch (error) {
return buildRequestErrorResult({
finalUrl: CONFIG.updateUrl,
status: null,
headers: {},
contentType: null,
contentLength: null
}, formatDesktopUpdateError(platform, error));
}
const finalUrl = response.url || CONFIG.updateUrl;
const headers = readResponseHeaders(response.headers);
const contentType = response.headers?.get?.("content-type") || null;
const contentLength = response.headers?.get?.("content-length") || null;
if (!response.ok) {
return buildRequestErrorResult({
finalUrl,
status: response.status,
headers,
contentType,
contentLength
}, `${platform.code} HTTP error: ${response.status}`);
}
let buffer;
try {
buffer = await response.arrayBuffer();
} catch (error) {
return buildRequestErrorResult({
finalUrl,
status: response.status,
headers,
contentType,
contentLength
}, formatDesktopUpdateError(platform, error));
}
const bodyLatin1 = decodeLatin1Buffer(buffer);
const extractedUpgradeLink = extractUpgradeLink(bodyLatin1);
const baseResult = {
finalUrl,
status: response.status,
headers,
contentType,
contentLength,
byteLength: buffer.byteLength,
bodyLatin1,
extractedUpgradeLink
};
if (!extractedUpgradeLink) {
return {
outcome: "empty_response",
...baseResult,
parseErrorMessage: null,
errorMessage: null
};
}
try {
const asset = parseUpgradeAsset(platform, extractedUpgradeLink);
return {
outcome: "success",
...baseResult,
parseErrorMessage: null,
errorMessage: null,
asset
};
} catch (error) {
return {
outcome: "parse_error",
...baseResult,
parseErrorMessage: error?.message || String(error),
errorMessage: null
};
}
} finally {
clearTimeout(timeoutId);
}
const finalUrl = response.url || CONFIG.updateUrl;
const headers = readResponseHeaders(response.headers);
const contentType = response.headers?.get?.("content-type") || null;
const contentLength = response.headers?.get?.("content-length") || null;
if (!response.ok) {
return buildRequestErrorResult({
finalUrl,
status: response.status,
headers,
contentType,
contentLength
}, `${platform.code} HTTP error: ${response.status}`);
}
let buffer;
try {
buffer = await response.arrayBuffer();
} catch (error) {
return buildRequestErrorResult({
finalUrl,
status: response.status,
headers,
contentType,
contentLength
}, formatDesktopUpdateError(platform, error));
}
const bodyLatin1 = decodeLatin1Buffer(buffer);
const extractedUpgradeLink = extractUpgradeLink(bodyLatin1);
const baseResult = {
finalUrl,
status: response.status,
headers,
contentType,
contentLength,
byteLength: buffer.byteLength,
bodyLatin1,
extractedUpgradeLink
};
if (!extractedUpgradeLink) {
return {
outcome: "empty_response",
...baseResult,
parseErrorMessage: null,
errorMessage: null
};
}
try {
const asset = parseUpgradeAsset(platform, extractedUpgradeLink);
return {
outcome: "success",
...baseResult,
parseErrorMessage: null,
errorMessage: null,
asset
};
} catch (error) {
return {
outcome: "parse_error",
...baseResult,
parseErrorMessage: error?.message || String(error),
errorMessage: null
};
}
}
function buildAttemptMetadata(attemptNumber, result) {
+50 -17
View File
@@ -21,8 +21,8 @@
"fr": "1.1.59",
"to": ""
},
"match": "adsEnabled:!0",
"replace": "adsEnabled:!1"
"match": "\\b(adsEnabled[:=])!0",
"replace": "$1!1"
},
"playlistsponsor": {
"version": {
@@ -874,7 +874,7 @@
"description": "Use ads-owned NPV and cinema surface state for ad orchestration",
"version": {
"fr": "1.2.96",
"to": ""
"to": "1.3.1"
}
},
"HptoHarmonyVideoPlayer": {
@@ -892,6 +892,39 @@
"fr": "1.2.96",
"to": ""
}
},
"VideoAdTerminatedEvent": {
"name": "enableVideoAdTerminatedEvent",
"description": "Fire terminated events for non-complete video ad endings on desktop",
"version": {
"fr": "1.2.98",
"to": ""
}
},
"SponsoredPlaylistCacheAlignedRefresh": {
"name": "enableSponsoredPlaylistCacheAlignedRefresh",
"description": "Uses a 15-minute sponsored playlist refresh interval aligned with the service TTL",
"version": {
"fr": "1.2.98",
"to": ""
}
},
"AdBreakTimeRemaining": {
"name": "showAdBreakTimeRemaining",
"description": "Show remaining ad-break time countdown in NPV and cinema-mode ad headers",
"version": {
"fr": "1.2.99",
"to": ""
}
},
"FocusStateAwareHptoFetch": {
"name": "enableFocusStateAwareHptoFetch",
"description": "Disable background HPTO fetch diagnostics",
"native_description": "Enable focus state guard when fetching HPTO ad",
"version": {
"fr": "1.3.3",
"to": ""
}
}
},
"EnableExp": {
@@ -1162,7 +1195,7 @@
"native_description": "Enable Smart Shuffle",
"version": {
"fr": "1.2.22",
"to": ""
"to": "1.2.96"
}
},
"ConcertsTicketPrice": {
@@ -1216,7 +1249,7 @@
"native_description": "Enable About Podcast section in NPV",
"version": {
"fr": "1.2.20",
"to": ""
"to": "1.2.96"
}
},
"QueueOnRightPanel": {
@@ -1270,7 +1303,7 @@
"native_description": "Enable list / compact mode in entity pages",
"version": {
"fr": "1.2.24",
"to": ""
"to": "1.2.99"
}
},
"UserTopContent": {
@@ -1585,7 +1618,7 @@
"native_description": "Enable the support for Nearby Jams feature in the Device Picker",
"version": {
"fr": "1.2.52",
"to": ""
"to": "1.2.97"
}
},
"TrackBans": {
@@ -1648,7 +1681,7 @@
"native_description": "Enable the Peek NPV feature",
"version": {
"fr": "1.2.53",
"to": ""
"to": "1.2.96"
}
},
"AlignedPanelHeaders": {
@@ -1711,7 +1744,7 @@
"native_description": "Enable canvas support inside improved cinema mode",
"version": {
"fr": "1.2.56",
"to": ""
"to": "1.2.96"
}
},
"YlxReverseSorting": {
@@ -1810,7 +1843,7 @@
"native_description": "Enable column reordering functionality in tracklists",
"version": {
"fr": "1.2.69",
"to": ""
"to": "1.2.96"
}
},
"ContextMenuShortcuts": {
@@ -2046,7 +2079,7 @@
"native_description": "Config for clearing the current leaderboard ad and hiding the leaderboard container when the ad slot returns an empty response",
"version": {
"fr": "1.2.94",
"to": ""
"to": "1.2.97"
}
},
"EntityHeaderNew": {
@@ -2070,7 +2103,7 @@
"native_description": "Enables the Canvas context menu toggle",
"version": {
"fr": "1.2.96",
"to": ""
"to": "1.3.1"
}
},
"MusicVideos": {
@@ -2690,28 +2723,28 @@
"fr": "1.2.36",
"to": ""
},
"add": " .LVMjmN2CaPruPAo62RAY, .Wn4fEKCJ6jYPfG2Y0ABn, .Y3Kd8WKnE3ZW9lzgA8nN, .C_T1Uoz7Fws_AFDl { display: none !important }"
"add": " .LVMjmN2CaPruPAo62RAY, .Wn4fEKCJ6jYPfG2Y0ABn, .Y3Kd8WKnE3ZW9lzgA8nN, .C_T1Uoz7Fws_AFDl, .ap_ioWdVFWJkrRicJB8C { display: none !important }"
},
"downloadquality": {
"version": {
"fr": "1.2.30",
"to": ""
},
"add": " :is(.weV_qxFz4gF5sPotO10y, .BMtRRwqaJD_95vJFMFD0, .eguwzH_QWTBXry7hiNj3, .qV_CxbowaNkMarye, .qV_CxbowaNkMarye):has([for=\"desktop.settings.downloadQuality\"]) {display: none}"
"add": " :is(.weV_qxFz4gF5sPotO10y, .BMtRRwqaJD_95vJFMFD0, .eguwzH_QWTBXry7hiNj3, .qV_CxbowaNkMarye, .Z6yfNoSJ6OjiEBGI5Osr, .H_Y7u72_U2ERiU8oYJeL):has([for=\"desktop.settings.downloadQuality\"]) {display: none}"
},
"downloadicon": {
"version": {
"fr": "1.1.74",
"to": ""
},
"add": " .BKsbV2Xl786X9a09XROH, .GWCBhKJqeZal3n5tCQwl, .pX3IkLhEry0wVfiU {display:none}"
"add": " .BKsbV2Xl786X9a09XROH, .GWCBhKJqeZal3n5tCQwl, .pX3IkLhEry0wVfiU, .IOXdOZpz_OhQUj2M3A0e, .F9vJGD2_t3IUyzuoDzOb {display:none}"
},
"submenudownload": {
"version": {
"fr": "1.1.74",
"to": ""
},
"add": " .pzkhLqffqF_4hucrVVQA, .egE6UQjF_UUoCzvMxREj, .Y98_oiegQgSpY_o7hoKG, .tT_JypfxNakuY1jHgyBN, .zVA1h9TUy8QQBogj {display:none}"
"add": " :is(.pzkhLqffqF_4hucrVVQA, .egE6UQjF_UUoCzvMxREj, .Y98_oiegQgSpY_o7hoKG, .tT_JypfxNakuY1jHgyBN, .zVA1h9TUy8QQBogj, .l7XabbfpobRNm8SpemYx, .OS2FSGrMk4JcABLlGUmc, .OAz6EUvqC2CpvN61OoeA)[role=menuitemcheckbox] {display:none}"
},
"veryhighstream": {
"version": {
@@ -2784,7 +2817,7 @@
"fr": "1.1.70",
"to": ""
},
"match": "(ADS_PREMIUM,isPremium:).(.{20,60}?isHptoHidden:).",
"match": "(ADS_PREMIUM,isPremium:|\\.isPremium=)[\\w$]+(?:\\.payload)?(.{20,300}?isHptoHidden[:=])[\\w$]+(?:\\.payload)?",
"replace": "$1true$2true"
},
"sentry": {
+1660 -503
View File
File diff suppressed because it is too large Load Diff