Files
SpotX/Install.ps1
amd64fox 61738f2e35 Update
- migration to Spotify version 1.1.92.647
 - added to the settings cleaning downloaded tracks and cache
 - fixed minor bugs and link paths
2022-08-16 14:39:11 +03:00

1909 lines
98 KiB
PowerShell
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
param
(
[Parameter(HelpMessage = 'Remove podcasts from homepage.')]
[switch]$podcasts_off,
[Parameter(HelpMessage = 'Do not remove podcasts from homepage.')]
[switch]$podcasts_on,
[Parameter(HelpMessage = 'Block Spotify automatic updates.')]
[switch]$block_update_on,
[Parameter(HelpMessage = 'Do not block Spotify automatic updates.')]
[switch]$block_update_off,
[Parameter(HelpMessage = 'Enable clear cache.')]
[switch]$cache_on,
[Parameter(HelpMessage = 'Specify the number of days. Default is 7 days.')]
[int16]$number_days = 7,
[Parameter(HelpMessage = 'Do not enable cache clearing.')]
[switch]$cache_off,
[Parameter(HelpMessage = 'Automatic uninstallation of Spotify MS if it was found.')]
[switch]$confirm_uninstall_ms_spoti,
[Parameter(HelpMessage = 'Overwrite outdated or unsupported version of Spotify with the recommended version.')]
[switch]$confirm_spoti_recomended_over,
[Parameter(HelpMessage = 'Uninstall outdated or unsupported version of Spotify and install the recommended version.')]
[switch]$confirm_spoti_recomended_unistall,
[Parameter(HelpMessage = 'Installation without ad blocking for premium accounts.')]
[switch]$premium,
[Parameter(HelpMessage = 'Automatic launch of Spotify after installation is complete.')]
[switch]$start_spoti,
[Parameter(HelpMessage = 'Experimental features operated by Spotify.')]
[switch]$exp_spotify,
[Parameter(HelpMessage = 'Experimental features of SpotX are not included')]
[switch]$exp_standart,
[Parameter(HelpMessage = 'Do not hide the icon of collaborations in playlists.')]
[switch]$hide_col_icon_off,
[Parameter(HelpMessage = 'Do not enable the made for you button on the left sidebar.')]
[switch]$made_for_you_off,
[Parameter(HelpMessage = 'Do not enable enhance playlist.')]
[switch]$enhance_playlist_off,
[Parameter(HelpMessage = 'Do not enable enhance liked songs.')]
[switch]$enhance_like_off,
[Parameter(HelpMessage = 'Do not enable new discography on artist.')]
[switch]$new_artist_pages_off,
[Parameter(HelpMessage = 'Do not enable new lyrics.')]
[switch]$new_lyrics_off,
[Parameter(HelpMessage = 'Do not enable exception playlists from recommendations.')]
[switch]$ignore_in_recommendations_off,
[Parameter(HelpMessage = 'Enable audio equalizer for Desktop.')]
[switch]$equalizer_off,
[Parameter(HelpMessage = 'Enable showing a new and improved device picker UI.')]
[switch]$device_new_off,
[Parameter(HelpMessage = 'Enabled the new home structure and navigation.')]
[switch]$enablenavalt,
#[Parameter(HelpMessage = 'Connect unlock test.')]
#[switch]$testconnect,
[Parameter(HelpMessage = 'Do not create desktop shortcut.')]
[switch]$no_shortcut,
[Parameter(HelpMessage = 'Select the desired language to use for installation. Default is the detected system language.')]
[Alias('l')]
[string]$Language
)
# Ignore errors from `Stop-Process`
$PSDefaultParameterValues['Stop-Process:ErrorAction'] = [System.Management.Automation.ActionPreference]::SilentlyContinue
function Format-LanguageCode {
# Normalizes and confirms support of the selected language.
[CmdletBinding()]
[OutputType([string])]
param
(
[string]$LanguageCode
)
begin {
$supportLanguages = @(
'en', 'ru', 'it', 'tr', 'ka', 'pl'
)
}
process {
# Trim the language code down to two letter code.
switch -Regex ($LanguageCode) {
'^en' {
$returnCode = 'en'
break
}
'^(ru|py)' {
$returnCode = 'ru'
break
}
'^it' {
$returnCode = 'it'
break
}
'^tr' {
$returnCode = 'tr'
break
}
'^ka' {
$returnCode = 'ka'
break
}
'^pl' {
$returnCode = 'pl'
break
}
Default {
$returnCode = $PSUICulture.Remove(2)
break
}
}
# Confirm that the language code is supported by this script.
if ($returnCode -NotIn $supportLanguages) {
# If the language code is not supported default to English.
$returnCode = 'en'
}
}
end {
return $returnCode
}
}
function Set-ScriptLanguageStrings {
#Sets the language strings to be used.
[CmdletBinding()]
[OutputType([object])]
param
(
[Parameter(Mandatory = $true,
HelpMessage = 'Two letter language code.')]
[string]$LanguageCode
)
begin {
# Define language strings.
$langStringsEN = [PSCustomObject]@{
Author = "Patch author:"
Author2 = "@Amd64fox"
Incorrect = "Oops, an incorrect value,"
Incorrect2 = "enter again through "
Download = "Error downloading"
Download2 = "Will re-request in 5 seconds..."
Download3 = "Error again"
Download4 = "Check your network settings and run the installation again"
Download5 = "Downloading Spotify"
StopScrpit = "Script is stopped"
MsSpoti = "The Microsoft Store version of Spotify has been detected which is not supported"
MsSpoti2 = "Uninstall Spotify Windows Store edition [Y/N]"
MsSpoti3 = "Automatic 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}"
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]"
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]"
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 from the main page? [Y/N]"
DowngradeNote = "It is recommended to block because there was a downgrade of Spotify"
UpdBlock = "Spotify updates blocked"
UpdUnblock = "Spotify updates are not blocked"
UpdSelect = "Want to block Spotify updates? [Y/N]"
CacheOn = "Clear cache enabled ({0})"
CacheOff = "Clearing the cache is not enabled"
CacheSelect = "Want to set up automatic cache cleanup? [Y/N]"
CacheDays = "Cache older: XX days to be cleared "
CacheDays2 = "Enter the number of days from 1 to 100"
NoVariable = "Didn't find variable"
NoVariable2 = "in xpui.js"
NoVariable3 = "in licenses.html"
NoVariable4 = "in html"
ModSpoti = "Patching Spotify..."
Error = "Error"
FileLocBroken = "Location of Spotify files is broken, uninstall the client and run the script again"
Spicetify = "Spicetify detected"
NoRestore = "SpotX has already been installed, but files to recover xpui.js.bak and xpui.css.bak not found. `nPlease uninstall Spotify client and run Install.bat again"
ExpSpotify = "Experimental features operated by Spotify"
ExpStandart = "Experimental features of SpotX are not included"
NoRestore2 = "SpotX has already been installed, xpui.bak not found. `nPlease uninstall Spotify client and run Install.bat again"
UpdateBlocked = "Spotify updates are already blocked"
UpdateError = "Failed to block updates"
NoSpotifyExe = "Could not find Spotify.exe"
InstallComplete = "installation completed"
HostInfo = "Unwanted URLs found in hosts file"
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"
}
$langStringsRU = [PSCustomObject]@{
Author = "Автор патча:"
Author2 = "@Amd64fox"
Incorrect = "Ой, некорректное значение,"
Incorrect2 = "повторите ввод через"
Download = "Ошибка загрузки"
Download2 = "Повторный запрос через 5 секунд..."
Download3 = "Опять ошибка"
Download4 = "Проверьте настройки вашей сети и снова запустите установку"
Download5 = "Загрузка Spotify"
StopScrpit = "рипт остановлен"
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} еще не тестировалась, стабильная версия сейчас {1}"
NewV3 = "Хотите продолжить с {0} (возможны ошибки) ? [Y/N]"
Recom = "Хотите установить рекомендуемую {0} версию ? [Y/N]"
DelNew = "Удаление неподдерживаемого Spotify..."
DownSpoti = "Загружаю и устанавливаю Spotify"
DownSpoti2 = "Пожалуйста подождите..."
PodcatsOff = "Подкасты отключены"
PodcastsOn = "Подкасты не отключены"
PodcatsSelect = "Хотите отключить подкасты c главной страницы ? [Y/N]"
DowngradeNote = "Рекомендуется заблокировать т.к. было понижение версии Spotify"
UpdBlock = "Обновления Spotify заблокированы"
UpdUnblock = "Обновления Spotify не заблокированы"
UpdSelect = "Хотите заблокировать обновления Spotify ? [Y/N]"
CacheOn = "Очистка кеша включена ({0})"
CacheOff = "Очистка кеша не включена"
CacheSelect = "Хотите установить автоматическую очистку кеша ? [Y/N]"
CacheDays = "Кэш старше: XX дней будет очищен"
CacheDays2 = "Пожалуйста, введите количество дней от 1 до 100"
NoVariable = "Не нашел переменную"
NoVariable2 = "в xpui.js"
NoVariable3 = "в licenses.html"
NoVariable4 = "в html"
NoVariable5 = "в ru.json"
ModSpoti = "Модифицирую Spotify..."
Error = "Ошибка"
FileLocBroken = "Расположение файлов Spotify нарушено, удалите клиент и снова запустите скрипт"
Spicetify = "Обнаружен Spicetify"
NoRestore = "SpotX уже был установлен, но файлы для восстановления xpui.js.bak и xpui.css.bak не найдены. `nУдалите клиент Spotify и снова запустите Install.bat"
ExpSpotify = "Экспериментальные функции управляются Spotify"
ExpStandart = "Экспериментальные функции SpotX не включены"
NoRestore2 = "SpotX уже был установлен, но файл для восстановления xpui.bak не найден. `nУдалите клиент Spotify и снова запустите Install.bat"
UpdateBlocked = "Обновления Spotify уже заблокированы"
UpdateError = "Не удалось заблокировать обновления"
NoSpotifyExe = "Spotify.exe не найден"
InstallComplete = "Установка завершена"
HostInfo = "В файле hosts найдены нежелательные Url-адреса"
HostBak = "Создаю резервную копию hosts.bak..."
HostDel = "Попытка удалить нежелательные Url-адреса из оригинального файла hosts..."
HostError = "Что-то пошло не так при редактировании файла hosts, отредактируйте его вручную или запустите скрипт от администратора"
}
$langStringsIT = [PSCustomObject]@{
Author = "Autore patch:"
Author2 = "@Amd64fox"
TranslationBy = "Autore traduzione:"
TranslationBy2 = "@Francescoaracu"
Incorrect = "Ops! 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 e fai partire di nuovo l'installazione"
Download5 = "Scarico Spotify"
StopScrpit = "Lo script è stato fermato"
MsSpoti = "Trovata versione del Microsoft Store di Spotify, che non è supportata"
MsSpoti2 = "Disinstalla la versione Microsoft Store di Spotify [Y/N]"
MsSpoti3 = "Disinstallazione automatica Spotify MS..."
MsSpoti4 = "Disinstallo 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 = "Vuoi aggiornare? [Y/N]"
AutoUpd = "Aggiornamento automatico alla versione consigliata"
DelOrOver = "Vuoi disinstallare la versione installata {0} o sovrascriverla? Y [Disinstalla] / N [Sovrascrivi]"
DelOld = "Disinstallo vecchio 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 = "Vuoi continuare a installare la versione {0} (possibili errori)? [Y/N]"
Recom = "Vuoi installare la versione consigliata {0}? [Y/N]"
DelNew = "Disinstallo una versione non testata di Spotify..."
DownSpoti = "Scarico e installo Spotify"
DownSpoti2 = "Attendi..."
PodcatsOff = "Podcasts OFF"
PodcastsOn = "Podcasts ON"
PodcatsSelect = "Vuoi rimuovere i podcast dalla home? [Y/N]"
DowngradeNote = "Si consiglia il blocco degli aggiornamenti perché è stato eseguito un downgrade di Spotify"
UpdBlock = "Aggiornamenti di Spotify bloccati"
UpdUnblock = "Aggiornamenti di Spotify non bloccati"
UpdSelect = "Vuoi bloccare gli aggiornamenti automatici di Spotify? [Y/N]"
CacheOn = "Attivata la cancellazione automatica della cache ({0})"
CacheOff = "Cancellazione automatica della cache non attiva"
CacheSelect = "Vuoi 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"
NoVariable = "Variabile non trovata"
NoVariable2 = "in xpui.js"
NoVariable3 = "in licenses.html"
NoVariable4 = "in html"
ModSpoti = "Patching Spotify..."
Error = "Errore"
FileLocBroken = "Il percorso dei file di Spotify non è stato trovato, disinstalla Spotify e fai ripartire lo script"
Spicetify = "Rilevato Spicetify"
NoRestore = "SpotX è già stato installato, ma file da recuperare xpui.js.bak e xpui.css.bak non trovati. `nPer favore, disinstalla Spotify e riapri il file Install.bat"
ExpSpotify = "Features sperimentali attivate da Spotify"
ExpStandart = "Features sperimentali di SpotX non incluse"
NoRestore2 = "SpotX è già stato installato, xpui.bak non trovato. `nPer favore, disinstalla Spotify e riapri il file Install.bat"
UpdateBlocked = "Gli aggiornamenti automatici di Spotify sono già stati bloccati"
UpdateError = "Blocco degli aggiornamenti non riuscito"
NoSpotifyExe = "Spotify.exe non trovato"
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 provando a modificare il file hosts, modificalo manualmente o fai partire lo script come amministratore"
}
$langStringsTR = [PSCustomObject]@{
Author = "Yama yapımcısı:"
Author2 = "@Amd64fox"
TranslationBy = "Tercüman:"
TranslationBy2 = "@metezd"
Incorrect = "Eyvah, yanlış bir değer,"
Incorrect2 = "tekrar girin "
Download = "İndirirken hata oluştu"
Download2 = "5 saniye içinde tekrar talep edilecek..."
Download3 = "Yine hata oluştu"
Download4 = "Ağ ayarlarınızı kontrol edin ve kurulumu tekrar çalıştırın"
Download5 = "Spotify indiriliyor"
StopScrpit = "Komut dosyası durduruldu"
MsSpoti = "Spotify'ın desteklenmeyen Microsoft Mağazası sürümü tespit edildi"
MsSpoti2 = "Spotify Windows Mağazası sürümünü kaldır [Y/N]"
MsSpoti3 = "Spotify MS otomatik olarak kaldırlıyor..."
MsSpoti4 = "Spotify MS kaldırılıyor..."
Prem = "Premium hesap için modifikasyon ..."
OldV = "Spotify'ın eski bir sürümü bulundu"
OldV2 = "Spotify {0} sürümü güncel değil, {1} sürümüne yükseltmeniz önerilir"
OldV3 = "Güncelleme yapılsın mı? [Y/N]"
AutoUpd = "Önerilen sürüme otomatik olarak güncelle"
DelOrOver = "Mevcut {0} sürümünü kaldırmak mı yoksa üzerine yüklemek mi istiyorsunuz? Y [Kaldır] / N [Üzerine Yükle]"
DelOld = "Eski Spotify kaldırılıyor..."
NewV = "Desteklenmeyen Spotify sürümü bulundu"
NewV2 = "Spotify {0} sürümü henüz test edilmedi, şu anda kararlı olan {1} sürümüdür"
NewV3 = "{0} sürümü ile devam etmek istiyor musunuz (hatalar olabilir) ? [Y/N]"
Recom = "Önerilen {0} sürümünü yüklemek istiyor musunuz? [Y/N]"
DelNew = "Test edilmemiş Spotify kaldırılıyor..."
DownSpoti = "Spotify indiriliyor ve kuruluyor"
DownSpoti2 = "Lütfen bekleyin..."
PodcatsOff = "Podcast'ler Kapalı"
PodcastsOn = "Podcast'ler Açık"
PodcatsSelect = "Podcast'leri ana sayfadan kaldırmak istiyor musunuz? [Y/N]"
DowngradeNote = "Spotify'da bir sürüm düşürme olduğu için engellemeniz önerilir"
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"
NoVariable = "Değişken bulunamadı"
NoVariable2 = "xpui.js içinde"
NoVariable3 = "in licenses.html"
NoVariable4 = "html içinde"
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"
Spicetify = "Spicetify algılandı"
NoRestore = "SpotX zaten yüklenmiş, ancak xpui.js.bak ve xpui.css.bak dosyalarının bulunamadığı tespit edildi. `nLütfen Spotify istemcisini kaldırın ve Install.bat dosyasını tekrar çalıştırın"
ExpSpotify = "Spotify tarafından sunulan deneysel özellikler"
ExpStandart = "SpotX'in deneysel özellikleri dahil değildir"
NoRestore2 = "SpotX zaten kurulmuş, xpui.bak dosyası bulunamadı. `nLütfen Spotify istemcisini kaldırın ve Install.bat dosyasını tekrar çalıştırın"
UpdateBlocked = "Spotify güncellemeleri zaten engellenmiş durumda"
UpdateError = "Güncellemeler engellenemedi"
NoSpotifyExe = "Spotify.exe bulunamadı"
InstallComplete = "kurulum tamamlandı"
HostInfo = "Hosts dosyasında istenmeyen URL'ler bulundu"
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"
}
$langStringsKA = [PSCustomObject]@{
Author = "პაჩის ავტორი:"
Author2 = "@Amd64fox"
TranslationBy = "თარგმანის ავტორი:"
TranslationBy2 = "@Naviamold1"
Incorrect = "უპს, არასწორი შენატანი,"
Incorrect2 = "მაგრამ თავიდან სცადე"
Download = "შეცდომა ჩაწერის დროს"
Download2 = "თავიდან ვცდი 5 წამში..."
Download3 = "შეცდომა ისევ"
Download4 = "შეამოწმეთ თქვენი კავშირი ქსელთან და თავიდან სცადე ინსტალაცია"
Download5 = "Spotify იწერება"
StopScrpit = "სკრიპტი ჩერდება"
MsSpoti = "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} ვერსია ჯერ არ არის დატესტილი, ამჟამად არის სტაბილური {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]"
CacheOn = "ქეშის გაწმენდა ჩართულია ({0})"
CacheOff = "ქეშის გაწმენდა არ არის ჩართული"
CacheSelect = "გინდათ რომ ჩართოთ ავტომატიკური ქეშის გაწმენდა? [Y/N]"
CacheDays = "ქეში უფრო ძველია: XX დღეზე რომ იყოს გაწმენდილი "
CacheDays2 = "შეიყვანეთ the დღეების რაოდენობა 1-იდან 100-ამდე"
NoVariable = "ცვლადი არ არის მოძებნილი"
NoVariable2 = "xpui.js -ში"
NoVariable3 = "licenses.html -ში"
NoVariable4 = "html =ში"
ModSpoti = "Spotify იკერვება..."
Error = "შეცდომა"
FileLocBroken = "Spotify ფაილების ლოკაცია არის გადეხილი, წაშალეთ კლიენტი და თავიდან გაუშვით სკრიპტი"
Spicetify = "Spicetify მოიზებნა"
NoRestore = "SpotX უკვეა ჩაწერილი, მაგრამ ფაილები xpui.js.bak და xpui.css.bak აღსადგენად ვერ მოიძებნა. `nგთხოვთ წაშალეთ Spotify-ის აპლიკაცია და თავიდან გაუშვით Install.bat"
ExpSpotify = "ექსპერიმენტული ფუნქციები, რომელსაც მართავს Spotify"
ExpStandart = "ექსპერიმენტული ფუნქციები SpotX არ მოითავსება"
NoRestore2 = "SpotX უკვე დაინსტალირებულია, xpui.bak ვერ მოიძებნა. `nგთხოვთ, წაშალოთ Spotify აპლიკაცია და თავიდან გაუშვით Install.bat"
UpdateBlocked = "Spotify-ს განახლებები უკვე დაბლოკერიბული არიან"
UpdateError = "განახლებების დაბლოკვა ვერ მოხერხდა"
NoSpotifyExe = "Spotify.exe ვერ მოიძებნა"
InstallComplete = "ინსტალაცია დასრულდა"
HostInfo = "არასასურველი URL-ები ნაპოვნი მასპინძელის ფაილში"
HostBak = "იქმნება hosts.bak-ის სარევეზნო ასლი..."
HostDel = "ვცდილობთ რომ ამოვიღოთ არასასურველი URL-ები ორიგინალური მასპინძელის ფაილიდან..."
HostError = "რაღაც შეცდომა მოხდა მასპინძელის ფაილის რედაქტირებისას, დაარედაქტირეთ ის ხელით ან გაუშვით სკრიპტი ადმინისტრატორის სახით"
}
$langStringsPL = [PSCustomObject]@{
Author = "Patch author:"
Author2 = "@Amd64fox"
TranslationBy = "Translation author:"
TranslationBy2 = "@Nokxixr"
Incorrect = "Oops, niewłaściwa wartość,"
Incorrect2 = "Wejdź ponownie przez "
Download = "Błąd pobierania"
Download2 = "Prośbę ponowię za 5 sekund..."
Download3 = "Ponowny Błąd"
Download4 = "Sprawdź swoje połączenie z siecią i spróbuj ponownie"
Download5 = "Pobieranie Spotify"
StopScrpit = "Skrypt wstrzymany"
MsSpoti = "Wersja Microsoft Store Spotify została wykryta i nie jest wspierana"
MsSpoti2 = "Odinstalować wersję od Spotify Windows Store? [Y/N]"
MsSpoti3 = "Automatyczne odinstalowywanie Spotify MS..."
MsSpoti4 = "Odinstalowywanie Spotify MS..."
Prem = "Modyfikacja dla konta premium..."
OldV = "Znaleziono nieaktualną wersję Spotify"
OldV2 = "Twoja wersja Spotify {0} jest nieaktualna, zalecana jest aktualizacja do {1}"
OldV3 = "Czy chcesz ją pobrać? [Y/N]"
AutoUpd = "Automatyczna aktualizacja do zalecanej wersji"
DelOrOver = "Chcesz odinstalować aktualną wersję {0}, czy pobrać nową? Y [Odinstaluj] / N [Pobierz Nowa]"
DelOld = "Odinstalowywanie przedawnionego Spotify..."
NewV = "Wykryto niewspieraną wersję Spotify"
NewV2 = "Twoja wersja {0} nie została jeszcze przetestowana, obecna stabilna jest wersja {1} "
NewV3 = "Czy chcesz kontynuować z wersją {0} (możliwe błędy) ? [Y/N]"
Recom = "Czy chcesz pobrać zalecaną, {0} wersję ? [Y/N]"
DelNew = "Odinstalowywanie niesprawdzonego Spotify..."
DownSpoti = "Pobieranie i instalowanie Spotify"
DownSpoti2 = "Proszę czekać..."
PodcatsOff = "Wyłączanie Podcastsów"
PodcastsOn = "Włączanie Podcastsów"
PodcatsSelect = "Czy chcesz wyłączyć podcasty ze strony głównej?? [Y/N]"
DowngradeNote = "Zalecane jest zablokowanie, ponieważ nastąpiło obniżenie wartości dla Spotify"
UpdBlock = "Aktualizacje Spotify zablokowane"
UpdUnblock = "Aktualizacje Spotify nie są zablokowane"
UpdSelect = "Czy chcesz zablokować aktualizacje dla 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"
NoVariable = "Nieznaleziono wartości"
NoVariable2 = "w xpui.js"
NoVariable3 = "w licenses.html"
NoVariable4 = "w html"
ModSpoti = "Patchowanie Spotify..."
Error = "Błąd"
FileLocBroken = "Lokalizacje plików spotify są zepsute, odinstaluj klienta i uruchom ponownie skrypt"
Spicetify = "Spicetify wykryty"
NoRestore = "SpotX został zainstalowany, jednak pliki do odzyskania xpui.js.bak i xpui.css.bak zostały nieznalezione. `nProszę odinstalować klienta i uruchomić Install.bat ponownie"
ExpSpotify = "Eksperymentalne funkcje obsługiwane przez Spotify"
ExpStandart = "Eksperymentalne funkcje SpotX nie są uwzględnione"
NoRestore2 = "SpotX został pobrany, xpui.bak nie znaleziony. `nProszę odinstalować klienta Spotify i uruchomić Install.bat ponownie"
UpdateBlocked = "Spotify aktualizacje są już zablokowane"
UpdateError = "Nie udało się zablokować aktualizacji"
NoSpotifyExe = "Nie można znaleźć Spotify.exe"
InstallComplete = "Instalacja zakończona"
HostInfo = "Niepożądane adresy URL znalezione w plikach hosts"
HostBak = "Tworzenie kopii zapasowych 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"
}
}
process {
# Assign language strings.
switch ($LangCode) {
'en' {
$langStrings = $langStringsEN
break
}
'ru' {
$langStrings = $langStringsRU
break
}
'it' {
$langStrings = $langStringsIT
break
}
'tr' {
$langStrings = $langStringsTR
break
}
'ka' {
$langStrings = $langStringsKA
break
}
'pl' {
$langStrings = $langStringsPL
break
}
Default {
# Default to English if unable to find a match.
$langStrings = $langStringsEN
break
}
}
}
end {
return $langStrings
}
}
# Set language code for script.
$langCode = Format-LanguageCode -LanguageCode $Language
# Set script language strings.
$lang = Set-ScriptLanguageStrings -LanguageCode $langCode
# Set variable 'ru'.
if ($langCode -eq 'ru') { $ru = $true }
# Set variable 'add transl line'.
if ($langCode -match '^(it|tr|ka|pl)') { $line = $true }
# Automatic length of stars
$au = ($lang).Author.Length + ($lang).Author2.Length
$by = ($lang).TranslationBy.Length + ($lang).TranslationBy2.Length
if ($au -gt $by ) { $long = $au + 1 } else { $long = $by + 1 }
$st = ""
$star = $st.PadLeft($long, '*')
Write-Host $star
Write-Host ($lang).Author"" -NoNewline
Write-Host ($lang).Author2 -ForegroundColor DarkYellow
if (!($line)) { Write-Host $star`n }
if ($line) {
Write-Host ($lang).TranslationBy"" -NoNewline
Write-Host ($lang).TranslationBy2 -ForegroundColor DarkYellow
Write-Host $star`n
}
# Sending a statistical web query to cutt.ly
$ErrorActionPreference = 'SilentlyContinue'
$cutt_url = "https://cutt.ly/DK8UQub"
try {
Invoke-WebRequest -Uri $cutt_url | Out-Null
}
catch {
Start-Sleep -Milliseconds 2300
try {
Invoke-WebRequest -Uri $cutt_url | Out-Null
}
catch { }
}
$spotifyDirectory = "$env:APPDATA\Spotify"
$spotifyDirectory2 = "$env:LOCALAPPDATA\Spotify"
$spotifyExecutable = "$spotifyDirectory\Spotify.exe"
$exe_bak = "$spotifyDirectory\Spotify.bak"
$chrome_elf = "$spotifyDirectory\chrome_elf.dll"
$chrome_elf_bak = "$spotifyDirectory\chrome_elf_bak.dll"
$cache_folder = "$env:APPDATA\Spotify\cache"
$spotifyUninstall = "$env:TEMP\SpotifyUninstall.exe"
$start_menu = "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Spotify.lnk"
$upgrade_client = $false
function incorrectValue {
Write-Host ($lang).Incorrect"" -ForegroundColor Red -NoNewline
Write-Host ($lang).Incorrect2"" -NoNewline
Start-Sleep -Milliseconds 1000
Write-Host "3" -NoNewline
Start-Sleep -Milliseconds 1000
Write-Host " 2" -NoNewline
Start-Sleep -Milliseconds 1000
Write-Host " 1"
Start-Sleep -Milliseconds 1000
Clear-Host
}
function Check_verison_clients($param2) {
# checking the recommended version for spotx
if ($param2 -eq "online") {
$ProgressPreference = 'SilentlyContinue' # Hiding Progress Bars
$readme = Invoke-WebRequest -UseBasicParsing -Uri https://raw.githubusercontent.com/amd64fox/SpotX/main/README.md
$v = $readme.RawContent | Select-String "Recommended official version \[\d+\.\d+\.\d+\.\d+\]" -AllMatches
$ver = $v.Matches.Value
$ver = $ver -replace 'Recommended official version \[(\d+\.\d+\.\d+\.\d+)\]', '$1'
return $ver
}
# Check version Spotify offline
if ($param2 -eq "offline") {
$check_offline = (Get-Item $spotifyExecutable).VersionInfo.FileVersion
return $check_offline
}
# Check version Spotify.bak
if ($param2 -eq "Spotify.bak") {
$check_offline_bak = (Get-Item $exe_bak).VersionInfo.FileVersion
return $check_offline_bak
}
}
function unlockFolder {
$ErrorActionPreference = 'SilentlyContinue'
$block_File_update = "$env:LOCALAPPDATA\Spotify\Update"
$Check_folder = Get-ItemProperty -Path $block_File_update | Select-Object Attributes
$folder_update_access = Get-Acl $block_File_update
# Check folder Update if it exists
if ($Check_folder -match '\bDirectory\b') {
# If the rights of the Update folder are blocked, then unblock
if ($folder_update_access.AccessToString -match 'Deny') {
($ACL = Get-Acl $block_File_update).access | ForEach-Object {
$Users = $_.IdentityReference
$ACL.PurgeAccessRules($Users) }
$ACL | Set-Acl $block_File_update
}
}
}
function downloadScripts($param1) {
$webClient = New-Object -TypeName System.Net.WebClient
if ($param1 -eq "Desktop") {
Import-Module BitsTransfer
$ver = Check_verison_clients -param2 "online"
$l = "$PWD\links.tsv"
$old = [IO.File]::ReadAllText($l)
$links = $old -match "https:\/\/upgrade.scdn.co\/upgrade\/client\/win32-x86\/spotify_installer-$ver\.g[0-9a-f]{8}-[0-9]{1,3}\.exe"
$links = $Matches.Values
}
if ($ru -and $param1 -eq "cache-spotify") {
$links2 = "https://raw.githubusercontent.com/amd64fox/SpotX/main/scripts/cache/cache_spotify_ru.ps1"
}
if (!($ru) -and $param1 -eq "cache-spotify" ) {
$links2 = "https://raw.githubusercontent.com/amd64fox/SpotX/main/scripts/cache/cache_spotify.ps1"
}
$web_Url_prev = "https://github.com/mrpond/BlockTheSpot/releases/latest/download/chrome_elf.zip", $links, `
$links2, "https://raw.githubusercontent.com/amd64fox/SpotX/main/scripts/cache/hide_window.vbs", `
"https://raw.githubusercontent.com/amd64fox/SpotX/main/scripts/cache/run_ps.bat", "https://docs.google.com/spreadsheets/d/e/2PACX-1vSFN2hWu4UO-ZWyVe8wlP9c0JsrduA49xBnRmSLOt8SWaOfIpCwjDLKXMTWJQ5aKj3WakQv6-Hnv9rz/pub?gid=0&single=true&output=tsv"
$local_Url_prev = "$PWD\chrome_elf.zip", "$PWD\SpotifySetup.exe", "$cache_folder\cache_spotify.ps1", "$cache_folder\hide_window.vbs", "$cache_folder\run_ps.bat", "$PWD\links.tsv"
$web_name_file_prev = "chrome_elf.zip", "SpotifySetup.exe", "cache_spotify.ps1", "hide_window.vbs", "run_ps.bat", "links.tsv"
switch ( $param1 ) {
"BTS" { $web_Url = $web_Url_prev[0]; $local_Url = $local_Url_prev[0]; $web_name_file = $web_name_file_prev[0] }
"Desktop" { $web_Url = $web_Url_prev[1]; $local_Url = $local_Url_prev[1]; $web_name_file = $web_name_file_prev[1] }
"cache-spotify" { $web_Url = $web_Url_prev[2]; $local_Url = $local_Url_prev[2]; $web_name_file = $web_name_file_prev[2] }
"hide_window" { $web_Url = $web_Url_prev[3]; $local_Url = $local_Url_prev[3]; $web_name_file = $web_name_file_prev[3] }
"run_ps" { $web_Url = $web_Url_prev[4]; $local_Url = $local_Url_prev[4]; $web_name_file = $web_name_file_prev[4] }
"links.tsv" { $web_Url = $web_Url_prev[5]; $local_Url = $local_Url_prev[5]; $web_name_file = $web_name_file_prev[5] }
}
if ($param1 -eq "Desktop") {
try { if (curl.exe -V) { $curl_check = $true } }
catch { $curl_check = $false }
$vernew = Check_verison_clients -param2 "online"
}
try {
if ($param1 -eq "Desktop" -and $curl_check) {
$stcode = curl.exe -I -s $web_Url
if (!($stcode -match "200 OK")) { throw ($lang).Download6 }
curl.exe $web_Url -o $local_Url --progress-bar --retry 3 --ssl-no-revoke
}
if ($param1 -eq "Desktop" -and $null -ne (Get-Module -Name BitsTransfer -ListAvailable) -and !($curl_check )) {
Start-BitsTransfer -Source $web_Url -Destination $local_Url -DisplayName ($lang).Download5 -Description "$vernew "
}
if ($param1 -eq "Desktop" -and $null -eq (Get-Module -Name BitsTransfer -ListAvailable) -and !($curl_check )) {
$webClient.DownloadFile($web_Url, $local_Url)
}
if ($param1 -ne "Desktop") {
$ProgressPreference = 'SilentlyContinue' # Hiding Progress Bars
$webClient.DownloadFile($web_Url, $local_Url)
}
}
catch {
Write-Host ""
Write-Host ($lang).Download $web_name_file -ForegroundColor RED
$Error[0].Exception
Write-Host ""
Write-Host ($lang).Download2`n
Start-Sleep -Milliseconds 5000
try {
if ($param1 -eq "Desktop" -and $curl_check) {
$stcode = curl.exe -I -s $web_Url
if (!($stcode -match "200 OK")) { throw ($lang).Download6 }
curl.exe $web_Url -o $local_Url --progress-bar --retry 3 --ssl-no-revoke
}
if ($param1 -eq "Desktop" -and $null -ne (Get-Module -Name BitsTransfer -ListAvailable) -and !($curl_check )) {
Start-BitsTransfer -Source $web_Url -Destination $local_Url -DisplayName ($lang).Download5 -Description "$vernew "
}
if ($param1 -eq "Desktop" -and $null -eq (Get-Module -Name BitsTransfer -ListAvailable) -and !($curl_check )) {
$webClient.DownloadFile($web_Url, $local_Url)
}
if ($param1 -ne "Desktop") {
$ProgressPreference = 'SilentlyContinue' # Hiding Progress Bars
$webClient.DownloadFile($web_Url, $local_Url)
}
}
catch {
Write-Host ($lang).Download3 -ForegroundColor RED
$Error[0].Exception
Write-Host ""
Write-Host ($lang).Download4`n
($lang).StopScrpit
$tempDirectory = $PWD
Pop-Location
Start-Sleep -Milliseconds 200
Remove-Item -Recurse -LiteralPath $tempDirectory
Pause
Exit
}
}
}
function DesktopFolder {
# If the default Dekstop folder does not exist, then try to find it through the registry.
$ErrorActionPreference = 'SilentlyContinue'
if (Test-Path "$env:USERPROFILE\Desktop") {
$desktop_folder = "$env:USERPROFILE\Desktop"
}
$regedit_desktop_folder = Get-ItemProperty -Path "Registry::HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\"
$regedit_desktop = $regedit_desktop_folder.'{754AC886-DF64-4CBA-86B5-F7FBF4FBCEF5}'
if (!(Test-Path "$env:USERPROFILE\Desktop")) {
$desktop_folder = $regedit_desktop
}
return $desktop_folder
}
# add Tls12
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Stop-Process -Name Spotify
if ($PSVersionTable.PSVersion.major -ge 7) {
Import-Module Appx -UseWindowsPowerShell -WarningAction:SilentlyContinue
}
# Check version Windows
$win_os = (get-itemproperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name ProductName).ProductName
$win11 = $win_os -match "\windows 11\b"
$win10 = $win_os -match "\windows 10\b"
$win8_1 = $win_os -match "\windows 8.1\b"
$win8 = $win_os -match "\windows 8\b"
if ($win11 -or $win10 -or $win8_1 -or $win8) {
# Remove Spotify Windows Store If Any
if (Get-AppxPackage -Name SpotifyAB.SpotifyMusic) {
Write-Host ($lang).MsSpoti`n
if (!($confirm_uninstall_ms_spoti)) {
do {
$ch = Read-Host -Prompt ($lang).MsSpoti2
Write-Host ""
if (!($ch -eq 'n' -or $ch -eq 'y')) {
incorrectValue
}
}
while ($ch -notmatch '^y$|^n$')
}
if ($confirm_uninstall_ms_spoti) { $ch = 'y' }
if ($ch -eq 'y') {
$ProgressPreference = 'SilentlyContinue' # Hiding Progress Bars
if ($confirm_uninstall_ms_spoti) { Write-Host ($lang).MsSpoti3`n }
if (!($confirm_uninstall_ms_spoti)) { Write-Host ($lang).MsSpoti4`n }
Get-AppxPackage -Name SpotifyAB.SpotifyMusic | Remove-AppxPackage
}
if ($ch -eq 'n') {
Read-Host ($lang).StopScrpit
Pause
Exit
}
}
}
# Attempt to fix the hosts file
$pathHosts = "$Env:windir\System32\Drivers\Etc\hosts"
$pathHosts_bak = "$Env:windir\System32\Drivers\Etc\hosts.bak"
$ErrorActionPreference = 'SilentlyContinue'
$testHosts = Test-Path -Path $pathHosts
if ($testHosts) {
$hosts = Get-Content -Path $pathHosts
if ($hosts -match '^[^\#|].+scdn.+|^[^\#|].+spotify.+') {
Write-Host ($lang).HostInfo
Write-Host ($lang).HostBak
copy-Item $pathHosts $pathHosts_bak
Write-Host ($lang).HostDel`n
try {
$hosts = $hosts -replace '^[^\#|].+scdn.+|^[^\#|].+spotify.+', ''
Set-Content -Path $pathHosts -Value $hosts -Force
$hosts | Where-Object { $_.trim() -ne "" } | Set-Content -Path $pathHosts -Force
}
catch {
Write-Host ($lang).HostError`n -ForegroundColor Red
}
}
}
# Unique directory name based on time
Push-Location -LiteralPath $env:TEMP
New-Item -Type Directory -Name "SpotX_Temp-$(Get-Date -UFormat '%Y-%m-%d_%H-%M-%S')" | Convert-Path | Set-Location
if ($premium) {
Write-Host ($lang).Prem`n
}
if (!($premium)) {
downloadScripts -param1 "BTS"
Add-Type -Assembly 'System.IO.Compression.FileSystem'
$zip = [System.IO.Compression.ZipFile]::Open("$PWD\chrome_elf.zip", 'read')
[System.IO.Compression.ZipFileExtensions]::ExtractToDirectory($zip, $PWD)
$zip.Dispose()
}
downloadScripts -param1 "links.tsv"
$online = Check_verison_clients -param2 "online"
$spotifyInstalled = (Test-Path -LiteralPath $spotifyExecutable)
if ($spotifyInstalled) {
$offline = Check_verison_clients -param2 "offline"
if ($online -gt $offline) {
if ($confirm_spoti_recomended_over -or $confirm_spoti_recomended_unistall) {
Write-Host ($lang).OldV`n
}
if (!($confirm_spoti_recomended_over) -and !($confirm_spoti_recomended_unistall)) {
do {
Write-Host (($lang).OldV2 -f $offline, $online)
$ch = Read-Host -Prompt ($lang).OldV3
Write-Host ""
if (!($ch -eq 'n' -or $ch -eq 'y')) {
incorrectValue
}
}
while ($ch -notmatch '^y$|^n$')
}
if ($confirm_spoti_recomended_over -or $confirm_spoti_recomended_unistall) {
$ch = 'y'
Write-Host ($lang).AutoUpd`n
}
if ($ch -eq 'y') {
$upgrade_client = $true
if (!($confirm_spoti_recomended_over) -and !($confirm_spoti_recomended_unistall)) {
do {
$ch = Read-Host -Prompt (($lang).DelOrOver -f $offline)
Write-Host ""
if (!($ch -eq 'n' -or $ch -eq 'y')) {
incorrectValue
}
}
while ($ch -notmatch '^y$|^n$')
}
if ($confirm_spoti_recomended_unistall) { $ch = 'y' }
if ($confirm_spoti_recomended_over) { $ch = 'n' }
if ($ch -eq 'y') {
Write-Host ($lang).DelOld`n
unlockFolder
cmd /c $spotifyExecutable /UNINSTALL /SILENT
wait-process -name SpotifyUninstall
Start-Sleep -Milliseconds 200
if (Test-Path $spotifyDirectory) { Remove-Item -Recurse -Force -LiteralPath $spotifyDirectory }
if (Test-Path $spotifyDirectory2) { Remove-Item -Recurse -Force -LiteralPath $spotifyDirectory2 }
if (Test-Path $spotifyUninstall ) { Remove-Item -Recurse -Force -LiteralPath $spotifyUninstall }
}
if ($ch -eq 'n') { $ch = $null }
}
if ($ch -eq 'n') {
$downgrading = $true
}
}
if ($online -lt $offline) {
if ($confirm_spoti_recomended_over -or $confirm_spoti_recomended_unistall) {
Write-Host ($lang).NewV`n
}
if (!($confirm_spoti_recomended_over) -and !($confirm_spoti_recomended_unistall)) {
do {
Write-Host (($lang).NewV2 -f $offline, $online)
$ch = Read-Host -Prompt (($lang).NewV3 -f $offline)
Write-Host ""
if (!($ch -eq 'n' -or $ch -eq 'y')) {
incorrectValue
}
}
while ($ch -notmatch '^y$|^n$')
}
if ($confirm_spoti_recomended_over -or $confirm_spoti_recomended_unistall) { $ch = 'n' }
if ($ch -eq 'y') { $upgrade_client = $false }
if ($ch -eq 'n') {
if (!($confirm_spoti_recomended_over) -and !($confirm_spoti_recomended_unistall)) {
do {
$ch = Read-Host -Prompt (($lang).Recom -f $online)
Write-Host ""
if (!($ch -eq 'n' -or $ch -eq 'y')) {
incorrectValue
}
}
while ($ch -notmatch '^y$|^n$')
}
if ($confirm_spoti_recomended_over -or $confirm_spoti_recomended_unistall) {
$ch = 'y'
Write-Host ($lang).AutoUpd`n
}
if ($ch -eq 'y') {
$upgrade_client = $true
$downgrading = $true
if (!($confirm_spoti_recomended_over) -and !($confirm_spoti_recomended_unistall)) {
do {
$ch = Read-Host -Prompt (($lang).DelOrOver -f $offline)
Write-Host ""
if (!($ch -eq 'n' -or $ch -eq 'y')) {
incorrectValue
}
}
while ($ch -notmatch '^y$|^n$')
}
if ($confirm_spoti_recomended_unistall) { $ch = 'y' }
if ($confirm_spoti_recomended_over) { $ch = 'n' }
if ($ch -eq 'y') {
Write-Host ($lang).DelNew`n
unlockFolder
cmd /c $spotifyExecutable /UNINSTALL /SILENT
wait-process -name SpotifyUninstall
Start-Sleep -Milliseconds 200
if (Test-Path $spotifyDirectory) { Remove-Item -Recurse -Force -LiteralPath $spotifyDirectory }
if (Test-Path $spotifyDirectory2) { Remove-Item -Recurse -Force -LiteralPath $spotifyDirectory2 }
if (Test-Path $spotifyUninstall ) { Remove-Item -Recurse -Force -LiteralPath $spotifyUninstall }
}
if ($ch -eq 'n') { $ch = $null }
}
if ($ch -eq 'n') {
Write-Host ($lang).StopScrpit
$tempDirectory = $PWD
Pop-Location
Start-Sleep -Milliseconds 200
Remove-Item -Recurse -LiteralPath $tempDirectory
Pause
Exit
}
}
}
}
# If there is no client or it is outdated, then install
if (-not $spotifyInstalled -or $upgrade_client) {
Write-Host ($lang).DownSpoti"" -NoNewline
Write-Host $online -ForegroundColor Green
Write-Host ($lang).DownSpoti2`n
# Delete old version files of Spotify before installing, leave only profile files
$ErrorActionPreference = 'SilentlyContinue'
Stop-Process -Name Spotify
Start-Sleep -Milliseconds 600
unlockFolder
Start-Sleep -Milliseconds 200
Get-ChildItem $spotifyDirectory -Exclude 'Users', 'prefs', 'cache' | Remove-Item -Recurse -Force
Start-Sleep -Milliseconds 200
# Client download
downloadScripts -param1 "Desktop"
Write-Host ""
Start-Sleep -Milliseconds 200
# Client installation
Start-Process -FilePath explorer.exe -ArgumentList $PWD\SpotifySetup.exe
while (-not (get-process | Where-Object { $_.ProcessName -eq 'SpotifySetup' })) {}
wait-process -name SpotifySetup
Stop-Process -Name Spotify
}
# Delete Spotify shortcut if it is on desktop
if ($no_shortcut) {
$ErrorActionPreference = 'SilentlyContinue'
$desktop_folder = DesktopFolder
Start-Sleep -Milliseconds 1000
remove-item "$desktop_folder\Spotify.lnk" -Recurse -Force
}
# Delete the leveldb folder (Fixes bug with incorrect experimental features for some accounts)
$leveldb = (Test-Path -LiteralPath "$spotifyDirectory2\Browser\Local Storage\leveldb")
if ($leveldb) {
$ErrorActionPreference = 'SilentlyContinue'
remove-item "$spotifyDirectory2\Browser\Local Storage\leveldb" -Recurse -Force
}
# Create backup chrome_elf.dll
if (!(Test-Path -LiteralPath $chrome_elf_bak) -and !($premium)) {
Move-Item $chrome_elf $chrome_elf_bak
}
$ch = $null
if ($podcasts_off) {
Write-Host ($lang).PodcatsOff`n
$ch = 'y'
}
if ($podcasts_on) {
Write-Host ($lang).PodcastsOn`n
$ch = 'n'
}
if (!($podcasts_off) -and !($podcasts_on)) {
do {
$ch = Read-Host -Prompt ($lang).PodcatsSelect
Write-Host ""
if (!($ch -eq 'n' -or $ch -eq 'y')) { incorrectValue }
}
while ($ch -notmatch '^y$|^n$')
}
if ($ch -eq 'y') { $podcast_off = $true }
$ch = $null
if ($downgrading) { $upd = "`n" + [string]($lang).DowngradeNote }
else { $upd = "" }
if ($block_update_on) {
Write-Host ($lang).UpdBlock`n
$ch = 'y'
}
if ($block_update_off) {
Write-Host ($lang).UpdUnblock`n
$ch = 'n'
}
if (!($block_update_on) -and !($block_update_off)) {
do {
$text_upd = [string]($lang).UpdSelect + $upd
$ch = Read-Host -Prompt $text_upd
Write-Host ""
if (!($ch -eq 'n' -or $ch -eq 'y')) { incorrectValue }
}
while ($ch -notmatch '^y$|^n$')
}
if ($ch -eq 'y') { $block_update = $true }
if ($ch -eq 'n') {
$ErrorActionPreference = 'SilentlyContinue'
$exe_onl_fn = Check_verison_clients -param2 "offline"
$exe_bak_fn = Check_verison_clients -param2 'Spotify.bak'
if ((Test-Path -LiteralPath $exe_bak) -and $exe_onl_fn -eq $exe_bak_fn) {
Remove-Item $spotifyExecutable -Recurse -Force
Rename-Item $exe_bak $spotifyExecutable
}
}
$ch = $null
if ($cache_on) {
Write-Host (($lang).CacheOn -f $number_days)`n
$cache_install = $true
}
if ($cache_off) {
Write-Host ($lang).CacheOff`n
$ErrorActionPreference = 'SilentlyContinue'
$desktop_folder = DesktopFolder
if (Test-Path -LiteralPath $cache_folder) {
remove-item $cache_folder -Recurse -Force
remove-item $desktop_folder\Spotify.lnk -Recurse -Force
remove-item $start_menu -Recurse -Force
}
}
if (!($cache_on) -and !($cache_off)) {
do {
$ch = Read-Host -Prompt ($lang).CacheSelect
Write-Host ""
if (!($ch -eq 'n' -or $ch -eq 'y')) { incorrectValue }
}
while ($ch -notmatch '^y$|^n$')
if ($ch -eq 'y') {
$cache_install = $true
do {
Write-Host ($lang).CacheDays
$ch = Read-Host -Prompt ($lang).CacheDays2
Write-Host ""
if (!($ch -match "^[1-9][0-9]?$|^100$")) { incorrectValue }
}
while ($ch -notmatch '^[1-9][0-9]?$|^100$')
if ($ch -match "^[1-9][0-9]?$|^100$") { $number_days = $ch }
}
if ($ch -eq 'n') {
$ErrorActionPreference = 'SilentlyContinue'
$desktop_folder = DesktopFolder
if (Test-Path -LiteralPath $cache_folder) {
remove-item $cache_folder -Recurse -Force
remove-item $desktop_folder\Spotify.lnk -Recurse -Force
remove-item $start_menu -Recurse -Force
}
}
}
if ($exp_standart) { Write-Host ($lang).ExpStandart`n }
if ($exp_spotify) { Write-Host ($lang).ExpSpotify`n }
function Helper($paramname) {
switch ( $paramname ) {
"HtmlLicMin" {
# licenses.html minification
$html_lic_min = @{
HtmlLicMin1 = '<li><a href="#6eef7">zlib<\/a><\/li>\n(.|\n)*<\/p><!-- END CONTAINER DEPS LICENSES -->(<\/div>)', '$2'
HtmlLicMin2 = ' ', ''
HtmlLicMin3 = ' ', ''
HtmlLicMin4 = '(?m)(^\s*\r?\n)', ''
HtmlLicMin5 = '\r?\n(?!\(1|\d)', ''
}
$n = ($lang).NoVariable3
$contents = $html_lic_min
$paramdata = $xpuiContents_html
}
"OffadsonFullscreen" {
$offadson_fullscreen = @{
EmptyBlockAd = 'adsEnabled:!0', 'adsEnabled:!1' # Removing an empty block
FullScreenAd = '(return|.=.=>)"free"===(.+?)(return|.=.=>)"premium"===', '$1"premium"===$2$3"free"===' # Fullscreen act., removing upgrade menu, button
PlaylistSponsorsOff = 'allSponsorships' , '' # Disabling a playlist sponsor
ConnectUnlock = ' connect-device-list-item--disabled' , '' # Connect unlock test for 1.1.91
ConnectUnlock2 = 'connect-picker.unavailable-to-control' , 'spotify-connect'
ConnectUnlock3 = '(className:.,disabled:)(..)' , '$1false'
ConnectUnlock4 = 'return (..isDisabled)(\?..createElement\(..,)' , 'return false$2'
}
#if (!($testconnect)) {
# $offadson_fullscreen.Remove('ConnectUnlock'), $offadson_fullscreen.Remove('ConnectUnlock2'),
# $offadson_fullscreen.Remove('ConnectUnlock3'), $offadson_fullscreen.Remove('ConnectUnlock4')
#}
$n = ($lang).NoVariable2
$contents = $offadson_fullscreen
$paramdata = $xpui_js
}
"OffPodcasts" {
# Turn off podcasts
$podcasts_off = @{
PodcastsOff1 = 'withQueryParameters\(e\){return this.queryParameters=e,this}', 'withQueryParameters(e){return this.queryParameters=(e.types?{...e, types: e.types.split(",").filter(_ => !["episode","show"].includes(_)).join(",")}:e),this}'
PodcastsOff2 = ',this[.]enableShows=[a-z]', ''
}
$n = ($lang).NoVariable2
$contents = $podcasts_off
$paramdata = $xpui_js
}
"OffRujs" {
# Remove all languages except En and Ru from xpui.js
$rus_js = @{
OffRujs = '(a\.go\.en,)(.+?\])', '$1a.go.ru]'
# temporary translation
clear = 'Remove all downloads', 'Удалить все загрузки'
clear2 = 'Clear cache', 'Очистка кеша'
clear3 = 'Temporary files that Spotify stores for a faster experience on slow networks', 'Временные файлы, которые Spotify хранит для более быстрой работы в медленных сетях'
clear4 = 'Content you have downloaded for offline use', 'Контент, который вы скачали для автономного использования'
clear5 = 'null,"Storage"', 'null,"Хранилище"'
clear6 = '"Downloads:"', '"Загрузки:"'
clear7 = '"Cache:"', '"Кэш:"'
}
$n = ($lang).NoVariable2
$contents = $rus_js
$paramdata = $xpui_js
}
"RuTranslate" {
# Additional translation of some words for the Russian language
$ru_translate = @{
EnhancePlaylist = '"To Enhance this playlist, you.ll need to go online."', '"Чтобы улучшить этот плейлист, вам нужно подключиться к интернету."'
ConfirmAge = '"Confirm your age"', '"Подтвердите свой возраст"'
Premium = '"%price%\/month after. Terms and conditions apply. One month free not available for users who have already tried Premium."', '"%price%/месяц спустя. Принять условия. Один месяц бесплатно, недоступно для пользователей, которые уже попробовали Premium."'
AdFreeMusic = '"Enjoy ad-free music listening, offline listening, and more. Cancel anytime."', '"Наслаждайтесь прослушиванием музыки без рекламы, прослушиванием в офлайн режиме и многим другим. Отменить можно в любое время."'
AddPlaylist = '"Add to another playlist"', '"Добавить в другой плейлист"'
OfflineStorage = '"Offline storage location"', '"Хранилище скачанных треков"'
ChangeLocation = '"Change location"', '"Изменить место"'
Linebreaks = '"Line breaks aren.t supported in the description."', '"В описании не поддерживаются разрывы строк."'
PressSave = '"Press save to keep changes you.ve made."', '"Нажмите «Сохранить», чтобы сохранить внесенные изменения."'
NoInternet = '"No internet connection found. Changes to description and image will not be saved."', '"Подключение к интернету не найдено. Изменения в описании и изображении не будут сохранены."'
ImageSmall = '"Image too small. Images must be at least [{]0[}]x[{]1[}]."', '"Изображение слишком маленькое. Изображения должны быть не менее {0}x{1}."'
FailedUpload = '"Failed to upload image. Please try again."', '"Не удалось загрузить изображение. Пожалуйста, попробуйте снова."'
Description = '"Description"', '"Описание"'
ChangePhoto = '"Change photo"', '"Сменить изображение"'
RemovePhoto = '"Remove photo"', '"Удалить изображение"'
Name = '"Name"', '"Имя"'
ChangeSpeed = '"Change speed"', '"Изменение скорости"'
Years19 = '"You need to be at least 19 years old to listen to explicit content marked with"', '"Вам должно быть не менее 19 лет, чтобы слушать непристойный контент, помеченный значком"'
AddPlaylist2 = '"Add to this playlist"', '"Добавить в этот плейлист"'
NoConnect = '"Couldn.t connect to Spotify."', '"Не удалось подключиться к Spotify."'
Reconnecting = '"Reconnecting..."', '"Повторное подключение..."'
NoConnection = '"No connection"', '"Нет соединения"'
CharacterCounter = '"Character counter"', '"Счетчик символов"'
Lightsaber = '"Toggle lightsaber hilt. Current is [{]0[}]."', '"Переключить рукоять светового меча. Текущий {0}."'
SongAvailable = '"Song not available"', '"Песня недоступна"'
HiFi = '"The song you.re trying to listen to is not available in HiFi at this time."', '"Песня, которую вы пытаетесь прослушать, в настоящее время недоступна в HiFi."'
Quality = '"Current audio quality:"', '"Текущее качество звука:"'
Network = '"Network connection"', '"Подключение к сети"'
Good = '"Good"', '"Хорошее"'
Poor = '"Poor"', '"Плохое"'
Yes = '"Yes"', '"Да"'
No = '"No"', '"Нет"'
Location = '"Your Location"', '"Ваше местоположение"'
NetworkConnection = '"Network connection failed while playing this content."', '"Сбой сетевого подключения при воспроизведении этого контента."'
ContentLocation = '"We.re not able to play this content in your current location."', '"Мы не можем воспроизвести этот контент в вашем текущем местоположении."'
ContentUnavailable = '"This content is unavailable. Try another\?"', '"Этот контент недоступен. Попробуете другой?"'
NoContent = '"Sorry, we.re not able to play this content."', '"К сожалению, мы не можем воспроизвести этот контент."'
NoContent2 = '"Hmm... we can.t seem to play this content. Try installing the latest version of Spotify."', '"Хм... похоже, мы не можем воспроизвести этот контент. Попробуйте установить последнюю версию Spotify."'
NoContent3 = '"Please upgrade Spotify to play this content."', '"Пожалуйста, обновите Spotify, чтобы воспроизвести этот контент."'
NoContent4 = '"This content cannot be played on your operating system version."', '"Этот контент нельзя воспроизвести в вашей версии операционной системы."'
DevLang = '"Override certain user attributes to test regionalized content programming. The overrides are only active in this app."', '"Переопределите определенные атрибуты пользователя, чтобы протестировать региональное программирование контента. Переопределения активны только в этом приложении."'
AlbumRelease = '"...name... was released this week!"', '"\"%name%\" был выпущен на этой неделе!"'
AlbumReleaseOne = '"one": "\\"%name%\\" was released %years% year ago this week!"', '"one": "\"%name%\" был выпущен %years% год назад на этой неделе!"'
AlbumReleaseFew = '"few": "\\"%name%\\" was released %years% years ago this week!"', '"few": "\"%name%\" был выпущен %years% года назад на этой неделе!"'
AlbumReleaseMany = '"many": "\\"%name%\\" was released %years% years ago this week!"', '"many": "\"%name%\" был выпущен %years% лет назад на этой неделе!"'
AlbumReleaseOther = '"other": "\\"%name%\\" was released %years% years ago this week!"', '"other": "\"%name%\" был выпущен %years% года назад на этой неделе!"'
Speed = '"Speed [{]0[}]×"', '"Скорость {0}×"'
AudiobookFree = '"This audiobook is free"', '"Эта аудиокнига бесплатна"'
AudiobookGet = '"Get"', '"Получить"'
AudiobookBy = '"Buy"', '"Купить"'
}
$n = ($lang).NoVariable5
$contents = $ru_translate
$paramdata = $xpui_ru
}
"ExpFeature" {
# Experimental Feature Standart
$exp_features = @{
ExpFeatures1 = '(Enable Liked Songs section on Artist page",default:)(!1)', '$1!0'
ExpFeatures2 = '(Enable block users feature in clientX",default:)(!1)', '$1!0'
ExpFeatures3 = '(Enables quicksilver in-app messaging modal",default:)(!0)', '$1!1'
ExpFeatures4 = '(With this enabled, clients will check whether tracks have lyrics available",default:)(!1)', '$1!0'
ExpFeatures5 = '(Enables new playlist creation flow in Web Player and DesktopX",default:)(!1)', '$1!0'
ExpFeatures6 = '(Adds a search box so users are able to filter playlists when trying to add songs to a playlist using the contextmenu",default:)(!1)', '$1!0'
ExpFeatures7 = '(Enable Ignore In Recommendations for desktop and web",default:)(!1)', '$1!0'
ExpFeatures8 = '(Enable Playlist Permissions flows for Prod",default:)(!1)', '$1!0'
ExpFeatures9 = '(Enable showing balloons on album release date anniversaries",default:)(!1)', '$1!0'
ExpFeatures10 = '(Enable Enhance Liked Songs UI and functionality",default:)(!1)', '$1!0'
ExpFeatures11 = '(Enable Enhance Playlist UI and functionality for end-users",default:)(!1)', '$1!0'
ExpFeatures12 = '(Enable a condensed disography shelf on artist pages",default:)(!1)', '$1!0'
ExpFeatures13 = '(Enable Lyrics match labels in search results",default:)(!1)', '$1!0'
ExpFeatures14 = '(Enable audio equalizer for Desktop and Web Player",default:)(!1)', '$1!0'
ExpFeatures15 = '(Enable showing a new and improved device picker UI",default:)(!1)', '$1!0'
ExpFeatures16 = '(Enable the new home structure and navigation",default:)(!1)', '$1!0'
ExpFeatures17 = '(Show "Made For You" entry point in the left sidebar.,default:)(!1)', '$1!0'
ExpFeatures18 = '(Enable option in settings to clear all downloads",default:)(!1)', '$1!0'
}
if ($enhance_like_off) { $exp_features.Remove('ExpFeatures10') }
if ($enhance_playlist_off) { $exp_features.Remove('ExpFeatures11') }
if ($new_artist_pages_off) { $exp_features.Remove('ExpFeatures12') }
if ($new_lyrics_off) { $exp_features.Remove('ExpFeatures13') }
if ($equalizer_off) { $exp_features.Remove('ExpFeatures14') }
if ($device_new_off) { $exp_features.Remove('ExpFeatures15') }
if (!($enablenavalt)) { $exp_features.Remove('ExpFeatures16') }
if ($made_for_you_off) { $exp_features.Remove('ExpFeatures17') }
if ($exp_standart) {
$exp_features.Remove('ExpFeatures10'), $exp_features.Remove('ExpFeatures11'),
$exp_features.Remove('ExpFeatures12'), $exp_features.Remove('ExpFeatures13'),
$exp_features.Remove('ExpFeatures14'), $exp_features.Remove('ExpFeatures15'),
$exp_features.Remove('ExpFeatures16'), $exp_features.Remove('ExpFeatures17')
}
$n = ($lang).NoVariable2
$contents = $exp_features
$paramdata = $xpui_js
}
}
$contents.Keys | Sort-Object | ForEach-Object {
if ($paramdata -match $contents.$PSItem[0]) {
$paramdata = $paramdata -replace $contents.$PSItem[0], $contents.$PSItem[1]
}
else {
Write-Host ($lang).NoVariable"" -ForegroundColor red -NoNewline
Write-Host "`$contents.$PSItem"$n
}
}
$paramdata
}
Write-Host ($lang).ModSpoti`n
# Patching files
if (!($premium)) {
$patchFiles = "$PWD\chrome_elf.dll", "$PWD\config.ini"
Copy-Item -LiteralPath $patchFiles -Destination "$spotifyDirectory"
}
$tempDirectory = $PWD
Pop-Location
Start-Sleep -Milliseconds 200
Remove-Item -Recurse -LiteralPath $tempDirectory
$xpui_spa_patch = "$env:APPDATA\Spotify\Apps\xpui.spa"
$xpui_js_patch = "$env:APPDATA\Spotify\Apps\xpui\xpui.js"
$xpui_css_patch = "$env:APPDATA\Spotify\Apps\xpui\xpui.css"
$xpui_lic_patch = "$env:APPDATA\Spotify\Apps\xpui\licenses.html"
if ($ru) { $xpui_ru_patch = "$env:APPDATA\Spotify\Apps\xpui\i18n\ru.json" }
$test_spa = Test-Path -Path $xpui_spa_patch
$test_js = Test-Path -Path $xpui_js_patch
$xpui_js_bak_patch = "$env:APPDATA\Spotify\Apps\xpui\xpui.js.bak"
$xpui_css_bak_patch = "$env:APPDATA\Spotify\Apps\xpui\xpui.css.bak"
$xpui_lic_bak_patch = "$env:APPDATA\Spotify\Apps\xpui\licenses.html.bak"
if ($ru) { $xpui_ru_bak_patch = "$env:APPDATA\Spotify\Apps\xpui\i18n\ru.json.bak" }
$spotify_exe_bak_patch = "$env:APPDATA\Spotify\Spotify.bak"
if ($test_spa -and $test_js) {
Write-Host ($lang).Error -ForegroundColor Red
Write-Host ($lang).FileLocBroken
Write-Host ($lang).StopScrpit
pause
Exit
}
if (Test-Path $xpui_js_patch) {
Write-Host ($lang).Spicetify`n
# Delete all files except "en", "ru" and "__longest"
if ($ru) {
$patch_lang = "$env:APPDATA\Spotify\Apps\xpui\i18n"
Remove-Item $patch_lang -Exclude *en*, *ru*, *__longest* -Recurse
}
$reader = New-Object -TypeName System.IO.StreamReader -ArgumentList $xpui_js_patch
$xpui_test_js = $reader.ReadToEnd()
$reader.Close()
If ($xpui_test_js -match 'patched by spotx') {
$test_xpui_js_bak = Test-Path -Path $xpui_js_bak_patch
$test_xpui_css_bak = Test-Path -Path $xpui_css_bak_patch
$test_xpui_lic_bak = Test-Path -Path $xpui_lic_bak_patch
if ($ru) { $test_xpui_ru_bak = Test-Path -Path $xpui_ru_bak_patch }
$test_spotify_exe_bak = Test-Path -Path $spotify_exe_bak_patch
if ($test_xpui_js_bak -and $test_xpui_css_bak) {
Remove-Item $xpui_js_patch -Recurse -Force
Rename-Item $xpui_js_bak_patch $xpui_js_patch
Remove-Item $xpui_css_patch -Recurse -Force
Rename-Item $xpui_css_bak_patch $xpui_css_patch
if ($test_xpui_lic_bak) {
Remove-Item $xpui_lic_patch -Recurse -Force
Rename-Item $xpui_lic_bak_patch $xpui_lic_patch
}
if ($test_xpui_ru_bak -and $ru) {
Remove-Item $xpui_ru_patch -Recurse -Force
Rename-Item $xpui_ru_bak_patch $xpui_ru_patch
}
if ($test_spotify_exe_bak) {
Remove-Item $spotifyExecutable -Recurse -Force
Rename-Item $spotify_exe_bak_patch $spotifyExecutable
}
}
else {
Write-Host ($lang).NoRestore`n
Pause
Exit
}
}
Copy-Item $xpui_js_patch $xpui_js_bak_patch
Copy-Item $xpui_css_patch $xpui_css_bak_patch
Copy-Item $xpui_lic_patch $xpui_lic_bak_patch
if ($ru) { Copy-Item $xpui_ru_patch $xpui_ru_bak_patch }
$reader = New-Object -TypeName System.IO.StreamReader -ArgumentList $xpui_js_patch
$xpui_js = $reader.ReadToEnd()
$reader.Close()
# Turn off podcasts
if ($Podcast_off) { $xpui_js = Helper -paramname "OffPodcasts" }
# Full screen mode activation and removing "Upgrade to premium" menu, upgrade button, disabling a playlist sponsor
if (!($premium)) { $xpui_js = Helper -paramname "OffadsonFullscreen" }
# Experimental Feature
if (!($exp_spotify)) { $xpui_js = Helper -paramname "ExpFeature" }
# Remove all languages except En and Ru from xpui.js
if ($ru) { $xpui_js = Helper -paramname "OffRujs" }
$writer = New-Object System.IO.StreamWriter -ArgumentList $xpui_js_patch
$writer.BaseStream.SetLength(0)
$writer.Write($xpui_js)
$writer.Write([System.Environment]::NewLine + '// Patched by SpotX')
$writer.Close()
# Russian additional translation
if ($ru) {
$file_ru = get-item $env:APPDATA\Spotify\Apps\xpui\i18n\ru.json
$reader = New-Object -TypeName System.IO.StreamReader -ArgumentList $file_ru
$xpui_ru = $reader.ReadToEnd()
$reader.Close()
$xpui_ru = Helper -paramname "RuTranslate"
$writer = New-Object System.IO.StreamWriter -ArgumentList $file_ru
$writer.BaseStream.SetLength(0)
$writer.Write($xpui_ru)
$writer.Close()
}
# xpui.css
$file_xpui_css = get-item $env:APPDATA\Spotify\Apps\xpui\xpui.css
$reader = New-Object -TypeName System.IO.StreamReader -ArgumentList $file_xpui_css
$xpuiContents_xpui_css = $reader.ReadToEnd()
$reader.Close()
$writer = New-Object System.IO.StreamWriter -ArgumentList $file_xpui_css
$writer.BaseStream.SetLength(0)
$writer.Write($xpuiContents_xpui_css)
if (!($premium)) {
# Hide download icon on different pages
$writer.Write([System.Environment]::NewLine + ' .BKsbV2Xl786X9a09XROH{display:none}')
# Hide submenu item "download"
$writer.Write([System.Environment]::NewLine + ' button.wC9sIed7pfp47wZbmU6m.pzkhLqffqF_4hucrVVQA{display:none}')
}
# Hide Collaborators icon
if (!($hide_col_icon_off) -and !($exp_spotify)) {
$writer.Write([System.Environment]::NewLine + ' .X1lXSiVj0pzhQCUo_72A{display:none}')
}
# Hide broken podcast menu
if ($podcast_off) {
$writer.Write([System.Environment]::NewLine + ' li.OEFWODerafYHGp09iLlA [href="/collection/podcasts"]{display:none}')
}
$writer.Close()
# licenses.html minification
$file_licenses = get-item $env:APPDATA\Spotify\Apps\xpui\licenses.html
$reader = New-Object -TypeName System.IO.StreamReader -ArgumentList $file_licenses
$xpuiContents_html = $reader.ReadToEnd()
$reader.Close()
$xpuiContents_html = Helper -paramname "HtmlLicMin"
$writer = New-Object System.IO.StreamWriter -ArgumentList $file_licenses
$writer.BaseStream.SetLength(0)
$writer.Write($xpuiContents_html)
$writer.Close()
}
If (Test-Path $xpui_spa_patch) {
$bak_spa = "$env:APPDATA\Spotify\Apps\xpui.bak"
$test_bak_spa = Test-Path -Path $bak_spa
# Make a backup copy of xpui.spa if it is original
Add-Type -Assembly 'System.IO.Compression.FileSystem'
$zip = [System.IO.Compression.ZipFile]::Open($xpui_spa_patch, 'update')
$entry = $zip.GetEntry('xpui.js')
$reader = New-Object System.IO.StreamReader($entry.Open())
$patched_by_spotx = $reader.ReadToEnd()
$reader.Close()
If ($patched_by_spotx -match 'patched by spotx') {
$zip.Dispose()
if ($test_bak_spa) {
Remove-Item $xpui_spa_patch -Recurse -Force
Rename-Item $bak_spa $xpui_spa_patch
$spotify_exe_bak_patch = "$env:APPDATA\Spotify\Spotify.bak"
$test_spotify_exe_bak = Test-Path -Path $spotify_exe_bak_patch
if ($test_spotify_exe_bak) {
Remove-Item $spotifyExecutable -Recurse -Force
Rename-Item $spotify_exe_bak_patch $spotifyExecutable
}
}
else {
Write-Host ($lang).NoRestore2`n
Pause
Exit
}
$spotify_exe_bak_patch = "$env:APPDATA\Spotify\Spotify.bak"
$test_spotify_exe_bak = Test-Path -Path $spotify_exe_bak_patch
if ($test_spotify_exe_bak) {
Remove-Item $spotifyExecutable -Recurse -Force
Rename-Item $spotify_exe_bak_patch $spotifyExecutable
}
}
$zip.Dispose()
Copy-Item $xpui_spa_patch $env:APPDATA\Spotify\Apps\xpui.bak
# Remove all languages except En and Ru from xpui.spa
if ($ru) {
[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression') | Out-Null
$files = 'af.json', 'am.json', 'ar.json', 'az.json', 'bg.json', 'bho.json', 'bn.json', `
'cs.json', 'da.json', 'de.json', 'el.json', 'es-419.json', 'es.json', 'et.json', 'fa.json', `
'fi.json', 'fil.json', 'fr-CA.json', 'fr.json', 'gu.json', 'he.json', 'hi.json', 'hu.json', `
'id.json', 'is.json', 'it.json', 'ja.json', 'kn.json', 'ko.json', 'lt.json', 'lv.json', `
'ml.json', 'mr.json', 'ms.json', 'nb.json', 'ne.json', 'nl.json', 'or.json', 'pa-IN.json', `
'pl.json', 'pt-BR.json', 'pt-PT.json', 'ro.json', 'sk.json', 'sl.json', 'sr.json', 'sv.json', `
'sw.json' , 'ta.json' , 'te.json' , 'th.json' , 'tr.json' , 'uk.json' , 'ur.json' , 'vi.json', `
'zh-CN.json', 'zh-TW.json' , 'zu.json' , 'pa-PK.json' , 'hr.json'
$stream = New-Object IO.FileStream($xpui_spa_patch, [IO.FileMode]::Open)
$mode = [IO.Compression.ZipArchiveMode]::Update
$zip_xpui = New-Object IO.Compression.ZipArchive($stream, $mode)
($zip_xpui.Entries | Where-Object { $files -contains $_.Name }) | ForEach-Object { $_.Delete() }
$zip_xpui.Dispose()
$stream.Close()
$stream.Dispose()
}
Add-Type -Assembly 'System.IO.Compression.FileSystem'
$zip = [System.IO.Compression.ZipFile]::Open($xpui_spa_patch, 'update')
# xpui.js
$entry_xpui = $zip.GetEntry('xpui.js')
$reader = New-Object System.IO.StreamReader($entry_xpui.Open())
$xpui_js = $reader.ReadToEnd()
$reader.Close()
# Turn off podcasts
if ($podcast_off) { $xpui_js = Helper -paramname "OffPodcasts" }
if (!($premium)) {
# Full screen mode activation and removing "Upgrade to premium" menu, upgrade button, disabling a playlist sponsor
$xpui_js = Helper -paramname "OffadsonFullscreen"
}
# Experimental Feature
if (!($exp_spotify)) { $xpui_js = Helper -paramname "ExpFeature" }
# Remove all languages except En and Ru from xpui.js
if ($ru) { $xpui_js = Helper -paramname "OffRujs" }
# Disabled logging
$xpui_js = $xpui_js -replace "sp://logging/v3/\w+", ""
$writer = New-Object System.IO.StreamWriter($entry_xpui.Open())
$writer.BaseStream.SetLength(0)
$writer.Write($xpui_js)
$writer.Write([System.Environment]::NewLine + '// Patched by SpotX')
$writer.Close()
# Disable Sentry (vendor~xpui.js)
$entry_vendor_xpui = $zip.GetEntry('vendor~xpui.js')
$reader = New-Object System.IO.StreamReader($entry_vendor_xpui.Open())
$xpuiContents_vendor = $reader.ReadToEnd()
$reader.Close()
$xpuiContents_vendor = $xpuiContents_vendor `
-replace "prototype\.bindClient=function\(\w+\)\{", '${0}return;'
$writer = New-Object System.IO.StreamWriter($entry_vendor_xpui.Open())
$writer.BaseStream.SetLength(0)
$writer.Write($xpuiContents_vendor)
$writer.Close()
# minification of all *.js
$zip.Entries | Where-Object FullName -like '*.js' | ForEach-Object {
$readerjs = New-Object System.IO.StreamReader($_.Open())
$xpuiContents_js = $readerjs.ReadToEnd()
$readerjs.Close()
$xpuiContents_js = $xpuiContents_js `
-replace "[/][/][#] sourceMappingURL=.*[.]map", "" -replace "\r?\n(?!\(1|\d)", ""
$writer = New-Object System.IO.StreamWriter($_.Open())
$writer.BaseStream.SetLength(0)
$writer.Write($xpuiContents_js)
$writer.Close()
}
# xpui.css
$entry_xpui_css = $zip.GetEntry('xpui.css')
$reader = New-Object System.IO.StreamReader($entry_xpui_css.Open())
$xpuiContents_xpui_css = $reader.ReadToEnd()
$reader.Close()
$writer = New-Object System.IO.StreamWriter($entry_xpui_css.Open())
$writer.BaseStream.SetLength(0)
$writer.Write($xpuiContents_xpui_css)
if (!($premium)) {
# Hide download icon on different pages
$writer.Write([System.Environment]::NewLine + ' .BKsbV2Xl786X9a09XROH {display: none}')
# Hide submenu item "download"
$writer.Write([System.Environment]::NewLine + ' button.wC9sIed7pfp47wZbmU6m.pzkhLqffqF_4hucrVVQA {display: none}')
}
# Hide Collaborators icon
if (!($hide_col_icon_off) -and !($exp_spotify)) {
$writer.Write([System.Environment]::NewLine + ' .X1lXSiVj0pzhQCUo_72A{display:none}')
}
# Hide broken podcast menu
if ($podcast_off) {
$writer.Write([System.Environment]::NewLine + ' li.OEFWODerafYHGp09iLlA [href="/collection/podcasts"] {display: none}')
}
$writer.Close()
# of all *.Css
$zip.Entries | Where-Object FullName -like '*.css' | ForEach-Object {
$readercss = New-Object System.IO.StreamReader($_.Open())
$xpuiContents_css = $readercss.ReadToEnd()
$readercss.Close()
$xpuiContents_css = $xpuiContents_css `
<# Remove RTL #>`
-replace "}\[dir=ltr\]\s?([.a-zA-Z\d[_]+?,\[dir=ltr\])", '}[dir=str] $1' -replace "}\[dir=ltr\]\s?", "} " -replace "html\[dir=ltr\]", "html" `
-replace ",\s?\[dir=rtl\].+?(\{.+?\})", '$1' -replace "[\w\-\.]+\[dir=rtl\].+?\{.+?\}", "" -replace "\}\[lang=ar\].+?\{.+?\}", "}" `
-replace "\}\[dir=rtl\].+?\{.+?\}", "}" -replace "\}html\[dir=rtl\].+?\{.+?\}", "}" -replace "\}html\[lang=ar\].+?\{.+?\}", "}" `
-replace "\[lang=ar\].+?\{.+?\}", "" -replace "html\[dir=rtl\].+?\{.+?\}", "" -replace "html\[lang=ar\].+?\{.+?\}", "" `
-replace "\[dir=rtl\].+?\{.+?\}", "" -replace "\[dir=str\]", "[dir=ltr]" `
<# Css minification #>`
-replace "[/]\*([^*]|[\r\n]|(\*([^/]|[\r\n])))*\*[/]", "" -replace "[/][/]#\s.*", "" -replace "\r?\n(?!\(1|\d)", ""
$writer = New-Object System.IO.StreamWriter($_.Open())
$writer.BaseStream.SetLength(0)
$writer.Write($xpuiContents_css)
$writer.Close()
}
# licenses.html minification
$zip.Entries | Where-Object FullName -like '*licenses.html' | ForEach-Object {
$reader = New-Object System.IO.StreamReader($_.Open())
$xpuiContents_html = $reader.ReadToEnd()
$reader.Close()
$xpuiContents_html = Helper -paramname "HtmlLicMin"
$writer = New-Object System.IO.StreamWriter($_.Open())
$writer.BaseStream.SetLength(0)
$writer.Write($xpuiContents_html)
$writer.Close()
}
# blank.html minification
$entry_blank_html = $zip.GetEntry('blank.html')
$reader = New-Object System.IO.StreamReader($entry_blank_html.Open())
$xpuiContents_html_blank = $reader.ReadToEnd()
$reader.Close()
$html_min1 = " "
$html_min2 = "(?m)(^\s*\r?\n)"
$html_min3 = "\r?\n(?!\(1|\d)"
if ($xpuiContents_html_blank -match $html_min1) { $xpuiContents_html_blank = $xpuiContents_html_blank -replace $html_min1, "" } else { Write-Host ($lang).NoVariable"" -ForegroundColor red -NoNewline; Write-Host "`$html_min1 "($lang).NoVariable4 }
if ($xpuiContents_html_blank -match $html_min2) { $xpuiContents_html_blank = $xpuiContents_html_blank -replace $html_min2, "" } else { Write-Host ($lang).NoVariable"" -ForegroundColor red -NoNewline; Write-Host "`$html_min2 "($lang).NoVariable4 }
if ($xpuiContents_html_blank -match $html_min3) { $xpuiContents_html_blank = $xpuiContents_html_blank -replace $html_min3, "" } else { Write-Host ($lang).NoVariable"" -ForegroundColor red -NoNewline; Write-Host "`$html_min3 "($lang).NoVariable4 }
$xpuiContents_html_blank = $xpuiContents_html_blank
$writer = New-Object System.IO.StreamWriter($entry_blank_html.Open())
$writer.BaseStream.SetLength(0)
$writer.Write($xpuiContents_html_blank)
$writer.Close()
if ($ru) {
# Additional translation of the ru.json file
$zip.Entries | Where-Object FullName -like '*ru.json' | ForEach-Object {
$readerjson = New-Object System.IO.StreamReader($_.Open())
$xpui_ru = $readerjson.ReadToEnd()
$readerjson.Close()
$xpui_ru = Helper -paramname "RuTranslate"
$writer = New-Object System.IO.StreamWriter($_.Open())
$writer.BaseStream.SetLength(0)
$writer.Write($xpui_ru)
$writer.Close()
}
}
# Json
$zip.Entries | Where-Object FullName -like '*.json' | ForEach-Object {
$readerjson = New-Object System.IO.StreamReader($_.Open())
$xpuiContents_json = $readerjson.ReadToEnd()
$readerjson.Close()
# json minification
$xpuiContents_json = $xpuiContents_json `
-replace " ", "" -replace " ", "" -replace '": ', '":' -replace "\r?\n(?!\(1|\d)", ""
$writer = New-Object System.IO.StreamWriter($_.Open())
$writer.BaseStream.SetLength(0)
$writer.Write($xpuiContents_json)
$writer.Close()
}
$zip.Dispose()
}
# Delete all files except "en" and "ru"
if ($ru) {
$patch_lang = "$spotifyDirectory\locales"
Remove-Item $patch_lang -Exclude *en*, *ru* -Recurse
}
# create a desktop shortcut
$ErrorActionPreference = 'SilentlyContinue'
if (!($no_shortcut)) {
$desktop_folder = DesktopFolder
If (!(Test-Path $desktop_folder\Spotify.lnk)) {
$source = "$env:APPDATA\Spotify\Spotify.exe"
$target = "$desktop_folder\Spotify.lnk"
$WorkingDir = "$env:APPDATA\Spotify"
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($target)
$Shortcut.WorkingDirectory = $WorkingDir
$Shortcut.TargetPath = $source
$Shortcut.Save()
}
}
# create shortcut in start menu
If (!(Test-Path $start_menu)) {
$source = "$env:APPDATA\Spotify\Spotify.exe"
$target = $start_menu
$WorkingDir = "$env:APPDATA\Spotify"
$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut($target)
$Shortcut.WorkingDirectory = $WorkingDir
$Shortcut.TargetPath = $source
$Shortcut.Save()
}
# Block updates
$ErrorActionPreference = 'SilentlyContinue'
$update_test_exe = Test-Path -Path $spotifyExecutable
if ($block_update) {
if ($update_test_exe) {
$exe = "$env:APPDATA\Spotify\Spotify.exe"
$ANSI = [Text.Encoding]::GetEncoding(1251)
$old = [IO.File]::ReadAllText($exe, $ANSI)
if ($old -match "(?<=wg:\/\/desktop-update\/.)7(\/update)") {
Write-Host ($lang).UpdateBlocked`n
}
elseif ($old -match "(?<=wg:\/\/desktop-update\/.)2(\/update)") {
if (Test-Path -LiteralPath $exe_bak) {
Remove-Item $exe_bak -Recurse -Force
Start-Sleep -Milliseconds 150
}
copy-Item $exe $exe_bak
$new = $old -replace "(?<=wg:\/\/desktop-update\/.)2(\/update)", '7/update'
[IO.File]::WriteAllText($exe, $new, $ANSI)
}
else {
Write-Host ($lang).UpdateError`n -ForegroundColor Red
}
}
else {
Write-Host ($lang).NoSpotifyExe`n -ForegroundColor Red
}
}
# Automatic cache clearing
if ($cache_install) {
Start-Sleep -Milliseconds 200
New-Item -Path $env:APPDATA\Spotify\ -Name "cache" -ItemType "directory" | Out-Null
# Download cache script
downloadScripts -param1 "cache-spotify"
downloadScripts -param1 "hide_window"
downloadScripts -param1 "run_ps"
# create a desktop shortcut
if (!($no_shortcut)) {
$source2 = "$cache_folder\hide_window.vbs"
$target2 = "$desktop_folder\Spotify.lnk"
$WorkingDir2 = "$cache_folder"
$WshShell2 = New-Object -comObject WScript.Shell
$Shortcut2 = $WshShell2.CreateShortcut($target2)
$Shortcut2.WorkingDirectory = $WorkingDir2
$Shortcut2.IconLocation = "$env:APPDATA\Spotify\Spotify.exe"
$Shortcut2.TargetPath = $source2
$Shortcut2.Save()
}
# create shortcut in start menu
$source2 = "$cache_folder\hide_window.vbs"
$target2 = $start_menu
$WorkingDir2 = "$cache_folder"
$WshShell2 = New-Object -comObject WScript.Shell
$Shortcut2 = $WshShell2.CreateShortcut($target2)
$Shortcut2.WorkingDirectory = $WorkingDir2
$Shortcut2.IconLocation = "$env:APPDATA\Spotify\Spotify.exe"
$Shortcut2.TargetPath = $source2
$Shortcut2.Save()
if ($number_days -match "^[1-9][0-9]?$|^100$") {
$file_cache_spotify_ps1 = Get-Content $cache_folder\cache_spotify.ps1 -Raw
$new_file_cache_spotify_ps1 = $file_cache_spotify_ps1 -replace '7', $number_days
Set-Content -Path $cache_folder\cache_spotify.ps1 -Force -Value $new_file_cache_spotify_ps1
$contentcache_spotify_ps1 = [System.IO.File]::ReadAllText("$cache_folder\cache_spotify.ps1")
$contentcache_spotify_ps1 = $contentcache_spotify_ps1.Trim()
[System.IO.File]::WriteAllText("$cache_folder\cache_spotify.ps1", $contentcache_spotify_ps1)
$infile = "$cache_folder\cache_spotify.ps1"
$outfile = "$cache_folder\cache_spotify2.ps1"
$sr = New-Object System.IO.StreamReader($infile)
$sw = New-Object System.IO.StreamWriter($outfile, $false, [System.Text.Encoding]::Default)
$sw.Write($sr.ReadToEnd())
$sw.Close()
$sr.Close()
$sw.Dispose()
$sr.Dispose()
Start-Sleep -Milliseconds 200
Remove-item $infile -Recurse -Force
Rename-Item -path $outfile -NewName $infile
}
}
if ($start_spoti) { Start-Process -WorkingDirectory $spotifyDirectory -FilePath $spotifyExecutable }
Write-Host ($lang).InstallComplete`n -ForegroundColor Green