mirror of
https://github.com/SpotX-Official/SpotX.git
synced 2026-10-08 11:39:01 +11:00
Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bee81013be | ||
|
|
15bf4355c2 | ||
|
|
84be4206fd | ||
|
|
1639ffb508 | ||
|
|
9fa954acd2 | ||
|
|
9d34465886 | ||
|
|
fd064f5492 | ||
|
|
1d19a68f58 | ||
|
|
f4cf592bf0 |
Binary file not shown.
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 19 KiB |
@@ -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,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">
|
||||
|
||||
@@ -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,17 @@
|
||||
}
|
||||
|
||||
/* 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,
|
||||
.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 +41,9 @@ body .W_EplVEAbZrZURqfLiQC,
|
||||
body .kGR_hu4tdj9PnUlSPaRL,
|
||||
.GML6YUVCeJvRhGznLnqm,
|
||||
body .iq4cgi0YEKr6DGaTtzUj,
|
||||
body .KDhLFoEqoClhH12bsfrS {
|
||||
body .KDhLFoEqoClhH12bsfrS,
|
||||
.NUBq_wlyuwoDUsSg,
|
||||
.upDNlpL8xEkxmKWWw9IF {
|
||||
color: var(--musixmatch) !important;
|
||||
}
|
||||
|
||||
@@ -44,7 +52,8 @@ body .KDhLFoEqoClhH12bsfrS {
|
||||
.T67LFP0PElpfkkLuegQt,
|
||||
.e7eFLioNSG5PAi1qVFT4,
|
||||
.l2060qoyWU4J9ihSxHLE,
|
||||
.hfTlyhd7WCIk9xmP {
|
||||
.hfTlyhd7WCIk9xmP,
|
||||
.bDlqrHmbHstExWu6T7Ms {
|
||||
color: var(--musixmatch) !important;
|
||||
}
|
||||
|
||||
@@ -53,16 +62,19 @@ body .KDhLFoEqoClhH12bsfrS {
|
||||
.tr8V5eHsUaIkOYVw7eSG,
|
||||
.hW9km7ku6_iggdWDR_Lg,
|
||||
.lofIAg8Ixko3mfBrbfej,
|
||||
.bbJIIopLxggQmv5x {
|
||||
.bbJIIopLxggQmv5x,
|
||||
.bqldaBkacR41KxR2Z0jY {
|
||||
--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 {
|
||||
color: var(--past) !important;
|
||||
opacity: 1 !important;
|
||||
}
|
||||
@@ -76,7 +88,9 @@ body .KDhLFoEqoClhH12bsfrS {
|
||||
.PSyA4iign083ZV6vOqPj:hover,
|
||||
.Plu0zvuRv7kOQwsQ02cC:hover,
|
||||
.Mnf9PkrVHsX90BNf:hover,
|
||||
.XiH9KR6bhDwEFykV:hover {
|
||||
.XiH9KR6bhDwEFykV:hover,
|
||||
.MZZCOz_ImVH1skMtX3aI:hover,
|
||||
.loNizikBbaCKyI9Gv8xg:hover {
|
||||
color: var(--hover) !important;
|
||||
/* remove underline */
|
||||
text-decoration: none !important;
|
||||
@@ -89,7 +103,9 @@ body .KDhLFoEqoClhH12bsfrS {
|
||||
.AEfhRyqGa3vzQrgfdwWE.Re403AJffPPuZmX7LRJj,
|
||||
.NHVfxGs2HwmI_fly2JC4.E64X_eoy6xsJmDdKKHja,
|
||||
.gaHIufRWhoWbiT8S6zuM.Qo3OkrSis5IWlP9Tchbr,
|
||||
.AEfhRyqGa3vzQrgfdwWE .Re403AJffPPuZmX7LRJj {
|
||||
.AEfhRyqGa3vzQrgfdwWE .Re403AJffPPuZmX7LRJj,
|
||||
.AQFBg9wNhDoKJHvS,
|
||||
.aO2StTvteoZW3ixq2Fz4 {
|
||||
color: var(--next) !important;
|
||||
}
|
||||
|
||||
@@ -132,8 +148,12 @@ body .KDhLFoEqoClhH12bsfrS {
|
||||
/* read along podcasts */
|
||||
.l6lFMYQteTVnTcHnLywc,
|
||||
._nDkCIVgkWayq3tqiIuW,
|
||||
.B_wut2Bw4HwLr3w8rNfM {
|
||||
.B_wut2Bw4HwLr3w8rNfM,
|
||||
.fhgdX2gD6kkUSiiX,
|
||||
.ss3nDnn4UPsMVtFr,
|
||||
.pvWgiS0R_7grz0VjKsSZ,
|
||||
.qb9cvoyw3y6W2evemPij {
|
||||
--transcript-color-background: var(--background) !important;
|
||||
--transcript-color-text: var(--next) !important;
|
||||
--transcript-color-highlightText: var(--current) !important;
|
||||
}
|
||||
}
|
||||
|
||||
+89
-87
@@ -138,7 +138,7 @@
|
||||
throw new Error(`HTTP error: ${response.status}`);
|
||||
}
|
||||
|
||||
return response.json();
|
||||
return await response.json();
|
||||
} finally {
|
||||
clearTimeout(timeoutId);
|
||||
}
|
||||
@@ -555,96 +555,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) {
|
||||
|
||||
+36
-12
@@ -892,6 +892,30 @@
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
},
|
||||
"EnableExp": {
|
||||
@@ -1162,7 +1186,7 @@
|
||||
"native_description": "Enable Smart Shuffle",
|
||||
"version": {
|
||||
"fr": "1.2.22",
|
||||
"to": ""
|
||||
"to": "1.2.96"
|
||||
}
|
||||
},
|
||||
"ConcertsTicketPrice": {
|
||||
@@ -1216,7 +1240,7 @@
|
||||
"native_description": "Enable About Podcast section in NPV",
|
||||
"version": {
|
||||
"fr": "1.2.20",
|
||||
"to": ""
|
||||
"to": "1.2.96"
|
||||
}
|
||||
},
|
||||
"QueueOnRightPanel": {
|
||||
@@ -1270,7 +1294,7 @@
|
||||
"native_description": "Enable list / compact mode in entity pages",
|
||||
"version": {
|
||||
"fr": "1.2.24",
|
||||
"to": ""
|
||||
"to": "1.2.99"
|
||||
}
|
||||
},
|
||||
"UserTopContent": {
|
||||
@@ -1585,7 +1609,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 +1672,7 @@
|
||||
"native_description": "Enable the Peek NPV feature",
|
||||
"version": {
|
||||
"fr": "1.2.53",
|
||||
"to": ""
|
||||
"to": "1.2.96"
|
||||
}
|
||||
},
|
||||
"AlignedPanelHeaders": {
|
||||
@@ -1711,7 +1735,7 @@
|
||||
"native_description": "Enable canvas support inside improved cinema mode",
|
||||
"version": {
|
||||
"fr": "1.2.56",
|
||||
"to": ""
|
||||
"to": "1.2.96"
|
||||
}
|
||||
},
|
||||
"YlxReverseSorting": {
|
||||
@@ -1810,7 +1834,7 @@
|
||||
"native_description": "Enable column reordering functionality in tracklists",
|
||||
"version": {
|
||||
"fr": "1.2.69",
|
||||
"to": ""
|
||||
"to": "1.2.96"
|
||||
}
|
||||
},
|
||||
"ContextMenuShortcuts": {
|
||||
@@ -2046,7 +2070,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": {
|
||||
@@ -2697,21 +2721,21 @@
|
||||
"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):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 {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)[role=menuitemcheckbox] {display:none}"
|
||||
},
|
||||
"veryhighstream": {
|
||||
"version": {
|
||||
@@ -2784,7 +2808,7 @@
|
||||
"fr": "1.1.70",
|
||||
"to": ""
|
||||
},
|
||||
"match": "(ADS_PREMIUM,isPremium:).(.{20,60}?isHptoHidden:).",
|
||||
"match": "(ADS_PREMIUM,isPremium:).(.{20,300}?isHptoHidden:).",
|
||||
"replace": "$1true$2true"
|
||||
},
|
||||
"sentry": {
|
||||
|
||||
Reference in New Issue
Block a user