mirror of
https://github.com/SpotX-Official/SpotX.git
synced 2026-04-20 10:44:35 +10:00
Compare commits
166 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0abf98a36b | ||
|
|
ef6601d186 | ||
|
|
ffd4a6b897 | ||
|
|
bd9726f589 | ||
|
|
74915a1e3e | ||
|
|
68fe6b6726 | ||
|
|
95abca6bc4 | ||
|
|
b22bebdab5 | ||
|
|
a0a59726ee | ||
|
|
6070bbcf1b | ||
|
|
691e24fa2e | ||
|
|
393d660d88 | ||
|
|
80d1da6c16 | ||
|
|
246c0f838f | ||
|
|
4c615f7a5a | ||
|
|
92894fc64c | ||
|
|
ece9799d2c | ||
|
|
2bbe38e20b | ||
|
|
a784576544 | ||
|
|
d71b1d4963 | ||
|
|
a992b74b51 | ||
|
|
15132daa81 | ||
|
|
d2f652b73e | ||
|
|
bae24fab51 | ||
|
|
2872e44360 | ||
|
|
72b4578e15 | ||
|
|
8085973eb7 | ||
|
|
99c235dff4 | ||
|
|
c2526dc3b8 | ||
|
|
a689c266dd | ||
|
|
e3121ea435 | ||
|
|
9ea3b4082a | ||
|
|
9cf696b876 | ||
|
|
fcd40cbc48 | ||
|
|
b26febf64b | ||
|
|
50138858fa | ||
|
|
bf78e900b6 | ||
|
|
014e49f426 | ||
|
|
6b40b8d0ee | ||
|
|
553c42e5ed | ||
|
|
0299c089c7 | ||
|
|
f4aa7ad64a | ||
|
|
6b586d46ac | ||
|
|
eb56ce0255 | ||
|
|
9dc6126f69 | ||
|
|
49b0a3ffc2 | ||
|
|
dbd120b458 | ||
|
|
8d9bbde34a | ||
|
|
a500bf2100 | ||
|
|
ab9ab17055 | ||
|
|
6d9a3ec257 | ||
|
|
cb1eab3663 | ||
|
|
a679cb3411 | ||
|
|
2051de8ba7 | ||
|
|
3c3d5cde71 | ||
|
|
447b44122e | ||
|
|
2be071b03e | ||
|
|
3798ef1991 | ||
|
|
02b0d76443 | ||
|
|
aeca128854 | ||
|
|
28e807363f | ||
|
|
8d59fb3f68 | ||
|
|
8e16837242 | ||
|
|
10d2e76702 | ||
|
|
a775edfcdc | ||
|
|
184fa13403 | ||
|
|
7df2695e42 | ||
|
|
77bf27a158 | ||
|
|
b800bb9e8d | ||
|
|
7a0675d4ed | ||
|
|
488c4e8b74 | ||
|
|
208622c547 | ||
|
|
133e78474b | ||
|
|
91203c4775 | ||
|
|
1c533d4eeb | ||
|
|
3bf6942a7d | ||
|
|
39391a1755 | ||
|
|
abc87bd2c6 | ||
|
|
aff944bbf5 | ||
|
|
9c2f9cac48 | ||
|
|
34abd7492e | ||
|
|
4eaf0d8128 | ||
|
|
27624387be | ||
|
|
69f50fd544 | ||
|
|
c9aee164c6 | ||
|
|
3543e594f3 | ||
|
|
cce7948412 | ||
|
|
dc1a38838f | ||
|
|
a5a47b6913 | ||
|
|
e12929faea | ||
|
|
0997fb25cd | ||
|
|
334e64d7fc | ||
|
|
2e4e8db907 | ||
|
|
3ea8683a6e | ||
|
|
aeb4b3d049 | ||
|
|
a065b142ab | ||
|
|
cdb111c758 | ||
|
|
5bd1fcb235 | ||
|
|
b8077eefe0 | ||
|
|
ae32767ca1 | ||
|
|
b7e9cbe14f | ||
|
|
9fea76f1ca | ||
|
|
66b863f5fc | ||
|
|
cbbf8f83f3 | ||
|
|
de7882fb99 | ||
|
|
cd140c94e0 | ||
|
|
611239b053 | ||
|
|
17347816b1 | ||
|
|
636ad97e52 | ||
|
|
fe1e87a20f | ||
|
|
0c89b528e4 | ||
|
|
8a1fe6487c | ||
|
|
aabf778c38 | ||
|
|
a43c201d37 | ||
|
|
26d8d97a8c | ||
|
|
f27c016428 | ||
|
|
60b2a27b23 | ||
|
|
6bcb4a0788 | ||
|
|
e36edbcded | ||
|
|
114abd8952 | ||
|
|
d2076a5bae | ||
|
|
3c421db6ea | ||
|
|
9a48c98deb | ||
|
|
cdbd4b29f1 | ||
|
|
2babd58516 | ||
|
|
c4543aca1c | ||
|
|
c405f2666b | ||
|
|
06617a3e49 | ||
|
|
b1c94bf550 | ||
|
|
da6c118859 | ||
|
|
75def8ac19 | ||
|
|
5a2c160ea5 | ||
|
|
7a13b0732e | ||
|
|
5bd389dc7f | ||
|
|
07b40a7ff7 | ||
|
|
28ea2db0fe | ||
|
|
4539ea7821 | ||
|
|
bdb762b930 | ||
|
|
2ca883ecea | ||
|
|
50110c8b73 | ||
|
|
9479460ef5 | ||
|
|
a16b48f1c8 | ||
|
|
2ed8681be9 | ||
|
|
b20dd48e1f | ||
|
|
2fb584b3ce | ||
|
|
b3ced889c7 | ||
|
|
2aae3d67be | ||
|
|
f265a5fca0 | ||
|
|
7448c439d6 | ||
|
|
743e6113c2 | ||
|
|
6c8fa32d12 | ||
|
|
28147cb29d | ||
|
|
99edd957a8 | ||
|
|
bc3079dcee | ||
|
|
d90a4f9abe | ||
|
|
4223dad171 | ||
|
|
a60308695f | ||
|
|
630a331b72 | ||
|
|
009d6c7107 | ||
|
|
93cf6228a8 | ||
|
|
e4206c55ba | ||
|
|
0658ccba4d | ||
|
|
42e40ddd25 | ||
|
|
e5db5e43b4 | ||
|
|
4396b0ca5d | ||
|
|
46395700ee |
@@ -42,30 +42,30 @@ body:
|
||||
Download5 = "Downloading Spotify"
|
||||
StopScript = "Script is stopped"
|
||||
MsSpoti = "The Microsoft Store version of Spotify has been detected which is not supported"
|
||||
MsSpoti2 = "Uninstall Spotify Microsoft Store edition [Y/N]"
|
||||
MsSpoti2 = "Uninstall Spotify Microsoft Store edition ? [Y/N]"
|
||||
MsSpoti3 = "Automatically uninstalling Spotify MS..."
|
||||
MsSpoti4 = "Uninstalling Spotify MS..."
|
||||
Prem = "Modification for premium account..."
|
||||
OldV = "Found outdated version of Spotify"
|
||||
OldV2 = "Your Spotify {0} version is outdated, it is recommended to upgrade to {1}"
|
||||
OldV2 = "Your Spotify version ({0}) is outdated, the current latest version is — {1}"
|
||||
OldV3 = "Want to update ? [Y/N]"
|
||||
AutoUpd = "Automatic update to the recommended version"
|
||||
DelOrOver = "Do you want to uninstall the current version of {0} or install over it? Y [Uninstall] / N [Install Over]"
|
||||
DelOrOver = "Remove the current version ({0}) or install over it? Y [Remove] / N [Install Over]"
|
||||
DelOld = "Uninstalling old Spotify..."
|
||||
NewV = "Unsupported version of Spotify found"
|
||||
NewV2 = "Your Spotify {0} version hasn't been tested yet, currently it's a stable {1} version"
|
||||
NewV3 = "Do you want to continue with {0} version (errors possible) ? [Y/N]"
|
||||
Recom = "Do you want to install the recommended {0} version ? [Y/N]"
|
||||
NewV2 = "Your Spotify version ({0}) has not been tested. The stable version for SpotX is {1}"
|
||||
NewV3 = "Continue with {0} (errors may occur) ? [Y/N]"
|
||||
Recom = "Install the latest version {0} ? [Y/N]"
|
||||
DelNew = "Uninstalling an untested Spotify..."
|
||||
DownSpoti = "Downloading and installing Spotify"
|
||||
DownSpoti2 = "Please wait..."
|
||||
PodcatsOff = "Off Podcasts"
|
||||
PodcastsOn = "On Podcasts"
|
||||
PodcatsSelect = "Do you want to disable podcasts, episodes and audiobooks from the main page? [Y/N]"
|
||||
DowngradeNote = "It is recommended to block because Spotify was downgraded"
|
||||
PodcatsSelect = "Hide podcasts, shows, and audiobooks on the homepage ? [Y/N]"
|
||||
DowngradeNote = "It is recommended to block because there is already a newer version of Spotify"
|
||||
UpdBlock = "Spotify updates blocked"
|
||||
UpdUnblock = "Spotify updates are not blocked"
|
||||
UpdSelect = "Want to block Spotify updates? [Y/N]"
|
||||
UpdSelect = "Block Spotify updates ? [Y/N]"
|
||||
ModSpoti = "Patching Spotify..."
|
||||
Error = "Error"
|
||||
FileLocBroken = "Location of Spotify files is broken, uninstall Spotify client and run the script again"
|
||||
|
||||
126
.github/workflows/auto-closes-false-positive.yml
vendored
Normal file
126
.github/workflows/auto-closes-false-positive.yml
vendored
Normal file
@@ -0,0 +1,126 @@
|
||||
name: Auto Close Antivirus False Positive Issues
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened, reopened, edited]
|
||||
|
||||
jobs:
|
||||
auto-close:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
|
||||
steps:
|
||||
- name: Check for AV-related keywords
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const issue = context.payload.issue;
|
||||
const title = issue.title.toLowerCase();
|
||||
const actor = context.payload.sender.login;
|
||||
|
||||
// Проверяем, кто выполнил действие (не создателя issue, а того кто сейчас действует)
|
||||
const privilegedUsers = ['amd64fox'];
|
||||
|
||||
if (privilegedUsers.includes(actor)) {
|
||||
console.log('Issue #' + issue.number + ' action performed by @' + actor + ' - will not auto-close');
|
||||
return;
|
||||
}
|
||||
|
||||
const keywords = [
|
||||
'av',
|
||||
'virus',
|
||||
'malware',
|
||||
'trojan',
|
||||
'defender',
|
||||
'smartscreen',
|
||||
'antivirus',
|
||||
'anti-virus',
|
||||
'anti virus',
|
||||
'malicious',
|
||||
'agenttesla',
|
||||
'virustotal',
|
||||
'eset',
|
||||
'avast',
|
||||
'avg',
|
||||
'kaspersky',
|
||||
'norton',
|
||||
'mcafee',
|
||||
'bitdefender'
|
||||
];
|
||||
|
||||
const containsKeyword = keywords.some(keyword => {
|
||||
const regex = new RegExp('\\b' + keyword + '\\b', 'i');
|
||||
return regex.test(title);
|
||||
});
|
||||
|
||||
if (containsKeyword) {
|
||||
console.log('Issue #' + issue.number + ' contains AV-related keywords in title');
|
||||
|
||||
const comment = '# ⚠️ Automatic Closure: Antivirus False Positive\n\n' +
|
||||
'> [!NOTE]\n' +
|
||||
'> This issue has been automatically closed because it appears to be related to an **antivirus false positive detection**.\n\n' +
|
||||
'---\n\n' +
|
||||
'## 🔍 What causes false positives?\n\n' +
|
||||
'Different antiviruses may respond differently to installing **SpotX**, as SpotX uses a system interpreter **PowerShell** to modify an application **Spotify**.\n\n' +
|
||||
'Also, most AV use **heuristic analysis**, which looks for threats based on assumptions or by matching its own set of rules. This imperfect method also leads to a high number of false positives.\n\n' +
|
||||
'---\n\n' +
|
||||
'## ✅ What should you do?\n\n' +
|
||||
'### Step 1: Disable Your Antivirus\n' +
|
||||
'> [!IMPORTANT]\n' +
|
||||
'> Before running the SpotX patcher, **temporarily disable or pause your antivirus protection**.\n\n' +
|
||||
'> [!WARNING]\n' +
|
||||
'> **Signs you need to disable your antivirus:**\n' +
|
||||
'> - The terminal window is forcibly closed\n' +
|
||||
'> - Errors flagging the script as malicious\n' +
|
||||
'> - The bat installation file is deleted\n\n' +
|
||||
'### Step 2: Run the Installation\n' +
|
||||
'Once your antivirus is disabled, proceed with the SpotX installation.\n\n' +
|
||||
'### Step 3: Re-enable Protection\n' +
|
||||
'After the installation is complete, you can turn your antivirus back on. If your AV then marks some files in the Spotify folder, **add them to the exclusion list** of your antivirus.\n\n' +
|
||||
'> [!TIP]\n' +
|
||||
'> We do not provide instructions on how to disable AV protection or add files/folders to exclusions, as there are many different security systems and the process varies for each. The easiest solution if you don\'t know how to do this is to use [Google](https://www.google.com).\n\n' +
|
||||
'---\n\n' +
|
||||
'<div align="center">\n\n' +
|
||||
'**🤖 This issue was automatically closed by a bot.**\n\n' +
|
||||
'If you believe your issue isn\'t related to a false positive, please mention **@​amd64fox**\n\n' +
|
||||
'</div>';
|
||||
|
||||
await github.rest.issues.createComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: issue.number,
|
||||
body: comment
|
||||
});
|
||||
|
||||
const existingLabels = issue.labels.map(label => label.name);
|
||||
if (existingLabels.length > 0) {
|
||||
for (const label of existingLabels) {
|
||||
await github.rest.issues.removeLabel({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: issue.number,
|
||||
name: label
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
await github.rest.issues.addLabels({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: issue.number,
|
||||
labels: ['❎ false positive']
|
||||
});
|
||||
|
||||
await github.rest.issues.update({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: issue.number,
|
||||
state: 'closed',
|
||||
state_reason: 'not_planned'
|
||||
});
|
||||
|
||||
console.log('Issue #' + issue.number + ' was automatically closed');
|
||||
} else {
|
||||
console.log('Issue #' + issue.number + ' does not contain AV-related keywords in title');
|
||||
}
|
||||
8
.github/workflows/check_spotx.yml
vendored
8
.github/workflows/check_spotx.yml
vendored
@@ -19,14 +19,14 @@ jobs:
|
||||
|
||||
# Get a link to the x86 installer for the first version
|
||||
$firstVersion = $resp.PSObject.Properties.Name | Select-Object -First 1
|
||||
$x86InstallerUrl = $resp.$firstVersion.links.win.x86
|
||||
$x64InstallerUrl = $resp.$firstVersion.links.win.x64
|
||||
|
||||
# Regex to find the desired part of the link
|
||||
$regex = [regex]::Match($x86InstallerUrl, "spotify_installer-(.+?)\.exe")
|
||||
$regex = [regex]::Match($x64InstallerUrl, "spotify_installer-(.+?)\.exe")
|
||||
$version = $regex.Groups[1].Value
|
||||
|
||||
# Incoming parameters
|
||||
$parametrs = '-new_theme -v $version -dev -funnyprogressBar -homesub_off -sp-over -cache_limit 1000 -block_update_on -lyrics_stat spotify -urlform_goofy "https://docs.google.com/forms/formResponse" -idbox_goofy "9999999" -podcasts_off -adsections_off'
|
||||
$parametrs = '-Verbose -new_theme -v $version -sp-over -cache_limit 1000 -block_update_on -lyrics_stat spotify -urlform_goofy "https://docs.google.com/forms/formResponse" -idbox_goofy "9999999" -podcasts_off -adsections_off -lyrics_block'
|
||||
|
||||
# Run Spotx
|
||||
iex "& { $(iwr -useb 'https://raw.githubusercontent.com/SpotX-Official/spotx-official.github.io/main/run.ps1') } $parametrs"
|
||||
iex "& { $(iwr -useb 'https://raw.githubusercontent.com/SpotX-Official/SpotX/refs/heads/main/run.ps1') } $parametrs"
|
||||
|
||||
34
.github/workflows/update-license.yml
vendored
Normal file
34
.github/workflows/update-license.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
name: Update License Year
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 0 1 1 *'
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
update-license:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Update year in LICENSE
|
||||
run: |
|
||||
CURRENT_YEAR=$(date +'%Y')
|
||||
sed -i -E "s/Copyright \(c\) ([0-9]{4})(-[0-9]{4})?/Copyright (c) \1-$CURRENT_YEAR/" LICENSE
|
||||
|
||||
- name: Commit and push changes
|
||||
run: |
|
||||
git config --global user.name "github-actions[bot]"
|
||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||
git add LICENSE
|
||||
|
||||
if git diff --staged --quiet; then
|
||||
echo "No changes needed"
|
||||
else
|
||||
git commit -m "chore: update license year to $(date +'%Y')"
|
||||
git push
|
||||
fi
|
||||
@@ -3,8 +3,8 @@
|
||||
:: Line for changing spotx parameters, each parameter should be separated by a space
|
||||
set param=-new_theme
|
||||
|
||||
set url='https://raw.githubusercontent.com/SpotX-Official/spotx-official.github.io/main/run.ps1'
|
||||
set url2='https://spotx-official.github.io/run.ps1'
|
||||
set url='https://raw.githubusercontent.com/SpotX-Official/SpotX/refs/heads/main/run.ps1'
|
||||
set url2='https://spotx-official.github.io/SpotX/run.ps1'
|
||||
set tls=[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12;
|
||||
|
||||
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\powershell.exe ^
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
@echo off
|
||||
|
||||
:: Line for changing spotx parameters, each parameter should be separated by a space
|
||||
set param=-v 1.2.13.661.ga588f749-4064 -confirm_spoti_recomended_over -block_update_on
|
||||
set param=-v 1.2.13.661.ga588f749 -confirm_spoti_recomended_over -block_update_on
|
||||
|
||||
set url='https://raw.githubusercontent.com/SpotX-Official/spotx-official.github.io/main/run.ps1'
|
||||
set url2='https://spotx-official.github.io/run.ps1'
|
||||
set url='https://raw.githubusercontent.com/SpotX-Official/SpotX/refs/heads/main/run.ps1'
|
||||
set url2='https://spotx-official.github.io/SpotX/run.ps1'
|
||||
set tls=[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12;
|
||||
|
||||
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\powershell.exe ^
|
||||
-Command %tls% $p='%param%'; """ & { $(try { iwr -useb %url% } catch { $p+= ' -m'; iwr -useb %url2% })} $p """" | iex
|
||||
|
||||
pause
|
||||
exit /b
|
||||
exit /b
|
||||
|
||||
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021-2024 amd64fox
|
||||
Copyright (c) 2021-2026 amd64fox
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
85
README.md
85
README.md
@@ -1,32 +1,45 @@
|
||||
<p align="center">
|
||||
<p align="center">
|
||||
<a href="https://github.com/SpotX-Official/SpotX/releases"><img src="https://spotx-official.github.io/images/logos/logo.png" /></a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://t.me/spotify_windows_mod"><img src="https://spotx-official.github.io/images/shields/SpotX_Channel.svg"></a>
|
||||
<a href="https://t.me/SpotxCommunity"><img src="https://spotx-official.github.io/images/shields/SpotX_Community.svg"></a>
|
||||
<a href="https://github.com/SpotX-Official/SpotX-Bash"><img src="https://spotx-official.github.io/images/shields/SpotX_for_Mac&Linux.svg"></a>
|
||||
<a href="https://telegra.ph/SpotX-FAQ-09-19"><img src="https://spotx-official.github.io/images/shields/faq.svg"></a>
|
||||
</p>
|
||||
<p align="center">
|
||||
<a href="https://t.me/spotify_windows_mod"><img src="https://spotx-official.github.io/images/shields/SpotX_Channel.svg"></a>
|
||||
<a href="https://t.me/SpotxCommunity"><img src="https://spotx-official.github.io/images/shields/SpotX_Community.svg"></a>
|
||||
<a href="https://github.com/SpotX-Official/SpotX-Bash"><img src="https://spotx-official.github.io/images/shields/SpotX_for_Mac&Linux.svg"></a>
|
||||
<a href="https://telegra.ph/SpotX-FAQ-09-19"><img src="https://spotx-official.github.io/images/shields/faq.svg"></a>
|
||||
</p>
|
||||
|
||||
<h2> <div align="center"><b> Modified Spotify Client for Windows </b></div> </h2>
|
||||
<h2>
|
||||
<div align="center">
|
||||
<b>Patcher for Spotify Desktop Client on Windows </b>
|
||||
</div>
|
||||
</h2>
|
||||
|
||||
<h1>System requirements</h1>
|
||||
<p align="center"> •
|
||||
<a href="#requirements">Requirements</a> •
|
||||
<a href="#features">Features</a> •
|
||||
<a href="#installation--update">Installation</a> •
|
||||
<a href="#uninstall">Uninstall</a> •
|
||||
<a href="#faq">FAQ</a> •
|
||||
<a href="#disclaimer">Disclaimer</a>
|
||||
</p>
|
||||
|
||||
- <strong>OS: Windows 7-11</strong>
|
||||
- <strong>Spotify: latest official [versions](https://cutt.ly/8EH6NuH)</strong>
|
||||
- <strong>For Windows Desktop only (Microsoft store version is not suitable).</strong>
|
||||
- <strong>PowerShell: version 5 and above recommended</strong>
|
||||
<h1 id="requirements">Requirements</h1>
|
||||
|
||||
<h1>Features</h1>
|
||||
- **OS:** Windows 7-11
|
||||
- **Spotify:** [Official desktop version](https://loadspot.pages.dev) (Microsoft Store version is not suitable)
|
||||
- **PowerShell:** 5.1 and above
|
||||
|
||||
- <strong>Blocks all banner, video and audio ads in the client</strong>
|
||||
- <strong>Hiding podcasts, episodes and audiobooks from the homepage (optional)</strong>
|
||||
- <strong>Block Spotify automatic updates (optional)</strong>
|
||||
- <strong>More experimental features have been activated ([see the full list](https://github.com/SpotX-Official/SpotX/discussions/50))</strong>
|
||||
- <strong>Disabled sentry's console log/error/warning messages to Spotify developers, halted user interaction logging, eliminated right-to-left CSS rules for simplification, and performed code minification</strong>
|
||||
<h1 id="features">Features</h1>
|
||||
|
||||
<h1>Fast installation / Update</h1>
|
||||
- **Blocks all banner, video, and audio ads** in the client
|
||||
- **Hiding podcasts, episodes, and audiobooks** from the homepage (optional)
|
||||
- **Block Spotify automatic updates** (optional)
|
||||
- **Some native experimental features have been changed**
|
||||
- **Analytics sending has been disabled**
|
||||
- **Advanced installation [parameters](https://github.com/SpotX-Official/SpotX/discussions/60)**
|
||||
|
||||
<h1 id="installation--update">Installation / Update</h1>
|
||||
<h3>Choose installation type:</h3>
|
||||
<details>
|
||||
<summary><small>Usual installation (New theme)</small></summary><p>
|
||||
@@ -38,20 +51,20 @@
|
||||
|
||||
<h4> </h4>
|
||||
|
||||
#### Just download and run [Install.bat](https://raw.githack.com/amd64fox/SpotX/main/Install_New_theme.bat)
|
||||
#### Just download and run [Install_New_theme.bat](https://raw.githack.com/amd64fox/SpotX/main/Install_New_theme.bat)
|
||||
|
||||
or
|
||||
|
||||
#### Run The following command in PowerShell:
|
||||
|
||||
```ps1
|
||||
iex "& { $(iwr -useb 'https://raw.githubusercontent.com/SpotX-Official/spotx-official.github.io/main/run.ps1') } -new_theme"
|
||||
iex "& { $(iwr -useb 'https://raw.githubusercontent.com/SpotX-Official/SpotX/refs/heads/main/run.ps1') } -new_theme"
|
||||
```
|
||||
|
||||
#### mirror
|
||||
|
||||
```ps1
|
||||
iex "& { $(iwr -useb 'https://spotx-official.github.io/run.ps1') } -m -new_theme"
|
||||
iex "& { $(iwr -useb 'https://spotx-official.github.io/SpotX/run.ps1') } -m -new_theme"
|
||||
```
|
||||
|
||||
</details>
|
||||
@@ -68,20 +81,20 @@ iex "& { $(iwr -useb 'https://spotx-official.github.io/run.ps1') } -m -new_theme
|
||||
|
||||
<h4> </h4>
|
||||
|
||||
#### Just download and run [Install.bat](https://raw.githack.com/amd64fox/SpotX/main/Install_Old_theme.bat)
|
||||
#### Just download and run [Install_Old_theme.bat](https://raw.githack.com/amd64fox/SpotX/main/Install_Old_theme.bat)
|
||||
|
||||
or
|
||||
|
||||
#### Run The following command in PowerShell:
|
||||
|
||||
```ps1
|
||||
iex "& { $(iwr -useb 'https://raw.githubusercontent.com/SpotX-Official/spotx-official.github.io/main/run.ps1') } -v 1.2.13.661.ga588f749-4064 -confirm_spoti_recomended_over -block_update_on"
|
||||
iex "& { $(iwr -useb 'https://raw.githubusercontent.com/SpotX-Official/SpotX/refs/heads/main/run.ps1') } -v 1.2.13.661.ga588f749 -confirm_spoti_recomended_over -block_update_on"
|
||||
```
|
||||
|
||||
#### mirror
|
||||
|
||||
```ps1
|
||||
iex "& { $(iwr -useb 'https://spotx-official.github.io/run.ps1') } -m -v 1.2.13.661.ga588f749-4064 -confirm_spoti_recomended_over -block_update_on"
|
||||
iex "& { $(iwr -useb 'https://spotx-official.github.io/SpotX/run.ps1') } -m -v 1.2.13.661.ga588f749 -confirm_spoti_recomended_over -block_update_on"
|
||||
```
|
||||
|
||||
</details>
|
||||
@@ -110,13 +123,13 @@ or
|
||||
#### Run The following command in PowerShell:
|
||||
|
||||
```ps1
|
||||
iex "& { $(iwr -useb 'https://raw.githubusercontent.com/SpotX-Official/spotx-official.github.io/main/run.ps1') } -confirm_uninstall_ms_spoti -confirm_spoti_recomended_over -podcasts_off -block_update_on -start_spoti -new_theme -adsections_off -lyrics_stat spotify"
|
||||
iex "& { $(iwr -useb 'https://raw.githubusercontent.com/SpotX-Official/SpotX/refs/heads/main/run.ps1') } -confirm_uninstall_ms_spoti -confirm_spoti_recomended_over -podcasts_off -block_update_on -start_spoti -new_theme -adsections_off -lyrics_stat spotify"
|
||||
```
|
||||
|
||||
#### mirror
|
||||
|
||||
```ps1
|
||||
iex "& { $(iwr -useb 'https://spotx-official.github.io/run.ps1') } -m -confirm_uninstall_ms_spoti -confirm_spoti_recomended_over -podcasts_off -block_update_on -start_spoti -new_theme -adsections_off -lyrics_stat spotify"
|
||||
iex "& { $(iwr -useb 'https://spotx-official.github.io/SpotX/run.ps1') } -m -confirm_uninstall_ms_spoti -confirm_spoti_recomended_over -podcasts_off -block_update_on -start_spoti -new_theme -adsections_off -lyrics_stat spotify"
|
||||
```
|
||||
|
||||
</details>
|
||||
@@ -142,13 +155,13 @@ or
|
||||
#### Run The following command in PowerShell:
|
||||
|
||||
```ps1
|
||||
iex "& { $(iwr -useb 'https://raw.githubusercontent.com/SpotX-Official/spotx-official.github.io/main/run.ps1') } -premium -new_theme"
|
||||
iex "& { $(iwr -useb 'https://raw.githubusercontent.com/SpotX-Official/SpotX/refs/heads/main/run.ps1') } -premium -new_theme"
|
||||
```
|
||||
|
||||
#### mirror
|
||||
|
||||
```ps1
|
||||
iex "& { $(iwr -useb 'https://spotx-official.github.io/run.ps1') } -m -premium -new_theme"
|
||||
iex "& { $(iwr -useb 'https://spotx-official.github.io/SpotX/run.ps1') } -m -premium -new_theme"
|
||||
```
|
||||
|
||||
</details>
|
||||
@@ -162,7 +175,7 @@ You can specify various parameters for a more flexible installation, more [detai
|
||||
|
||||
</details>
|
||||
|
||||
<h1>Uninstall</h1>
|
||||
<h1 id="uninstall">Uninstall</h1>
|
||||
|
||||
- Just run [Uninstall.bat](https://raw.githack.com/amd64fox/SpotX/main/Uninstall.bat)
|
||||
|
||||
@@ -170,14 +183,10 @@ or
|
||||
|
||||
- Reinstall Spotify ([Full uninstall Spotify](https://github.com/amd64fox/Uninstall-Spotify) recommended)
|
||||
|
||||
<h1>FAQ</h1>
|
||||
<h1 id="faq">FAQ</h1>
|
||||
|
||||
Read [FAQ](https://telegra.ph/SpotX-FAQ-09-19)
|
||||
|
||||
<h1>Credits</h1>
|
||||
<h1 id="disclaimer">Disclaimer</h1>
|
||||
|
||||
Some tricks were taken from <a href="https://github.com/khanhas/spicetify-cli">spicetify-cli</a>, many thanks to the contributors.
|
||||
|
||||
<h1>Disclaimer</h1>
|
||||
|
||||
SpotX is a modified version of the official Spotify client, provided as an evaluation version, you use it at your own risk.
|
||||
SpotX is a tool that modifies the official Spotify client, provided as an evaluation version — use it at your own risk.
|
||||
|
||||
@@ -1,31 +1,28 @@
|
||||
@echo off
|
||||
SETLOCAL ENABLEDELAYEDEXPANSION
|
||||
|
||||
if exist "%Appdata%\Spotify\dpapi.dll" (
|
||||
del /s /q "%Appdata%\Spotify\dpapi.dll" > NUL 2>&1
|
||||
)
|
||||
set "SPOTIFY_PATH=%Appdata%\Spotify"
|
||||
|
||||
if exist "%Appdata%\Spotify\Spotify.bak" (
|
||||
del /s /q "%Appdata%\Spotify.exe" > NUL 2>&1
|
||||
move "%Appdata%\Spotify\Spotify.bak" "%Appdata%\Spotify\Spotify.exe" > NUL 2>&1
|
||||
if exist "%SPOTIFY_PATH%\chrome_elf.dll.bak" (
|
||||
del /s /q "%SPOTIFY_PATH%\chrome_elf.dll" > NUL 2>&1
|
||||
move "%SPOTIFY_PATH%\chrome_elf.dll.bak" "%SPOTIFY_PATH%\chrome_elf.dll" > NUL 2>&1
|
||||
)
|
||||
|
||||
|
||||
if exist "%Appdata%\Spotify\config.ini" (
|
||||
del /s /q "%Appdata%\Spotify\config.ini" > NUL 2>&1
|
||||
)
|
||||
|
||||
|
||||
if exist "%Appdata%\Spotify\Apps\xpui.bak" (
|
||||
del /s /q "%Appdata%\Spotify\Apps\xpui.spa" > NUL 2>&1
|
||||
move "%Appdata%\Spotify\Apps\xpui.bak" "%Appdata%\Spotify\Apps\xpui.spa" > NUL 2>&1
|
||||
)
|
||||
|
||||
|
||||
if exist "%Appdata%\Spotify\blockthespot_log.txt" (
|
||||
del /s /q "%Appdata%\Spotify\blockthespot_log.txt" > NUL 2>&1
|
||||
if exist "%SPOTIFY_PATH%\Spotify.dll.bak" (
|
||||
del /s /q "%SPOTIFY_PATH%\Spotify.dll" > NUL 2>&1
|
||||
move "%SPOTIFY_PATH%\Spotify.dll.bak" "%SPOTIFY_PATH%\Spotify.dll" > NUL 2>&1
|
||||
)
|
||||
|
||||
if exist "%SPOTIFY_PATH%\Spotify.bak" (
|
||||
del /s /q "%SPOTIFY_PATH%\Spotify.exe" > NUL 2>&1
|
||||
move "%SPOTIFY_PATH%\Spotify.bak" "%SPOTIFY_PATH%\Spotify.exe" > NUL 2>&1
|
||||
)
|
||||
|
||||
if exist "%SPOTIFY_PATH%\Apps\xpui.bak" (
|
||||
del /s /q "%SPOTIFY_PATH%\Apps\xpui.spa" > NUL 2>&1
|
||||
move "%SPOTIFY_PATH%\Apps\xpui.bak" "%SPOTIFY_PATH%\Apps\xpui.spa" > NUL 2>&1
|
||||
)
|
||||
|
||||
if exist "%temp%\SpotX_Temp*" (
|
||||
for /d %%i in ("%temp%\SpotX_Temp*") do (
|
||||
rd /s/q "%%i" > NUL 2>&1
|
||||
@@ -33,4 +30,4 @@ if exist "%temp%\SpotX_Temp*" (
|
||||
)
|
||||
|
||||
echo Patch successfully removed
|
||||
pause
|
||||
pause
|
||||
@@ -1,6 +1,7 @@
|
||||
@import url('colors.css');
|
||||
|
||||
/* mini lyrics */
|
||||
.Li269NgzkU2gI4KOP9sM,
|
||||
.I2WIloMMjsBeMaIS8H3v,
|
||||
.McI3hD7aCfpq015LJa6X,
|
||||
.gpDSOimnzH4zTJmE7UR5 {
|
||||
@@ -10,6 +11,18 @@
|
||||
--lyrics-color-background: var(--background) !important;
|
||||
}
|
||||
|
||||
/* title unsynced */
|
||||
p[class*="e-"][class*="-text"].encore-text-body-small {
|
||||
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) {
|
||||
background-color:
|
||||
#1f1f1f !important;
|
||||
}
|
||||
|
||||
/* lyrics description */
|
||||
.ebHsEf.I4K12o0qDoITOLr2AEs0,
|
||||
.ebHsEf.OYiGFGZJDIZ4FF4ZTDK2,
|
||||
@@ -36,7 +49,8 @@ body .KDhLFoEqoClhH12bsfrS {
|
||||
/* full cinema lyrics */
|
||||
.FUYNhisXTCmbzt9IDxnT,
|
||||
.tr8V5eHsUaIkOYVw7eSG,
|
||||
.hW9km7ku6_iggdWDR_Lg {
|
||||
.hW9km7ku6_iggdWDR_Lg,
|
||||
.lofIAg8Ixko3mfBrbfej {
|
||||
--lyrics-color-active: var(--current) !important;
|
||||
--lyrics-color-inactive: var(--next) !important;
|
||||
--lyrics-color-passed: var(--past) !important;
|
||||
@@ -54,13 +68,17 @@ body .KDhLFoEqoClhH12bsfrS {
|
||||
.vapgYYF2HMEeLJuOWGq5:hover,
|
||||
._LKG3z7SnerR0eigPCoK:hover,
|
||||
.NHVfxGs2HwmI_fly2JC4:hover,
|
||||
.gaHIufRWhoWbiT8S6zuM:hover {
|
||||
.gaHIufRWhoWbiT8S6zuM:hover,
|
||||
.FQYXZaa0aDIrse54YlYO:hover {
|
||||
color: var(--hover) !important;
|
||||
/* remove underline */
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
/* lyrics unsynced */
|
||||
.HxblHEsl2WX2yhubfVIc,
|
||||
.SruqsAzX8rUtY2isUZDF,
|
||||
.eTLjCqbDo7QehPEPz86a,
|
||||
.AEfhRyqGa3vzQrgfdwWE.Re403AJffPPuZmX7LRJj,
|
||||
.NHVfxGs2HwmI_fly2JC4.E64X_eoy6xsJmDdKKHja,
|
||||
.gaHIufRWhoWbiT8S6zuM.Qo3OkrSis5IWlP9Tchbr,
|
||||
@@ -68,7 +86,6 @@ body .KDhLFoEqoClhH12bsfrS {
|
||||
color: var(--next) !important;
|
||||
}
|
||||
|
||||
|
||||
/* full screen lyrics */
|
||||
.npv-lyrics__text-wrapper--previous .npv-lyrics__text {
|
||||
color: var(--past) !important;
|
||||
@@ -106,6 +123,7 @@ body .KDhLFoEqoClhH12bsfrS {
|
||||
}
|
||||
|
||||
/* read along podcasts */
|
||||
.l6lFMYQteTVnTcHnLywc,
|
||||
._nDkCIVgkWayq3tqiIuW,
|
||||
.B_wut2Bw4HwLr3w8rNfM {
|
||||
--transcript-color-background: var(--background) !important;
|
||||
|
||||
964
js-helper/checkVersion.js
Normal file
964
js-helper/checkVersion.js
Normal file
@@ -0,0 +1,964 @@
|
||||
(() => {
|
||||
if (window.oneTime) return;
|
||||
window.oneTime = true;
|
||||
|
||||
const WORKER_BASE_URL = "https://spotify-ingest-admin.amd64fox1.workers.dev";
|
||||
const SCRIPT_VERSION = "1.2.1";
|
||||
|
||||
const SOURCE_LABELS = {
|
||||
REMOTE: "latest.json",
|
||||
FIXED: "fixed-version"
|
||||
};
|
||||
|
||||
const PLATFORMS = [
|
||||
{
|
||||
code: "Win32_x86_64",
|
||||
assetPrefix: "spotify_installer",
|
||||
assetSuffix: "x64",
|
||||
extension: ".exe"
|
||||
},
|
||||
{
|
||||
code: "Win32_ARM64",
|
||||
assetPrefix: "spotify_installer",
|
||||
assetSuffix: "arm64",
|
||||
extension: ".exe"
|
||||
},
|
||||
{
|
||||
code: "OSX",
|
||||
assetPrefix: "spotify-autoupdate",
|
||||
assetSuffix: "x86_64",
|
||||
extension: ".tbz"
|
||||
},
|
||||
{
|
||||
code: "OSX_ARM64",
|
||||
assetPrefix: "spotify-autoupdate",
|
||||
assetSuffix: "arm64",
|
||||
extension: ".tbz"
|
||||
}
|
||||
];
|
||||
|
||||
const PLATFORM_CODES = PLATFORMS.map((platform) => platform.code);
|
||||
const SUCCESS_REPORT_STORAGE_KEY = "spotify_ingest:last_successful_report_v1";
|
||||
const ERROR_MESSAGES = {
|
||||
token_missing: "Authorization token not captured",
|
||||
version_unavailable: "Spotify version unavailable. Update check stopped",
|
||||
inconsistent_target_version: "Inconsistent target version across platform links",
|
||||
empty_response: "No update link in response",
|
||||
desktop_update_parse_error: "Desktop-update response parse failed."
|
||||
};
|
||||
|
||||
const CONFIG = {
|
||||
fixedShortVersion: "",
|
||||
latestUrls: Array.isArray(window.__spotifyLatestUrls)
|
||||
? window.__spotifyLatestUrls.filter((url) => typeof url === "string" && url.trim()).map((url) => url.trim())
|
||||
: window.__spotifyLatestUrl
|
||||
? [String(window.__spotifyLatestUrl).trim()]
|
||||
: [
|
||||
"https://raw.githubusercontent.com/LoaderSpot/table/refs/heads/main/latest.json",
|
||||
"https://raw.githack.com/LoaderSpot/table/main/latest.json",
|
||||
`${WORKER_BASE_URL}/api/client/latest`
|
||||
],
|
||||
updateUrl: "https://spclient.wg.spotify.com/desktop-update/v2/update",
|
||||
reportEndpoint: `${WORKER_BASE_URL}/api/client/report`,
|
||||
errorEndpoint: `${WORKER_BASE_URL}/api/client/error`,
|
||||
reportTimeoutMs: 15000,
|
||||
versionTimeoutMs: 10000,
|
||||
desktopUpdateTimeoutMs: 8000,
|
||||
desktopUpdateMaxRetries: 1,
|
||||
tokenCaptureMaxAttempts: 5,
|
||||
tokenCaptureTimeoutMs: 30000
|
||||
};
|
||||
|
||||
const originalFetch = window.fetch;
|
||||
let runStarted = false;
|
||||
let tokenCaptureStopped = false;
|
||||
let tokenCaptureAttempts = 0;
|
||||
let tokenCaptureTimeoutId = 0;
|
||||
|
||||
const SPOTIFY_VERSION_RE = /Spotify\/(\d+\.\d+\.\d+\.\d+)/;
|
||||
|
||||
function nowIso() {
|
||||
return new Date().toISOString();
|
||||
}
|
||||
|
||||
function extractShortVersion(value) {
|
||||
return String(value || "").match(/(\d+\.\d+\.\d+\.\d+)/)?.[1] || "";
|
||||
}
|
||||
|
||||
function readVersionSourceSnapshot() {
|
||||
return {
|
||||
clientInformationAppVersion: String(window.clientInformation?.appVersion || ""),
|
||||
userAgent: String(navigator.userAgent || ""),
|
||||
navigatorAppVersion: String(window.navigator?.appVersion || "")
|
||||
};
|
||||
}
|
||||
|
||||
function readClientVersionSources() {
|
||||
const versionSources = readVersionSourceSnapshot();
|
||||
|
||||
return {
|
||||
clientInformationAppVersion: versionSources.clientInformationAppVersion,
|
||||
userAgent: versionSources.userAgent,
|
||||
navigatorAppVersion: versionSources.navigatorAppVersion,
|
||||
realVersion:
|
||||
versionSources.userAgent.match(SPOTIFY_VERSION_RE)?.[1] ||
|
||||
versionSources.navigatorAppVersion.match(SPOTIFY_VERSION_RE)?.[1] ||
|
||||
"undefined"
|
||||
};
|
||||
}
|
||||
|
||||
function buildSpotifyAppVersion(shortVersion, sourceLabel) {
|
||||
if (!shortVersion) {
|
||||
console.warn(`Spotify version not found (${sourceLabel}).`);
|
||||
return "";
|
||||
}
|
||||
|
||||
const parts = shortVersion.split(".");
|
||||
if (parts.length !== 4) {
|
||||
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;
|
||||
}
|
||||
|
||||
async function fetchJsonWithTimeout(url, timeoutMs) {
|
||||
const controller = new AbortController();
|
||||
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
||||
|
||||
try {
|
||||
const response = await originalFetch(url, {
|
||||
method: "GET",
|
||||
cache: "no-store",
|
||||
signal: controller.signal
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error: ${response.status}`);
|
||||
}
|
||||
|
||||
return response.json();
|
||||
} finally {
|
||||
clearTimeout(timeoutId);
|
||||
}
|
||||
}
|
||||
|
||||
async function resolveQueryVersion() {
|
||||
const fixedShortVersion = String(CONFIG.fixedShortVersion || "").trim();
|
||||
if (fixedShortVersion) {
|
||||
return {
|
||||
shortVersion: fixedShortVersion,
|
||||
fullVersion: "",
|
||||
spotifyAppVersion: buildSpotifyAppVersion(fixedShortVersion, SOURCE_LABELS.FIXED),
|
||||
sourceLabel: SOURCE_LABELS.FIXED,
|
||||
remoteVersionFailed: false,
|
||||
remoteShortVersion: "",
|
||||
remoteFullVersion: ""
|
||||
};
|
||||
}
|
||||
|
||||
for (const latestUrl of CONFIG.latestUrls) {
|
||||
try {
|
||||
const data = await fetchJsonWithTimeout(latestUrl, CONFIG.versionTimeoutMs);
|
||||
const shortVersion = String(data?.version || "").trim();
|
||||
const fullVersion = String(data?.fullversion || "").trim();
|
||||
|
||||
if (!shortVersion) {
|
||||
throw new Error("version field is missing or empty.");
|
||||
}
|
||||
|
||||
return {
|
||||
shortVersion,
|
||||
fullVersion,
|
||||
spotifyAppVersion: buildSpotifyAppVersion(shortVersion, SOURCE_LABELS.REMOTE),
|
||||
sourceLabel: SOURCE_LABELS.REMOTE,
|
||||
remoteVersionFailed: false,
|
||||
remoteShortVersion: shortVersion,
|
||||
remoteFullVersion: fullVersion
|
||||
};
|
||||
} catch (error) {
|
||||
console.warn(`Failed to fetch latest.json version from ${latestUrl}: ${error?.message || error}`);
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
shortVersion: "",
|
||||
fullVersion: "",
|
||||
spotifyAppVersion: "",
|
||||
sourceLabel: "",
|
||||
remoteVersionFailed: true,
|
||||
remoteShortVersion: "",
|
||||
remoteFullVersion: ""
|
||||
};
|
||||
}
|
||||
|
||||
function createState(token) {
|
||||
return {
|
||||
token,
|
||||
startedAtMs: Date.now(),
|
||||
versionSources: readClientVersionSources(),
|
||||
spotifyAppVersion: "",
|
||||
sourceLabel: "",
|
||||
queryShortVersion: "",
|
||||
queryFullVersion: "",
|
||||
remoteVersionFailed: false,
|
||||
remoteShortVersion: "",
|
||||
remoteFullVersion: "",
|
||||
targetShortVersion: "",
|
||||
targetFullVersion: "",
|
||||
platforms: {},
|
||||
failures: [],
|
||||
desktopUpdateResponses: [],
|
||||
retryCountByPlatform: {},
|
||||
forensicMode: false
|
||||
};
|
||||
}
|
||||
|
||||
function readClientContext(state) {
|
||||
const nav = window.navigator || {};
|
||||
return {
|
||||
scriptVersion: SCRIPT_VERSION,
|
||||
userAgent: state.versionSources.userAgent || nav.userAgent || "",
|
||||
platform: nav.platform || "",
|
||||
language: nav.language || "",
|
||||
languages: Array.isArray(nav.languages) ? nav.languages.slice(0, 5) : [],
|
||||
clientInformationAppVersion: state.versionSources.clientInformationAppVersion,
|
||||
navigatorAppVersion: state.versionSources.navigatorAppVersion,
|
||||
"real-version": state.versionSources.realVersion,
|
||||
spotifyAppVersion: state.spotifyAppVersion,
|
||||
sourceLabel: state.sourceLabel,
|
||||
latestJsonVersion: state.sourceLabel === SOURCE_LABELS.REMOTE ? state.remoteShortVersion : "",
|
||||
latestJsonFullVersion: state.sourceLabel === SOURCE_LABELS.REMOTE ? state.remoteFullVersion : ""
|
||||
};
|
||||
}
|
||||
|
||||
function readRequestMeta(state, extra = {}) {
|
||||
return {
|
||||
source: "spotify-client-script",
|
||||
timestamp: nowIso(),
|
||||
hasAuthorization: Boolean(state.token),
|
||||
headers: { "spotify-app-version": state.spotifyAppVersion },
|
||||
...extra
|
||||
};
|
||||
}
|
||||
|
||||
function readDiagnostics(state, result, extra = {}) {
|
||||
return {
|
||||
result,
|
||||
remoteVersionUsed: state.sourceLabel === SOURCE_LABELS.REMOTE,
|
||||
remoteVersionFailed: state.remoteVersionFailed,
|
||||
remoteVersion: state.remoteShortVersion || null,
|
||||
remoteFullVersion: state.remoteFullVersion || null,
|
||||
queryShortVersion: state.queryShortVersion || null,
|
||||
queryFullVersion: state.queryFullVersion || null,
|
||||
detectedShortVersion: state.targetShortVersion || null,
|
||||
detectedFullVersion: state.targetFullVersion || null,
|
||||
requestDurationMs: Math.max(0, Date.now() - state.startedAtMs),
|
||||
checkedPlatforms: PLATFORM_CODES,
|
||||
foundPlatforms: Object.keys(state.platforms),
|
||||
failures: state.failures,
|
||||
...extra
|
||||
};
|
||||
}
|
||||
|
||||
function getPayloadVersions(state) {
|
||||
return {
|
||||
shortVersion: state.targetShortVersion || "",
|
||||
fullVersion: state.targetFullVersion || ""
|
||||
};
|
||||
}
|
||||
|
||||
function buildNormalizedAssetName(platform, fullVersion) {
|
||||
return `${platform.assetPrefix}-${fullVersion}-${platform.assetSuffix}${platform.extension}`;
|
||||
}
|
||||
|
||||
function parseUpgradeAsset(platform, sourceUrl) {
|
||||
let normalizedUrl;
|
||||
try {
|
||||
normalizedUrl = new URL(sourceUrl);
|
||||
} catch {
|
||||
throw new Error(`Invalid upgrade link URL for ${platform.code}.`);
|
||||
}
|
||||
|
||||
const assetName = decodeURIComponent(normalizedUrl.pathname.split("/").pop() || "");
|
||||
const pattern = platform.extension === ".exe"
|
||||
? /^spotify_installer-(.+?)-(?:\d+|x86|x64|arm64)\.exe$/i
|
||||
: /^spotify-autoupdate-(.+?)-(?:\d+|x86_64|arm64)\.tbz$/i;
|
||||
const fullVersion = assetName.match(pattern)?.[1]?.trim() || "";
|
||||
const shortVersion = extractShortVersion(fullVersion);
|
||||
|
||||
if (!fullVersion || !shortVersion) {
|
||||
throw new Error(`Unsupported upgrade asset name for ${platform.code}: ${assetName}`);
|
||||
}
|
||||
|
||||
return {
|
||||
url: normalizedUrl.toString(),
|
||||
shortVersion,
|
||||
fullVersion,
|
||||
normalizedAssetName: buildNormalizedAssetName(platform, fullVersion)
|
||||
};
|
||||
}
|
||||
|
||||
function finalizeDetectedVersions(state) {
|
||||
const assets = Object.values(state.platforms);
|
||||
const shortVersions = [...new Set(assets.map((asset) => asset.shortVersion).filter(Boolean))];
|
||||
const fullVersions = [...new Set(assets.map((asset) => asset.fullVersion).filter(Boolean))];
|
||||
|
||||
if (shortVersions.length > 1 || fullVersions.length > 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
state.targetShortVersion = shortVersions[0] || "";
|
||||
state.targetFullVersion = fullVersions[0] || "";
|
||||
return true;
|
||||
}
|
||||
|
||||
function buildPlatformPayload(platforms) {
|
||||
const payload = {};
|
||||
for (const [code, asset] of Object.entries(platforms)) {
|
||||
if (!asset) continue;
|
||||
payload[code] = {
|
||||
url: asset.url,
|
||||
shortVersion: asset.shortVersion,
|
||||
fullVersion: asset.fullVersion,
|
||||
normalizedAssetName: asset.normalizedAssetName
|
||||
};
|
||||
}
|
||||
return payload;
|
||||
}
|
||||
|
||||
function getSuccessReportStorage() {
|
||||
try {
|
||||
return window.localStorage || null;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function clearStoredSuccessReport(storage = getSuccessReportStorage()) {
|
||||
if (!storage) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
storage.removeItem(SUCCESS_REPORT_STORAGE_KEY);
|
||||
} catch {
|
||||
// ignore storage cleanup failures
|
||||
}
|
||||
}
|
||||
|
||||
function readStoredSuccessReport() {
|
||||
const storage = getSuccessReportStorage();
|
||||
if (!storage) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let rawValue = "";
|
||||
try {
|
||||
rawValue = String(storage.getItem(SUCCESS_REPORT_STORAGE_KEY) || "");
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!rawValue) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
const parsed = JSON.parse(rawValue);
|
||||
const shortVersion = String(parsed?.shortVersion || "").trim();
|
||||
const fullVersion = String(parsed?.fullVersion || "").trim();
|
||||
const reportedAt = String(parsed?.reportedAt || "").trim();
|
||||
|
||||
if (!fullVersion) {
|
||||
clearStoredSuccessReport(storage);
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
shortVersion,
|
||||
fullVersion,
|
||||
reportedAt
|
||||
};
|
||||
} catch {
|
||||
clearStoredSuccessReport(storage);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function isAlreadyReported(fullVersion) {
|
||||
const normalizedFullVersion = String(fullVersion || "").trim();
|
||||
if (!normalizedFullVersion) {
|
||||
return false;
|
||||
}
|
||||
return readStoredSuccessReport()?.fullVersion === normalizedFullVersion;
|
||||
}
|
||||
|
||||
function writeStoredSuccessReport(state) {
|
||||
const storage = getSuccessReportStorage();
|
||||
if (!storage) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const payload = {
|
||||
shortVersion: state.targetShortVersion || "",
|
||||
fullVersion: state.targetFullVersion || "",
|
||||
reportedAt: nowIso()
|
||||
};
|
||||
if (!payload.fullVersion) {
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
storage.setItem(SUCCESS_REPORT_STORAGE_KEY, JSON.stringify(payload));
|
||||
return true;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function postJsonWithTimeout(endpoint, body) {
|
||||
const controller = new AbortController();
|
||||
const timeoutId = setTimeout(() => controller.abort(), CONFIG.reportTimeoutMs);
|
||||
|
||||
return originalFetch(endpoint, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "text/plain;charset=UTF-8" },
|
||||
body,
|
||||
cache: "no-store",
|
||||
keepalive: true,
|
||||
signal: controller.signal
|
||||
}).finally(() => {
|
||||
clearTimeout(timeoutId);
|
||||
});
|
||||
}
|
||||
|
||||
function sendBestEffortPayload(endpoint, payload) {
|
||||
if (!endpoint) {
|
||||
return;
|
||||
}
|
||||
|
||||
const body = JSON.stringify(payload);
|
||||
|
||||
try {
|
||||
if (navigator.sendBeacon && navigator.sendBeacon(endpoint, body)) {
|
||||
return;
|
||||
}
|
||||
} catch {
|
||||
// ignore beacon failure and fall back to fetch
|
||||
}
|
||||
|
||||
void postJsonWithTimeout(endpoint, body).catch((error) => {
|
||||
console.warn("Failed to send report:", error?.message || error);
|
||||
});
|
||||
}
|
||||
|
||||
async function postSuccessPayloadWithAck(endpoint, payload) {
|
||||
if (!endpoint) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const body = JSON.stringify(payload);
|
||||
|
||||
try {
|
||||
const response = await postJsonWithTimeout(endpoint, body);
|
||||
|
||||
if (response.status === 200) {
|
||||
return true;
|
||||
}
|
||||
|
||||
console.warn(`Client report rejected with HTTP ${response.status}.`);
|
||||
return false;
|
||||
} catch (error) {
|
||||
console.warn("Failed to send acknowledged report:", error?.message || error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
async function sendSuccess(state) {
|
||||
const versions = getPayloadVersions(state);
|
||||
return postSuccessPayloadWithAck(CONFIG.reportEndpoint, {
|
||||
shortVersion: versions.shortVersion,
|
||||
fullVersion: versions.fullVersion,
|
||||
platforms: buildPlatformPayload(state.platforms),
|
||||
clientContext: readClientContext(state),
|
||||
requestMeta: readRequestMeta(state),
|
||||
diagnostics: readDiagnostics(state, "success")
|
||||
});
|
||||
}
|
||||
|
||||
function sendError(state, kind, extra = {}) {
|
||||
const versions = getPayloadVersions(state);
|
||||
sendBestEffortPayload(CONFIG.errorEndpoint, {
|
||||
kind,
|
||||
phase: extra.phase || kind,
|
||||
shortVersion: versions.shortVersion,
|
||||
fullVersion: versions.fullVersion,
|
||||
message: extra.message || ERROR_MESSAGES[kind] || "Unexpected error.",
|
||||
stack: extra.stack || "",
|
||||
partialPlatforms: buildPlatformPayload(state.platforms),
|
||||
clientContext: readClientContext(state),
|
||||
requestMeta: readRequestMeta(state, extra.requestMeta),
|
||||
diagnostics: readDiagnostics(state, "error", extra.diagnostics),
|
||||
rawPayload: extra.rawPayload
|
||||
});
|
||||
}
|
||||
|
||||
function decodeLatin1Buffer(buffer) {
|
||||
return new TextDecoder("latin1").decode(buffer);
|
||||
}
|
||||
|
||||
function extractUpgradeLink(bodyLatin1) {
|
||||
const payload = String(bodyLatin1 || "");
|
||||
const baseUrl = payload.match(
|
||||
/https:\/\/upgrade\.scdn\.co\/upgrade\/client\/(?:win32-(?:x86_64|arm64)|osx-(?:x86_64|arm64))\/[A-Za-z0-9._-]+\.(?:exe|tbz)/i
|
||||
)?.[0];
|
||||
const authQuery = payload.match(/\?fauth=[A-Za-z0-9._~-]+/)?.[0];
|
||||
return baseUrl && authQuery ? `${baseUrl}${authQuery}` : "";
|
||||
}
|
||||
|
||||
function readResponseHeaders(headers) {
|
||||
const result = {};
|
||||
if (!headers || typeof headers.forEach !== "function") {
|
||||
return result;
|
||||
}
|
||||
headers.forEach((value, key) => {
|
||||
result[String(key || "").toLowerCase()] = String(value || "");
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
function formatDesktopUpdateError(platform, error) {
|
||||
if (error?.name === "AbortError") {
|
||||
return `${platform.code} request timeout after ${CONFIG.desktopUpdateTimeoutMs}ms`;
|
||||
}
|
||||
return error?.message || String(error);
|
||||
}
|
||||
|
||||
function buildRequestErrorResult(base, errorMessage) {
|
||||
return {
|
||||
outcome: "request_error",
|
||||
finalUrl: base.finalUrl || CONFIG.updateUrl,
|
||||
status: Number.isFinite(Number(base.status)) ? Number(base.status) : null,
|
||||
headers: base.headers || {},
|
||||
contentType: base.contentType || null,
|
||||
contentLength: base.contentLength || null,
|
||||
byteLength: null,
|
||||
bodyLatin1: null,
|
||||
extractedUpgradeLink: "",
|
||||
parseErrorMessage: null,
|
||||
errorMessage: errorMessage || null
|
||||
};
|
||||
}
|
||||
|
||||
async function fetchDesktopUpdateAttempt(token, spotifyAppVersion, platform) {
|
||||
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));
|
||||
} 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) {
|
||||
return {
|
||||
attempt: attemptNumber,
|
||||
outcome: result.outcome,
|
||||
status: Number.isFinite(Number(result.status)) ? Number(result.status) : null,
|
||||
finalUrl: result.finalUrl || null,
|
||||
contentType: result.contentType || null,
|
||||
contentLength: result.contentLength || null,
|
||||
byteLength: Number.isFinite(Number(result.byteLength)) ? Number(result.byteLength) : null,
|
||||
errorMessage: result.errorMessage || null
|
||||
};
|
||||
}
|
||||
|
||||
function buildDesktopUpdateResponseRecord(platformCode, attempts, result, requestErrors) {
|
||||
return {
|
||||
platform: platformCode,
|
||||
attempts,
|
||||
finalOutcome: result.outcome,
|
||||
finalUrl: result.finalUrl || null,
|
||||
status: Number.isFinite(Number(result.status)) ? Number(result.status) : null,
|
||||
headers: result.headers || {},
|
||||
contentType: result.contentType || null,
|
||||
contentLength: result.contentLength || null,
|
||||
byteLength: Number.isFinite(Number(result.byteLength)) ? Number(result.byteLength) : null,
|
||||
bodyLatin1: result.bodyLatin1 || null,
|
||||
extractedUpgradeLink: result.extractedUpgradeLink || "",
|
||||
parseErrorMessage: result.parseErrorMessage || null,
|
||||
requestErrors
|
||||
};
|
||||
}
|
||||
|
||||
function buildForensicDiagnostics(state) {
|
||||
const retryCountByPlatform = {};
|
||||
for (const platform of PLATFORMS) {
|
||||
retryCountByPlatform[platform.code] = Number(state.retryCountByPlatform[platform.code] || 0);
|
||||
}
|
||||
|
||||
const successfulPlatforms = [];
|
||||
const parseErrorPlatforms = [];
|
||||
const requestErrorPlatforms = [];
|
||||
const emptyResponsePlatforms = [];
|
||||
|
||||
for (const item of state.desktopUpdateResponses) {
|
||||
if (!item?.platform) {
|
||||
continue;
|
||||
}
|
||||
if (item.finalOutcome === "success") successfulPlatforms.push(item.platform);
|
||||
if (item.finalOutcome === "parse_error") parseErrorPlatforms.push(item.platform);
|
||||
if (item.finalOutcome === "request_error") requestErrorPlatforms.push(item.platform);
|
||||
if (item.finalOutcome === "empty_response") emptyResponsePlatforms.push(item.platform);
|
||||
}
|
||||
|
||||
return {
|
||||
successfulPlatforms,
|
||||
parseErrorPlatforms,
|
||||
requestErrorPlatforms,
|
||||
emptyResponsePlatforms,
|
||||
retryCountByPlatform
|
||||
};
|
||||
}
|
||||
|
||||
function buildForensicRawPayload(state) {
|
||||
return {
|
||||
desktopUpdateResponses: state.desktopUpdateResponses.map((item) => ({
|
||||
platform: item.platform,
|
||||
attempts: Array.isArray(item.attempts) ? item.attempts.map((attempt) => ({ ...attempt })) : [],
|
||||
finalOutcome: item.finalOutcome,
|
||||
finalUrl: item.finalUrl || null,
|
||||
status: item.status ?? null,
|
||||
headers: item.headers && typeof item.headers === "object" ? { ...item.headers } : {},
|
||||
contentType: item.contentType || null,
|
||||
contentLength: item.contentLength || null,
|
||||
byteLength: item.byteLength ?? null,
|
||||
bodyLatin1: item.bodyLatin1 || null,
|
||||
extractedUpgradeLink: item.extractedUpgradeLink || "",
|
||||
parseErrorMessage: item.parseErrorMessage || null,
|
||||
requestErrors: Array.isArray(item.requestErrors) ? item.requestErrors.slice() : []
|
||||
}))
|
||||
};
|
||||
}
|
||||
|
||||
async function collectPlatformResult(state, platform) {
|
||||
const attempts = [];
|
||||
const requestErrors = [];
|
||||
const maxAttempts = 1 + Number(CONFIG.desktopUpdateMaxRetries || 0);
|
||||
let finalResult = null;
|
||||
|
||||
for (let attemptIndex = 0; attemptIndex < maxAttempts; attemptIndex += 1) {
|
||||
const result = await fetchDesktopUpdateAttempt(state.token, state.spotifyAppVersion, platform);
|
||||
finalResult = result;
|
||||
attempts.push(buildAttemptMetadata(attemptIndex + 1, result));
|
||||
if (result.outcome === "request_error" && result.errorMessage) {
|
||||
requestErrors.push(result.errorMessage);
|
||||
}
|
||||
if (result.outcome !== "request_error" || attemptIndex === maxAttempts - 1) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
state.retryCountByPlatform[platform.code] = Math.max(0, attempts.length - 1);
|
||||
state.desktopUpdateResponses.push(
|
||||
buildDesktopUpdateResponseRecord(platform.code, attempts, finalResult, requestErrors)
|
||||
);
|
||||
|
||||
if (finalResult.outcome === "success") {
|
||||
state.platforms[platform.code] = finalResult.asset;
|
||||
return finalResult.outcome;
|
||||
}
|
||||
|
||||
if (finalResult.outcome === "parse_error") {
|
||||
state.forensicMode = true;
|
||||
state.failures.push({
|
||||
platform: platform.code,
|
||||
kind: "parse_error",
|
||||
message: finalResult.parseErrorMessage || `Failed to parse ${platform.code} upgrade response`
|
||||
});
|
||||
return finalResult.outcome;
|
||||
}
|
||||
|
||||
if (finalResult.outcome === "empty_response") {
|
||||
state.failures.push({
|
||||
platform: platform.code,
|
||||
kind: "empty_response",
|
||||
message: ERROR_MESSAGES.empty_response
|
||||
});
|
||||
return finalResult.outcome;
|
||||
}
|
||||
|
||||
state.failures.push({
|
||||
platform: platform.code,
|
||||
kind: "request_error",
|
||||
message: finalResult.errorMessage || `Failed to request ${platform.code} update metadata`
|
||||
});
|
||||
return finalResult.outcome;
|
||||
}
|
||||
|
||||
async function collectPlatforms(state) {
|
||||
for (const platform of PLATFORMS) {
|
||||
const outcome = await collectPlatformResult(state, platform);
|
||||
if (!state.forensicMode && outcome !== "success") {
|
||||
return { aborted: true };
|
||||
}
|
||||
}
|
||||
return { aborted: false };
|
||||
}
|
||||
|
||||
function sendDesktopUpdateParseError(state) {
|
||||
sendError(state, "desktop_update_parse_error", {
|
||||
phase: "desktop_update_parse_error",
|
||||
message: ERROR_MESSAGES.desktop_update_parse_error,
|
||||
diagnostics: buildForensicDiagnostics(state),
|
||||
rawPayload: buildForensicRawPayload(state)
|
||||
});
|
||||
}
|
||||
|
||||
function logVersionUnavailable(state) {
|
||||
console.error(ERROR_MESSAGES.version_unavailable, {
|
||||
scriptVersion: SCRIPT_VERSION,
|
||||
remoteVersionFailed: state.remoteVersionFailed,
|
||||
realVersion: state.versionSources.realVersion || "",
|
||||
latestJsonVersion: state.remoteShortVersion || "",
|
||||
latestJsonFullVersion: state.remoteFullVersion || ""
|
||||
});
|
||||
}
|
||||
|
||||
async function runOnce(token) {
|
||||
const state = createState(token);
|
||||
|
||||
if (!token) {
|
||||
sendError(state, "token_missing");
|
||||
return;
|
||||
}
|
||||
|
||||
const version = await resolveQueryVersion();
|
||||
state.queryShortVersion = version.shortVersion;
|
||||
state.queryFullVersion = version.fullVersion;
|
||||
state.spotifyAppVersion = version.spotifyAppVersion;
|
||||
state.sourceLabel = version.sourceLabel;
|
||||
state.remoteVersionFailed = version.remoteVersionFailed;
|
||||
state.remoteShortVersion = version.remoteShortVersion;
|
||||
state.remoteFullVersion = version.remoteFullVersion;
|
||||
|
||||
if (!state.spotifyAppVersion) {
|
||||
logVersionUnavailable(state);
|
||||
return;
|
||||
}
|
||||
|
||||
const collection = await collectPlatforms(state);
|
||||
if (state.forensicMode) {
|
||||
sendDesktopUpdateParseError(state);
|
||||
return;
|
||||
}
|
||||
if (collection.aborted) {
|
||||
return;
|
||||
}
|
||||
|
||||
const foundCount = Object.keys(state.platforms).length;
|
||||
if (!finalizeDetectedVersions(state)) {
|
||||
sendError(state, "inconsistent_target_version", {
|
||||
diagnostics: {
|
||||
detectedShortVersions: [...new Set(Object.values(state.platforms).map((asset) => asset.shortVersion))],
|
||||
detectedFullVersions: [...new Set(Object.values(state.platforms).map((asset) => asset.fullVersion))]
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if (isAlreadyReported(state.targetFullVersion)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (await sendSuccess(state)) {
|
||||
writeStoredSuccessReport(state);
|
||||
}
|
||||
}
|
||||
|
||||
function getHeaderValue(headers, name) {
|
||||
const target = String(name).toLowerCase();
|
||||
if (!headers) return null;
|
||||
|
||||
if (headers instanceof Headers) {
|
||||
return headers.get(target);
|
||||
}
|
||||
|
||||
if (Array.isArray(headers)) {
|
||||
return headers.find(([key]) => String(key).toLowerCase() === target)?.[1] || null;
|
||||
}
|
||||
|
||||
if (typeof headers === "object") {
|
||||
for (const key of Object.keys(headers)) {
|
||||
if (key.toLowerCase() === target) {
|
||||
return headers[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function getRequestUrl(input) {
|
||||
if (typeof input === "string") return input;
|
||||
if (input instanceof URL) return input.toString();
|
||||
if (input instanceof Request) return input.url;
|
||||
return "";
|
||||
}
|
||||
|
||||
function isSpotifyAuthorizedRequest(url, authorization) {
|
||||
return Boolean(
|
||||
authorization &&
|
||||
/^Bearer\s+/i.test(String(authorization)) &&
|
||||
/spclient\.wg\.spotify\.com/i.test(String(url || ""))
|
||||
);
|
||||
}
|
||||
|
||||
function extractBearerToken(authorization) {
|
||||
const match = String(authorization || "").match(/^Bearer\s+(.+)$/i);
|
||||
if (!match) {
|
||||
return "";
|
||||
}
|
||||
return String(match[1] || "").trim();
|
||||
}
|
||||
|
||||
function stopTokenCapture(reason) {
|
||||
if (tokenCaptureStopped) {
|
||||
return;
|
||||
}
|
||||
|
||||
tokenCaptureStopped = true;
|
||||
window.fetch = originalFetch;
|
||||
if (tokenCaptureTimeoutId) {
|
||||
clearTimeout(tokenCaptureTimeoutId);
|
||||
tokenCaptureTimeoutId = 0;
|
||||
}
|
||||
|
||||
if (reason === "max_attempts") {
|
||||
console.warn(`Spotify token capture stopped after ${CONFIG.tokenCaptureMaxAttempts} empty bearer attempts.`);
|
||||
} else if (reason === "timeout") {
|
||||
console.warn(`Spotify token capture stopped after ${CONFIG.tokenCaptureTimeoutMs}ms timeout.`);
|
||||
}
|
||||
}
|
||||
|
||||
tokenCaptureTimeoutId = setTimeout(() => {
|
||||
if (!runStarted) {
|
||||
stopTokenCapture("timeout");
|
||||
}
|
||||
}, CONFIG.tokenCaptureTimeoutMs);
|
||||
|
||||
window.fetch = async function (...args) {
|
||||
const [input, init] = args;
|
||||
const headers = init?.headers || (input instanceof Request ? input.headers : null);
|
||||
const authorization = getHeaderValue(headers, "authorization");
|
||||
|
||||
if (!runStarted && !tokenCaptureStopped && isSpotifyAuthorizedRequest(getRequestUrl(input), authorization)) {
|
||||
tokenCaptureAttempts += 1;
|
||||
const token = extractBearerToken(authorization);
|
||||
if (token) {
|
||||
runStarted = true;
|
||||
stopTokenCapture("success");
|
||||
|
||||
void runOnce(token).catch((error) => {
|
||||
const state = createState(token);
|
||||
sendError(state, "uncaught", {
|
||||
phase: "uncaught_runOnce",
|
||||
message: error?.message || String(error),
|
||||
stack: error?.stack || ""
|
||||
});
|
||||
});
|
||||
} else if (tokenCaptureAttempts >= CONFIG.tokenCaptureMaxAttempts) {
|
||||
stopTokenCapture("max_attempts");
|
||||
}
|
||||
}
|
||||
|
||||
return originalFetch.apply(this, args);
|
||||
};
|
||||
})();
|
||||
@@ -1,20 +1,68 @@
|
||||
const unique = new Set();
|
||||
// max track buffer for localStorage
|
||||
// when the limit is reached, old tracks will be removed from the beginning, and new ones will be added to the end
|
||||
const MAX_TRACKS = 1000;
|
||||
|
||||
function goofyHistory(e, urlForm, idBox) {
|
||||
// max delay between switching tracks (ms)
|
||||
const MAX_DELAY = 1000;
|
||||
|
||||
const uri = e?.item?.uri;
|
||||
function debounce(func, wait) {
|
||||
let timeout;
|
||||
return function executedFunction(...args) {
|
||||
const later = () => {
|
||||
clearTimeout(timeout);
|
||||
func(...args);
|
||||
};
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(later, wait);
|
||||
};
|
||||
}
|
||||
|
||||
if (uri && uri.includes('spotify:track:') && !unique.has(uri)) {
|
||||
const loadTracksFromStorage = () => {
|
||||
try {
|
||||
const savedTracks = localStorage.getItem('sentSpotifyTracks');
|
||||
return new Set(savedTracks ? JSON.parse(savedTracks) : []);
|
||||
} catch (error) {
|
||||
console.error('Error loading tracks from localStorage:', error);
|
||||
return new Set();
|
||||
}
|
||||
};
|
||||
|
||||
unique.add(uri);
|
||||
const saveTracksToStorage = (tracks) => {
|
||||
try {
|
||||
let tracksArray = [...tracks];
|
||||
|
||||
fetch(urlForm, {
|
||||
if (tracksArray.length > MAX_TRACKS) {
|
||||
tracksArray = tracksArray.slice(-MAX_TRACKS);
|
||||
}
|
||||
|
||||
localStorage.setItem('sentSpotifyTracks', JSON.stringify(tracksArray));
|
||||
} catch (error) {
|
||||
console.error('Error saving tracks to localStorage:', error);
|
||||
}
|
||||
};
|
||||
|
||||
const unique = loadTracksFromStorage();
|
||||
|
||||
async function sendToGoogleForm(uri, urlForm, idBox) {
|
||||
try {
|
||||
await fetch(urlForm, {
|
||||
"headers": {
|
||||
"content-type": "application/x-www-form-urlencoded",
|
||||
},
|
||||
"body": "entry." + idBox + "=" + uri,
|
||||
"method": "POST",
|
||||
"mode": "no-cors",
|
||||
}).catch(error => console.error('error sending uri to google form:', error));
|
||||
});
|
||||
saveTracksToStorage(unique);
|
||||
} catch (error) {
|
||||
console.error('Error sending uri to google form:', error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const goofyHistory = debounce(async (e, urlForm, idBox) => {
|
||||
const uri = e?.item?.uri;
|
||||
if (uri && uri.includes('spotify:track:') && !unique.has(uri)) {
|
||||
unique.add(uri);
|
||||
await sendToGoogleForm(uri, urlForm, idBox);
|
||||
}
|
||||
}, MAX_DELAY);
|
||||
@@ -1,89 +1,352 @@
|
||||
function sectionBlock(e, type) {
|
||||
const API_PATHFINDER = 'api-partner.spotify.com/pathfinder';
|
||||
const API_RECOMMENDATIONS = 'api.spotify.com/v1/views/personalized-recommendations';
|
||||
|
||||
const BLOCKED_SECTIONS_BY_CATEGORY = {
|
||||
'Party': [
|
||||
'0JQ5DAnM3wGh0gz1MXnul1'
|
||||
],
|
||||
'Chill': [
|
||||
'0JQ5DAnM3wGh0gz1MXnukV'
|
||||
],
|
||||
'Best of the Year': [
|
||||
'0JQ5IMCbQBLupUQrQFeCzx'
|
||||
],
|
||||
'Best of Artists / Tracks': [
|
||||
'0JQ5DAnM3wGh0gz1MXnu3C'
|
||||
],
|
||||
'Best of songwriters': [
|
||||
'0JQ5DAnM3wGh0gz1MXnu4w'
|
||||
],
|
||||
'Biggest Indie Playlists': [
|
||||
'0JQ5IMCbQBLhSb02SGYpDM'
|
||||
],
|
||||
'Charts': [
|
||||
'0JQ5DAnM3wGh0gz1MXnu5g'
|
||||
],
|
||||
'Dinner': [
|
||||
'0JQ5DAnM3wGh0gz1MXnu3p'
|
||||
],
|
||||
'Featured Charts': [
|
||||
'0JQ5DAob0KOew1FBAMSmBz'
|
||||
],
|
||||
'Focus': [
|
||||
'0JQ5DAob0JCuWaGLU6ntFY',
|
||||
'0JQ5DAnM3wGh0gz1MXnulP'
|
||||
],
|
||||
'Fresh new music': [
|
||||
'0JQ5DAnM3wGh0gz1MXnu3s'
|
||||
],
|
||||
'Gaming music': [
|
||||
'0JQ5DAob0LaV9FOMJ9utY5'
|
||||
],
|
||||
'Happy': [
|
||||
'0JQ5DAnM3wGh0gz1MXnu3q'
|
||||
],
|
||||
'ICE PHONK': [
|
||||
'0JQ5IMCbQBLiqrNCH9VvmA'
|
||||
],
|
||||
'Mood': [
|
||||
'0JQ5DAnM3wGh0gz1MXnucG',
|
||||
'0JQ5DAob0JCuWaGLU6ntFT'
|
||||
],
|
||||
'Most Listened 2023': [
|
||||
'0JQ5IMCbQBLicmNERjnGn5'
|
||||
],
|
||||
'Music to game to': [
|
||||
'0JQ5DAob0Jr9ClCbkV4pZD'
|
||||
],
|
||||
'Popular Albums / Artists': [
|
||||
'0JQ5DAnM3wGh0gz1MXnu3B'
|
||||
],
|
||||
'Popular new releases': [
|
||||
'0JQ5DAnM3wGh0gz1MXnu3D'
|
||||
],
|
||||
'Popular radio': [
|
||||
'0JQ5DAnM3wGh0gz1MXnu4h'
|
||||
],
|
||||
'Sad': [
|
||||
'0JQ5DAnM3wGh0gz1MXnu3u',
|
||||
'0JQ5DAnM3wGh0gz1MXnul2'
|
||||
],
|
||||
'Throwback': [
|
||||
'0JQ5DAnM3wGh0gz1MXnu3w',
|
||||
'0JQ5DAnM3wGh0gz1MXnul4'
|
||||
],
|
||||
'Throwback Thursday / Spotify Playlists / Good night ': [
|
||||
'0JQ5DAuChZYPe9iDhh2mJz'
|
||||
],
|
||||
'Today`s biggest hits': [
|
||||
'0JQ5DAnM3wGh0gz1MXnu3M'
|
||||
],
|
||||
'Trending now': [
|
||||
'0JQ5DAnM3wGh0gz1MXnu3E'
|
||||
],
|
||||
'Workout': [
|
||||
'0JQ5DAnM3wGh0gz1MXnu3x',
|
||||
'0JQ5DAnM3wGh0gz1MXnul6'
|
||||
],
|
||||
'Now defrosting': [
|
||||
'0JQ5IMCbQBLlC31GvtaB6w'
|
||||
],
|
||||
'Unknown': [
|
||||
'0JQ5IMCbQBLqTJyy28YCa9',
|
||||
'0JQ5DAnM3wGh0gz1MXnu7R'
|
||||
]
|
||||
};
|
||||
|
||||
// block subfeeds
|
||||
if (type === "podcast" || type === "all") {
|
||||
const style = document.createElement("style");
|
||||
style.innerHTML = `
|
||||
.cj6vRk3nFAi80HSVqX91,
|
||||
.zbU90jX5VWUhVlpUda7B {
|
||||
display: none !important;
|
||||
}
|
||||
`;
|
||||
document.body.appendChild(style);
|
||||
const BLOCKED_SECTIONS = {};
|
||||
for (const [category, ids] of Object.entries(BLOCKED_SECTIONS_BY_CATEGORY)) {
|
||||
for (const id of ids) {
|
||||
BLOCKED_SECTIONS[id] = category;
|
||||
}
|
||||
}
|
||||
|
||||
const BLOCKED_CONTENT_TYPES = new Set(['Podcast', 'Audiobook', 'Episode']);
|
||||
|
||||
const createSectionAdapter = (isPersonalizedRecommendations) => {
|
||||
if (isPersonalizedRecommendations) {
|
||||
return {
|
||||
getId: (item) => {
|
||||
const href = item?.href;
|
||||
if (!href) return null;
|
||||
|
||||
const parts = href.split('/');
|
||||
let id = parts[parts.length - 1];
|
||||
|
||||
if (id.startsWith('section')) {
|
||||
id = id.substring(7);
|
||||
}
|
||||
return id;
|
||||
},
|
||||
getTitle: (item) => item?.content?.name || 'Unknown',
|
||||
getRef: (item) => item?.href,
|
||||
getSectionId: (item) => item?.id,
|
||||
|
||||
getContentItems: (item) => item?.content?.items,
|
||||
getContentData: (contentItem) => contentItem?.content,
|
||||
getContentType: (contentItem) => contentItem?.type,
|
||||
getContentTypeName: (contentItem) => contentItem?.content_type
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
getId: (item) => {
|
||||
const uri = item?.uri;
|
||||
if (!uri) return null;
|
||||
|
||||
const parts = uri.split(':');
|
||||
return parts[parts.length - 1];
|
||||
},
|
||||
getTitle: (item) => item?.data?.title?.text || 'Unknown',
|
||||
getRef: (item) => item?.uri,
|
||||
getSectionId: (item) => null,
|
||||
|
||||
getContentItems: (item) => item?.sectionItems?.items,
|
||||
getContentData: (contentItem) => contentItem?.content?.data,
|
||||
getContentType: (contentItem) => null,
|
||||
getContentTypeName: (contentItem) => null
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
const processShortcutsSection = (contentItems, adapter, removed) => {
|
||||
if (!contentItems?.length) return false;
|
||||
|
||||
for (let j = contentItems.length - 1; j >= 0; j--) {
|
||||
const contentItem = contentItems[j];
|
||||
const contentType = adapter.getContentTypeName(contentItem);
|
||||
|
||||
if (contentType !== 'PODCAST_EPISODE' && contentType !== 'AUDIOBOOK') {
|
||||
continue;
|
||||
}
|
||||
|
||||
removed.push({
|
||||
type: contentType,
|
||||
name: contentItem?.name || 'Unknown',
|
||||
uri: contentItem?.uri || 'N/A'
|
||||
});
|
||||
contentItems.splice(j, 1);
|
||||
}
|
||||
|
||||
const body = e?.data?.home;
|
||||
return true;
|
||||
};
|
||||
|
||||
const isPodcastSection = (contentItems, adapter) => {
|
||||
if (!contentItems?.length) return false;
|
||||
return adapter.getContentType(contentItems[0]) === 'show';
|
||||
};
|
||||
|
||||
const removeBlockedContent = (contentItems, adapter, removed) => {
|
||||
if (!contentItems?.length) return;
|
||||
|
||||
for (let j = contentItems.length - 1; j >= 0; j--) {
|
||||
const contentData = adapter.getContentData(contentItems[j]);
|
||||
|
||||
if (!contentData || !BLOCKED_CONTENT_TYPES.has(contentData.__typename)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
removed.push({
|
||||
type: contentData.__typename,
|
||||
name: contentData.name || 'Unknown',
|
||||
uri: contentData.uri || 'N/A'
|
||||
});
|
||||
contentItems.splice(j, 1);
|
||||
}
|
||||
};
|
||||
|
||||
function sectionBlock(data, type) {
|
||||
const body = data?.data?.home;
|
||||
const sections = body?.sectionContainer?.sections?.items;
|
||||
const items = data?.content?.items || data?.data?.content?.items;
|
||||
|
||||
const isPersonalizedRecommendations = !!items && !body;
|
||||
const targetArray = isPersonalizedRecommendations ? items : sections;
|
||||
|
||||
function removeSections() {
|
||||
if (!targetArray?.length) return;
|
||||
|
||||
const sectionsData = [
|
||||
{ id: '0JQ5IMCbQBLupUQrQFeCzx', name: 'Best of the Year' },
|
||||
{ id: '0JQ5DAnM3wGh0gz1MXnu3C', name: 'Best of Artists / Tracks' },
|
||||
{ id: '0JQ5DAnM3wGh0gz1MXnu4w', name: 'Best of songwriters' },
|
||||
{ id: '0JQ5IMCbQBLhSb02SGYpDM', name: 'Biggest Indie Playlists' },
|
||||
{ id: '0JQ5DAnM3wGh0gz1MXnu5g', name: 'Charts' },
|
||||
{ id: '0JQ5DAnM3wGh0gz1MXnu3p', name: 'Dinner' },
|
||||
{ id: '0JQ5DAob0KOew1FBAMSmBz', name: 'Featured Charts' },
|
||||
{ id: '0JQ5DAob0JCuWaGLU6ntFY', name: 'Focus' },
|
||||
{ id: '0JQ5DAnM3wGh0gz1MXnu3s', name: 'Fresh new music' },
|
||||
{ id: '0JQ5DAob0LaV9FOMJ9utY5', name: 'Gaming music' },
|
||||
{ id: '0JQ5DAnM3wGh0gz1MXnu3q', name: 'Happy' },
|
||||
{ id: '0JQ5IMCbQBLiqrNCH9VvmA', name: 'ICE PHONK' },
|
||||
{ id: '0JQ5DAnM3wGh0gz1MXnucG', name: 'Mood' },
|
||||
{ id: '0JQ5DAob0JCuWaGLU6ntFT', name: 'Mood' },
|
||||
{ id: '0JQ5IMCbQBLicmNERjnGn5', name: 'Most Listened 2023' },
|
||||
{ id: '0JQ5DAob0Jr9ClCbkV4pZD', name: 'Music to game to' },
|
||||
{ id: '0JQ5DAnM3wGh0gz1MXnu3B', name: 'Popular Albums / Artists' },
|
||||
{ id: '0JQ5DAnM3wGh0gz1MXnu3D', name: 'Popular new releases' },
|
||||
{ id: '0JQ5DAnM3wGh0gz1MXnu4h', name: 'Popular radio' },
|
||||
{ id: '0JQ5DAnM3wGh0gz1MXnu3u', name: 'Sad' },
|
||||
{ id: '0JQ5DAnM3wGh0gz1MXnu3w', name: 'Throwback' },
|
||||
{ id: '0JQ5DAuChZYPe9iDhh2mJz', name: 'Throwback Thursday / Spotify Playlists' },
|
||||
{ id: '0JQ5DAnM3wGh0gz1MXnu3M', name: 'Today`s biggest hits' },
|
||||
{ id: '0JQ5DAnM3wGh0gz1MXnu3E', name: 'Trending now' },
|
||||
{ id: '0JQ5DAnM3wGh0gz1MXnu3x', name: 'Workout' },
|
||||
{ id: '0JQ5IMCbQBLqTJyy28YCa9', name: '?' },
|
||||
{ id: '0JQ5IMCbQBLlC31GvtaB6w', name: '?' },
|
||||
{ id: '0JQ5DAnM3wGh0gz1MXnu7R', name: '?' }
|
||||
]
|
||||
const sectionIdsRegex = new RegExp(sectionsData.map(section => section.id).join('|'));
|
||||
const adapter = createSectionAdapter(isPersonalizedRecommendations);
|
||||
const removed = [];
|
||||
|
||||
for (let i = sections.length - 1; i >= 0; i--) {
|
||||
const uri = sections[i]?.uri;
|
||||
if (uri && uri.match(sectionIdsRegex)) {
|
||||
sections.splice(i, 1);
|
||||
for (let i = targetArray.length - 1; i >= 0; i--) {
|
||||
const item = targetArray[i];
|
||||
const sectionId = adapter.getId(item);
|
||||
|
||||
if (!sectionId) continue;
|
||||
|
||||
if (sectionId in BLOCKED_SECTIONS) {
|
||||
removed.push({
|
||||
id: sectionId,
|
||||
knownAs: BLOCKED_SECTIONS[sectionId],
|
||||
actualTitle: adapter.getTitle(item),
|
||||
ref: adapter.getRef(item)
|
||||
});
|
||||
targetArray.splice(i, 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (removed.length > 0) {
|
||||
console.log(`[SectionBlock] Removed ${removed.length} blocked section(s):`, removed);
|
||||
}
|
||||
}
|
||||
|
||||
function removePodcasts() {
|
||||
if (Array.isArray(sections)) {
|
||||
for (let i = 0; i < sections.length; i++) {
|
||||
const sectionItems = sections[i]?.sectionItems?.items;
|
||||
if (!targetArray?.length) return;
|
||||
|
||||
if (Array.isArray(sectionItems)) {
|
||||
for (let j = 0; j < sectionItems.length; j++) {
|
||||
const contentData = sectionItems[j]?.content?.data;
|
||||
const adapter = createSectionAdapter(isPersonalizedRecommendations);
|
||||
const removed = [];
|
||||
|
||||
if (contentData && ["Podcast", "Audiobook", "Episode"].includes(contentData.__typename)) {
|
||||
sectionItems.splice(j, 1);
|
||||
j--;
|
||||
}
|
||||
}
|
||||
for (let i = targetArray.length - 1; i >= 0; i--) {
|
||||
const item = targetArray[i];
|
||||
const contentItems = adapter.getContentItems(item);
|
||||
|
||||
if (isPersonalizedRecommendations) {
|
||||
const sectionId = adapter.getSectionId(item);
|
||||
|
||||
if (sectionId === 'shortcuts') {
|
||||
processShortcutsSection(contentItems, adapter, removed);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isPodcastSection(contentItems, adapter)) {
|
||||
removed.push({
|
||||
type: 'PodcastSection',
|
||||
sectionId: sectionId,
|
||||
sectionName: adapter.getTitle(item),
|
||||
itemsCount: contentItems.length
|
||||
});
|
||||
targetArray.splice(i, 1);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
removeBlockedContent(contentItems, adapter, removed);
|
||||
}
|
||||
|
||||
if (removed.length > 0) {
|
||||
console.log(`[SectionBlock] Removed ${removed.length} podcast/audiobook item(s):`, removed);
|
||||
}
|
||||
}
|
||||
|
||||
if (body?.greeting && sections) {
|
||||
if (type === "section" || type === "all") {
|
||||
removeSections();
|
||||
function removeCanvasSections() {
|
||||
if (!sections?.length) return;
|
||||
|
||||
const removed = [];
|
||||
|
||||
for (let i = sections.length - 1; i >= 0; i--) {
|
||||
if (sections[i]?.data?.__typename === 'HomeFeedBaselineSectionData') {
|
||||
removed.push({
|
||||
uri: sections[i]?.uri || 'N/A',
|
||||
title: sections[i]?.data?.title?.text || 'Canvas Section'
|
||||
});
|
||||
sections.splice(i, 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (type === "podcast" || type === "all") {
|
||||
removePodcasts();
|
||||
if (removed.length > 0) {
|
||||
console.log(`[SectionBlock] Removed ${removed.length} canvas section(s):`, removed);
|
||||
}
|
||||
}
|
||||
|
||||
if ((body?.greeting && sections) || items) {
|
||||
const actions = {
|
||||
section: removeSections,
|
||||
podcast: removePodcasts,
|
||||
canvas: removeCanvasSections,
|
||||
all: () => {
|
||||
removeSections();
|
||||
removePodcasts();
|
||||
|
||||
if (!isPersonalizedRecommendations) {
|
||||
removeCanvasSections();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (Array.isArray(type)) {
|
||||
type.forEach(t => actions[t]?.());
|
||||
} else {
|
||||
actions[type]?.();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const originalFetch = window.fetch;
|
||||
|
||||
window.fetch = async function (...args) {
|
||||
const [url] = args;
|
||||
const urlString = typeof url === 'string' ? url : url?.url || '';
|
||||
|
||||
const isPathfinderUrl = urlString.includes(API_PATHFINDER);
|
||||
const isPersonalizedRecommendationsUrl = urlString.includes(API_RECOMMENDATIONS);
|
||||
|
||||
if (!isPathfinderUrl && !isPersonalizedRecommendationsUrl) {
|
||||
return originalFetch.apply(this, args);
|
||||
}
|
||||
|
||||
const response = await originalFetch.apply(this, args);
|
||||
const clonedResponse = response.clone();
|
||||
|
||||
try {
|
||||
const data = await response.json();
|
||||
|
||||
const shouldModify = (isPathfinderUrl && data?.data?.home) ||
|
||||
(isPersonalizedRecommendationsUrl && data?.content);
|
||||
|
||||
if (!shouldModify) {
|
||||
return clonedResponse;
|
||||
}
|
||||
|
||||
sectionBlock(data, '');
|
||||
|
||||
return new Response(JSON.stringify(data), {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
headers: response.headers
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('Fetch intercept error:', error);
|
||||
return clonedResponse;
|
||||
}
|
||||
};
|
||||
@@ -1,242 +1,646 @@
|
||||
{
|
||||
"lang": {
|
||||
"version": "1.2.44",
|
||||
"version": "1.2.80",
|
||||
"language": "Russian"
|
||||
},
|
||||
"1": {
|
||||
"match": "\"The Stage Experience\"",
|
||||
"replace": "\"Сценический опыт\""
|
||||
},
|
||||
"2": {
|
||||
"match": "\"Confirm your age\"",
|
||||
"replace": "\"Подтвердите свой возраст\""
|
||||
},
|
||||
"3": {
|
||||
"2": {
|
||||
"match": "\"%price%/month after. Terms and conditions apply. One month free not available for users who have already tried Premium.\"",
|
||||
"replace": "\"%price%/месяц спустя. Принять условия. Один месяц бесплатно, недоступно для пользователей, которые уже попробовали Premium.\""
|
||||
},
|
||||
"4": {
|
||||
"match": "\"Enjoy ad-free music listening, offline listening, and more. Cancel anytime.\"",
|
||||
"replace": "\"Наслаждайтесь прослушиванием музыки без рекламы, прослушиванием в офлайн режиме и многим другим. Отменить можно в любое время.\""
|
||||
},
|
||||
"5": {
|
||||
"3": {
|
||||
"match": "\"Offline storage location\"",
|
||||
"replace": "\"Хранилище скачанных треков\""
|
||||
},
|
||||
"6": {
|
||||
"4": {
|
||||
"match": "\"Click to start listening\"",
|
||||
"replace": "\"Нажмите, чтобы начать прослушивание\""
|
||||
},
|
||||
"7": {
|
||||
"5": {
|
||||
"match": "\"Change speed\"",
|
||||
"replace": "\"Изменение скорости\""
|
||||
},
|
||||
"8": {
|
||||
"6": {
|
||||
"match": "\"You need to be at least 19 years old to listen to explicit content marked with\"",
|
||||
"replace": "\"Вам должно быть не менее 19 лет, чтобы слушать непристойный контент, помеченный значком\""
|
||||
},
|
||||
"9": {
|
||||
"7": {
|
||||
"match": "\"Add to another playlist\"",
|
||||
"replace": "\"Добавить в другой плейлист\""
|
||||
},
|
||||
"10": {
|
||||
"match": "\"Add to this playlist\"",
|
||||
"replace": "\"Добавить в этот плейлист\""
|
||||
},
|
||||
"11": {
|
||||
"match": "\"Couldn.t connect to Spotify.\"",
|
||||
"replace": "\"Не удалось подключиться к Spotify.\""
|
||||
},
|
||||
"12": {
|
||||
"match": "\"No connection\"",
|
||||
"replace": "\"Нет соединения\""
|
||||
},
|
||||
"13": {
|
||||
"match": "\"Reconnecting...\"",
|
||||
"replace": "\"Повторное подключение...\""
|
||||
},
|
||||
"14": {
|
||||
"8": {
|
||||
"match": "\"Character counter\"",
|
||||
"replace": "\"Счетчик символов\""
|
||||
},
|
||||
"15": {
|
||||
"9": {
|
||||
"match": "\"Toggle lightsaber hilt. Current is [{]0[}].\"",
|
||||
"replace": "\"Переключить рукоять светового меча. Текущий {0}.\""
|
||||
},
|
||||
"16": {
|
||||
"10": {
|
||||
"match": "\"Doors at .0.\"",
|
||||
"replace": "\"Вход в {0}\""
|
||||
},
|
||||
"17": {
|
||||
"11": {
|
||||
"match": "\"Show at .0.\"",
|
||||
"replace": "\"Показ в {0}\""
|
||||
},
|
||||
"18": {
|
||||
"12": {
|
||||
"match": "\"Your Location\"",
|
||||
"replace": "\"Ваше местоположение\""
|
||||
},
|
||||
"19": {
|
||||
"13": {
|
||||
"match": "\"Override certain user attributes to test regionalized content programming. The overrides are only active in this app.\"",
|
||||
"replace": "\"Переопределите определенные атрибуты пользователя, чтобы протестировать региональное программирование контента. Переопределения активны только в этом приложении.\""
|
||||
},
|
||||
"20": {
|
||||
"14": {
|
||||
"match": " was released this week!",
|
||||
"replace": " был выпущен на этой неделе!"
|
||||
},
|
||||
"21": {
|
||||
"match": "(\"one\": \"...name...) was released %years% year ago this week!\"",
|
||||
"replace": "$1 был выпущен %years% год назад на этой неделе!\""
|
||||
},
|
||||
"22": {
|
||||
"match": "(\"few\": \"...name...) was released %years% years ago this week!\"",
|
||||
"replace": "$1 был выпущен %years% года назад на этой неделе!\""
|
||||
},
|
||||
"23": {
|
||||
"match": "(\"many\": \"...name...) was released %years% years ago this week!\"",
|
||||
"replace": "$1 был выпущен %years% лет назад на этой неделе!\""
|
||||
},
|
||||
"24": {
|
||||
"match": "(\"other\": \"...name...) was released %years% years ago this week!\"",
|
||||
"replace": "$1 был выпущен %years% года назад на этой неделе!\""
|
||||
},
|
||||
"25": {
|
||||
"15": {
|
||||
"match": "\"Speed [{]0[}]×\"",
|
||||
"replace": "\"Скорость {0}×\""
|
||||
},
|
||||
"26": {
|
||||
"16": {
|
||||
"match": "\"Artist\"",
|
||||
"replace": "\"Исполнитель\""
|
||||
},
|
||||
"27": {
|
||||
"17": {
|
||||
"match": "\"... of ...\"",
|
||||
"replace": "\"{0} из {1}\""
|
||||
},
|
||||
"28": {
|
||||
"18": {
|
||||
"match": "\"Не удалось изменить\"",
|
||||
"replace": "\"Не удалось обновить\""
|
||||
},
|
||||
"29": {
|
||||
"match": "Dynamic normalizer - Actively adjust the volume by leveling out the difference between quiet and loud parts of the audio",
|
||||
"replace": "Динамический нормализатор - активно регулирует громкость, выравнивая разницу между тихими и громкими частями аудио"
|
||||
},
|
||||
"30": {
|
||||
"19": {
|
||||
"match": "Dynamic loudness control for podcasts - Actively maintain optimal podcast volume level for a clear and balanced sound experience",
|
||||
"replace": "Динамическое управление громкостью для подкастов - активное поддержание оптимального уровня громкости подкаста для четкого и сбалансированного звукового восприятия"
|
||||
},
|
||||
"31": {
|
||||
"match": "Prerelease Radar",
|
||||
"replace": "Пререлизный радар"
|
||||
},
|
||||
"32": {
|
||||
"match": "\"Your destination for upcoming albums curated for you.\"",
|
||||
"replace": "\"Место назначения для предстоящих альбомов, подобранных специально для вас.\""
|
||||
},
|
||||
"33": {
|
||||
"20": {
|
||||
"match": "\"Build .0. is available\"",
|
||||
"replace": "\"Сборка {0} доступна\""
|
||||
},
|
||||
"34": {
|
||||
"21": {
|
||||
"match": "\"Downloading build .0....\"",
|
||||
"replace": "\"Загрузка сборки {0}...\""
|
||||
},
|
||||
"35": {
|
||||
"22": {
|
||||
"match": "\"Build .0. is ready to install\"",
|
||||
"replace": "\"Сборка {0} готова к установке\""
|
||||
},
|
||||
"36": {
|
||||
"23": {
|
||||
"match": "\"Remove\"",
|
||||
"replace": "\"Удалить\""
|
||||
},
|
||||
"37": {
|
||||
"match": "\"Feature Spotlight\"",
|
||||
"replace": "\"Особенности\""
|
||||
},
|
||||
"38": {
|
||||
"match": "\"prev-related-video\"",
|
||||
"replace": "\"предыдущее связанное видео\""
|
||||
},
|
||||
"39": {
|
||||
"match": "\"next-related-video\"",
|
||||
"replace": "\"следующее связанное видео\""
|
||||
},
|
||||
"40": {
|
||||
"24": {
|
||||
"match": "\"Do not translate\"",
|
||||
"replace": "\"Не переводить\""
|
||||
},
|
||||
"41": {
|
||||
"25": {
|
||||
"match": "\"Translating to .0.\"",
|
||||
"replace": "\"Перевожу на {0}\""
|
||||
},
|
||||
"42": {
|
||||
"26": {
|
||||
"match": "\"Translation to .0. not available\"",
|
||||
"replace": "\"Перевод на {0} недоступен\""
|
||||
},
|
||||
"43": {
|
||||
"27": {
|
||||
"match": "\"Translate lyrics\"",
|
||||
"replace": "\"Перевести текст песни\""
|
||||
},
|
||||
"44": {
|
||||
"28": {
|
||||
"match": "\"Spotify MiniPlayer\"",
|
||||
"replace": "\"мини-плеер Spotify\""
|
||||
},
|
||||
"45": {
|
||||
"match": "\"Date\"",
|
||||
"replace": "\"Дата\""
|
||||
},
|
||||
"46": {
|
||||
"29": {
|
||||
"match": "\"Venue\"",
|
||||
"replace": "\"Место проведения\""
|
||||
},
|
||||
"47": {
|
||||
"30": {
|
||||
"match": "\"We couldn't find the venue\"",
|
||||
"replace": "\"Мы не смогли найти место проведения\""
|
||||
},
|
||||
"48": {
|
||||
"match": "\"Notifications\"",
|
||||
"replace": "\"Уведомления\""
|
||||
},
|
||||
"49": {
|
||||
"31": {
|
||||
"match": "\"Bring back to main window\"",
|
||||
"replace": "\"Вернуться к основному окну\""
|
||||
},
|
||||
"50": {
|
||||
"match": "\"You have no notifications\"",
|
||||
"replace": "\"У вас нет уведомлений\""
|
||||
},
|
||||
"51": {
|
||||
"32": {
|
||||
"match": "\"Chapter\"",
|
||||
"replace": "\"Глава\""
|
||||
},
|
||||
"52": {
|
||||
"33": {
|
||||
"match": "\"Song\"",
|
||||
"replace": "\"Трек\""
|
||||
},
|
||||
"53": {
|
||||
"34": {
|
||||
"match": "\"Episode\"",
|
||||
"replace": "\"Эпизод\""
|
||||
},
|
||||
"54": {
|
||||
"35": {
|
||||
"match": "\"The venue you requested couldn.t be found, please try again.\"",
|
||||
"replace": "\"Запрошенное вами место проведения не найдено, попробуйте снова.\""
|
||||
},
|
||||
"55": {
|
||||
"36": {
|
||||
"match": "\"There was an error fetching the venue.\"",
|
||||
"replace": "\"Произошла ошибка при получении места проведения.\""
|
||||
},
|
||||
"56": {
|
||||
"37": {
|
||||
"match": "\"Concerts\"",
|
||||
"replace": "\"Концерты\""
|
||||
},
|
||||
"57": {
|
||||
"38": {
|
||||
"match": "\"all times are local to the venue\"",
|
||||
"replace": "\"все время указано по месту проведения\""
|
||||
},
|
||||
"39": {
|
||||
"match": "\"Spotify Spotlight Presale\"",
|
||||
"replace": "\"Предпродажа Spotify Spotlight\""
|
||||
},
|
||||
"40": {
|
||||
"match": "\"Get access\"",
|
||||
"replace": "\"Получить доступ\""
|
||||
},
|
||||
"41": {
|
||||
"match": "\"Continue playing\"",
|
||||
"replace": "\"Продолжить воспроизведение\""
|
||||
},
|
||||
"42": {
|
||||
"match": "\"Fans First\"",
|
||||
"replace": "\"Для фанатов\""
|
||||
},
|
||||
"43": {
|
||||
"match": "\"Offer ends in .0.:.1.:.2.\"",
|
||||
"replace": "\"До конца предложения: {0}:{1}:{2}\""
|
||||
},
|
||||
"44": {
|
||||
"match": "\"Search in Authors\"",
|
||||
"replace": "\"Искать в Авторах\""
|
||||
},
|
||||
"45": {
|
||||
"match": "\"A soundtrack for every part of the day.\"",
|
||||
"replace": "\"Саундтрек для любого времени суток.\""
|
||||
},
|
||||
"46": {
|
||||
"match": "\"See your unique playlist\"",
|
||||
"replace": "\"Посмотрите свой уникальный плейлист\""
|
||||
},
|
||||
"47": {
|
||||
"match": "\"You.ll still get:\"",
|
||||
"replace": "\"Вы также получите:\""
|
||||
},
|
||||
"48": {
|
||||
"match": "\"Trending songs in .country. . Spotify\"",
|
||||
"replace": "\"Популярные песни в %country% | Spotify\""
|
||||
},
|
||||
"49": {
|
||||
"match": "\"Featured Charts in .country. . Spotify\"",
|
||||
"replace": "\"Избранные чарты в %country% . Spotify\""
|
||||
},
|
||||
"50": {
|
||||
"match": "\"Popular artists in .country. . Spotify\"",
|
||||
"replace": "\"Популярные исполнители в %country% | Spotify\""
|
||||
},
|
||||
"51": {
|
||||
"match": "\"Popular albums in .country. . Spotify\"",
|
||||
"replace": "\"Популярные альбомы в %country% | Spotify\""
|
||||
},
|
||||
"52": {
|
||||
"match": "\"Discover trending songs in .country. today.\"",
|
||||
"replace": "\"Откройте для себя трендовые песни в %country% сегодня.\""
|
||||
},
|
||||
"53": {
|
||||
"match": "\"Discover Featured Charts in .country. today.\"",
|
||||
"replace": "\"Откройте для себя избранные чарты в %country% сегодня.\""
|
||||
},
|
||||
"54": {
|
||||
"match": "\"Discover the most popular artists in .country. today.\"",
|
||||
"replace": "\"Откройте для себя самых популярных исполнителей в %country% сегодня.\""
|
||||
},
|
||||
"55": {
|
||||
"match": "\"Discover the most popular albums in .country. today.\"",
|
||||
"replace": "\"Откройте для себя самые популярные альбомы в %country% сегодня.\""
|
||||
},
|
||||
"56": {
|
||||
"match": "\"Close\"",
|
||||
"replace": "\"Закрыть\""
|
||||
},
|
||||
"57": {
|
||||
"match": "\"Ok, we won.t play music from this artist again.\"",
|
||||
"replace": "\"Хорошо, мы больше не будем воспроизводить музыку этого исполнителя\""
|
||||
},
|
||||
"58": {
|
||||
"match": "\"Presale access\"",
|
||||
"replace": "\"Предварительный доступ\""
|
||||
"match": "\"Compact list\"",
|
||||
"replace": "\"Компактный список\""
|
||||
},
|
||||
"59": {
|
||||
"match": "\"We.ve ran out of codes. Visit our ticketing partner for more information\"",
|
||||
"replace": "\"У нас закончились коды. Посетите нашего партнера по продаже билетов для получения дополнительной информации\""
|
||||
"match": "\"Compact grid\"",
|
||||
"replace": "\"Компактная сетка\""
|
||||
},
|
||||
"60": {
|
||||
"match": "\"Lyrics preview\"",
|
||||
"replace": "\"Превью текста\""
|
||||
},
|
||||
"61": {
|
||||
"match": "\"Show less\"",
|
||||
"replace": "\"Свернуть\""
|
||||
},
|
||||
"62": {
|
||||
"match": "\"Show more\"",
|
||||
"replace": "\"Развернуть\""
|
||||
},
|
||||
"63": {
|
||||
"match": "\"Hide lyrics\"",
|
||||
"replace": "\"Скрыть текст\""
|
||||
},
|
||||
"64": {
|
||||
"match": "\"Переключиться на видеорежим\"",
|
||||
"replace": "\"К видео\""
|
||||
},
|
||||
"65": {
|
||||
"match": "\"Переключиться на аудиорежим\"",
|
||||
"replace": "\"К аудио\""
|
||||
},
|
||||
"66": {
|
||||
"match": "\".\".name..\" was released .years. year ago this week!\"",
|
||||
"replace": "\"На этой неделе исполнился %years% год с момента выхода \\\"%name%\\\"!\""
|
||||
},
|
||||
"67": {
|
||||
"match": "((?:few|other)..)\".\".name..\" was released .years. years ago this week!\"",
|
||||
"replace": "$1\"На этой неделе исполнилось %years% года с момента выхода \\\"%name%\\\"!\""
|
||||
},
|
||||
"68": {
|
||||
"match": "(many..)\".\".name..\" was released .years. years ago this week!\"",
|
||||
"replace": "$1\"На этой неделе исполнилось %years% лет с момента выхода \\\"%name%\\\"!\""
|
||||
},
|
||||
"69": {
|
||||
"match": "\".Select Type. \"",
|
||||
"replace": "\"<Выберите тип>\""
|
||||
},
|
||||
"70": {
|
||||
"match": "\"Connect\"",
|
||||
"replace": "\"Подключить устройство\""
|
||||
},
|
||||
"71": {
|
||||
"match": "\"Синхронизация\"",
|
||||
"replace": "\"Синхронизировать\""
|
||||
},
|
||||
"72": {
|
||||
"match": "\"Browse the live events feed to find more concerts.\"",
|
||||
"replace": "\"Листайте нашу афишу, чтобы найти больше концертов.\""
|
||||
},
|
||||
"73": {
|
||||
"match": "\"No concerts found\"",
|
||||
"replace": "\"Концертов не найдено\""
|
||||
},
|
||||
"74": {
|
||||
"match": "\"Browse the live events feed to find more venues.\"",
|
||||
"replace": "\"Листайте нашу афишу, чтобы найти больше площадок.\""
|
||||
},
|
||||
"75": {
|
||||
"match": "\"No venues found\"",
|
||||
"replace": "\"Площадок не найдено\""
|
||||
},
|
||||
"76": {
|
||||
"match": "\"Concerts in Your Top Genre\"",
|
||||
"replace": "\"Концерты в вашем любимом жанре\""
|
||||
},
|
||||
"77": {
|
||||
"match": "\"Follow your favorite venues to discover and browse events happening near you\"",
|
||||
"replace": "\"Подписывайтесь на любимые площадки, чтобы открывать и просматривать события рядом с вами\""
|
||||
},
|
||||
"78": {
|
||||
"match": "\"Search results\"",
|
||||
"replace": "\"Результаты поиска\""
|
||||
},
|
||||
"79": {
|
||||
"match": "\"BPM\"",
|
||||
"replace": "\"Темп\""
|
||||
},
|
||||
"80": {
|
||||
"match": "\"Folder name is required\"",
|
||||
"replace": "\"Имя папки обязательно\""
|
||||
},
|
||||
"81": {
|
||||
"match": "\"Generate\"",
|
||||
"replace": "\"Сгенерировать\""
|
||||
},
|
||||
"82": {
|
||||
"match": "\"Retry\"",
|
||||
"replace": "\"Повторить\""
|
||||
},
|
||||
"83": {
|
||||
"match": "\"Daily\"",
|
||||
"replace": "\"Ежедневно\""
|
||||
},
|
||||
"84": {
|
||||
"match": "\"Tracks update every day by 6am\"",
|
||||
"replace": "\"Треки обновляются каждый день к 6 утра\""
|
||||
},
|
||||
"85": {
|
||||
"match": "\"Doesn.t update\"",
|
||||
"replace": "\"Не обновляется\""
|
||||
},
|
||||
"86": {
|
||||
"match": "\"Set updates\"",
|
||||
"replace": "\"Настроить обновления\""
|
||||
},
|
||||
"87": {
|
||||
"match": "\"Never\"",
|
||||
"replace": "\"Никогда\""
|
||||
},
|
||||
"88": {
|
||||
"match": "\"You can still update tracks manually\"",
|
||||
"replace": "\"Вы все еще можете обновлять треки вручную\""
|
||||
},
|
||||
"89": {
|
||||
"match": "\"Unknown\"",
|
||||
"replace": "\"Неизвестно\""
|
||||
},
|
||||
"90": {
|
||||
"match": "\"Updates daily\"",
|
||||
"replace": "\"Обновляется ежедневно\""
|
||||
},
|
||||
"91": {
|
||||
"match": "\"Updates weekly\"",
|
||||
"replace": "\"Обновляется еженедельно\""
|
||||
},
|
||||
"92": {
|
||||
"match": "\"Weekly\"",
|
||||
"replace": "\"Еженедельно\""
|
||||
},
|
||||
"93": {
|
||||
"match": "\"Every week at 6am every...\"",
|
||||
"replace": "\"Каждую неделю в 6 утра каждый...\""
|
||||
},
|
||||
"94": {
|
||||
"match": "\"Updates every .0.\"",
|
||||
"replace": "\"Обновляется каждый {0}\""
|
||||
},
|
||||
"95": {
|
||||
"match": "\"Tracks in this playlist will update daily\"",
|
||||
"replace": "\"Треки в этом плейлисте будут обновляться ежедневно\""
|
||||
},
|
||||
"96": {
|
||||
"match": "\"Tracks in this playlist won.t update\"",
|
||||
"replace": "\"Треки в этом плейлисте не будут обновляться\""
|
||||
},
|
||||
"97": {
|
||||
"match": "\"Tracks in this playlist will update every .0.\"",
|
||||
"replace": "\"Треки в этом плейлисте будут обновляться каждый {0}\""
|
||||
},
|
||||
"98": {
|
||||
"match": "\"Got it\"",
|
||||
"replace": "\"Понятно\""
|
||||
},
|
||||
"99": {
|
||||
"match": "\"This.ll reset in .0., so come back then.\"",
|
||||
"replace": "\"Сброс через {0}, возвращайтесь позже.\""
|
||||
},
|
||||
"100": {
|
||||
"match": "\"Dismiss\"",
|
||||
"replace": "\"Отклонить\""
|
||||
},
|
||||
"101": {
|
||||
"match": "\"You.ve reached the limit for prompting playlists\"",
|
||||
"replace": "\"Вы достигли лимита создания плейлистов по запросу\""
|
||||
},
|
||||
"102": {
|
||||
"match": "\"Prompt\"",
|
||||
"replace": "\"Запрос\""
|
||||
},
|
||||
"103": {
|
||||
"match": "\"Prompted Playlist\"",
|
||||
"replace": "\"Плейлист по запросу\""
|
||||
},
|
||||
"104": {
|
||||
"match": "\"Customize prompt\"",
|
||||
"replace": "\"Настроить запрос\""
|
||||
},
|
||||
"105": {
|
||||
"match": "\"Friday\"",
|
||||
"replace": "\"Пятница\""
|
||||
},
|
||||
"106": {
|
||||
"match": "\"Monday\"",
|
||||
"replace": "\"Понедельник\""
|
||||
},
|
||||
"107": {
|
||||
"match": "\"Saturday\"",
|
||||
"replace": "\"Суббота\""
|
||||
},
|
||||
"108": {
|
||||
"match": "\"Sunday\"",
|
||||
"replace": "\"Воскресенье\""
|
||||
},
|
||||
"109": {
|
||||
"match": "\"Thursday\"",
|
||||
"replace": "\"Четверг\""
|
||||
},
|
||||
"110": {
|
||||
"match": "\"Tuesday\"",
|
||||
"replace": "\"Вторник\""
|
||||
},
|
||||
"111": {
|
||||
"match": "\"Wednesday\"",
|
||||
"replace": "\"Среда\""
|
||||
},
|
||||
"112": {
|
||||
"match": "\"Generate playlist\"",
|
||||
"replace": "\"Создать плейлист\""
|
||||
},
|
||||
"113": {
|
||||
"match": "\"See what this prompt would create based on your tastes\"",
|
||||
"replace": "\"Посмотрите, что этот запрос создаст на основе ваших вкусов\""
|
||||
},
|
||||
"114": {
|
||||
"match": "\"Beta\"",
|
||||
"replace": "\"Бета\""
|
||||
},
|
||||
"115": {
|
||||
"match": "\"Generate a playlist that curates and updates\"",
|
||||
"replace": "\"Создать плейлист, который подбирается и обновляется\""
|
||||
},
|
||||
"116": {
|
||||
"match": "\"Update now\"",
|
||||
"replace": "\"Обновить сейчас\""
|
||||
},
|
||||
"117": {
|
||||
"match": "\"Something went wrong. Please try again\"",
|
||||
"replace": "\"Что-то пошло не так. Пожалуйста, попробуйте снова\""
|
||||
},
|
||||
"118": {
|
||||
"match": "\"Private\"",
|
||||
"replace": "\"Приватный\""
|
||||
},
|
||||
"119": {
|
||||
"match": "\"Public\"",
|
||||
"replace": "\"Публичный\""
|
||||
},
|
||||
"120": {
|
||||
"match": "\"Set privacy\"",
|
||||
"replace": "\"Настроить приватность\""
|
||||
},
|
||||
"121": {
|
||||
"match": "\"Only you and people you invite will be able to view this prompt and playlist\"",
|
||||
"replace": "\"Только вы и приглашенные вами люди смогут видеть этот запрос и плейлист\""
|
||||
},
|
||||
"122": {
|
||||
"match": "\"Anyone will be able to view this prompt and playlist\"",
|
||||
"replace": "\"Любой сможет видеть этот запрос и плейлист\""
|
||||
},
|
||||
"123": {
|
||||
"match": "\"Learn\"",
|
||||
"replace": "\"Узнать\""
|
||||
},
|
||||
"124": {
|
||||
"match": "\"You.re prompting with an AI. Don.t include any sensitive data. .learn. how your data is managed and shared.\"",
|
||||
"replace": "\"Вы делаете запрос к ИИ. Не указывайте конфиденциальные данные. %learn%, как управляются и передаются ваши данные.\""
|
||||
},
|
||||
"125": {
|
||||
"match": "\"New prompt\"",
|
||||
"replace": "\"Новый запрос\""
|
||||
},
|
||||
"126": {
|
||||
"match": "\"Edit prompt\"",
|
||||
"replace": "\"Изменить запрос\""
|
||||
},
|
||||
"127": {
|
||||
"match": "\"Analyzing...\"",
|
||||
"replace": "\"Анализ...\""
|
||||
},
|
||||
"128": {
|
||||
"match": "\"Update playlist\"",
|
||||
"replace": "\"Обновить плейлист\""
|
||||
},
|
||||
"129": {
|
||||
"match": "\"Updating playlist\"",
|
||||
"replace": "\"Обновление плейлиста\""
|
||||
},
|
||||
"130": {
|
||||
"match": "\"Prompt playlist options\"",
|
||||
"replace": "\"Настройки плейлиста по запросу\""
|
||||
},
|
||||
"131": {
|
||||
"match": "\"Describe your perfect playlist, in as much detail as you want...\"",
|
||||
"replace": "\"Опишите свой идеальный плейлист, настолько подробно, насколько хотите...\""
|
||||
},
|
||||
"132": {
|
||||
"match": "\"Made for\"",
|
||||
"replace": "\"Сделано для\""
|
||||
},
|
||||
"133": {
|
||||
"match": "\"Prompted by\"",
|
||||
"replace": "\"По запросу\""
|
||||
},
|
||||
"134": {
|
||||
"match": "\"Ideas\"",
|
||||
"replace": "\"Идеи\""
|
||||
},
|
||||
"135": {
|
||||
"match": "\"This.ll reset soon.\"",
|
||||
"replace": "\"Скоро сбросится.\""
|
||||
},
|
||||
"136": {
|
||||
"match": "\"Hide ideas\"",
|
||||
"replace": "\"Скрыть идеи\""
|
||||
},
|
||||
"137": {
|
||||
"match": "\"Show ideas\"",
|
||||
"replace": "\"Показать идеи\""
|
||||
},
|
||||
"138": {
|
||||
"match": "\"Name & details\"",
|
||||
"replace": "\"Название и детали\""
|
||||
},
|
||||
"139": {
|
||||
"match": "\"Notes\"",
|
||||
"replace": "\"Заметки\""
|
||||
},
|
||||
"140": {
|
||||
"match": "\"View prompt\"",
|
||||
"replace": "\"Посмотреть запрос\""
|
||||
},
|
||||
"141": {
|
||||
"match": "\"Discard this prompt.\"",
|
||||
"replace": "\"Отменить этот запрос?\""
|
||||
},
|
||||
"142": {
|
||||
"match": "\"Cancel\"",
|
||||
"replace": "\"Отмена\""
|
||||
},
|
||||
"143": {
|
||||
"match": "\"Discard\"",
|
||||
"replace": "\"Отменить\""
|
||||
},
|
||||
"144": {
|
||||
"match": "\"Any changes you.ve made won.t be saved.\"",
|
||||
"replace": "\"Любые внесенные изменения не будут сохранены.\""
|
||||
},
|
||||
"145": {
|
||||
"match": "\"What you.ll get\"",
|
||||
"replace": "\"Что вы получите\""
|
||||
},
|
||||
"146": {
|
||||
"match": "\"Collapse .0.\"",
|
||||
"replace": "\"Свернуть {0}\""
|
||||
},
|
||||
"147": {
|
||||
"match": "\"Collapsed .0.\"",
|
||||
"replace": "\"Свернуто {0}\""
|
||||
},
|
||||
"148": {
|
||||
"match": "\"Audiobooks\"",
|
||||
"replace": "\"Аудиокниги\""
|
||||
},
|
||||
"149": {
|
||||
"match": "\"Music\"",
|
||||
"replace": "\"Музыка\""
|
||||
},
|
||||
"150": {
|
||||
"match": "\"Podcasts\"",
|
||||
"replace": "\"Подкасты\""
|
||||
},
|
||||
"151": {
|
||||
"match": "\"Expand .0.\"",
|
||||
"replace": "\"Развернуть {0}\""
|
||||
},
|
||||
"152": {
|
||||
"match": "\"Expanded .0.\"",
|
||||
"replace": "\"Развернуто {0}\""
|
||||
},
|
||||
"153": {
|
||||
"match": "\"Loading more items\"",
|
||||
"replace": "\"Загрузка дополнительных элементов\""
|
||||
},
|
||||
"154": {
|
||||
"match": "\"More items loaded\"",
|
||||
"replace": "\"Загружено больше элементов\""
|
||||
},
|
||||
"155": {
|
||||
"match": "\"Played\"",
|
||||
"replace": "\"Прослушано\""
|
||||
},
|
||||
"156": {
|
||||
"match": "\"Saved\"",
|
||||
"replace": "\"Сохранено\""
|
||||
},
|
||||
"157": {
|
||||
"match": "\"Shared\"",
|
||||
"replace": "\"Поделились\""
|
||||
},
|
||||
"158": {
|
||||
"match": "\"Generating...\"",
|
||||
"replace": "\"Генерация...\""
|
||||
},
|
||||
"159": {
|
||||
"match": "\"Made for .0.\"",
|
||||
"replace": "\"Сделано для {0}\""
|
||||
},
|
||||
"160": {
|
||||
"match": "\"Prompted by .0.\"",
|
||||
"replace": "\"Запрос от {0}\""
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,8 +3,8 @@
|
||||
:: Line for changing spotx parameters, each parameter should be separated by a space
|
||||
set param=-confirm_uninstall_ms_spoti -confirm_spoti_recomended_over -podcasts_off -block_update_on -start_spoti -new_theme -adsections_off -lyrics_stat spotify
|
||||
|
||||
set url='https://raw.githubusercontent.com/SpotX-Official/spotx-official.github.io/main/run.ps1'
|
||||
set url2='https://spotx-official.github.io/run.ps1'
|
||||
set url='https://raw.githubusercontent.com/SpotX-Official/SpotX/refs/heads/main/run.ps1'
|
||||
set url2='https://spotx-official.github.io/SpotX/run.ps1'
|
||||
set tls=[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12;
|
||||
|
||||
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\powershell.exe ^
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
:: Line for changing spotx parameters, each parameter should be separated by a space
|
||||
set param=-premium -new_theme
|
||||
|
||||
set url='https://raw.githubusercontent.com/SpotX-Official/spotx-official.github.io/main/run.ps1'
|
||||
set url2='https://spotx-official.github.io/run.ps1'
|
||||
set url='https://raw.githubusercontent.com/SpotX-Official/SpotX/refs/heads/main/run.ps1'
|
||||
set url2='https://spotx-official.github.io/SpotX/run.ps1'
|
||||
set tls=[Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12;
|
||||
|
||||
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\powershell.exe ^
|
||||
|
||||
50
scripts/installer-lang/be.ps1
Normal file
50
scripts/installer-lang/be.ps1
Normal file
@@ -0,0 +1,50 @@
|
||||
[PSCustomObject]@{
|
||||
Welcome = "
|
||||
╔════════════════════════════════════════╗
|
||||
║ Сардэчна запрашаем у SpotX для Windows ║
|
||||
╚════════════════════════════════════════╝"
|
||||
Incorrect = "Вой, няправільнае значэнне,"
|
||||
Incorrect2 = "увядзіце зноў праз "
|
||||
Download = "Памылка спампоўкі"
|
||||
Download2 = "Будзе перазапыт праз 5 секунд..."
|
||||
Download3 = "Памылка зноў"
|
||||
Download4 = "Праверце свае налады сеткі і запусціце ўстаноўку зноў"
|
||||
Download5 = "Спампоўка Spotify"
|
||||
StopScript = "Сцэнарый спынены"
|
||||
MsSpoti = "Выяўлена версія Spotify з Microsoft Store, якая не падтрымліваецца"
|
||||
MsSpoti2 = "Выдаліць выданне Spotify Microsoft Store? [Y/N]"
|
||||
MsSpoti3 = "Аўтаматычнае выдаленне Spotify MS..."
|
||||
MsSpoti4 = "Выдаленне Spotify MS..."
|
||||
Prem = "Мадыфікацыя для прэміум-акаўнта..."
|
||||
OldV = "Знойдзена састарэлая версія Spotify"
|
||||
OldV2 = "Ваша версія Spotify ({0}) састарэла, бягучая апошняя версія — {1}"
|
||||
OldV3 = "Хочаце абнавіць? [Y/N]"
|
||||
AutoUpd = "Аўтаматычнае абнаўленне да рэкамендаванай версіі"
|
||||
DelOrOver = "Выдаліць бягучую версію ({0}) або ўсталяваць паверх яе? Y [Выдаліць] / N [Усталяваць паверх]"
|
||||
DelOld = "Выдаленне старой версіі Spotify..."
|
||||
NewV = "Знойдзена непадтрымоўваная версія Spotify"
|
||||
NewV2 = "Ваша версія Spotify ({0}) не была пратэставана. Стабільная версія для SpotX — {1}"
|
||||
NewV3 = "Працягнуць з {0} (могуць узнікнуць памылкі)? [Y/N]"
|
||||
Recom = "Усталяваць апошнюю версію {0}? [Y/N]"
|
||||
DelNew = "Выдаленне неправеранай версіі Spotify..."
|
||||
DownSpoti = "Спампоўка і ўсталёўка Spotify"
|
||||
DownSpoti2 = "Калі ласка, пачакайце..."
|
||||
PodcatsOff = "Падкасты выкл"
|
||||
PodcastsOn = "Падкасты ўкл"
|
||||
PodcatsSelect = "Схаваць падкасты, шоу і аўдыякнігі на галоўнай старонцы? [Y/N]"
|
||||
DowngradeNote = "Рэкамендуецца заблакаваць, таму што Spotify быў паніжаны да папярэдняй версіі"
|
||||
UpdBlock = "Абнаўленні Spotify заблакаваныя"
|
||||
UpdUnblock = "Абнаўленні Spotify не заблакаваныя"
|
||||
UpdSelect = "Заблакаваць абнаўленні Spotify? [Y/N]"
|
||||
ModSpoti = "Патчынг Spotify..."
|
||||
Error = "Памылка"
|
||||
FileLocBroken = "Месцазнаходжанне файлаў Spotify пашкоджана, выдаліце кліент Spotify і запусціце сцэнарый зноў"
|
||||
Spicetify = "Spicetify выяўлены, ён павінен быць усталяваны пасля SpotX, адкрыць рэкамендаваныя дзеянні ў FAQ? [Y/N]"
|
||||
NoRestore = "SpotX ужо ўсталяваны, xpui.bak не знойдзены. Калі ласка, выдаліце кліент Spotify і запусціце Install.bat зноў"
|
||||
InstallComplete = "Усталёўка завершана"
|
||||
HostInfo = "Непажаданыя URL-адрасы знойдзены ў файле hosts"
|
||||
HostBak = "Рэзервовае капіраванне hosts.bak..."
|
||||
HostDel = "Спроба выдаліць непажаданыя URL-адрасы з арыгінальнага файла hosts..."
|
||||
HostError = "Нешта пайшло не так пры рэдагаванні файла hosts, адрэдагуйце яго ўручную або запусціце сцэнарый ад імя адміністратара"
|
||||
PressAnyKey = "Націсніце любую клавішу, каб выйсці..."
|
||||
}
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "আবার সমস্যা হচ্ছে"
|
||||
Download4 = "আপনার নেটওয়ার্ক সেটিংস চেক করুন এবং পুনরায় ইনস্টলেশন শুরু করুন"
|
||||
Download5 = "স্পটিফাই ডাউনলোড হচ্ছে"
|
||||
Download6 = "কার্ল সমস্যা"
|
||||
StopScript = "স্ক্রিপ্ট থেমে গেছে"
|
||||
MsSpoti = "স্পটিফাই এর মাইক্রোসফট স্টোর সংস্করণ সনাক্ত করা হয়েছে যেটি সমর্থিত নয়"
|
||||
MsSpoti2 = "স্পটিফাই এর উইন্ডোজ স্টোর সংস্করণ আনইন্সটল করুন [Y/N]"
|
||||
@@ -37,11 +36,6 @@
|
||||
UpdBlock = "স্পটিফাই হালনাগাদ ব্লক করা হয়েছে"
|
||||
UpdUnblock = "স্পটিফাই হালনাগাদ ব্লক করা হয় নি"
|
||||
UpdSelect = "স্পটিফাই হালনাগাদ বন্ধ রাখতে চান? [Y/N]"
|
||||
CacheOn = "ক্যাশ মুছে ফেলা সক্রিয় আছে ({0})"
|
||||
CacheOff = "ক্যাশ মুছে ফেলা সক্রিয় নয়"
|
||||
CacheSelect = "আপনি কি স্বয়ংক্রিয়ভাবে ক্যাশ মুছে ফেলা চালু করতে চান? [Y/N]"
|
||||
CacheDays = "পুরাতন ক্যাশ: XX দিনেরটি মুছে ফেলতে হবে"
|
||||
CacheDays2 = "1 থেকে 100 এর মাঝে দিন উল্লেখ করুন"
|
||||
ModSpoti = "স্পটিফাই প্যাচ করা হচ্ছে..."
|
||||
Error = "সমস্যা হয়েছে"
|
||||
FileLocBroken = "স্পটিফাই ফাইলের লোকেশনটি খুঁজে পাওয়া যাচ্ছে না, ব্যবহারকারী সংস্করণটি আনইনস্টল করুন এবং পুনরায় স্ক্রিপ্ট চালু করুন"
|
||||
@@ -52,4 +46,5 @@
|
||||
HostBak = "hosts.bak ফাইলটি ব্যাকআপ রাখা হয়েছে..."
|
||||
HostDel = "অরিজিনাল হোস্ট ফাইল থেকে অপ্রত্যাশিত ইউআরএল মুছে ফেলার চেষ্টা করা হচ্ছে..."
|
||||
HostError = "হোস্ট ফাইল মুছে ফেলার সময় কিছু একটা সমস্যা হয়েছে, এটি ম্যানুয়ালি সম্পাদন করুন অথবা এডমিনিস্ট্রেটর হিসেবে স্ক্রিপ্টটি রান করুন"
|
||||
}
|
||||
PressAnyKey = "Press any key to exit..."
|
||||
}
|
||||
|
||||
@@ -46,4 +46,5 @@
|
||||
HostBak = "Zálohuji soubor hosts.bak..."
|
||||
HostDel = "Pokouším se odebrat nechtěné URL adresy z originálního souboru hosts..."
|
||||
HostError = "Něco se nepovedlo s úpravou souboru hosts, upravte ho manuálně nebo spusťte skript jako"
|
||||
PressAnyKey = "Stiskněte libovolnou klávesu pro ukončení..."
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "Erneuter Fehler"
|
||||
Download4 = "Überprüfen Sie Ihre Netzwerkeinstellungen und starten Sie die Installation erneut"
|
||||
Download5 = "Lade Spotify herunter"
|
||||
Download6 = "Curl Fehler"
|
||||
StopScript = "Skript wurde gestoppt"
|
||||
MsSpoti = "Die Microsoft Store Version von Spotify wurde gefunden, jedoch wird sie nicht unterstützt"
|
||||
MsSpoti2 = "Die Microsoft Store Version von Spotify deinstallieren? [Y/N]"
|
||||
@@ -37,11 +36,6 @@
|
||||
UpdBlock = "Spotify-Updates blockiert"
|
||||
UpdUnblock = "Spotify-Updates sind nicht blockiert"
|
||||
UpdSelect = "Möchten Sie Spotify-Updates blockieren? [Y/N]"
|
||||
CacheOn = "Automatische Cache-Bereinigung ist aktiviert ({0})"
|
||||
CacheOff = "Automatische Cache-Bereinigung ist deaktiviert"
|
||||
CacheSelect = "Möchten Sie die automatische Cache-Bereinigung aktivieren? [Y/N]"
|
||||
CacheDays = "Caches, die älter als die angegebene Anzahl Tage sind, werden bereinigt"
|
||||
CacheDays2 = "Geben Sie die Anzahl der Tage von 1 bis 100 ein"
|
||||
ModSpoti = "Patche Spotify..."
|
||||
Error = "Fehler"
|
||||
FileLocBroken = "Speicherort von Spotify ist fehlerhaft, deinstallieren Sie Spotify und führen Sie das Skript erneut aus"
|
||||
@@ -52,4 +46,5 @@
|
||||
HostBak = "Sichere hosts.bak..."
|
||||
HostDel = "Versuche, unerwünschte URLs von der originalen hosts-Datei zu entfernen..."
|
||||
HostError = "Beim Bearbeiten der hosts-Datei ist etwas schief gelaufen, bearbeiten Sie sie manuell oder führen Sie die Installation als Administrator aus"
|
||||
PressAnyKey = "Drücken Sie eine beliebige Taste zum Beenden..."
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "Σφάλμα Ξανά"
|
||||
Download4 = "Ελέγξτε τις ρυθμίσεις του δικτύου σας και εκτελέστε ξανά την εγκατάσταση"
|
||||
Download5 = "Λήψη Spotify"
|
||||
Download6 = "Σφάλμα Curl"
|
||||
StopScript = "Το Script έχει σταματήσει"
|
||||
MsSpoti = "Εντοπίστηκε η έκδοση του Spotify του Microsoft Store η οποία δεν υποστηρίζεται"
|
||||
MsSpoti2 = "Απεγκατάσταση Spotify έκδοσης Microsoft Store [Y/N]"
|
||||
@@ -37,11 +36,6 @@
|
||||
UpdBlock = "Αποκλείστηκαν οι ενημερώσεις του Spotify"
|
||||
UpdUnblock = "Οι ενημερώσεις του Spotify δεν είναι αποκλεισμένες"
|
||||
UpdSelect = "Θέλετε να αποκλείσετε τις ενημερώσεις του Spotify; [Y/N]"
|
||||
CacheOn = "Ο καθαρισμός της κρυφής μνήμης ήχου είναι ενεργοποιημένος ({0})"
|
||||
CacheOff = "Ο καθαρισμός της κρυφής μνήμης ήχου δεν είναι ενεργοποιημένος"
|
||||
CacheSelect = "Θέλετε να εγκαταστήσετε τον αυτόματο καθαρισμό της κρυφής μνήμης ήχου για το Spotify; [Y/N]"
|
||||
CacheDays = "Μια προσωρινή μνήμη που δεν έχει χρησιμοποιηθεί για περισσότερο από τον αριθμό των ημερών που έχετε καθορίσει θα διαγραφεί"
|
||||
CacheDays2 = "Εισάγετε τον αριθμό των ημερών από 1 έως 100"
|
||||
ModSpoti = "Επιδιόρθωση Spotify..."
|
||||
Error = "Σφάλμα"
|
||||
FileLocBroken = "Η τοποθεσία των αρχείων Spotify είναι κατεστραμμένη, απεγκαταστήστε το πρόγραμμα Spotify και εκτελέστε ξανά το script"
|
||||
@@ -52,4 +46,5 @@
|
||||
HostBak = "Δημιουργείται αντίγραφο ασφαλείας hosts.bak..."
|
||||
HostDel = "Προσπάθεια κατάργησης ανεπιθύμητων διευθύνσεων URL από το αρχικό αρχείο hosts..."
|
||||
HostError = "Παρουσιάστηκε κάποιο πρόβλημα κατά την επεξεργασία του αρχείου hosts, επεξεργαστείτε το χειροκίνητα ή εκτελέστε το script ως διαχειριστής"
|
||||
PressAnyKey = "Πατήστε οποιοδήποτε πλήκτρο για έξοδο..."
|
||||
}
|
||||
|
||||
@@ -12,30 +12,30 @@
|
||||
Download5 = "Downloading Spotify"
|
||||
StopScript = "Script is stopped"
|
||||
MsSpoti = "The Microsoft Store version of Spotify has been detected which is not supported"
|
||||
MsSpoti2 = "Uninstall Spotify Microsoft Store edition [Y/N]"
|
||||
MsSpoti2 = "Uninstall Spotify Microsoft Store edition ? [Y/N]"
|
||||
MsSpoti3 = "Automatically uninstalling Spotify MS..."
|
||||
MsSpoti4 = "Uninstalling Spotify MS..."
|
||||
Prem = "Modification for premium account..."
|
||||
OldV = "Found outdated version of Spotify"
|
||||
OldV2 = "Your Spotify {0} version is outdated, it is recommended to upgrade to {1}"
|
||||
OldV2 = "Your Spotify version ({0}) is outdated, the current latest version is — {1}"
|
||||
OldV3 = "Want to update ? [Y/N]"
|
||||
AutoUpd = "Automatic update to the recommended version"
|
||||
DelOrOver = "Do you want to uninstall the current version of {0} or install over it? Y [Uninstall] / N [Install Over]"
|
||||
DelOrOver = "Remove the current version ({0}) or install over it? Y [Remove] / N [Install Over]"
|
||||
DelOld = "Uninstalling old Spotify..."
|
||||
NewV = "Unsupported version of Spotify found"
|
||||
NewV2 = "Your Spotify {0} version hasn't been tested yet, currently it's a stable {1} version"
|
||||
NewV3 = "Do you want to continue with {0} version (errors possible) ? [Y/N]"
|
||||
Recom = "Do you want to install the recommended {0} version ? [Y/N]"
|
||||
NewV2 = "Your Spotify version ({0}) has not been tested. The stable version for SpotX is {1}"
|
||||
NewV3 = "Continue with {0} (errors may occur) ? [Y/N]"
|
||||
Recom = "Install the latest version {0} ? [Y/N]"
|
||||
DelNew = "Uninstalling an untested Spotify..."
|
||||
DownSpoti = "Downloading and installing Spotify"
|
||||
DownSpoti2 = "Please wait..."
|
||||
PodcatsOff = "Off Podcasts"
|
||||
PodcastsOn = "On Podcasts"
|
||||
PodcatsSelect = "Do you want to disable podcasts, episodes and audiobooks from the main page? [Y/N]"
|
||||
DowngradeNote = "It is recommended to block because Spotify was downgraded"
|
||||
PodcatsSelect = "Hide podcasts, shows, and audiobooks on the homepage ? [Y/N]"
|
||||
DowngradeNote = "It is recommended to block because there is already a newer version of Spotify"
|
||||
UpdBlock = "Spotify updates blocked"
|
||||
UpdUnblock = "Spotify updates are not blocked"
|
||||
UpdSelect = "Want to block Spotify updates? [Y/N]"
|
||||
UpdSelect = "Block Spotify updates ? [Y/N]"
|
||||
ModSpoti = "Patching Spotify..."
|
||||
Error = "Error"
|
||||
FileLocBroken = "Location of Spotify files is broken, uninstall Spotify client and run the script again"
|
||||
@@ -46,4 +46,5 @@
|
||||
HostBak = "Backing up hosts.bak..."
|
||||
HostDel = "Trying to remove unwanted URLs from the original hosts file..."
|
||||
HostError = "Something went wrong while editing the hosts file, edit it manually or run the script as administrator"
|
||||
}
|
||||
PressAnyKey = "Press any key to exit..."
|
||||
}
|
||||
|
||||
@@ -46,4 +46,5 @@
|
||||
HostBak = "Haciendo una copia de seguridad de hosts.bak..."
|
||||
HostDel = "Intentando eliminar los URL no deseados del archivo hosts original..."
|
||||
HostError = "Algo salió mal al editar el archivo hosts; edítelo manualmente o ejecute el script como administrador"
|
||||
PressAnyKey = "Presione cualquier tecla para salir..."
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "دوباره خطا"
|
||||
Download4 = "تنظیمات شبکه خود را بررسی کنید و دوباره نصب را اجرا کنید"
|
||||
Download5 = "در حال دانلود اسپاتیفای"
|
||||
Download6 = "خطای Curl"
|
||||
StopScript = "اسکریپت متوقف شده است"
|
||||
MsSpoti = "نسخه اسپاتیفای ویندوز استور شناسایی شده است که پشتیبانی نمی شود"
|
||||
MsSpoti2 = "نسخه اسپاتیفای ویندوز استور حذف شود [Y/N]"
|
||||
@@ -37,11 +36,6 @@
|
||||
UpdBlock = "به روز رسانی اسپاتیفای مسدود شده است"
|
||||
UpdUnblock = "به روز رسانی اسپاتیفای مسدود نمی شود"
|
||||
UpdSelect = "آیا می خواهید به روز رسانی های اسپاتیفای را مسدود کنید؟ [Y/N]"
|
||||
CacheOn = "پاک کردن حافظه پنهان فعال شد ({0})"
|
||||
CacheOff = "پاک کردن کش فعال نیست"
|
||||
CacheSelect = "آیا می خواهید پاکسازی کش خودکار را راه اندازی کنید؟ [Y/N]"
|
||||
CacheDays = "پاکسازی کش فعال نیست "
|
||||
CacheDays2 = "تعداد روزها را از بین 1 تا 100 وارد کنید"
|
||||
ModSpoti = "در حال پچ کردن اسپاتیفای"
|
||||
Error = "خطا"
|
||||
FileLocBroken = "محل فایل های اسپاتیفای خراب است، کلاینت را حذف نصب کنید و اسکریپت را دوباره اجرا کنید"
|
||||
@@ -52,4 +46,5 @@
|
||||
HostBak = "پشتیبان گیری از hosts.bak"
|
||||
HostDel = "تلاش برای حذف URL های ناخواسته از فایل میزبان اصلی"
|
||||
HostError = "هنگام ویرایش فایل میزبان مشکلی پیش آمد، آن را به صورت دستی ویرایش کنید یا اسکریپت را صورت ادمینستریتور اجرا کنید"
|
||||
PressAnyKey = "برای خروج هر کلیدی را فشار دهید..."
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "Taas virhe"
|
||||
Download4 = "Tarkista verkkoasetuksesi ja suorita asennus uudelleen"
|
||||
Download5 = "Ladataan Spotify:tä"
|
||||
Download6 = "Curl virhe"
|
||||
StopScript = "Skripti on pysäytetty"
|
||||
MsSpoti = "Spotifyn Microsoft Store -versio on havaittu, jota ei tueta"
|
||||
MsSpoti2 = "Poista Spotifyn Windows Store -versio [Y/N]"
|
||||
@@ -37,11 +36,6 @@
|
||||
UpdBlock = "Spotifyn päivitykset estetty"
|
||||
UpdUnblock = "Spotifyn päivityksiä ei ole estetty"
|
||||
UpdSelect = "Haluatko estää Spotifyn päivitykset? [Y/N]"
|
||||
CacheOn = "välimuistin tyhjennys käytössä ({0})"
|
||||
CacheOff = "Välimuistin tyhjennys ei ole käytössä"
|
||||
CacheSelect = "Haluatko määrittää automaattisen välimuistin tyhjennyksen? [Y/N]"
|
||||
CacheDays = "Vanha välimuisti: XX päivää tyhjennettävä"
|
||||
CacheDays2 = "Syötä päivien lukumäärä 1–100 päivää"
|
||||
ModSpoti = "Paikataan Spotifyn tiedostoja..."
|
||||
Error = "Virhe"
|
||||
FileLocBroken = "Spotify-tiedostojen sijainti on rikki, asenna spotify uudelleen ja suorita komentosarja uudelleen"
|
||||
@@ -52,4 +46,5 @@
|
||||
HostBak = "Varmuuskopioidaan hosts.bak..."
|
||||
HostDel = "Yritetään poistaa ei toivottuja URL-osoitteita alkuperäisestä hosts-tiedostosta..."
|
||||
HostError = "Jotain meni pieleen, hosts-tiedostoton muokkaamisessa, muokkaa sitä manuaalisesti tai suorita komentosarja järjestelmänvalvojana"
|
||||
PressAnyKey = "Paina mitä tahansa näppäintä poistuaksesi..."
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "Muling nagka-error"
|
||||
Download4 = "Suriin ang iyong mga setting sa network at patakbuhin muli ang pag-install"
|
||||
Download5 = "Nagdo-download ng Spotify"
|
||||
Download6 = "Error sa Curl"
|
||||
StopScript = "Itinigil ang script"
|
||||
MsSpoti = "Nadiskubre ang bersyon ng Spotify ay mula sa Microsoft Store na hindi suportado"
|
||||
MsSpoti2 = "I-uninstall ang edisyon ng Spotify mula sa Microsoft Store [Y/N]"
|
||||
@@ -37,11 +36,6 @@
|
||||
UpdBlock = "Ang pag-update ng Spotify ay na-block"
|
||||
UpdUnblock = "Ang pag-update ng Spotify ay hindi na-block"
|
||||
UpdSelect = "Gusto mo bang i-block ang mga update ng Spotify? [Y/N]"
|
||||
CacheOn = "Ang paglilinis ng audio cache ay naka-enable ({0})"
|
||||
CacheOff = "Ang paglilinis ng audio cache ay hindi naka-enable"
|
||||
CacheSelect = "Gusto mo bang mag-install ng automatikong paglilinis ng audio cache para sa Spotify? [Y/N]"
|
||||
CacheDays = "Ang cache na hindi nagamit sa loob ng higit sa bilang ng araw na itinakda mo ay magiging hindi na kinakailangan at matatanggal."
|
||||
CacheDays2 = "Ilagay ang bilang ng araw mula 1 hanggang 100"
|
||||
ModSpoti = "Pinapatch ang Spotify..."
|
||||
Error = "May nangyaring mali"
|
||||
FileLocBroken = "Ang lokasyon ng mga file ng Spotify ay sira, mag-uninstall ng Spotify client at patakbuhin muli ang script."
|
||||
@@ -52,4 +46,5 @@
|
||||
HostBak = "Nagbabackup ng hosts.bak..."
|
||||
HostDel = "Sinusubukang alisin ang mga hindi kanais-nais na URL mula sa orihinal na hosts file..."
|
||||
HostError = "May naging problema sa pag-eedit ng hosts file, i-edit ito ng manu-mano o patakbuhin ang script bilang administrator"
|
||||
PressAnyKey = "Pindutin ang anumang key upang lumabas..."
|
||||
}
|
||||
|
||||
@@ -46,4 +46,5 @@
|
||||
HostBak = "Sauvegarde de hosts.bak..."
|
||||
HostDel = "Tentative de suppression des URLs indésirables du fichier hosts original..."
|
||||
HostError = "Quelque chose ne s'est pas bien passé lors de l'édition du fichier hosts, modifiez le manuellement ou lancez le script en tant qu'administrateur"
|
||||
PressAnyKey = "Appuyez sur n'importe quelle touche pour quitter..."
|
||||
}
|
||||
|
||||
@@ -1,55 +1,50 @@
|
||||
[PSCustomObject]@{
|
||||
Welcome = "
|
||||
╔══════════════════════════════╗
|
||||
║ Welcome to SpotX for Windows ║
|
||||
╚══════════════════════════════╝"
|
||||
Incorrect = "ओह, एक गलत मान,"
|
||||
╔════════════════════════════════════╗
|
||||
║ SpotX for Windows में आपका स्वागत है ║
|
||||
╚════════════════════════════════════╝"
|
||||
Incorrect = "ओह, एक गलत मान,"
|
||||
Incorrect2 = "के माध्यम से फिर से दर्ज करें "
|
||||
Download = "डाउनलोड करने में गड़बड़ी"
|
||||
Download2 = "5 सेकंड में फिर से अनुरोध करेंगे..."
|
||||
Download2 = "5 सेकंड में फिर से कोशिश की जाएगी..."
|
||||
Download3 = "फिर से गड़बड़ी"
|
||||
Download4 = "अपनी नेटवर्क सेटिंग्स की जाँच करें और फिर से इंस्टॉलेशन चलाएँ"
|
||||
Download5 = "स्पॉटिफाई डाउनलोड हो रहा है"
|
||||
Download6 = "कर्ल एरर"
|
||||
StopScript = "स्क्रिप्ट बंद हो गई है("
|
||||
MsSpoti = "स्पॉटिफाई के माइक्रोसॉफ्ट स्टोर संस्करण का पता चला है जो समर्थित नहीं है"
|
||||
MsSpoti2 = "स्पॉटिफाई विंडोज स्टोर संस्करण को अनइंस्टॉल करें [Y/N]"
|
||||
MsSpoti3 = "स्पॉटिफाई एमएस को अपने आप अनइंस्टॉल कर रहा है..."
|
||||
MsSpoti4 = "स्पॉटिफाई एमएस को अनइंस्टॉल किया जा रहा है..."
|
||||
Prem = "प्रीमियम आकाउंट में बदलाव.."
|
||||
OldV = "स्पॉटिफाई का पुराना संस्करण मिला"
|
||||
OldV2 = "आपका स्पॉटिफाई {0} संस्करण पुराना है, इसे {1} में अपग्रेड करने की अनुशंसा की जाती है"
|
||||
OldV3 = "अपडेट करना चाहते हैं? [Y/N]"
|
||||
AutoUpd = "अनुशंसित संस्करण में स्वचालित अपडेट"
|
||||
DelOrOver = "क्या आप {0} के वर्तमान संस्करण की स्थापना रद्द करना चाहते हैं या उस पर स्थापित करना चाहते हैं? Y [अनइंस्टॉल करें] / N [इंस्टॉल ओवर करें]("
|
||||
DelOld = "पुराने स्पॉटिफाई को अनइंस्टॉल किया जा रहा है..."
|
||||
NewV = "स्पॉटिफाई का असमर्थित संस्करण मिला"
|
||||
NewV2 = "आपके स्पॉटिफाई {0} संस्करण का अभी तक परीक्षण नहीं हुआ है, वर्तमान में यह एक स्थिर {1} संस्करण है"
|
||||
NewV3 = "क्या आप {0} संस्करण (त्रुटियां संभव) के साथ जारी रखना चाहते हैं? [Y/N]"
|
||||
Recom = "क्या आप अनुशंसित {0} संस्करण स्थापित करना चाहते हैं? [Y/N]"
|
||||
DelNew = "परीक्षण न किए गए स्पॉटिफाई को अनइंस्टॉल किया जा रहा है..."
|
||||
DownSpoti = "स्पॉटिफाई को डाउनलोड और इंस्टॉल किया जा रहा है"
|
||||
Download4 = "अपनी नेटवर्क सेटिंग्स जाँचें और इंस्टॉलेशन फिर से चलाएँ"
|
||||
Download5 = "Spotify डाउनलोड हो रहा है"
|
||||
StopScript = "स्क्रिप्ट रोक दी गई है"
|
||||
MsSpoti = "Spotify का Microsoft Store वर्जन मिला है, जो सपोर्टेड नहीं है"
|
||||
MsSpoti2 = "Spotify का Microsoft Store वर्जन अनइंस्टॉल करें? [Y/N]"
|
||||
MsSpoti3 = "Spotify MS अपने आप अनइंस्टॉल हो रहा है..."
|
||||
MsSpoti4 = "Spotify MS अनइंस्टॉल किया जा रहा है..."
|
||||
Prem = "प्रीमियम अकाउंट के लिए मॉडिफिकेशन किया जा रहा है..."
|
||||
OldV = "Spotify का पुराना वर्जन मिला"
|
||||
OldV2 = "आपका Spotify वर्जन ({0}) पुराना है। लेटेस्ट वर्जन {1} है"
|
||||
OldV3 = "क्या आप अपडेट करना चाहते हैं? [Y/N]"
|
||||
AutoUpd = "सुझाए गए वर्जन पर ऑटोमेटिक अपडेट"
|
||||
DelOrOver = "मौजूदा वर्जन ({0}) को हटाएँ या इसी पर इंस्टॉल करें? Y [हटाएँ] / N [इसी पर इंस्टॉल करें]"
|
||||
DelOld = "पुराना Spotify अनइंस्टॉल किया जा रहा है..."
|
||||
NewV = "Spotify का अनसपोर्टेड वर्जन मिला"
|
||||
NewV2 = "आपके Spotify वर्जन ({0}) को टेस्ट नहीं किया गया है। SpotX के लिए स्टेबल वर्जन {1} है"
|
||||
NewV3 = "क्या आप वर्जन {0} के साथ जारी रखना चाहते हैं (इसमें समस्याएं आ सकती हैं)? [Y/N]"
|
||||
Recom = "क्या आप लेटेस्ट वर्जन {0} इंस्टॉल करना चाहते हैं? [Y/N]"
|
||||
DelNew = "टेस्ट न किए गए Spotify को अनइंस्टॉल किया जा रहा है..."
|
||||
DownSpoti = "Spotify डाउनलोड और इंस्टॉल किया जा रहा है"
|
||||
DownSpoti2 = "कृपया प्रतीक्षा करें..."
|
||||
PodcatsOff = "पॉडकास्ट बंद "
|
||||
PodcatsOff = "पॉडकास्ट बंद"
|
||||
PodcastsOn = "पॉडकास्ट चालू"
|
||||
PodcatsSelect = "क्या आप मुख्य पृष्ठ से पॉडकास्ट, एपिसोड और ऑडियोबुक को निष्क्रिय करना चाहते हैं? [Y/N]"
|
||||
DowngradeNote = "इसे अवरुद्ध करने की अनुशंसा की जाती है क्योंकि स्पॉटिफाई का डाउनग्रेड था"
|
||||
UpdBlock = "स्पॉटिफाई अपडेट ब्लॉक किए गए"
|
||||
UpdUnblock = "स्पॉटिफाई अपडेट ब्लॉक नहीं हैं"
|
||||
UpdSelect = "स्पॉटिफाई अपडेट को ब्लॉक करना चाहते हैं? [Y/N]"
|
||||
CacheOn = "कैशे साफ़ करें सक्षम किया गया ({0})"
|
||||
CacheOff = "कैशे साफ़ करना सक्षम नहीं है"
|
||||
CacheSelect = "स्वचालित कैश सफाई सेट करना चाहते हैं? [Y/N]"
|
||||
CacheDays = "कैश पुराना: XX दिन साफ़ किया जाना है"
|
||||
CacheDays2 = "1 से 100 तक दिनों की संख्या दर्ज करें"
|
||||
ModSpoti = "स्पॉटिफाई पैचिंग..."
|
||||
Error = "गडबड"
|
||||
FileLocBroken = "स्पॉटिफाई फ़ाइलों का स्थान टूटा हुआ है, क्लाइंट की स्थापना रद्द करें और स्क्रिप्ट को फिर से चलाएँ"
|
||||
Spicetify = "स्पाइसेटिफाई का पता चला, इसे स्पॉटएक्स के बाद इंस्टॉल किया जाना चाहिए, एफएक्यू में अनुशंसित क्रियाएं खोलें? [Y/N]"
|
||||
NoRestore = "स्पॉटएक्स पहले ही स्थापित किया जा चुका है, xpui.bak नहीं मिला। `nकृपया स्पॉटिफाई क्लाइंट को अनइंस्टॉल करें और Install.bat को फिर से चलाएं"
|
||||
InstallComplete = "इंस्टालेशन पूर्ण"
|
||||
HostInfo = "hosts फ़ाइल में अवांछित URL मिले"
|
||||
HostBak = "hosts.bak का बैकअप ले जा रहा है..."
|
||||
HostDel = "मूल होस्ट फ़ाइल से अवांछित URL निकालने का प्रयास किया जा रहा है..."
|
||||
HostError = "होस्ट फ़ाइल को संपादित करते समय कुछ गलत हो गया, इसे मैन्युअल रूप से संपादित करें या स्क्रिप्ट को व्यवस्थापक के रूप में चलाएं"
|
||||
}
|
||||
PodcatsSelect = "क्या आप होमपेज से पॉडकास्ट, शो और ऑडियोबुक छिपाना चाहते हैं? [Y/N]"
|
||||
DowngradeNote = "अपडेट्स ब्लॉक करने की सलाह दी जाती है, क्योंकि Spotify को डाउनग्रेड किया गया था"
|
||||
UpdBlock = "Spotify अपडेट्स ब्लॉक कर दिए गए हैं"
|
||||
UpdUnblock = "Spotify अपडेट्स ब्लॉक नहीं हैं"
|
||||
UpdSelect = "क्या Spotify अपडेट्स को ब्लॉक करना है? [Y/N]"
|
||||
ModSpoti = "Spotify को पैच किया जा रहा है..."
|
||||
Error = "त्रुटि"
|
||||
FileLocBroken = "Spotify फाइलों का लोकेशन गलत है। कृपया Spotify क्लाइंट को अनइंस्टॉल करें और स्क्रिप्ट फिर से चलाएँ"
|
||||
Spicetify = "Spicetify मिला है। इसे SpotX के बाद इंस्टॉल किया जाना चाहिए। क्या आप FAQ में सुझाए गए एक्शन देखना चाहते हैं? [Y/N]"
|
||||
NoRestore = "SpotX पहले से इंस्टॉल है, लेकिन xpui.bak नहीं मिला। `nकृपया Spotify क्लाइंट को अनइंस्टॉल करें और Install.bat को फिर से चलाएँ"
|
||||
InstallComplete = "इंस्टॉलेशन पूरा हुआ"
|
||||
HostInfo = "hosts फ़ाइल में कुछ गैर-जरूरी URLs मिले हैं"
|
||||
HostBak = "hosts.bak का बैकअप बनाया जा रहा है..."
|
||||
HostDel = "ओरिजिनल hosts फ़ाइल से गैर-जरूरी URLs को हटाने की कोशिश की जा रही है..."
|
||||
HostError = "hosts फ़ाइल को एडिट करते समय कोई समस्या हुई है। कृपया इसे मैनुअली एडिट करें या स्क्रिप्ट को एडमिनिस्ट्रेटर के रूप में चलाएँ"
|
||||
PressAnyKey = "Press any key to exit..."
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "Ismét hiba"
|
||||
Download4 = "Ellenőrizze a hálózati beállításokat, és futtassa újra a telepítést"
|
||||
Download5 = "Spotify letöltése"
|
||||
Download6 = "Curl hiba"
|
||||
StopScript = "A script leállt"
|
||||
MsSpoti = "A Spotify Microsoft Store verziója van telepítve, amely nem támogatott"
|
||||
MsSpoti2 = "A Spotify Microsoft Store kiadásának eltávolítása [Y/N]"
|
||||
@@ -37,11 +36,6 @@
|
||||
UpdBlock = "Spotify frissítések blokkolva"
|
||||
UpdUnblock = "A Spotify frissítések nincsenek blokkolva"
|
||||
UpdSelect = "Szeretnéd letiltani a Spotify frissítéseket? [Y/N]"
|
||||
CacheOn = "A gyorsítótár törlése engedélyezve ({0})"
|
||||
CacheOff = "A gyorsítótár törlése nem engedélyezett"
|
||||
CacheSelect = "Szeretné beállítani az automatikus gyorsítótár-tisztítást? [Y/N]"
|
||||
CacheDays = "XX napnál régebbi gyorsítótárak törlésre fognak kerülni "
|
||||
CacheDays2 = "Adj meg egy napot 1 és 100 között."
|
||||
ModSpoti = "Spotify patchelése..."
|
||||
Error = "Hiba"
|
||||
FileLocBroken = "A Spotify fájlok sérültek, távolítsa el a klienst, és futtassa újra a szkriptet."
|
||||
@@ -52,4 +46,5 @@
|
||||
HostBak = "A hosts.bak mentése..."
|
||||
HostDel = "A nem kívánt URL-ek eltávolítása az eredeti hosts fájlból..."
|
||||
HostError = "Valami hiba történt a hosts fájl szerkesztése közben, szerkeszd meg manuálisan, vagy futtasd a szkriptet rendszergazdaként."
|
||||
PressAnyKey = "Nyomjon meg egy gombot a kilépéshez..."
|
||||
}
|
||||
|
||||
@@ -46,4 +46,5 @@
|
||||
HostBak = "Membuat cadangan hosts.bak..."
|
||||
HostDel = "Mencoba menghapus URL yang tidak diinginkan dari file hosts asli..."
|
||||
HostError = "Ada yang salah saat mengedit file hosts, edit manual atau jalankan skrip sebagai administrator"
|
||||
PressAnyKey = "Tekan sembarang tombol untuk keluar..."
|
||||
}
|
||||
|
||||
@@ -1,55 +1,50 @@
|
||||
[PSCustomObject]@{
|
||||
Welcome = "
|
||||
╔══════════════════════════════╗
|
||||
║ Welcome to SpotX for Windows ║
|
||||
╚══════════════════════════════╝"
|
||||
Incorrect = "Ops! Valore sbagliato,"
|
||||
Incorrect2 = "inserisci di nuovo"
|
||||
╔═══════════════════════════════╗
|
||||
║ Benvenuti a SpotX per Windows ║
|
||||
╚═══════════════════════════════╝"
|
||||
Incorrect = "Ops, un valore sbagliato,"
|
||||
Incorrect2 = "inserisci di nuovo "
|
||||
Download = "Errore nel download"
|
||||
Download2 = "Nuova richiesta in 5 secondi..."
|
||||
Download3 = "Nuovo errore"
|
||||
Download4 = "Verifica le tue impostazioni di rete ed esegui di nuovo l'installazione."
|
||||
Download4 = "Verifica le tue impostazioni di rete ed esegui di nuovo l'installazione"
|
||||
Download5 = "Scaricamento di Spotify"
|
||||
Download6 = "Errore Curl"
|
||||
StopScript = "Lo script è stato fermato"
|
||||
MsSpoti = "Trovata versione del Microsoft Store di Spotify, che non è supportata"
|
||||
MsSpoti2 = "Disinstallare la versione Microsoft Store di Spotify [Y/N]"
|
||||
MsSpoti = "È stata rilevata la versione di Spotify del Microsoft Store, che non è supportata"
|
||||
MsSpoti2 = "Disinstallare la versione del Microsoft Store di Spotify ? [Y/N]"
|
||||
MsSpoti3 = "Disinstallazione automatica di Spotify MS..."
|
||||
MsSpoti4 = "Disinstallazione di Spotify MS..."
|
||||
Prem = "Modifica per account premium..."
|
||||
OldV = "Trovata vecchia versione di Spotify"
|
||||
OldV2 = "La tua versione di Spotify {0} è vecchia, è consigliato aggiornare alla versione {1}"
|
||||
OldV3 = "Vorresti aggiornare? [Y/N]"
|
||||
OldV2 = "La tua versione di Spotify {0} è vecchia, la versione attuale più recente è — {1}"
|
||||
OldV3 = "Vorresti aggiornare ? [Y/N]"
|
||||
AutoUpd = "Aggiornamento automatico alla versione consigliata"
|
||||
DelOrOver = "Vorresti disinstallare la versione installata {0} o sovrascriverla? Y [Disinstalla] / N [Sovrascrivi]"
|
||||
DelOrOver = "Rimuovere la versione attuale {0} o sovrascriverla? Y [Rimuovi] / N [Sovrascrivi]"
|
||||
DelOld = "Disinstallando vecchia versione di Spotify..."
|
||||
NewV = "Trovata versione di Spotify non supportata"
|
||||
NewV2 = "La tua versione {0} di Spotify non è stata ancora testata, al momento la {1} è stabile"
|
||||
NewV3 = "Vorresti continuare ad installare la versione {0} (possibili errori)? [Y/N]"
|
||||
Recom = "Vorresti installare la versione consigliata {0}? [Y/N]"
|
||||
NewV2 = "La tua versione {0} di Spotify non è stata testata. La versione stabile per SpotX è {1}"
|
||||
NewV3 = "Continuare con {0} (possibili errori) ? [Y/N]"
|
||||
Recom = "Installare l'ultima versione {0} ? [Y/N]"
|
||||
DelNew = "Disinstallando una versione non testata di Spotify..."
|
||||
DownSpoti = "Scaricando ed installando Spotify"
|
||||
DownSpoti2 = "Attendere..."
|
||||
PodcatsOff = "Podcasts OFF"
|
||||
PodcastsOn = "Podcasts ON"
|
||||
PodcatsSelect = "Vorresti rimuovere podcast, episodi ed audiolibri dalla pagina principale? [Y/N]"
|
||||
DowngradeNote = "Si consiglia il blocco degli aggiornamenti dato il downgrade di Spotify"
|
||||
PodcatsSelect = "Nascondere podcast, episodi ed audiolibri dalla pagina principale ? [Y/N]"
|
||||
DowngradeNote = "Si consiglia il blocco dato il downgrade di Spotify"
|
||||
UpdBlock = "Aggiornamenti di Spotify bloccati"
|
||||
UpdUnblock = "Aggiornamenti di Spotify non bloccati"
|
||||
UpdSelect = "Vorresti bloccare gli aggiornamenti automatici di Spotify? [Y/N]"
|
||||
CacheOn = "Attivata la cancellazione automatica della cache ({0})"
|
||||
CacheOff = "Cancellazione automatica della cache non attiva"
|
||||
CacheSelect = "Vorresti attivare la cancellazione automatica della cache? [Y/N]"
|
||||
CacheDays = "Verrà cancellata la cache più vecchia di XX giorni"
|
||||
CacheDays2 = "Inserisci il numero dei giorni da 1 a 100"
|
||||
UpdSelect = "Bloccare gli aggiornamenti di Spotify ? [Y/N]"
|
||||
ModSpoti = "Patching Spotify..."
|
||||
Error = "Errore"
|
||||
FileLocBroken = "Il percorso dei file di Spotify non è stato trovato, disinstallare Spotify ed eseguire lo script"
|
||||
Spicetify = "Spicetify detected, it must be installed after SpotX, open recommended actions in FAQ ? [Y/N]"
|
||||
FileLocBroken = "La posizione dei file di Spotify è danneggiata, disinstallare il client di Spotify ed eseguire nuovamente lo script"
|
||||
Spicetify = "Spicetify rilevato, deve essere installato dopo SpotX, aprire le azioni consigliate nelle FAQ ? [Y/N]"
|
||||
NoRestore = "SpotX è già stato installato, xpui.bak non trovato. `nPer favore, disinstalla Spotify e riapri il file Install.bat"
|
||||
InstallComplete = "Installazione completata"
|
||||
InstallComplete = "installazione completata"
|
||||
HostInfo = "Trovati URL non desiderati nel file hosts"
|
||||
HostBak = "Backup di hosts.bak in corso..."
|
||||
HostDel = "Provo a rimuovere URL non desiderati dal file hosts originale..."
|
||||
HostError = "Qualcosa è andato storto durante la modifica del file hosts, modificalo manualmente o fai partire lo script come amministratore"
|
||||
PressAnyKey = "Premi un tasto qualsiasi per uscire..."
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "再びエラー"
|
||||
Download4 = "ネットワークの設定を確認し再度インストールを実行してくささい"
|
||||
Download5 = "Spotify のダウンロード中"
|
||||
Download6 = "Curl のエラー"
|
||||
StopScript = "スクリプトが停止しました"
|
||||
MsSpoti = "Microsoft Store 版の Spotify には対応していません"
|
||||
MsSpoti2 = "Microsoft Store 版の Spotifyをアンインストールしますか ? [Y/N]"
|
||||
@@ -37,11 +36,6 @@
|
||||
UpdBlock = "Spotify の更新を阻止"
|
||||
UpdUnblock = "Spotify の更新を阻止していません"
|
||||
UpdSelect = "Spotify の更新を阻止しますか ? [Y/N]"
|
||||
CacheOn = "音声キャッシュ清掃は有効です ({0})"
|
||||
CacheOff = "音声キャッシュ清掃が有効ではありません"
|
||||
CacheSelect = "Spotify の音声キャッシュの自動清掃をインストールしますか ? [Y/N]"
|
||||
CacheDays = "指定の日数以上使用されていないキャッシュを削除します"
|
||||
CacheDays2 = "日数を1から100までで入力してだくさい"
|
||||
ModSpoti = "Spotify にパッチ適用中..."
|
||||
Error = "エラー"
|
||||
FileLocBroken = "Spotify のファイルの場所が壊れています。Spotify クライアントをアンインストールし再度スクリプトを実行してください"
|
||||
@@ -52,4 +46,5 @@
|
||||
HostBak = "hosts.bak にバックアップ中..."
|
||||
HostDel = "元の hosts から望まない URL を削除中..."
|
||||
HostError = "hosts ファイルの編集中に不明の問題が発生、手動で編集するか、管理者としてスクリプトを実行してください"
|
||||
PressAnyKey = "終了するには何かキーを押してください..."
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "შეცდომა ისევ"
|
||||
Download4 = "შეამოწმეთ თქვენი კავშირი ქსელთან და თავიდან სცადე ინსტალაცია"
|
||||
Download5 = "Spotify იწერება"
|
||||
Download6 = "Curl error" #
|
||||
StopScript = "სკრიპტი ჩერდება"
|
||||
MsSpoti = "Microsoft Store-ის ვერსია მოიძებნა რომელიც არ არის მხარდაჯერილი"
|
||||
MsSpoti2 = "წავშალოთ Spotify Microsoft Store-ის ვერსია [Y/N]"
|
||||
@@ -37,11 +36,6 @@
|
||||
UpdBlock = "Spotify-ს განახლებები დაბლოკილია"
|
||||
UpdUnblock = "Spotify-ს განახლებები არ არის დაბლოკილი"
|
||||
UpdSelect = "გინდათ რომ დაბლოკოთ Spotify-ს განახლებები? [Y/N]"
|
||||
CacheOn = "ქეშის გაწმენდა ჩართულია ({0})"
|
||||
CacheOff = "ქეშის გაწმენდა არ არის ჩართული"
|
||||
CacheSelect = "გინდათ რომ ჩართოთ ავტომატიკური ქეშის გაწმენდა? [Y/N]"
|
||||
CacheDays = "ქეში უფრო ძველია: XX დღეზე რომ იყოს გაწმენდილი "
|
||||
CacheDays2 = "შეიყვანეთ the დღეების რაოდენობა 1-იდან 100-ამდე"
|
||||
ModSpoti = "Spotify იკერვება..."
|
||||
Error = "შეცდომა"
|
||||
FileLocBroken = "Spotify ფაილების ლოკაცია არის გადეხილი, წაშალეთ კლიენტი და თავიდან გაუშვით სკრიპტი"
|
||||
@@ -52,4 +46,5 @@
|
||||
HostBak = "იქმნება hosts.bak-ის სარევეზნო ასლი..."
|
||||
HostDel = "ვცდილობთ რომ ამოვიღოთ არასასურველი URL-ები ორიგინალური მასპინძელის ფაილიდან..."
|
||||
HostError = "რაღაც შეცდომა მოხდა მასპინძელის ფაილის რედაქტირებისას, დაარედაქტირეთ ის ხელით ან გაუშვით სკრიპტი ადმინისტრატორის სახით"
|
||||
}
|
||||
PressAnyKey = "დააჭირეთ ნებისმიერ ღილაკს გასასვლელად..."
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "오류 발생"
|
||||
Download4 = "네트워크 설정을 확인하시고 다시 실행해주세요"
|
||||
Download5 = "Spotify 다운로드 중"
|
||||
Download6 = "Curl 오류"
|
||||
StopScript = "스크립트가 중단되었습니다"
|
||||
MsSpoti = "Microsoft Store 버전의 Spotify가 감지되었으며 이는 지원되지 않습니다"
|
||||
MsSpoti2 = "Spotify Microsoft Store 버전을 제거할까요? [Y/N]"
|
||||
@@ -37,11 +36,6 @@
|
||||
UpdBlock = "Spotify 업데이트가 차단됨"
|
||||
UpdUnblock = "Spotify 업데이트가 차단되지 않음"
|
||||
UpdSelect = "Spotify 업데이트를 차단할까요? [Y/N]"
|
||||
CacheOn = "캐시 비우기 활성화됨 ({0})"
|
||||
CacheOff = "캐시 비우기가 활성화되지 않음"
|
||||
CacheSelect = "자동 캐시 비우기를 설정할까요? [Y/N]"
|
||||
CacheDays = "XX 일보다 오래된 캐시가 비워집니다 "
|
||||
CacheDays2 = "1에서 100 사이의 일수를 입력하세요"
|
||||
ModSpoti = "Spotify를 패치하는 중..."
|
||||
Error = "오류"
|
||||
FileLocBroken = "Spotify 폴더의 파일이 손상되었습니다, Spotify를 제거하고 이 스크립트를 다시 실행하세요"
|
||||
@@ -52,4 +46,5 @@
|
||||
HostBak = "hosts.bak 백업 파일을 생성하는 중..."
|
||||
HostDel = "원본 hosts 파일에서 불필요한 URL 제거를 시도하는 중..."
|
||||
HostError = "파일을 수정하는 데 오류가 발생했습니다, 직접 수정하거나 이 스크립트를 관리자 권한으로 실행해주세요"
|
||||
}
|
||||
PressAnyKey = "종료하려면 아무 키나 누르십시오..."
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "Atkal kļūda"
|
||||
Download4 = "Pārbaudi savus tīkla iestatījumus un mēģini instalēt vēlreiz"
|
||||
Download5 = "Lejuplādejam Spotify"
|
||||
Download6 = "Curl kļūda"
|
||||
StopScript = "Skripts ir apstājies"
|
||||
MsSpoti = "Microsoft veikala Spotify versija tika konstatēta, un nav atbalstīta."
|
||||
MsSpoti2 = "Izdzēst Spotify Microsoft Store versiju [Y/N]"
|
||||
@@ -37,11 +36,6 @@
|
||||
UpdBlock = "Spotify atjauninājumi ir bloķēti"
|
||||
UpdUnblock = "Spotify atjauninājumi nav bloķēti"
|
||||
UpdSelect = "Vai vēlies bloķēt Spotify atjauninājumus? [Y/N]"
|
||||
CacheOn = "Kešatmiņu tīrīšana ir ieslēgta ({0})"
|
||||
CacheOff = "Kešatmiņu tīrīšana nav ieslēgta"
|
||||
CacheSelect = "Vai vēlaties iestatīt automātisko kešatmiņas tīrīšanu? [Y/N]"
|
||||
CacheDays = "Kešatmiņa vecāka par: XX dienām tiks tīrīta. "
|
||||
CacheDays2 = "Ievadiet, cik dienas no 1 līdz 100 ir jāgaida lai tīrītu kešatmiņu."
|
||||
ModSpoti = "Modo Spotify..."
|
||||
Error = "Kļūda"
|
||||
FileLocBroken = "Spotify failu atrašanās vieta ir bojāta, atinstalējiet klientu un palaidiet skriptu vēlreiz"
|
||||
@@ -52,4 +46,5 @@
|
||||
HostBak = "Dublē hosts.bak ..."
|
||||
HostDel = "Mēģina noņemt nevēlamus URL no sākotnējā hosts faila..."
|
||||
HostError = "Kaut kas greizi aizgāja rediģējot hosts failu, rediģējiet to manuāli vai palaidiet skriptu ar administratora privilēģijām"
|
||||
}
|
||||
PressAnyKey = "Nospiediet jebkuru taustiņu, lai izietu..."
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "Pobieranie się nie powiodło"
|
||||
Download4 = "Sprawdź ustawienia sieci i uruchom instalację ponownie"
|
||||
Download5 = "Pobieranie Spotify"
|
||||
Download6 = "Błąd Curl"
|
||||
StopScript = "Skrypt jest zatrzymany"
|
||||
MsSpoti = "Wykryto wersję Spotify ze Sklepu Microsoft, która nie jest wspierana"
|
||||
MsSpoti2 = "Czy chcesz odinstalować wersję Spotify ze Sklepu Microsoft? [Y/N]"
|
||||
@@ -37,11 +36,6 @@
|
||||
UpdBlock = "Aktualizacje Spotify zablokowane"
|
||||
UpdUnblock = "Aktualizacje Spotify nie są zablokowane"
|
||||
UpdSelect = "Czy chcesz zablokować aktualizacje Spotify? [Y/N]"
|
||||
CacheOn = "Usuwanie plików cache ({0})"
|
||||
CacheOff = "Czyszczenie plików cache jest wyłączone"
|
||||
CacheSelect = "Chcesz ustawić automatyczne czyszczenie plików cache? [Y/N]"
|
||||
CacheDays = "Czyszczenie co: XX dni"
|
||||
CacheDays2 = "Wybierz co ile dni ma nastąpić czyszczenie od 1 to 100 do"
|
||||
ModSpoti = "Łatanie Spotify..."
|
||||
Error = "Błąd"
|
||||
FileLocBroken = "Lokalizacje plików Spotify jest uszkodzona, odinstaluj klienta Spotify i uruchom skrypt ponownie"
|
||||
@@ -52,4 +46,5 @@
|
||||
HostBak = "Tworzenie kopii zapasowej pliku hosts.bak..."
|
||||
HostDel = "Próba usunięcia niechcianych adresów URL z oryginalnego pliku hosts..."
|
||||
HostError = "Coś poszło nie tak podczas edycji pliku hosts, edytuj go ręcznie lub uruchom skrypt jako administrator"
|
||||
PressAnyKey = "Naciśnij dowolny klawisz, aby wyjść..."
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "Erro de novo"
|
||||
Download4 = "Verifique suas configurações de rede e tente executar a instalação novamente"
|
||||
Download5 = "Baixando o Spotify"
|
||||
Download6 = "Erro de Curl"
|
||||
StopScript = "O script foi interrompido"
|
||||
MsSpoti = "A versão do Spotify da Microsoft Store foi detectada, a qual não é suportada"
|
||||
MsSpoti2 = "Desinstalar edição do Spotify da Microsoft Store [Y/N]"
|
||||
@@ -37,11 +36,6 @@
|
||||
UpdBlock = "Atualizações do Spotify bloqueadas"
|
||||
UpdUnblock = "Atualizações do Spotify não bloqueadas"
|
||||
UpdSelect = "Deseja bloquear as atualizações do Spotify? [Y/N]"
|
||||
CacheOn = "A limpeza do cache de áudio está ativada ({0})"
|
||||
CacheOff = "A limpeza do cache de áudio está desativada"
|
||||
CacheSelect = "Deseja instalar a limpeza automática do cache do áudio do Spotify? [Y/N]"
|
||||
CacheDays = "Um cache que não foi usado por mais do que o número de dias especificado por você será excluído"
|
||||
CacheDays2 = "Digite o número de dias entre 1 a 100"
|
||||
ModSpoti = "Aplicando patch no Spotify..."
|
||||
Error = "Erro"
|
||||
FileLocBroken = "A localização dos arquivos do Spotify está incorreta, desinstale o Spotify e execute o script novamente"
|
||||
@@ -52,4 +46,5 @@
|
||||
HostBak = "Fazendo backup de hosts.bak..."
|
||||
HostDel = "Tentando remover URLs indesejados do arquivo hosts original..."
|
||||
HostError = "Algo deu errado ao editar o arquivo hosts, edite-o manualmente ou execute o script como Administrador"
|
||||
PressAnyKey = "Pressione qualquer tecla para sair..."
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "Eroare din nou"
|
||||
Download4 = "Verificați setările de rețea și rulați din nou instalarea"
|
||||
Download5 = "Se descarca Spotify"
|
||||
Download6 = "Eroare Curl"
|
||||
StopScript = "Scriptul a fost oprit"
|
||||
MsSpoti = "A fost detectată versiunea Microsoft Store a Spotify, care nu este suportată"
|
||||
MsSpoti2 = "Dezinstalati versiunea Microsoft Store a Spotify [Y/N]"
|
||||
@@ -37,11 +36,6 @@
|
||||
UpdBlock = "Actualizările Spotify au fost blocate"
|
||||
UpdUnblock = "Actualizările Spotify nu sunt blocate"
|
||||
UpdSelect = "Doriți să blocați actualizările Spotify? [Y/N]"
|
||||
CacheOn = "Ștergerea cache-ului este activată ({0})"
|
||||
CacheOff = "Ștergerea cache-ului nu este activată"
|
||||
CacheSelect = "Doriți să configurați curățarea automată a cache-ului? [Y/N]"
|
||||
CacheDays = "Cache mai vechi: XX zile pentru a fi curățat "
|
||||
CacheDays2 = "Introduceți numărul de zile de la 1 la 100"
|
||||
ModSpoti = "Se patchuiește Spotify..."
|
||||
Error = "Eroare"
|
||||
FileLocBroken = "Locația fișierelor Spotify este stricată, dezinstalați clientul și rulați din nou scriptul"
|
||||
@@ -52,4 +46,5 @@
|
||||
HostBak = "Se efectuează o copie de siguranță a fișierului hosts.bak..."
|
||||
HostDel = "Se încearcă eliminarea URL-urilor nedorite din fișierul original hosts..."
|
||||
HostError = "Ceva nu a mers bine in timpul editării fișierului hosts, editează-l manual sau rulează scriptul ca Administrator."
|
||||
PressAnyKey = "Apăsați orice tastă pentru a ieși..."
|
||||
}
|
||||
|
||||
@@ -12,30 +12,30 @@
|
||||
Download5 = "Загрузка Spotify"
|
||||
StopScript = "Cкрипт остановлен"
|
||||
MsSpoti = "Обнаружена версия Spotify из Microsoft Store, которая не поддерживается"
|
||||
MsSpoti2 = "Хотите удалить Spotify Microsoft Store ? [Y/N]"
|
||||
MsSpoti2 = "Удалить Spotify Microsoft Store ? [Y/N]"
|
||||
MsSpoti3 = "Автоматическое удаление Spotify MS..."
|
||||
MsSpoti4 = "Удаление Spotify MS..."
|
||||
Prem = "Модификация для премиум аккаунта..."
|
||||
OldV = "Найдена устаревшая версия Spotify"
|
||||
OldV2 = "Ваша версия Spotify {0} устарела, рекомендуется обновиться до {1}"
|
||||
OldV2 = "Ваша версия Spotify ({0}) устарела. Текущая актуальная версия — {1}"
|
||||
OldV3 = "Обновить ? [Y/N]"
|
||||
AutoUpd = "Автоматическое обновление до рекомендуемой версии"
|
||||
DelOrOver = "Вы хотите удалить текущую версию {0} или установить поверх нее? Y [Удалить] / N [Поверх]"
|
||||
DelOrOver = "Удалить текущую версию ({0}) или установить поверх? Y [Удалить] / N [Поверх]"
|
||||
DelOld = "Удаление устаревшего Spotify..."
|
||||
NewV = "Найдена неподдерживаемая версия Spotify"
|
||||
NewV2 = "Ваша версия Spotify {0} еще не тестировалась, стабильная версия сейчас {1}"
|
||||
NewV3 = "Хотите продолжить с {0} (возможны ошибки) ? [Y/N]"
|
||||
Recom = "Хотите установить рекомендуемую {0} версию ? [Y/N]"
|
||||
NewV2 = "Ваша версия Spotify ({0}) не тестировалась. Стабильная версия для SpotX — {1}"
|
||||
NewV3 = "Продолжить с {0} (возможны ошибки) ? [Y/N]"
|
||||
Recom = "Установить последнюю версию {0} ? [Y/N]"
|
||||
DelNew = "Удаление неподдерживаемого Spotify..."
|
||||
DownSpoti = "Загружаю и устанавливаю Spotify"
|
||||
DownSpoti2 = "Пожалуйста подождите..."
|
||||
PodcatsOff = "Подкасты отключены"
|
||||
PodcastsOn = "Подкасты не отключены"
|
||||
PodcatsSelect = "Хотите скрыть подкасты, шоу и аудиокниги на главной странице ? [Y/N]"
|
||||
DowngradeNote = "Рекомендуется заблокировать т.к. было понижение версии Spotify"
|
||||
PodcatsSelect = "Скрыть подкасты, шоу и аудиокниги на главной странице ? [Y/N]"
|
||||
DowngradeNote = "Рекомендуется заблокировать т.к. уже существует более новая версия Spotify"
|
||||
UpdBlock = "Обновления Spotify заблокированы"
|
||||
UpdUnblock = "Обновления Spotify не заблокированы"
|
||||
UpdSelect = "Хотите заблокировать обновления Spotify ? [Y/N]"
|
||||
UpdSelect = "Заблокировать обновления Spotify ? [Y/N]"
|
||||
ModSpoti = "Модифицирую Spotify..."
|
||||
Error = "Ошибка"
|
||||
FileLocBroken = "Расположение файлов Spotify нарушено, удалите клиент Spotify и снова запустите скрипт"
|
||||
@@ -46,4 +46,5 @@
|
||||
HostBak = "Создаю резервную копию hosts.bak..."
|
||||
HostDel = "Попытка удалить нежелательные Url-адреса из оригинального файла hosts..."
|
||||
HostError = "Что-то пошло не так при редактировании файла hosts, отредактируйте его вручную или запустите скрипт от администратора"
|
||||
}
|
||||
PressAnyKey = "Нажмите любую клавишу для выхода..."
|
||||
}
|
||||
|
||||
@@ -40,11 +40,11 @@
|
||||
Error = "Chyba"
|
||||
FileLocBroken = "Umiestnenie Spotify súborov je chybné, odinštaluj Spotify klient a spusti skript znova"
|
||||
Spicetify = "Spicetify nájdené, musí byť inštalované po SpotX, otvoriť odporúčané akcie vo FAQ ? [Y/N]"
|
||||
ExpSpotify = "Experimentálne funkcie sú prevádzkované Spotify"
|
||||
NoRestore = "SpotX už bol nainštalovaný, xpui.bak sa nenašlo. `nProsím odinštaluj Spotify klient a spusti Install.bat znova"
|
||||
InstallComplete = "Inštalácia dokončená"
|
||||
HostInfo = "Nechcené URLs nájdené v súbore hosts"
|
||||
HostBak = "Zálohujem súbor hosts.bak..."
|
||||
HostDel = "Pokúšam sa odobrať nechcené URLs z originálneho hosts súboru..."
|
||||
HostError = "Niečo sa nepodarilo s upravovaním súboru hosts, uprav ho manuálne alebo spusti skript ako administrátor"
|
||||
PressAnyKey = "Stlačte ľubovoľnú klávesu pre ukončenie..."
|
||||
}
|
||||
|
||||
50
scripts/installer-lang/sr-Latn.ps1
Normal file
50
scripts/installer-lang/sr-Latn.ps1
Normal file
@@ -0,0 +1,50 @@
|
||||
[PSCustomObject]@{
|
||||
Welcome = "
|
||||
╔══════════════════════════════╗
|
||||
║ Welcome to SpotX for Windows ║
|
||||
╚══════════════════════════════╝"
|
||||
Incorrect = "Ups, netačna vrednost,"
|
||||
Incorrect2 = "unesite ponovo za "
|
||||
Download = "Greška preuzimanja"
|
||||
Download2 = "Ponovan zahtev za 5 sekundi..."
|
||||
Download3 = "Ponovo greška"
|
||||
Download4 = "Proverite svoje postavke mreže i pokrenite instalaciju još jednom"
|
||||
Download5 = "Preuzimanje Spotify-ja"
|
||||
StopScript = "Skripta zaustavljena"
|
||||
MsSpoti = "Detektovana je verzija Spotify-ja iz Microsoft Store-a, što nije podržano"
|
||||
MsSpoti2 = "Deinstalirati verziju Spotify-ja iz Microsoft Store-a? [Y/N]"
|
||||
MsSpoti3 = "Automatska deinstalacija Spotify MS..."
|
||||
MsSpoti4 = "Deinstalacija Spotify MS..."
|
||||
Prem = "Modifikacija za premijum nalog..."
|
||||
OldV = "Pronađena je zastarela verzija Spotify-ja"
|
||||
OldV2 = "Vaša verzija Spotify-ja {0} je zastarela, trenutno najnovija verzija je {1}"
|
||||
OldV3 = "Želite li da ažurirate? [Y/N]"
|
||||
AutoUpd = "Automatsko ažuriranje na preporučenu verziju"
|
||||
DelOrOver = "Želite li da deinstalirate trenutnu verziju {0} ili da instalirate preko nje? Y [Deinstaliraj] / N [Preko]"
|
||||
DelOld = "Deinstalacija starog Spotify-ja..."
|
||||
NewV = "Pronađena je nepodržana verzija Spotify-ja"
|
||||
NewV2 = "Vaša verzija Spotify-ja {0} još nije testirana, trenutna stabilna verzija je {1}"
|
||||
NewV3 = "Želite li da nastavite sa verzijom {0} (moguće su greške)? [Y/N]"
|
||||
Recom = "Želite li da instalirate poslednju verziju {0}? [Y/N]"
|
||||
DelNew = "Deinstalacija netestiranog Spotify-ja..."
|
||||
DownSpoti = "Preuzimanje i instalacija Spotify-ja"
|
||||
DownSpoti2 = "Molimo sačekajte..."
|
||||
PodcatsOff = "Isključi podkaste"
|
||||
PodcastsOn = "Uključi podkaste"
|
||||
PodcatsSelect = "Želite li da onemogućite podkaste, epizode i audioknjige na početnoj strani? [Y/N]"
|
||||
DowngradeNote = "Preporučuje se da blokirate pošto je Spotify bio daungrejdovan"
|
||||
UpdBlock = "Ažuriranja Spotify-ja blokirana"
|
||||
UpdUnblock = "Ažuriranja Spotify-ja nisu blokirana"
|
||||
UpdSelect = "Želite li da blokirate ažuriranja Spotify-ja? [Y/N]"
|
||||
ModSpoti = "Krpljenje Spotify-ja..."
|
||||
Error = "Greška"
|
||||
FileLocBroken = "Lokacija fajlova Spotify-ja je narušena, deinstalirajte klijent, pa pokrenite skriptu ponovo"
|
||||
Spicetify = "Detektovan je Spicetify koji mora biti instaliran nakon SpotX-a, otvori preporučene akcije u FAQ-u? [Y/N]"
|
||||
NoRestore = "SpotX je već bio instaliran, xpui.bak nije pronađen. `nMolimo deinstalirajte Spotify klijent i pokrenite Install.bat ponovo"
|
||||
InstallComplete = "instalacija završena"
|
||||
HostInfo = "Neželjeni URL-ovi pronađeni u hosts fajlu"
|
||||
HostBak = "Pravljenje rezervne kopije hosts.bak..."
|
||||
HostDel = "Pokušavamo da uklonimo neželjene URL-ove iz originalnog hosts fajla..."
|
||||
HostError = "Nešto je pošlo naopako tokom uređivanja hosts fajla, uredite ga ručno ili pokrenite skriptu kao administrator"
|
||||
PressAnyKey = "Pritisnite bilo koji taster da izađete..."
|
||||
}
|
||||
@@ -10,23 +10,22 @@
|
||||
Download3 = "Поново грешка"
|
||||
Download4 = "Проверите своје поставке мреже и покрените инсталацију још једном"
|
||||
Download5 = "Преузимање Spotify-ја"
|
||||
Download6 = "Curl грешка"
|
||||
StopScript = "Скрипта заустављена"
|
||||
MsSpoti = "Детектована је верзија Spotify-ја из Microsoft Store-а, што није подржано"
|
||||
MsSpoti2 = "Деинсталирати верзију Spotify-ја из Microsoft Store-а? [Y/N]"
|
||||
MsSpoti3 = "Аутоматска деинсталација Spotify MS..."
|
||||
MsSpoti4 = "Деинсталација Spotify MS..."
|
||||
Prem = "Модификација за премијум налог..."
|
||||
OldV = "Нађена је застарела верзија Spotify-ја"
|
||||
OldV2 = "Ваша верзија Spotify-ја {0} је застарела, препоручује се да је ажурирате на {1}"
|
||||
OldV = "Пронађена је застарела верзија Spotify-ја"
|
||||
OldV2 = "Ваша верзија Spotify-ја {0} је застарела, тренутно најновија верзија је {1}"
|
||||
OldV3 = "Желите ли да ажурирате? [Y/N]"
|
||||
AutoUpd = "Аутоматско ажурирање на препоручену верзију"
|
||||
DelOrOver = "Желите ли да деинсталирате тренутну верзију {0} или да инсталирате преко ње? Y [Деинсталирај] / N [Преко]"
|
||||
DelOld = "Деинсталација старог Spotify-ја..."
|
||||
NewV = "Нађена је неподржана верзија Spotify-ја"
|
||||
NewV2 = "Ваша верзија Spotify-ја {0} није још била тестирана, тренутна стабилна верзија је {1}"
|
||||
NewV = "Пронађена је неподржана верзија Spotify-ја"
|
||||
NewV2 = "Ваша верзија Spotify-ја {0} још није тестирана, тренутна стабилна верзија је {1}"
|
||||
NewV3 = "Желите ли да наставите са верзијом {0} (могуће су грешке)? [Y/N]"
|
||||
Recom = "Желите ли да инсталирате препоручену верзију {0}? [Y/N]"
|
||||
Recom = "Желите ли да инсталирате последњу верзију {0}? [Y/N]"
|
||||
DelNew = "Деинсталација нетестираног Spotify-ја..."
|
||||
DownSpoti = "Преузимање и инсталација Spotify-ја"
|
||||
DownSpoti2 = "Молимо сачекајте..."
|
||||
@@ -37,19 +36,15 @@
|
||||
UpdBlock = "Ажурирања Spotify-ја блокирана"
|
||||
UpdUnblock = "Ажурирања Spotify-ја нису блокирана"
|
||||
UpdSelect = "Желите ли да блокирате ажурирања Spotify-ја? [Y/N]"
|
||||
CacheOn = "Чишћење кеша омогућено ({0})"
|
||||
CacheOff = "Чишћење кеша није омогућено"
|
||||
CacheSelect = "Желите ли да подесите аутоматско чишћење кеша? [Y/N]"
|
||||
CacheDays = "Кеш старији од XX дана ће се брисати"
|
||||
CacheDays2 = "Унесите број дана од 1 до 100"
|
||||
ModSpoti = "Крпљење Spotify-ја..."
|
||||
Error = "Грешка"
|
||||
FileLocBroken = "Локација фајлова Spotify-ја је нарушена, деинсталирајте клијент, па покрените скрипту поново"
|
||||
Spicetify = "Spicetify detected, it must be installed after SpotX, open recommended actions in FAQ ? [Y/N]"
|
||||
NoRestore = "SpotX је већ био инсталиран, xpui.bak није нађен. `nМолимо деинсталирајте Spotify клијент и покрените Install.bat поново"
|
||||
InstallComplete = "Инсталација завршена"
|
||||
HostInfo = "Нежељени URL-ови нађени у фајлу hosts"
|
||||
Spicetify = "Детектован је Spicetify који мора бити инсталиран након SpotX-а, отвори препоручене акције у FAQ-у? [Y/N]"
|
||||
NoRestore = "SpotX је већ био инсталиран, xpui.bak није пронађен. `nМолимо деинсталирајте Spotify клијент и покрените Install.bat поново"
|
||||
InstallComplete = "инсталација завршена"
|
||||
HostInfo = "Нежељени URL-ови пронађени у hosts фајлу"
|
||||
HostBak = "Прављење резервне копије hosts.bak..."
|
||||
HostDel = "Покушавамо да уклонимо нежељене URL-ове из оригиналног фајла hosts..."
|
||||
HostError = "Нешто је пошло наопако током уређивања фајла hosts, уредите га ручно или покрените скрипту као администратор"
|
||||
}
|
||||
HostDel = "Покушавамо да уклонимо нежељене URL-ове из оригиналног hosts фајла..."
|
||||
HostError = "Нешто је пошло наопако током уређивања hosts фајла, уредите га ручно или покрените скрипту као администратор"
|
||||
PressAnyKey = "Притисните било који тастер да изађете..."
|
||||
}
|
||||
|
||||
@@ -46,4 +46,5 @@
|
||||
HostBak = "Backar upp hosts.bak..."
|
||||
HostDel = "Försöker ta bort oönskade webbadresser från den ursprungliga hosts filen..."
|
||||
HostError = "Något gick fel vid redigering av hosts filen, redigera den manuellt eller kör skriptet som administratör"
|
||||
}
|
||||
PressAnyKey = "Tryck på valfri tangent för att avsluta..."
|
||||
}
|
||||
|
||||
@@ -46,4 +46,5 @@
|
||||
HostBak = "hosts.bak காப்புப்பிரதி..."
|
||||
HostDel = "Original host filesலிருந்து தேவையற்ற URL களை அகற்ற முயற்சிக்கிறது ..."
|
||||
HostError = "Hosts Filesயைத் திருத்தும் போது ஏதோ தவறு ஏற்பட்டது, அதை manualலாக திருத்தவும் அல்லது Scriptயை administratorராக இயக்கவும்"
|
||||
PressAnyKey = "Press any key to exit..."
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "Yine hata oluştu"
|
||||
Download4 = "Ağ ayarlarınızı kontrol edin ve kurulumu tekrar çalıştırın"
|
||||
Download5 = "Spotify indiriliyor"
|
||||
Download6 = "Curl hatası"
|
||||
StopScript = "Komut dosyası durduruldu"
|
||||
MsSpoti = "Spotify'ın desteklenmeyen Microsoft Store sürümü tespit edildi"
|
||||
MsSpoti2 = "Spotify'ın Microsoft Store sürümünü kaldır [Y/N]"
|
||||
@@ -37,11 +36,6 @@
|
||||
UpdBlock = "Spotify güncellemeleri engellendi"
|
||||
UpdUnblock = "Spotify güncellemeleri engellenmedi"
|
||||
UpdSelect = "Spotify güncellemelerini engellemek ister misiniz? [Y/N]"
|
||||
CacheOn = "Önbelleği temizleme etkin ({0})"
|
||||
CacheOff = "Önbelleğin temizlenmesi etkin değil"
|
||||
CacheSelect = "Otomatik önbellek temizlemeyi ayarlamak ister misiniz? [Y/N]"
|
||||
CacheDays = "Daha eski olan önbellek: XX gün içinde temizlenecek "
|
||||
CacheDays2 = "Gün sayısını 1 ile 100 arasında girin"
|
||||
ModSpoti = "Spotify'a yama yapılıyor..."
|
||||
Error = "Hata"
|
||||
FileLocBroken = "Spotify dosyalarının konumu bozuk, istemciyi kaldırın ve kodu tekrar çalıştırın"
|
||||
@@ -52,4 +46,5 @@
|
||||
HostBak = "hosts.bak dosyası yedekleniyor...."
|
||||
HostDel = "Orijinal hosts dosyasından istenmeyen URL'ler kaldırılmaya çalışılıyor..."
|
||||
HostError = "Hosts dosyasını düzenlerken bir şeyler ters gitti, elle düzenleyin veya kodu yönetici olarak çalıştırın"
|
||||
PressAnyKey = "Çıkmak için herhangi bir tuşa basın..."
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "Помилка знову"
|
||||
Download4 = "Перевірте налаштування вашого з'єднання та запустіть інсталятор знову"
|
||||
Download5 = "Завантаження Spotify"
|
||||
Download6 = "Помилка Curl"
|
||||
StopScript = "Скрипт зупинено"
|
||||
MsSpoti = "Знайдено версію Spotify з Microsoft Store, яка не підтримується"
|
||||
MsSpoti2 = "Видалити версію Spotify з Microsoft Store [Y/N]"
|
||||
@@ -37,11 +36,6 @@
|
||||
UpdBlock = "Оновлення Spotify заблоковано"
|
||||
UpdUnblock = "Оновлення Spotify наразі не заблоковані"
|
||||
UpdSelect = "Хочете заблокувати оновлення Spotify ? [Y/N]"
|
||||
CacheOn = "Увімкнено блокування кешу ({0})"
|
||||
CacheOff = "Блокування кешу вимкнено"
|
||||
CacheSelect = "Хочете налаштувати автоматичне чищення кешу? [Y/N]"
|
||||
CacheDays = "Кеш старіше XX днів буде видалений "
|
||||
CacheDays2 = "Введіть кількість днів від 1 до 100"
|
||||
ModSpoti = "Встановлення патчів на Spotify..."
|
||||
Error = "Помилка"
|
||||
FileLocBroken = "Помилки у шляху до файлів Spotify, видаліть клієнт та запустіть скрипт ще раз."
|
||||
@@ -52,4 +46,5 @@
|
||||
HostBak = "Бекап hosts.bak..."
|
||||
HostDel = "Спроба прибрати небажані посилання з оригінального файлу hosts..."
|
||||
HostError = "Щось пішло не так під час редагування файлу hosts, змініть його вручну, або спробуйте запустити скрипт від імені адміністратора"
|
||||
PressAnyKey = "Натисніть будь-яку клавішу, щоб вийти..."
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
Download3 = "Lại bị lỗi"
|
||||
Download4 = "Hãy kiểm tra cài đặt mạng và chạy lại chương trình"
|
||||
Download5 = "Đang tải Spotify"
|
||||
Download6 = "Lỗi curl"
|
||||
StopScript = "Đã dừng bản vá"
|
||||
MsSpoti = "Phát hiện phiên bản Spotify của Microsoft Store, bản này không được hỗ trợ"
|
||||
MsSpoti2 = "Gỡ Spotify của Microsoft Store [Y/N]"
|
||||
@@ -37,19 +36,15 @@
|
||||
UpdBlock = "Đã chặn cập nhật Spotify"
|
||||
UpdUnblock = "Cập nhật Spotify không bị chặn"
|
||||
UpdSelect = "Bạn có muốn ngăn Spotify tự động cập nhật? [Y/N]"
|
||||
CacheOn = "Dọn bộ nhớ đệm đã được kích hoạt ({0})"
|
||||
CacheOff = "Dọn bộ nhớ đệm chưa được kích hoạt"
|
||||
CacheSelect = "Bạn có muốn đặt thời gian tự động dọn dẹp bộ nhớ đệm? [Y/N]"
|
||||
CacheDays = "Bộ nhớ đệm nếu không được sử dụng trong một thời gian nhất định sẽ bị xóa"
|
||||
CacheDays2 = "Nhập số ngày từ 1 đến 100"
|
||||
ModSpoti = "Đang vá Spotify..."
|
||||
Error = "Lỗi"
|
||||
FileLocBroken = "Vị trí các tệp của Spotify đã bị hỏng, gỡ Spotify và chạy lại bản vá"
|
||||
Spicetify = "Spicetify detected, it must be installed after SpotX, open recommended actions in FAQ ? [Y/N]"
|
||||
Spicetify = "Đã phát hiện Spicetify, nó cần phải được cài đặt sau SpotX, bạn có muốn mở những hành động khuyến khích trong mục FAQ ? [Y/N]"
|
||||
NoRestore = "Đã cài SpotX nhưng không tìm thấy tập tin xpui.bak. `nGỡ Spotify và chạy lại Install.bat"
|
||||
InstallComplete = "cài đặt hoàn tất"
|
||||
HostInfo = "Tìm thấy các URL không cần thiết trong tệp hosts"
|
||||
HostBak = "Đang sao lưu hosts.bak..."
|
||||
HostDel = "Đang xóa các URL không cần thiết khỏi tệp hosts..."
|
||||
HostError = "Xảy ra lỗi khi đang chỉnh sửa tệp hosts. Hãy tự sửa hoặc chạy tệp này với tư cách quản trị viên"
|
||||
PressAnyKey = "Nhấn phím bất kỳ để thoát..."
|
||||
}
|
||||
|
||||
@@ -46,4 +46,5 @@
|
||||
HostBak = "正在備份 hosts.bak..."
|
||||
HostDel = "正在嘗試從原始 hosts 檔案中刪除不需要的網址..."
|
||||
HostError = "在編輯 hosts 檔案時發生了錯誤,請手動編輯或以系統管理員身分執行腳本"
|
||||
PressAnyKey = "按任意鍵退出..."
|
||||
}
|
||||
|
||||
@@ -46,4 +46,5 @@
|
||||
HostBak = "备份原始 hosts 文件为 hosts.bak..."
|
||||
HostDel = "正在试图从原始 hosts 文件中删除不需要的 URL..."
|
||||
HostError = "在编辑 hosts 文件时发生了错误,请手动编辑或以管理员身份重新运行该脚本。"
|
||||
PressAnyKey = "按任意键退出..."
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user