Compare commits

..

No commits in common. "76f0f185929413414f181fbed40edab17c3c6ca0" and "b6c0926efc8a444aa38ec950a945f178af677d28" have entirely different histories.

79 changed files with 1049 additions and 5681 deletions

File diff suppressed because one or more lines are too long

View File

@ -15,7 +15,8 @@ class TextFormBuilderField extends StatelessWidget {
// final AlignmentGeometry? leadingAlignment;
// final AlignmentGeometry? trailingAlignment;
final bool border;
final List<InputFeature> features;
final Widget? leading;
final Widget? trailing;
final EdgeInsetsGeometry? padding;
final ValueChanged<String>? onSubmitted;
final VoidCallback? onEditingComplete;
@ -62,6 +63,8 @@ class TextFormBuilderField extends StatelessWidget {
this.filled = false,
this.placeholder,
this.border = true,
this.leading,
this.trailing,
this.padding,
this.onSubmitted,
this.onEditingComplete,
@ -93,7 +96,6 @@ class TextFormBuilderField extends StatelessWidget {
// this.leadingAlignment,
// this.trailingAlignment,
this.statesController,
this.features = const [],
});
@override
@ -128,7 +130,10 @@ class TextFormBuilderField extends StatelessWidget {
filled: filled,
placeholder: placeholder,
border: border,
features: features,
features: [
if (leading != null) InputFeature.leading(leading!),
if (trailing != null) InputFeature.trailing(trailing!),
],
padding: padding,
onSubmitted: (value) {
field.validate();

View File

@ -426,9 +426,5 @@
"download": "تنزيل",
"file_not_found": "الملف غير موجود",
"custom": "مخصص",
"add_custom_url": "إضافة URL مخصص",
"edit_port": "تعديل المنفذ",
"port_helper_msg": "القيمة الافتراضية هي -1 والتي تشير إلى رقم عشوائي. إذا كان لديك جدار ناري مُعد، يُوصى بتعيين هذا.",
"connect_request": "السماح لـ {client} بالاتصال؟",
"connection_request_denied": "تم رفض الاتصال. المستخدم رفض الوصول."
"add_custom_url": "إضافة URL مخصص"
}

View File

@ -426,9 +426,5 @@
"download": "ডাউনলোড",
"file_not_found": "ফাইল পাওয়া যায়নি",
"custom": "কাস্টম",
"add_custom_url": "কাস্টম URL যোগ করুন",
"edit_port": "পোর্ট সম্পাদনা করুন",
"port_helper_msg": "ডিফল্ট হল -1 যা এলোমেলো সংখ্যা নির্দেশ করে। যদি আপনার ফায়ারওয়াল কনফিগার করা থাকে, তবে এটি সেট করা সুপারিশ করা হয়।",
"connect_request": "{client} কে সংযোগ করতে অনুমতি দেবেন?",
"connection_request_denied": "সংযোগ অস্বীকৃত। ব্যবহারকারী প্রবেশাধিকার অস্বীকার করেছে।"
"add_custom_url": "কাস্টম URL যোগ করুন"
}

View File

@ -426,9 +426,5 @@
"download": "Descarregar",
"file_not_found": "Fitxer no trobat",
"custom": "Personalitzat",
"add_custom_url": "Afegir URL personalitzada",
"edit_port": "Editar port",
"port_helper_msg": "El valor per defecte és -1, que indica un número aleatori. Si teniu un tallafoc configurat, es recomana establir-ho.",
"connect_request": "Permetre que {client} es connecti?",
"connection_request_denied": "Connexió denegada. L'usuari ha denegat l'accés."
"add_custom_url": "Afegir URL personalitzada"
}

View File

@ -426,9 +426,5 @@
"download": "Stáhnout",
"file_not_found": "Soubor nenalezen",
"custom": "Vlastní",
"add_custom_url": "Přidat vlastní URL",
"edit_port": "Upravit port",
"port_helper_msg": "Výchozí hodnota je -1, což znamená náhodné číslo. Pokud máte nakonfigurován firewall, doporučuje se to nastavit.",
"connect_request": "Povolit {client} připojení?",
"connection_request_denied": "Připojení bylo zamítnuto. Uživatel odmítl přístup."
"add_custom_url": "Přidat vlastní URL"
}

View File

@ -426,9 +426,5 @@
"download": "Herunterladen",
"file_not_found": "Datei nicht gefunden",
"custom": "Benutzerdefiniert",
"add_custom_url": "Benutzerdefinierte URL hinzufügen",
"edit_port": "Port bearbeiten",
"port_helper_msg": "Der Standardwert ist -1, was eine zufällige Zahl bedeutet. Wenn Sie eine Firewall konfiguriert haben, wird empfohlen, dies einzustellen.",
"connect_request": "{client} die Verbindung erlauben?",
"connection_request_denied": "Verbindung abgelehnt. Benutzer hat den Zugriff verweigert."
"add_custom_url": "Benutzerdefinierte URL hinzufügen"
}

View File

@ -424,9 +424,5 @@
"download": "Download",
"file_not_found": "File not found",
"custom": "Custom",
"add_custom_url": "Add custom URL",
"edit_port": "Edit port",
"port_helper_msg": "Default is -1 which indicates random number. If you've firewall configured, setting this is recommended.",
"connect_request": "Allow {client} to connect?",
"connection_request_denied": "Connection denied. User denied access."
"add_custom_url": "Add custom URL"
}

View File

@ -426,9 +426,5 @@
"download": "Descargar",
"file_not_found": "Archivo no encontrado",
"custom": "Personalizado",
"add_custom_url": "Agregar URL personalizada",
"edit_port": "Editar puerto",
"port_helper_msg": "El valor predeterminado es -1, lo que indica un número aleatorio. Si tienes un firewall configurado, se recomienda establecer esto.",
"connect_request": "¿Permitir que {client} se conecte?",
"connection_request_denied": "Conexión denegada. El usuario denegó el acceso."
"add_custom_url": "Agregar URL personalizada"
}

View File

@ -426,9 +426,5 @@
"download": "Deskargatu",
"file_not_found": "Fitxategia ez da aurkitu",
"custom": "Pertsonalizatua",
"add_custom_url": "Gehitu URL pertsonalizatua",
"edit_port": "Editatu portua",
"port_helper_msg": "Lehenetsitako balioa -1 da, zenbaki aleatorioa adierazten duena. Su firewall konfiguratu baduzu, gomendatzen da hau ezartzea.",
"connect_request": "{client} konektatzea baimendu?",
"connection_request_denied": "Konektatzea ukatu da. Erabiltzaileak sarbidea ukatu du."
"add_custom_url": "Gehitu URL pertsonalizatua"
}

View File

@ -426,9 +426,5 @@
"download": "دانلود",
"file_not_found": "فایل پیدا نشد",
"custom": "شخصی‌سازی شده",
"add_custom_url": "اضافه کردن URL سفارشی",
"edit_port": "ویرایش پورت",
"port_helper_msg": "پیش‌فرض -1 است که نشان‌دهنده یک عدد تصادفی است. اگر فایروال شما پیکربندی شده است، توصیه می‌شود این را تنظیم کنید.",
"connect_request": "آیا اجازه می‌دهید {client} متصل شود؟",
"connection_request_denied": "اتصال رد شد. کاربر دسترسی را رد کرد."
"add_custom_url": "اضافه کردن URL سفارشی"
}

View File

@ -426,9 +426,5 @@
"download": "Lataa",
"file_not_found": "Tiedostoa ei löydy",
"custom": "Mukautettu",
"add_custom_url": "Lisää mukautettu URL",
"edit_port": "Muokkaa porttia",
"port_helper_msg": "Oletusarvo on -1, mikä tarkoittaa satunnaista numeroa. Jos sinulla on palomuuri määritetty, tämän asettamista suositellaan.",
"connect_request": "Salli {client} yhdistää?",
"connection_request_denied": "Yhteys evätty. Käyttäjä eväsi pääsyn."
"add_custom_url": "Lisää mukautettu URL"
}

View File

@ -426,9 +426,5 @@
"download": "Télécharger",
"file_not_found": "Fichier non trouvé",
"custom": "Personnalisé",
"add_custom_url": "Ajouter une URL personnalisée",
"edit_port": "Modifier le port",
"port_helper_msg": "La valeur par défaut est -1, ce qui indique un nombre aléatoire. Si vous avez configuré un pare-feu, il est recommandé de le définir.",
"connect_request": "Autoriser {client} à se connecter ?",
"connection_request_denied ": "Connexion refusée. L'utilisateur a refusé l'accès."
"add_custom_url": "Ajouter une URL personnalisée"
}

View File

@ -426,9 +426,5 @@
"download": "डाउनलोड करें",
"file_not_found": "फाइल नहीं मिली",
"custom": "कस्टम",
"add_custom_url": "कस्टम URL जोड़ें",
"edit_port": "पोर्ट संपादित करें",
"port_helper_msg": "डिफ़ॉल्ट -1 है जो यादृच्छिक संख्या को दर्शाता है। यदि आपने फ़ायरवॉल कॉन्फ़िगर किया है, तो इसे सेट करना अनुशंसित है।",
"connect_request": "{client} को कनेक्ट करने की अनुमति दें?",
"connection_request_denied": "कनेक्शन अस्वीकृत। उपयोगकर्ता ने पहुंच अस्वीकृत कर दी।"
"add_custom_url": "कस्टम URL जोड़ें"
}

View File

@ -426,9 +426,5 @@
"download": "Download",
"file_not_found": "File not found",
"custom": "Custom",
"add_custom_url": "Add custom URL",
"edit_port": "Edit port",
"port_helper_msg": "Default adalah -1 yang menunjukkan angka acak. Jika Anda telah mengonfigurasi firewall, disarankan untuk mengatur ini.",
"connect_request": "Izinkan {client} untuk terhubung?",
"connection_request_denied": "Koneksi ditolak. Pengguna menolak akses."
"add_custom_url": "Add custom URL"
}

View File

@ -427,9 +427,5 @@
"download": "Scarica",
"file_not_found": "File non trovato",
"custom": "Personalizzato",
"add_custom_url": "Aggiungi URL personalizzato",
"edit_port": "Modifica porta",
"port_helper_msg": "Il valore predefinito è -1, che indica un numero casuale. Se hai configurato un firewall, si consiglia di impostarlo.",
"connect_request": "Consentire a {client} di connettersi?",
"connection_request_denied": "Connessione negata. L'utente ha negato l'accesso."
"add_custom_url": "Aggiungi URL personalizzato"
}

View File

@ -426,9 +426,5 @@
"download": "ダウンロード",
"file_not_found": "ファイルが見つかりません",
"custom": "カスタム",
"add_custom_url": "カスタムURLを追加",
"edit_port": "ポートを編集",
"port_helper_msg": "デフォルトは-1で、ランダムな番号を示します。ファイアウォールを設定している場合は、これを設定することをお勧めします。",
"connect_request": "{client}の接続を許可しますか?",
"connection_request_denied": "接続が拒否されました。ユーザーがアクセスを拒否しました。"
"add_custom_url": "カスタムURLを追加"
}

View File

@ -426,9 +426,5 @@
"download": "ჩამოტვირთვა",
"file_not_found": "ფაილი ვერ მოიძებნა",
"custom": "პერსონალიზირებული",
"add_custom_url": "დამატება პერსონალური URL",
"edit_port": "პორტის რედაქტირება",
"port_helper_msg": "ნაგულისხმევი არის -1, რაც შემთხვევითი ნომრის მითითებას ნიშნავს. თუ لديك firewall настроен, рекомендуется установить это.",
"connect_request": "{client}-ის დაკავშირების ნებართვა?",
"connection_request_denied": "კავშირი უარყოფილია. მომხმარებელმა უარყო წვდომა."
"add_custom_url": "დამატება პერსონალური URL"
}

View File

@ -427,9 +427,5 @@
"download": "다운로드",
"file_not_found": "파일을 찾을 수 없습니다",
"custom": "사용자 정의",
"add_custom_url": "사용자 정의 URL 추가",
"edit_port": "포트 편집",
"port_helper_msg": "기본값은 -1로 무작위 숫자를 나타냅니다. 방화벽이 구성된 경우 이를 설정하는 것이 좋습니다.",
"connect_request": "{client}의 연결을 허용하시겠습니까?",
"connection_request_denied": "연결이 거부되었습니다. 사용자가 액세스를 거부했습니다."
"add_custom_url": "사용자 정의 URL 추가"
}

View File

@ -426,9 +426,5 @@
"download": "डाउनलोड",
"file_not_found": "फ़ाइल नहीं मिली",
"custom": "कस्टम",
"add_custom_url": "कस्टम URL जोड़ें",
"edit_port": "पोर्ट सम्पादन गर्नुहोस्",
"port_helper_msg": "डिफ़ॉल्ट -1 हो जुन यादृच्छिक संख्या जनाउँछ। यदि तपाईंले फायरवाल कन्फिगर गर्नुभएको छ भने, यसलाई सेट गर्न सिफारिस गरिन्छ।",
"connect_request": "{client} लाई जडान गर्न अनुमति दिनुहोस्?",
"connection_request_denied": "जडान अस्वीकृत। प्रयोगकर्ताले पहुँच अस्वीकृत गर्यो।"
"add_custom_url": "कस्टम URL जोड़ें"
}

View File

@ -427,9 +427,5 @@
"download": "Downloaden",
"file_not_found": "Bestand niet gevonden",
"custom": "Aangepast",
"add_custom_url": "Voeg aangepaste URL toe",
"edit_port": "Poort bewerken",
"port_helper_msg": "Standaard is -1, wat een willekeurig nummer aangeeft. Als je een firewall hebt geconfigureerd, wordt aanbevolen dit in te stellen.",
"connect_request": "Toestaan dat {client} verbinding maakt?",
"connection_request_denied": "Verbinding geweigerd. Gebruiker heeft toegang geweigerd."
"add_custom_url": "Voeg aangepaste URL toe"
}

View File

@ -426,9 +426,5 @@
"download": "Pobierz",
"file_not_found": "Plik nie znaleziony",
"custom": "Niestandardowy",
"add_custom_url": "Dodaj niestandardowy URL",
"edit_port": "Edytuj port",
"port_helper_msg": "Domyślna wartość to -1, co oznacza losową liczbę. Jeśli masz skonfigurowany zaporę, zaleca się jej ustawienie.",
"connect_request": "Zezwolić {client} na połączenie?",
"connection_request_denied": "Połączenie odrzucone. Użytkownik odmówił dostępu."
"add_custom_url": "Dodaj niestandardowy URL"
}

View File

@ -426,9 +426,5 @@
"download": "Baixar",
"file_not_found": "Arquivo não encontrado",
"custom": "Personalizado",
"add_custom_url": "Adicionar URL personalizada",
"edit_port": "Editar porta",
"port_helper_msg": "O padrão é -1, que indica um número aleatório. Se você tiver um firewall configurado, é recomendável definir isso.",
"connect_request": "Permitir que {client} se conecte?",
"connection_request_denied": "Conexão negada. O usuário negou o acesso ."
"add_custom_url": "Adicionar URL personalizada"
}

View File

@ -426,9 +426,5 @@
"download": "Скачать",
"file_not_found": "Файл не найден",
"custom": "Пользовательский",
"add_custom_url": "Добавить пользовательский URL",
"edit_port": "Редактировать порт",
"port_helper_msg": "По умолчанию -1, что означает случайное число. Если у вас настроен брандмауэр, рекомендуется установить это.",
"connect_request": "Разрешить {client} подключение?",
"connection_request_denied": "Подключение отклонено. Пользователь отказал в доступе."
"add_custom_url": "Добавить пользовательский URL"
}

View File

@ -1,432 +1,428 @@
{
"guest": "விருந்தினர்",
"browse": "உலாவு",
"search": "தேடுக",
"library": "நூலகம்",
"lyrics": "பாடல் வரிகள்",
"settings": "அமைப்புகள்",
"genre_categories_filter": "வகைகள் அல்லது பாணிகளை வடிகட்டுக...",
"genre": "பாணி",
"personalized": "தனிப்பயனாக்கப்பட்ட",
"featured": "சிறப்பிடம் பெற்ற",
"new_releases": "புதிய வெளியீடுகள்",
"songs": "பாடல்கள்",
"playing_track": "{track} இயங்குகிறது",
"queue_clear_alert": "இது தற்போதைய வரிசையை அழிக்கும். {track_length} பாடல்கள் நீக்கப்படும்\nதொடர விரும்புகிறீர்களா?",
"load_more": "மேலும் ஏற்றுக",
"playlists": "பாடல் பட்டியல்கள்",
"artists": "கலைஞர்கள்",
"albums": "ஆல்பங்கள்",
"tracks": "பாடல்கள்",
"downloads": "பதிவிறக்கங்கள்",
"filter_playlists": "உங்கள் பாடல் பட்டியல்களை வடிகட்டுக...",
"liked_tracks": "விரும்பிய பாடல்கள்",
"liked_tracks_description": "உங்கள் விரும்பிய பாடல்கள் அனைத்தும்",
"playlist": "பாடல் பட்டியல்",
"create_a_playlist": "பாடல் பட்டியலை உருவாக்குக",
"update_playlist": "பாடல் பட்டியலைப் புதுப்பிக்க",
"create": "உருவாக்கு",
"cancel": "ரத்து செய்",
"update": "புதுப்பி",
"playlist_name": "பாடல் பட்டியல் பெயர்",
"name_of_playlist": "பாடல் பட்டியலின் பெயர்",
"description": "விளக்கம்",
"public": "பொது",
"collaborative": "கூட்டு",
"search_local_tracks": "உள்ளூர் பாடல்களைத் தேடுக...",
"play": "இயக்கு",
"delete": "அழி",
"none": "எதுவுமில்லை",
"sort_a_z": "A-Z வரிசைப்படுத்து",
"sort_z_a": "Z-A வரிசைப்படுத்து",
"sort_artist": "கலைஞர் மூலம் வரிசைப்படுத்து",
"sort_album": "ஆல்பம் மூலம் வரிசைப்படுத்து",
"sort_duration": "கால அளவு மூலம் வரிசைப்படுத்து",
"sort_tracks": "பாடல்களை வரிசைப்படுத்து",
"currently_downloading": "தற்போது பதிவிறக்குகிறது ({tracks_length})",
"cancel_all": "அனைத்தையும் ரத்து செய்",
"filter_artist": "கலைஞர்களை வடிகட்டுக...",
"followers": "{followers} பின்தொடர்பவர்கள்",
"add_artist_to_blacklist": "கலைஞரை தடைப்பட்டியலில் சேர்க்க",
"top_tracks": "சிறந்த பாடல்கள்",
"fans_also_like": "ரசிகர்கள் விரும்புவது",
"loading": "ஏற்றுகிறது...",
"artist": "கலைஞர்",
"blacklisted": "தடைப்பட்டியலில் உள்ளது",
"following": "பின்தொடர்கிறது",
"follow": "பின்தொடர்",
"artist_url_copied": "கலைஞர் URL கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது",
"added_to_queue": "{tracks} பாடல்கள் வரிசையில் சேர்க்கப்பட்டன",
"filter_albums": "ஆல்பங்களை வடிகட்டுக...",
"synced": "ஒத்திசைக்கப்பட்டது",
"plain": "சாதாரண",
"shuffle": "கலக்கு",
"search_tracks": "பாடல்களைத் தேடுக...",
"released": "வெளியிடப்பட்டது",
"error": "பிழை {error}",
"title": "தலைப்பு",
"time": "நேரம்",
"more_actions": "மேலும் செயல்கள்",
"download_count": "பதிவிறக்கு ({count})",
"add_count_to_playlist": "({count}) பாடல் பட்டியலில் சேர்",
"add_count_to_queue": "({count}) வரிசையில் சேர்",
"play_count_next": "({count}) அடுத்து இயக்கு",
"album": "ஆல்பம்",
"copied_to_clipboard": "{data} கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது",
"add_to_following_playlists": "{track} பின்வரும் பாடல் பட்டியல்களில் சேர்",
"add": "சேர்",
"added_track_to_queue": "{track} வரிசையில் சேர்க்கப்பட்டது",
"add_to_queue": "வரிசையில் சேர்",
"track_will_play_next": "{track} அடுத்து இயக்கப்படும்",
"play_next": "அடுத்து இயக்கு",
"removed_track_from_queue": "{track} வரிசையிலிருந்து நீக்கப்பட்டது",
"remove_from_queue": "வரிசையிலிருந்து நீக்கு",
"remove_from_favorites": "பிடித்தவையிலிருந்து நீக்கு",
"save_as_favorite": "பிடித்தவையாக சேமி",
"add_to_playlist": "பாடல் பட்டியலில் சேர்",
"remove_from_playlist": "பாடல் பட்டியலிலிருந்து நீக்கு",
"add_to_blacklist": "தடைப்பட்டியலில் சேர்",
"remove_from_blacklist": "தடைப்பட்டியலிலிருந்து நீக்கு",
"share": "பகிர்",
"mini_player": "சிறிய இயக்கி",
"slide_to_seek": "முன்னோக்கி அல்லது பின்னோக்கி செல்ல சறுக்கவும்",
"shuffle_playlist": "பாடல் பட்டியலை கலக்கு",
"unshuffle_playlist": "பாடல் பட்டியலை கலக்காதே",
"previous_track": "முந்தைய பாடல்",
"next_track": "அடுத்த பாடல்",
"pause_playback": "இயக்கத்தை நிறுத்து",
"resume_playback": "இயக்கத்தை தொடர்",
"loop_track": "பாடலை சுழற்று",
"no_loop": "சுழற்சி இல்லை",
"repeat_playlist": "பாடல் பட்டியலை மீண்டும் இயக்கு",
"queue": "வரிசை",
"alternative_track_sources": "மாற்று பாடல் மூலங்கள்",
"download_track": "பாடலைப் பதிவிறக்கு",
"tracks_in_queue": "வரிசையில் {tracks} பாடல்கள்",
"clear_all": "அனைத்தையும் அழி",
"show_hide_ui_on_hover": "மேலே வரும்போது UI ஐக் காட்டு/மறை",
"always_on_top": "எப்போதும் மேலே",
"exit_mini_player": "சிறிய இயக்கியிலிருந்து வெளியேறு",
"download_location": "பதிவிறக்க இடம்",
"local_library": "உள்ளூர் நூலகம்",
"add_library_location": "நூலகத்தில் சேர்",
"remove_library_location": "நூலகத்திலிருந்து நீக்கு",
"account": "கணக்கு",
"login_with_spotify": "உங்கள் Spotify கணக்கில் உள்நுழைக",
"connect_with_spotify": "Spotify உடன் இணைக்கவும்",
"logout": "வெளியேறு",
"logout_of_this_account": "இந்த கணக்கிலிருந்து வெளியேறு",
"language_region": "மொழி & பிராந்தியம்",
"language": "மொழி",
"system_default": "கணினி இயல்புநிலை",
"market_place_region": "சந்தை பிராந்தியம்",
"recommendation_country": "பரிந்துரை நாடு",
"appearance": "தோற்றம்",
"layout_mode": "அமைப்பு முறை",
"override_layout_settings": "தளவமைப்பு அமைப்புகளை மாற்றியமை",
"adaptive": "தகவமைப்பு",
"compact": "சுருக்கமான",
"extended": "விரிவான",
"theme": "தீம்",
"dark": "இருள்",
"light": "வெளிர்",
"system": "கணினி வழி",
"accent_color": "அழுத்த நிறம்",
"sync_album_color": "ஆல்பம் நிறத்தை ஒத்திசை",
"sync_album_color_description": "ஆல்பம் படத்தின் முக்கிய நிறத்தை அழுத்த நிறமாகப் பயன்படுத்துகிறது",
"playback": "பின்னணி",
"audio_quality": "ஒலி தரம்",
"high": "உயர்",
"low": "குறைந்த",
"pre_download_play": "முன்பதிவிறக்கம் மற்றும் இயக்கம்",
"pre_download_play_description": "ஒலியை ஸ்ட்ரீம் செய்வதற்குப் பதிலாக, பைட்டுகளைப் பதிவிறக்கி இயக்கவும் (அதிக பேண்ட்விட்த் பயனர்களுக்கு பரிந்துரைக்கப்படுகிறது)",
"skip_non_music": "இசையல்லாத பகுதிகளைத் தவிர் (SponsorBlock)",
"blacklist_description": "தடைசெய்யப்பட்ட பாடல்கள் மற்றும் கலைஞர்கள்",
"wait_for_download_to_finish": "தற்போதைய பதிவிறக்கம் முடியும் வரை காத்திருக்கவும்",
"desktop": "கணினி",
"close_behavior": "மூடும் நடத்தை",
"close": "மூடு",
"minimize_to_tray": "ட்ரேயை குறைக்கவும்",
"show_tray_icon": "ட்ரே ஐகானைக் காட்டு",
"about": "பற்றி",
"u_love_spotube": "நீங்கள் Spotube ஐ நேசிக்கிறீர்கள் என்பது எங்களுக்குத் தெரியும்",
"check_for_updates": "புதுப்பிப்புகளைச் சரிபார்",
"about_spotube": "Spotube பற்றி",
"blacklist": "தடைப்பட்டியல்",
"please_sponsor": "தயவுசெய்து ஆதரவு/நன்கொடை அளியுங்கள்",
"spotube_description": "Spotube, ஒரு லேசான, பல தளங்களில் இயங்கும், அனைவருக்கும் இலவசமான spotify கிளையன்ட்",
"version": "பதிப்பு",
"build_number": "கட்டமைப்பு எண்",
"founder": "நிறுவனர்",
"repository": "களஞ்சியம்",
"bug_issues": "பிழை_சிக்கல்கள்",
"made_with": "வங்காளதேசத்திலிருந்து🇧🇩 ❤️ உருவாக்கப்பட்டது",
"kingkor_roy_tirtho": "கிங்கர் ராய் திர்தோ",
"copyright": "© 2021-{current_year} கிங்கர் ராய் திர்தோ",
"license": "உரிமம்",
"add_spotify_credentials": "தொடங்குவதற்கு உங்கள் spotify சான்றுகளைச் சேர்க்கவும்",
"credentials_will_not_be_shared_disclaimer": "கவலைப்பட வேண்டாம், உங்கள் சான்றுகள் எதுவும் சேகரிக்கப்படாது அல்லது யாருடனும் பகிரப்படாது",
"know_how_to_login": "இதை எப்படி செய்வது என்று தெரியவில்லையா?",
"follow_step_by_step_guide": "படிப்படியான வழிகாட்டியைப் பின்பற்றவும்",
"spotify_cookie": "Spotify {name} நட்புநிரல்",
"cookie_name_cookie": "{name} நட்புநிரல்",
"fill_in_all_fields": "அனைத்து களங்களையும் நிரப்பவும்",
"submit": "சமர்ப்பி",
"exit": "வெளியேறு",
"previous": "முந்தைய",
"next": "அடுத்து",
"done": "முடிந்தது",
"step_1": "முதல் படி",
"first_go_to": "முதலில், செல்லவேண்டியது",
"login_if_not_logged_in": "நீங்கள் உள்நுழையவில்லை என்றால் உள்நுழைக/பதிவுசெய்க",
"step_2": "இரண்டாம் படி",
"step_2_steps": "1. நீங்கள் உள்நுழைந்தவுடன், F12 ஐ அழுத்தவும் அல்லது வலது கிளிக் செய்து > ஆய்வு செய்யவும் உலாவி டெவ்டூல்களைத் திறக்கவும்.\n2. பின்னர் \"பயன்பாடு\" தாவலுக்குச் செல்லவும் (Chrome, Edge, Brave போன்றவை) அல்லது \"சேமிப்பகம்\" தாவல் (Firefox, Palemoon போன்றவை)\n3. \"குக்கிகள்\" பிரிவுக்குச் சென்று பின்னர் \"https://accounts.spotify.com\" பிரிவுக்குச் செல்லவும்",
"step_3": "மூன்றாம் படி",
"step_3_steps": "\"sp_dc\" நட்புநிரலின் மதிப்பை நகலெடுக்கவும்",
"success_emoji": "வெற்றி🥳",
"success_message": "இப்போது நீங்கள் உங்கள் Spotify கணக்கில் வெற்றிகரமாக உள்நுழைந்துள்ளீர்கள். நல்லது, நண்பரே!",
"step_4": "நான்காம் படி",
"step_4_steps": "நகலெடுக்கப்பட்ட \"sp_dc\" மதிப்பை ஒட்டவும்",
"something_went_wrong": "ஏதோ தவறு நடந்துவிட்டது",
"piped_instance": "Piped சேவையகம் நிகழ்வு",
"piped_description": "பாடல் பொருத்தத்திற்குப் பயன்படுத்த வேண்டிய Piped சேவையகம் நிகழ்வு",
"piped_warning": "அவற்றில் சில நன்றாக வேலை செய்யாமல் இருக்கலாம். எனவே உங்கள் சொந்த ஆபத்தில் பயன்படுத்தவும்",
"invidious_instance": "Invidious சேவையக நிகழ்வு",
"invidious_description": "பாடல் பொருத்தத்திற்குப் பயன்படுத்த வேண்டிய Invidious சேவையக நிகழ்வு",
"invidious_warning": "அவற்றில் சில நன்றாக வேலை செய்யாமல் இருக்கலாம். எனவே உங்கள் சொந்த ஆபத்தில் பயன்படுத்தவும்",
"generate": "உருவாக்கு",
"track_exists": "பாடல் {track} ஏற்கனவே உள்ளது",
"replace_downloaded_tracks": "பதிவிறக்கம் செய்யப்பட்ட அனைத்து பாடல்களையும் மாற்றவும்",
"skip_download_tracks": "பதிவிறக்கம் செய்யப்பட்ட அனைத்து பாடல்களையும் தவிர்க்கவும்",
"do_you_want_to_replace": "ஏற்கனவே உள்ள பாடலை மாற்ற விரும்புகிறீர்களா?",
"replace": "மாற்று",
"skip": "தவிர்",
"select_up_to_count_type": "{count} {type} வரை தேர்ந்தெடுக்கவும்",
"select_genres": "வகைகளைத் தேர்ந்தெடுக்கவும்",
"add_genres": "வகைகளைச் சேர்க்கவும்",
"country": "நாடு",
"number_of_tracks_generate": "உருவாக்க வேண்டிய பாடல்களின் எண்ணிக்கை",
"acousticness": "அகவுஸ்டிக்னெஸ்",
"danceability": "நடனத்தன்மை",
"energy": "ஆற்றல்",
"instrumentalness": "கருவித்தன்மை",
"liveness": "உயிர்ப்புத்தன்மை",
"loudness": "ஒலி அளவு",
"speechiness": "பேச்சுத்தன்மை",
"valence": "உணர்வு",
"popularity": "பிரபலம்",
"key": "இசை குறிப்பு",
"duration": "கால அளவு (வினாடிகள்)",
"tempo": "வேகம் (BPM)",
"mode": "முறை",
"time_signature": "நேர கையொப்பம்",
"short": "குறுகிய",
"medium": "நடுத்தர",
"long": "நீண்ட",
"min": "குறைந்தபட்சம்",
"max": "அதிகபட்சம்",
"target": "இலக்கு",
"moderate": "மிதமான",
"deselect_all": "அனைத்தையும் தேர்வுநீக்கு",
"select_all": "அனைத்தையும் தேர்ந்தெடு",
"are_you_sure": "உறுதியாக இருக்கிறீர்களா?",
"generating_playlist": "உங்கள் தனிப்பயன்பாட்டிற்கான பாடல் பட்டியலை உருவாக்குகிறது...",
"selected_count_tracks": "{count} பாடல்கள் தேர்ந்தெடுக்கப்பட்டன",
"download_warning": "நீங்கள் அனைத்து பாடல்களையும் மொத்தமாக பதிவிறக்கினால், நீங்கள் தெளிவாக இசையைத் திருடுகிறீர்கள் மற்றும் இசையின் படைப்பாற்றல் சமூகத்திற்கு சேதம் விளைவிக்கிறீர்கள். நீங்கள் இதை அறிந்திருக்கிறீர்கள் என்று நம்புகிறேன். எப்போதும், கலைஞரின் கடின உழைப்பை மதித்து ஆதரிக்க முயற்சி செய்யுங்கள்",
"download_ip_ban_warning": "மேலும், அதிகப்படியான பதிவிறக்க கோரிக்கைகள் காரணமாக உங்கள் IP YouTube இல் தடைசெய்யப்படலாம். IP தடை என்பது குறைந்தது 2-3 மாதங்களுக்கு அந்த IP சாதனத்திலிருந்து YouTube ஐப் பயன்படுத்த முடியாது (நீங்கள் உள்நுழைந்திருந்தாலும் கூட). இது ஒருபோதும் நடந்தால் Spotube பொறுப்பேற்காது",
"by_clicking_accept_terms": "'ஏற்றுக்கொள்' என்பதைக் கிளிக் செய்வதன் மூலம் பின்வரும் விதிமுறைகளுக்கு நீங்கள் ஒப்புக்கொள்கிறீர்கள்:",
"download_agreement_1": "நான் இசையைத் திருடுகிறேன் என்பது எனக்குத் தெரியும். நான் கெட்டவன்",
"download_agreement_2": "நான் கலைஞரை முடிந்தவரை ஆதரிப்பேன், அவர்களின் கலைக்கு பணம் செலுத்த எனக்கு பணம் இல்லாததால் மட்டுமே இதைச் செய்கிறேன்",
"download_agreement_3": "என் IP YouTube இல் தடைசெய்யப்படலாம் என்பதை நான் முழுமையாக அறிவேன், மேலும் என் தற்போதைய செயலால் ஏற்படும் எந்த விபத்துகளுக்கும் Spotube அல்லது அதன் உரிமையாளர்கள்/பங்களிப்பாளர்களை பொறுப்பாக்க மாட்டேன்",
"decline": "மறு",
"accept": "ஏற்றுக்கொள்",
"details": "விவரங்கள்",
"youtube": "YouTube",
"channel": "சேனல்",
"likes": "விருப்பங்கள்",
"dislikes": "விருப்பமில்லாதவை",
"views": "பார்வைகள்",
"streamUrl": "ஸ்ட்ரீம் URL",
"stop": "நிறுத்து",
"sort_newest": "புதிதாக சேர்க்கப்பட்டவற்றை வரிசைப்படுத்து",
"sort_oldest": "பழமையானவற்றை வரிசைப்படுத்து",
"sleep_timer": "உறக்க நேரம்",
"mins": "{minutes} நிமிடங்கள்",
"hours": "{hours} மணிநேரங்கள்",
"hour": "{hours} மணிநேரம்",
"custom_hours": "தனிப்பயன் மணிநேரங்கள்",
"logs": "பதிவுகள்",
"developers": "உருவாக்குநர்கள்",
"not_logged_in": "நீங்கள் உள்நுழையவில்லை",
"search_mode": "தேடல் முறை",
"audio_source": "ஒலி மூலம்",
"ok": "சரி",
"failed_to_encrypt": "குறியாக்கம் தோல்வியடைந்தது",
"encryption_failed_warning": "Spotube உங்கள் தரவை பாதுகாப்பாக சேமிக்க குறியாக்கத்தைப் பயன்படுத்துகிறது. ஆனால் அவ்வாறு செய்ய முடியவில்லை. எனவே இது பாதுகாப்பற்ற சேமிப்பகத்திற்கு மாறும்\nநீங்கள் லினக்ஸ் பயன்படுத்துகிறீர்கள் என்றால், எந்த ரகசிய சேவையும் (gnome-keyring, kde-wallet, keepassxc போன்றவை) நிறுவப்பட்டுள்ளதா என்பதை உறுதிப்படுத்தவும்",
"querying_info": "தகவலைக் கேட்கிறது...",
"piped_api_down": "Piped API செயலிழந்துள்ளது",
"piped_down_error_instructions": "Piped நிகழ்வு {pipedInstance} தற்போது செயலிழந்துள்ளது\n\nநிகழ்வை மாற்றவும் அல்லது 'API வகை'யை அதிகாரப்பூர்வ YouTube API க்கு மாற்றவும்\n\nமாற்றத்திற்குப் பிறகு பயன்பாட்டை மறுதொடக்கம் செய்வதை உறுதிப்படுத்தவும்",
"you_are_offline": "நீங்கள் தற்போது ஆஃப்லைனில் உள்ளீர்கள்",
"connection_restored": "உங்கள் இணைய இணைப்பு மீட்டெடுக்கப்பட்டது",
"use_system_title_bar": "கணினி தலைப்புப் பட்டியைப் பயன்படுத்தவும்",
"crunching_results": "முடிவுகளை செயலாக்குகிறது...",
"search_to_get_results": "முடிவுகளைப் பெற தேடவும்",
"use_amoled_mode": "கருமை நிற இருண்ட தீம்",
"pitch_dark_theme": "AMOLED முறை",
"normalize_audio": "ஒலியை சீரமை",
"change_cover": "அட்டையை மாற்று",
"add_cover": "அட்டையைச் சேர்",
"restore_defaults": "இயல்புநிலைகளை மீட்டமை",
"download_music_codec": "இசை கோடெக்கை பதிவிறக்கு",
"streaming_music_codec": "இசை கோடெக்கை ஸ்ட்ரீம் செய்",
"login_with_lastfm": "Last.fm உடன் உள்நுழைக",
"connect": "இணை",
"disconnect_lastfm": "Last.fm இலிருந்து துண்டி",
"disconnect": "துண்டி",
"username": "பயனர்பெயர்",
"password": "கடவுச்சொல்",
"login": "உள்நுழைக",
"login_with_your_lastfm": "உங்கள் Last.fm கணக்குடன் உள்நுழைக",
"scrobble_to_lastfm": "Last.fm க்கு ஸ்க்ரோபிள் செய்",
"go_to_album": "ஆல்பத்திற்குச் செல்",
"discord_rich_presence": "Discord செழுமையான தோற்றம்",
"browse_all": "அனைத்தையும் உலாவு",
"genres": "வகைகள்",
"explore_genres": "வகைகளை ஆராயுங்கள்",
"friends": "நண்பர்கள்",
"no_lyrics_available": "மன்னிக்கவும், இந்தப் பாடலுக்கான பாடல் வரிகளைக் கண்டுபிடிக்க முடியவில்லை",
"start_a_radio": "வானொலியைத் தொடங்கு",
"how_to_start_radio": "வானொலியை எவ்வாறு தொடங்க விரும்புகிறீர்கள்?",
"replace_queue_question": "தற்போதைய வரிசையை மாற்ற விரும்புகிறீர்களா அல்லது அதனுடன் சேர்க்க விரும்புகிறீர்களா?",
"endless_playback": "முடிவற்ற இயக்கம்",
"delete_playlist": "பாடல் பட்டியலை நீக்கு",
"delete_playlist_confirmation": "இந்த பாடல் பட்டியலை நீக்க விரும்புகிறீர்களா?",
"local_tracks": "உள்ளூர் பாடல்கள்",
"local_tab": "உள்ளூர்",
"song_link": "பாடல் இணைப்பு",
"skip_this_nonsense": "இந்த அர்த்தமற்றதைத் தவிர்",
"freedom_of_music": "\"இசையின் சுதந்திரம்\"",
"freedom_of_music_palm": "\"உங்கள் கைகளில் இசையின் சுதந்திரம்\"",
"get_started": "தொடங்குவோம்",
"youtube_source_description": "பரிந்துரைக்கப்படுகிறது மற்றும் சிறப்பாக செயல்படுகிறது.",
"piped_source_description": "சுதந்திரமாக உணர்கிறீர்களா? YouTube போலவே ஆனால் மிகவும் சுதந்திரமானது.",
"jiosaavn_source_description": "தெற்காசியப் பிராந்தியத்திற்கு சிறந்தது.",
"invidious_source_description": "Piped ஐப் போன்றது ஆனால் அதிக கிடைக்கும் தன்மையுடன்.",
"highest_quality": "உயர்ந்த தரம்: {quality}",
"select_audio_source": "ஒலி மூலத்தைத் தேர்ந்தெடுக்கவும்",
"endless_playback_description": "வரிசையின் இறுதியில் புதிய பாடல்களை\nதானாகவே சேர்க்கவும்",
"choose_your_region": "உங்கள் பிராந்தியத்தைத் தேர்ந்தெடுக்கவும்",
"choose_your_region_description": "இது உங்கள் இருப்பிடத்திற்கான சரியான உள்ளடக்கத்தை\nSpotube காட்ட உதவும்.",
"choose_your_language": "உங்கள் மொழியைத் தேர்ந்தெடுக்கவும்",
"help_project_grow": "இந்த திட்டம் வளர உதவுங்கள்",
"help_project_grow_description": "Spotube ஒரு திறந்த மூல திட்டம். திட்டத்திற்கு பங்களிப்பு செய்வதன் மூலம், பிழைகளைப் புகாரளிப்பதன் மூலம் அல்லது புதிய அம்சங்களைப் பரிந்துரைப்பதன் மூலம் இந்தத் திட்டம் வளர உதவலாம்.",
"contribute_on_github": "GitHub இல் பங்களியுங்கள்",
"donate_on_open_collective": "Open Collective இல் நன்கொடை அளியுங்கள்",
"browse_anonymously": "அநாமதேயமாக உலாவுக",
"enable_connect": "இணைப்பை இயக்கு",
"enable_connect_description": "மற்ற சாதனங்களிலிருந்து Spotube ஐக் கட்டுப்படுத்தவும்",
"devices": "சாதனங்கள்",
"select": "தேர்ந்தெடு",
"connect_client_alert": "நீங்கள் {client} ஆல் கட்டுப்படுத்தப்படுகிறீர்கள்",
"this_device": "இந்த சாதனம்",
"remote": "தொலைநிலை",
"stats": "புள்ளிவிவரங்கள்",
"and_n_more": "மற்றும் {count} கூடுதலாக",
"recently_played": "சமீபத்தில் இயக்கியவை",
"browse_more": "மேலும் உலாவு",
"no_title": "தலைப்பு இல்லை",
"not_playing": "இயக்கப்படவில்லை",
"epic_failure": "மோசமான தோல்வி!",
"added_num_tracks_to_queue": "{tracks_length} பாடல்கள் வரிசையில் சேர்க்கப்பட்டன",
"spotube_has_an_update": "Spotube க்கு ஒரு புதுப்பிப்பு உள்ளது",
"download_now": "இப்போது பதிவிறக்கு",
"nightly_version": "Spotube Nightly {nightlyBuildNum} வெளியிடப்பட்டுள்ளது",
"release_version": "Spotube v{version} வெளியிடப்பட்டுள்ளது",
"read_the_latest": "சமீபத்திய ",
"release_notes": "வெளியீட்டு குறிப்புகளைப் படிக்கவும்",
"pick_color_scheme": "வண்ணத் திட்டத்தைத் தேர்ந்தெடுக்கவும்",
"save": "சேமி",
"choose_the_device": "சாதனத்தைத் தேர்ந்தெடுக்கவும்:",
"multiple_device_connected": "பல சாதனங்கள் இணைக்கப்பட்டுள்ளன.\nஇந்த செயல் நடைபெற வேண்டிய சாதனத்தைத் தேர்ந்தெடுக்கவும்",
"nothing_found": "எதுவும் கிடைக்கவில்லை",
"the_box_is_empty": "பெட்டி காலியாக உள்ளது",
"top_artists": "சிறந்த கலைஞர்கள்",
"top_albums": "சிறந்த ஆல்பங்கள்",
"this_week": "இந்த வாரம்",
"this_month": "இந்த மாதம்",
"last_6_months": "கடந்த 6 மாதங்கள்",
"this_year": "இந்த ஆண்டு",
"last_2_years": "கடந்த 2 ஆண்டுகள்",
"all_time": "எல்லா நேரமும்",
"powered_by_provider": "{providerName} ஆல் இயக்கப்படுகிறது",
"email": "மின்னஞ்சல்",
"profile_followers": "பின்தொடர்பவர்கள்",
"birthday": "பிறந்த நாள்",
"subscription": "சந்தா",
"not_born": "பிறக்கவில்லை",
"hacker": "ஹேக்கர்",
"profile": "சுயவிவரம்",
"no_name": "பெயர் இல்லை",
"edit": "திருத்து",
"user_profile": "பயனர் சுயவிவரம்",
"count_plays": "{count} முறை இசைக்கப்பட்டது",
"streaming_fees_hypothetical": "ஸ்ட்ரீமிங் கட்டணங்கள் (கற்பனை)",
"minutes_listened": "காலம் கேட்டது",
"streamed_songs": "ஸ்ட்ரீமிங் செய்யப்பட்ட பாடல்கள்",
"count_streams": "{count} ஸ்ட்ரீம்கள்",
"owned_by_you": "உங்களால் கொண்டது",
"copied_shareurl_to_clipboard": "நகலெடுக்கப்பட்டது {shareUrl} கிளிப்போர்டுக்காக",
"spotify_hipotetical_calculation": "*இது Spotify இன் ஒவ்வொரு ஸ்ட்ரீமிற்கும்\n$0.003 முதல் $0.005 வரை அளவீடு அடிப்படையில் கணக்கிடப்படுகிறது. இது ஒரு கற்பனை\nகணக்கீடு ஆகும், பயனர் எந்த அளவிற்கு கலைஞர்களுக்கு\nஅதோர் பாடலை Spotify மென்பொருளில் கேட்டால் எவ்வளவு பணம் செலுத்தினார்கள் என்பதைக் கண்டுபிடிக்க.",
"count_mins": "{minutes} நிமிடங்கள்",
"summary_minutes": "நிமிடங்கள்",
"summary_listened_to_music": "இசை கேட்டது",
"summary_songs": "பாடல்கள்",
"summary_streamed_overall": "மொத்தமாக ஸ்ட்ரீமிங்",
"summary_owed_to_artists": "கலைஞர்களுக்கு\nஇந்த மாதம் சொந்தமானது",
"summary_artists": "கலைஞர்கள்",
"summary_music_reached_you": "இசை உங்களுக்கு வந்தது",
"summary_full_albums": "முழு ஆல்பங்கள்",
"summary_got_your_love": "உங்கள் அன்பை பெற்றுக்கொண்டேன்",
"summary_playlists": "பாடல் பட்டியல்கள்",
"summary_were_on_repeat": "மீண்டும் மீண்டும் இருந்தன",
"total_money": "மொத்தம் {money}",
"webview_not_found": "வெப்வியூ கிடைக்கவில்லை",
"webview_not_found_description": "உங்கள் சாதனத்தில் எந்தவொரு வெப்வியூ இயக்கத்தை நிறுவவில்லை.\nஇது நிறுவப்பட்டிருந்தால், சுற்றுச்சூழல் பாதையில் PATH உள்ளது என்பதை உறுதிபடுத்தவும்\n\nநிறுவித்த பிறகு, செயலியை மறுதொடக்கம் செய்யவும்",
"unsupported_platform": "அதிர்ஷ்டகாத உருப்படியை ஆதரிக்கவில்லை",
"cache_music": "இசையை கேஷ் செய்",
"open": "திறக்கவும்",
"cache_folder": "கேஷ் அடைவு",
"export": "ஏற்றுமதி",
"clear_cache": "கேஷ் அழிக்கவும்",
"clear_cache_confirmation": "கேஷைப் அழிக்க விரும்புகிறீர்களா?",
"export_cache_files": "கேஷில் உள்ள கோப்புகளை ஏற்றுமதி செய்யவும்",
"found_n_files": "{count} கோப்புகள் கிடைத்தன",
"export_cache_confirmation": "இந்த கோப்புகளை ஏற்றுமதி செய்ய விரும்புகிறீர்களா?",
"exported_n_out_of_m_files": "{filesExported} கோப்புகள் ஏற்றுமதி செய்யப்பட்டன, {files} கோப்புகளில்",
"undo": "செயல்தவிர்",
"download_all": "அனைத்தையும் பதிவிறக்குக",
"add_all_to_playlist": "அனைத்தையும் பாடல் பட்டியலில் சேர்க்கவும்",
"add_all_to_queue": "அனைத்தையும் வரிசைப்படுத்து",
"play_all_next": "அடுத்த உள்ள அனைத்தையும் இயக்கு",
"pause": "நிறுத்து",
"view_all": "அனைத்தையும் காண்க",
"no_tracks_added_yet": "உங்கள் பாடல்களை இன்னும் சேர்க்கவில்லை என்றால் தெரியாதே",
"no_tracks": "இங்கு பாடல்கள் எதுவும் இல்லை",
"no_tracks_listened_yet": "இன்னும் எதையும் கேள்வியில்லை",
"not_following_artists": "நீங்கள் எந்த கலைஞரையும் பின்தொடரவில்லை",
"no_favorite_albums_yet": "நீங்கள் இன்னும் எந்த ஆல்பங்களையும் பிடித்தவையாகச் சேர்க்கவில்லை",
"no_logs_found": "பதிவுகள் எதுவும் கிடைக்கவில்லை",
"youtube_engine": "YouTube இயந்திரம்",
"youtube_engine_not_installed_title": "{engine} நிறுவியதில்லை",
"youtube_engine_not_installed_message": "{engine} உங்கள் கணினியில் நிறுவியதில்லை.",
"youtube_engine_set_path": "PATH மாறியில் கிடைக்கிறதா என்பதை உறுதிப்படுத்தவும் அல்லது\n{engine} செயல் செய்யக்கூடிய முறையை கீழே அமைக்கவும்",
"youtube_engine_unix_issue_message": "macOS/Linux/unix போல் OS இல், .zshrc/.bashrc/.bash_profile போன்றவை அமைப்பில் பாதையை PATH அமைப்பது இயலாது.\nநீங்கள்.shell configuration file இல் பாதையை அமைக்க வேண்டும்",
"download": "பதிவிறக்கு",
"file_not_found": "கோப்பு கிடைக்கவில்லை",
"custom": "தனிப்பயன்",
"add_custom_url": "தனிப்பயன் URL ஐச் சேர்க்கவும்",
"edit_port": "போர்டு திருத்தவும்",
"port_helper_msg": "இயல்புநிலை -1 ஆகும், இது சீரற்ற எண்ணை குறிக்கிறது. நீங்கள் தீயணைப்பு அமைக்கப்பட்டிருந்தால், இதை அமைப்பது பரிந்துரைக்கப்படுகிறது.",
"connect_request": "{client} க்கு இணைக்க அனுமதிக்கவா?",
"connection_request_denied": "இணைப்பு மறுக்கப்பட்டது. பயனர் அணுகலை மறுத்தார்."
"guest": "விருந்தினர்",
"browse": "உலாவு",
"search": "தேடுக",
"library": "நூலகம்",
"lyrics": "பாடல் வரிகள்",
"settings": "அமைப்புகள்",
"genre_categories_filter": "வகைகள் அல்லது பாணிகளை வடிகட்டுக...",
"genre": "பாணி",
"personalized": "தனிப்பயனாக்கப்பட்ட",
"featured": "சிறப்பிடம் பெற்ற",
"new_releases": "புதிய வெளியீடுகள்",
"songs": "பாடல்கள்",
"playing_track": "{track} இயங்குகிறது",
"queue_clear_alert": "இது தற்போதைய வரிசையை அழிக்கும். {track_length} பாடல்கள் நீக்கப்படும்\nதொடர விரும்புகிறீர்களா?",
"load_more": "மேலும் ஏற்றுக",
"playlists": "பாடல் பட்டியல்கள்",
"artists": "கலைஞர்கள்",
"albums": "ஆல்பங்கள்",
"tracks": "பாடல்கள்",
"downloads": "பதிவிறக்கங்கள்",
"filter_playlists": "உங்கள் பாடல் பட்டியல்களை வடிகட்டுக...",
"liked_tracks": "விரும்பிய பாடல்கள்",
"liked_tracks_description": "உங்கள் விரும்பிய பாடல்கள் அனைத்தும்",
"playlist": "பாடல் பட்டியல்",
"create_a_playlist": "பாடல் பட்டியலை உருவாக்குக",
"update_playlist": "பாடல் பட்டியலைப் புதுப்பிக்க",
"create": "உருவாக்கு",
"cancel": "ரத்து செய்",
"update": "புதுப்பி",
"playlist_name": "பாடல் பட்டியல் பெயர்",
"name_of_playlist": "பாடல் பட்டியலின் பெயர்",
"description": "விளக்கம்",
"public": "பொது",
"collaborative": "கூட்டு",
"search_local_tracks": "உள்ளூர் பாடல்களைத் தேடுக...",
"play": "இயக்கு",
"delete": "அழி",
"none": "எதுவுமில்லை",
"sort_a_z": "A-Z வரிசைப்படுத்து",
"sort_z_a": "Z-A வரிசைப்படுத்து",
"sort_artist": "கலைஞர் மூலம் வரிசைப்படுத்து",
"sort_album": "ஆல்பம் மூலம் வரிசைப்படுத்து",
"sort_duration": "கால அளவு மூலம் வரிசைப்படுத்து",
"sort_tracks": "பாடல்களை வரிசைப்படுத்து",
"currently_downloading": "தற்போது பதிவிறக்குகிறது ({tracks_length})",
"cancel_all": "அனைத்தையும் ரத்து செய்",
"filter_artist": "கலைஞர்களை வடிகட்டுக...",
"followers": "{followers} பின்தொடர்பவர்கள்",
"add_artist_to_blacklist": "கலைஞரை தடைப்பட்டியலில் சேர்க்க",
"top_tracks": "சிறந்த பாடல்கள்",
"fans_also_like": "ரசிகர்கள் விரும்புவது",
"loading": "ஏற்றுகிறது...",
"artist": "கலைஞர்",
"blacklisted": "தடைப்பட்டியலில் உள்ளது",
"following": "பின்தொடர்கிறது",
"follow": "பின்தொடர்",
"artist_url_copied": "கலைஞர் URL கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது",
"added_to_queue": "{tracks} பாடல்கள் வரிசையில் சேர்க்கப்பட்டன",
"filter_albums": "ஆல்பங்களை வடிகட்டுக...",
"synced": "ஒத்திசைக்கப்பட்டது",
"plain": "சாதாரண",
"shuffle": "கலக்கு",
"search_tracks": "பாடல்களைத் தேடுக...",
"released": "வெளியிடப்பட்டது",
"error": "பிழை {error}",
"title": "தலைப்பு",
"time": "நேரம்",
"more_actions": "மேலும் செயல்கள்",
"download_count": "பதிவிறக்கு ({count})",
"add_count_to_playlist": "({count}) பாடல் பட்டியலில் சேர்",
"add_count_to_queue": "({count}) வரிசையில் சேர்",
"play_count_next": "({count}) அடுத்து இயக்கு",
"album": "ஆல்பம்",
"copied_to_clipboard": "{data} கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது",
"add_to_following_playlists": "{track} பின்வரும் பாடல் பட்டியல்களில் சேர்",
"add": "சேர்",
"added_track_to_queue": "{track} வரிசையில் சேர்க்கப்பட்டது",
"add_to_queue": "வரிசையில் சேர்",
"track_will_play_next": "{track} அடுத்து இயக்கப்படும்",
"play_next": "அடுத்து இயக்கு",
"removed_track_from_queue": "{track} வரிசையிலிருந்து நீக்கப்பட்டது",
"remove_from_queue": "வரிசையிலிருந்து நீக்கு",
"remove_from_favorites": "பிடித்தவையிலிருந்து நீக்கு",
"save_as_favorite": "பிடித்தவையாக சேமி",
"add_to_playlist": "பாடல் பட்டியலில் சேர்",
"remove_from_playlist": "பாடல் பட்டியலிலிருந்து நீக்கு",
"add_to_blacklist": "தடைப்பட்டியலில் சேர்",
"remove_from_blacklist": "தடைப்பட்டியலிலிருந்து நீக்கு",
"share": "பகிர்",
"mini_player": "சிறிய இயக்கி",
"slide_to_seek": "முன்னோக்கி அல்லது பின்னோக்கி செல்ல சறுக்கவும்",
"shuffle_playlist": "பாடல் பட்டியலை கலக்கு",
"unshuffle_playlist": "பாடல் பட்டியலை கலக்காதே",
"previous_track": "முந்தைய பாடல்",
"next_track": "அடுத்த பாடல்",
"pause_playback": "இயக்கத்தை நிறுத்து",
"resume_playback": "இயக்கத்தை தொடர்",
"loop_track": "பாடலை சுழற்று",
"no_loop": "சுழற்சி இல்லை",
"repeat_playlist": "பாடல் பட்டியலை மீண்டும் இயக்கு",
"queue": "வரிசை",
"alternative_track_sources": "மாற்று பாடல் மூலங்கள்",
"download_track": "பாடலைப் பதிவிறக்கு",
"tracks_in_queue": "வரிசையில் {tracks} பாடல்கள்",
"clear_all": "அனைத்தையும் அழி",
"show_hide_ui_on_hover": "மேலே வரும்போது UI ஐக் காட்டு/மறை",
"always_on_top": "எப்போதும் மேலே",
"exit_mini_player": "சிறிய இயக்கியிலிருந்து வெளியேறு",
"download_location": "பதிவிறக்க இடம்",
"local_library": "உள்ளூர் நூலகம்",
"add_library_location": "நூலகத்தில் சேர்",
"remove_library_location": "நூலகத்திலிருந்து நீக்கு",
"account": "கணக்கு",
"login_with_spotify": "உங்கள் Spotify கணக்கில் உள்நுழைக",
"connect_with_spotify": "Spotify உடன் இணைக்கவும்",
"logout": "வெளியேறு",
"logout_of_this_account": "இந்த கணக்கிலிருந்து வெளியேறு",
"language_region": "மொழி & பிராந்தியம்",
"language": "மொழி",
"system_default": "கணினி இயல்புநிலை",
"market_place_region": "சந்தை பிராந்தியம்",
"recommendation_country": "பரிந்துரை நாடு",
"appearance": "தோற்றம்",
"layout_mode": "அமைப்பு முறை",
"override_layout_settings": "தளவமைப்பு அமைப்புகளை மாற்றியமை",
"adaptive": "தகவமைப்பு",
"compact": "சுருக்கமான",
"extended": "விரிவான",
"theme": "தீம்",
"dark": "இருள்",
"light": "வெளிர்",
"system": "கணினி வழி",
"accent_color": "அழுத்த நிறம்",
"sync_album_color": "ஆல்பம் நிறத்தை ஒத்திசை",
"sync_album_color_description": "ஆல்பம் படத்தின் முக்கிய நிறத்தை அழுத்த நிறமாகப் பயன்படுத்துகிறது",
"playback": "பின்னணி",
"audio_quality": "ஒலி தரம்",
"high": "உயர்",
"low": "குறைந்த",
"pre_download_play": "முன்பதிவிறக்கம் மற்றும் இயக்கம்",
"pre_download_play_description": "ஒலியை ஸ்ட்ரீம் செய்வதற்குப் பதிலாக, பைட்டுகளைப் பதிவிறக்கி இயக்கவும் (அதிக பேண்ட்விட்த் பயனர்களுக்கு பரிந்துரைக்கப்படுகிறது)",
"skip_non_music": "இசையல்லாத பகுதிகளைத் தவிர் (SponsorBlock)",
"blacklist_description": "தடைசெய்யப்பட்ட பாடல்கள் மற்றும் கலைஞர்கள்",
"wait_for_download_to_finish": "தற்போதைய பதிவிறக்கம் முடியும் வரை காத்திருக்கவும்",
"desktop": "கணினி",
"close_behavior": "மூடும் நடத்தை",
"close": "மூடு",
"minimize_to_tray": "ட்ரேயை குறைக்கவும்",
"show_tray_icon": "ட்ரே ஐகானைக் காட்டு",
"about": "பற்றி",
"u_love_spotube": "நீங்கள் Spotube ஐ நேசிக்கிறீர்கள் என்பது எங்களுக்குத் தெரியும்",
"check_for_updates": "புதுப்பிப்புகளைச் சரிபார்",
"about_spotube": "Spotube பற்றி",
"blacklist": "தடைப்பட்டியல்",
"please_sponsor": "தயவுசெய்து ஆதரவு/நன்கொடை அளியுங்கள்",
"spotube_description": "Spotube, ஒரு லேசான, பல தளங்களில் இயங்கும், அனைவருக்கும் இலவசமான spotify கிளையன்ட்",
"version": "பதிப்பு",
"build_number": "கட்டமைப்பு எண்",
"founder": "நிறுவனர்",
"repository": "களஞ்சியம்",
"bug_issues": "பிழை_சிக்கல்கள்",
"made_with": "வங்காளதேசத்திலிருந்து🇧🇩 ❤️ உருவாக்கப்பட்டது",
"kingkor_roy_tirtho": "கிங்கர் ராய் திர்தோ",
"copyright": "© 2021-{current_year} கிங்கர் ராய் திர்தோ",
"license": "உரிமம்",
"add_spotify_credentials": "தொடங்குவதற்கு உங்கள் spotify சான்றுகளைச் சேர்க்கவும்",
"credentials_will_not_be_shared_disclaimer": "கவலைப்பட வேண்டாம், உங்கள் சான்றுகள் எதுவும் சேகரிக்கப்படாது அல்லது யாருடனும் பகிரப்படாது",
"know_how_to_login": "இதை எப்படி செய்வது என்று தெரியவில்லையா?",
"follow_step_by_step_guide": "படிப்படியான வழிகாட்டியைப் பின்பற்றவும்",
"spotify_cookie": "Spotify {name} நட்புநிரல்",
"cookie_name_cookie": "{name} நட்புநிரல்",
"fill_in_all_fields": "அனைத்து களங்களையும் நிரப்பவும்",
"submit": "சமர்ப்பி",
"exit": "வெளியேறு",
"previous": "முந்தைய",
"next": "அடுத்து",
"done": "முடிந்தது",
"step_1": "முதல் படி",
"first_go_to": "முதலில், செல்லவேண்டியது",
"login_if_not_logged_in": "நீங்கள் உள்நுழையவில்லை என்றால் உள்நுழைக/பதிவுசெய்க",
"step_2": "இரண்டாம் படி",
"step_2_steps": "1. நீங்கள் உள்நுழைந்தவுடன், F12 ஐ அழுத்தவும் அல்லது வலது கிளிக் செய்து > ஆய்வு செய்யவும் உலாவி டெவ்டூல்களைத் திறக்கவும்.\n2. பின்னர் \"பயன்பாடு\" தாவலுக்குச் செல்லவும் (Chrome, Edge, Brave போன்றவை) அல்லது \"சேமிப்பகம்\" தாவல் (Firefox, Palemoon போன்றவை)\n3. \"குக்கிகள்\" பிரிவுக்குச் சென்று பின்னர் \"https://accounts.spotify.com\" பிரிவுக்குச் செல்லவும்",
"step_3": "மூன்றாம் படி",
"step_3_steps": "\"sp_dc\" நட்புநிரலின் மதிப்பை நகலெடுக்கவும்",
"success_emoji": "வெற்றி🥳",
"success_message": "இப்போது நீங்கள் உங்கள் Spotify கணக்கில் வெற்றிகரமாக உள்நுழைந்துள்ளீர்கள். நல்லது, நண்பரே!",
"step_4": "நான்காம் படி",
"step_4_steps": "நகலெடுக்கப்பட்ட \"sp_dc\" மதிப்பை ஒட்டவும்",
"something_went_wrong": "ஏதோ தவறு நடந்துவிட்டது",
"piped_instance": "Piped சேவையகம் நிகழ்வு",
"piped_description": "பாடல் பொருத்தத்திற்குப் பயன்படுத்த வேண்டிய Piped சேவையகம் நிகழ்வு",
"piped_warning": "அவற்றில் சில நன்றாக வேலை செய்யாமல் இருக்கலாம். எனவே உங்கள் சொந்த ஆபத்தில் பயன்படுத்தவும்",
"invidious_instance": "Invidious சேவையக நிகழ்வு",
"invidious_description": "பாடல் பொருத்தத்திற்குப் பயன்படுத்த வேண்டிய Invidious சேவையக நிகழ்வு",
"invidious_warning": "அவற்றில் சில நன்றாக வேலை செய்யாமல் இருக்கலாம். எனவே உங்கள் சொந்த ஆபத்தில் பயன்படுத்தவும்",
"generate": "உருவாக்கு",
"track_exists": "பாடல் {track} ஏற்கனவே உள்ளது",
"replace_downloaded_tracks": "பதிவிறக்கம் செய்யப்பட்ட அனைத்து பாடல்களையும் மாற்றவும்",
"skip_download_tracks": "பதிவிறக்கம் செய்யப்பட்ட அனைத்து பாடல்களையும் தவிர்க்கவும்",
"do_you_want_to_replace": "ஏற்கனவே உள்ள பாடலை மாற்ற விரும்புகிறீர்களா?",
"replace": "மாற்று",
"skip": "தவிர்",
"select_up_to_count_type": "{count} {type} வரை தேர்ந்தெடுக்கவும்",
"select_genres": "வகைகளைத் தேர்ந்தெடுக்கவும்",
"add_genres": "வகைகளைச் சேர்க்கவும்",
"country": "நாடு",
"number_of_tracks_generate": "உருவாக்க வேண்டிய பாடல்களின் எண்ணிக்கை",
"acousticness": "அகவுஸ்டிக்னெஸ்",
"danceability": "நடனத்தன்மை",
"energy": "ஆற்றல்",
"instrumentalness": "கருவித்தன்மை",
"liveness": "உயிர்ப்புத்தன்மை",
"loudness": "ஒலி அளவு",
"speechiness": "பேச்சுத்தன்மை",
"valence": "உணர்வு",
"popularity": "பிரபலம்",
"key": "இசை குறிப்பு",
"duration": "கால அளவு (வினாடிகள்)",
"tempo": "வேகம் (BPM)",
"mode": "முறை",
"time_signature": "நேர கையொப்பம்",
"short": "குறுகிய",
"medium": "நடுத்தர",
"long": "நீண்ட",
"min": "குறைந்தபட்சம்",
"max": "அதிகபட்சம்",
"target": "இலக்கு",
"moderate": "மிதமான",
"deselect_all": "அனைத்தையும் தேர்வுநீக்கு",
"select_all": "அனைத்தையும் தேர்ந்தெடு",
"are_you_sure": "உறுதியாக இருக்கிறீர்களா?",
"generating_playlist": "உங்கள் தனிப்பயன்பாட்டிற்கான பாடல் பட்டியலை உருவாக்குகிறது...",
"selected_count_tracks": "{count} பாடல்கள் தேர்ந்தெடுக்கப்பட்டன",
"download_warning": "நீங்கள் அனைத்து பாடல்களையும் மொத்தமாக பதிவிறக்கினால், நீங்கள் தெளிவாக இசையைத் திருடுகிறீர்கள் மற்றும் இசையின் படைப்பாற்றல் சமூகத்திற்கு சேதம் விளைவிக்கிறீர்கள். நீங்கள் இதை அறிந்திருக்கிறீர்கள் என்று நம்புகிறேன். எப்போதும், கலைஞரின் கடின உழைப்பை மதித்து ஆதரிக்க முயற்சி செய்யுங்கள்",
"download_ip_ban_warning": "மேலும், அதிகப்படியான பதிவிறக்க கோரிக்கைகள் காரணமாக உங்கள் IP YouTube இல் தடைசெய்யப்படலாம். IP தடை என்பது குறைந்தது 2-3 மாதங்களுக்கு அந்த IP சாதனத்திலிருந்து YouTube ஐப் பயன்படுத்த முடியாது (நீங்கள் உள்நுழைந்திருந்தாலும் கூட). இது ஒருபோதும் நடந்தால் Spotube பொறுப்பேற்காது",
"by_clicking_accept_terms": "'ஏற்றுக்கொள்' என்பதைக் கிளிக் செய்வதன் மூலம் பின்வரும் விதிமுறைகளுக்கு நீங்கள் ஒப்புக்கொள்கிறீர்கள்:",
"download_agreement_1": "நான் இசையைத் திருடுகிறேன் என்பது எனக்குத் தெரியும். நான் கெட்டவன்",
"download_agreement_2": "நான் கலைஞரை முடிந்தவரை ஆதரிப்பேன், அவர்களின் கலைக்கு பணம் செலுத்த எனக்கு பணம் இல்லாததால் மட்டுமே இதைச் செய்கிறேன்",
"download_agreement_3": "என் IP YouTube இல் தடைசெய்யப்படலாம் என்பதை நான் முழுமையாக அறிவேன், மேலும் என் தற்போதைய செயலால் ஏற்படும் எந்த விபத்துகளுக்கும் Spotube அல்லது அதன் உரிமையாளர்கள்/பங்களிப்பாளர்களை பொறுப்பாக்க மாட்டேன்",
"decline": "மறு",
"accept": "ஏற்றுக்கொள்",
"details": "விவரங்கள்",
"youtube": "YouTube",
"channel": "சேனல்",
"likes": "விருப்பங்கள்",
"dislikes": "விருப்பமில்லாதவை",
"views": "பார்வைகள்",
"streamUrl": "ஸ்ட்ரீம் URL",
"stop": "நிறுத்து",
"sort_newest": "புதிதாக சேர்க்கப்பட்டவற்றை வரிசைப்படுத்து",
"sort_oldest": "பழமையானவற்றை வரிசைப்படுத்து",
"sleep_timer": "உறக்க நேரம்",
"mins": "{minutes} நிமிடங்கள்",
"hours": "{hours} மணிநேரங்கள்",
"hour": "{hours} மணிநேரம்",
"custom_hours": "தனிப்பயன் மணிநேரங்கள்",
"logs": "பதிவுகள்",
"developers": "உருவாக்குநர்கள்",
"not_logged_in": "நீங்கள் உள்நுழையவில்லை",
"search_mode": "தேடல் முறை",
"audio_source": "ஒலி மூலம்",
"ok": "சரி",
"failed_to_encrypt": "குறியாக்கம் தோல்வியடைந்தது",
"encryption_failed_warning": "Spotube உங்கள் தரவை பாதுகாப்பாக சேமிக்க குறியாக்கத்தைப் பயன்படுத்துகிறது. ஆனால் அவ்வாறு செய்ய முடியவில்லை. எனவே இது பாதுகாப்பற்ற சேமிப்பகத்திற்கு மாறும்\nநீங்கள் லினக்ஸ் பயன்படுத்துகிறீர்கள் என்றால், எந்த ரகசிய சேவையும் (gnome-keyring, kde-wallet, keepassxc போன்றவை) நிறுவப்பட்டுள்ளதா என்பதை உறுதிப்படுத்தவும்",
"querying_info": "தகவலைக் கேட்கிறது...",
"piped_api_down": "Piped API செயலிழந்துள்ளது",
"piped_down_error_instructions": "Piped நிகழ்வு {pipedInstance} தற்போது செயலிழந்துள்ளது\n\nநிகழ்வை மாற்றவும் அல்லது 'API வகை'யை அதிகாரப்பூர்வ YouTube API க்கு மாற்றவும்\n\nமாற்றத்திற்குப் பிறகு பயன்பாட்டை மறுதொடக்கம் செய்வதை உறுதிப்படுத்தவும்",
"you_are_offline": "நீங்கள் தற்போது ஆஃப்லைனில் உள்ளீர்கள்",
"connection_restored": "உங்கள் இணைய இணைப்பு மீட்டெடுக்கப்பட்டது",
"use_system_title_bar": "கணினி தலைப்புப் பட்டியைப் பயன்படுத்தவும்",
"crunching_results": "முடிவுகளை செயலாக்குகிறது...",
"search_to_get_results": "முடிவுகளைப் பெற தேடவும்",
"use_amoled_mode": "கருமை நிற இருண்ட தீம்",
"pitch_dark_theme": "AMOLED முறை",
"normalize_audio": "ஒலியை சீரமை",
"change_cover": "அட்டையை மாற்று",
"add_cover": "அட்டையைச் சேர்",
"restore_defaults": "இயல்புநிலைகளை மீட்டமை",
"download_music_codec": "இசை கோடெக்கை பதிவிறக்கு",
"streaming_music_codec": "இசை கோடெக்கை ஸ்ட்ரீம் செய்",
"login_with_lastfm": "Last.fm உடன் உள்நுழைக",
"connect": "இணை",
"disconnect_lastfm": "Last.fm இலிருந்து துண்டி",
"disconnect": "துண்டி",
"username": "பயனர்பெயர்",
"password": "கடவுச்சொல்",
"login": "உள்நுழைக",
"login_with_your_lastfm": "உங்கள் Last.fm கணக்குடன் உள்நுழைக",
"scrobble_to_lastfm": "Last.fm க்கு ஸ்க்ரோபிள் செய்",
"go_to_album": "ஆல்பத்திற்குச் செல்",
"discord_rich_presence": "Discord செழுமையான தோற்றம்",
"browse_all": "அனைத்தையும் உலாவு",
"genres": "வகைகள்",
"explore_genres": "வகைகளை ஆராயுங்கள்",
"friends": "நண்பர்கள்",
"no_lyrics_available": "மன்னிக்கவும், இந்தப் பாடலுக்கான பாடல் வரிகளைக் கண்டுபிடிக்க முடியவில்லை",
"start_a_radio": "வானொலியைத் தொடங்கு",
"how_to_start_radio": "வானொலியை எவ்வாறு தொடங்க விரும்புகிறீர்கள்?",
"replace_queue_question": "தற்போதைய வரிசையை மாற்ற விரும்புகிறீர்களா அல்லது அதனுடன் சேர்க்க விரும்புகிறீர்களா?",
"endless_playback": "முடிவற்ற இயக்கம்",
"delete_playlist": "பாடல் பட்டியலை நீக்கு",
"delete_playlist_confirmation": "இந்த பாடல் பட்டியலை நீக்க விரும்புகிறீர்களா?",
"local_tracks": "உள்ளூர் பாடல்கள்",
"local_tab": "உள்ளூர்",
"song_link": "பாடல் இணைப்பு",
"skip_this_nonsense": "இந்த அர்த்தமற்றதைத் தவிர்",
"freedom_of_music": "\"இசையின் சுதந்திரம்\"",
"freedom_of_music_palm": "\"உங்கள் கைகளில் இசையின் சுதந்திரம்\"",
"get_started": "தொடங்குவோம்",
"youtube_source_description": "பரிந்துரைக்கப்படுகிறது மற்றும் சிறப்பாக செயல்படுகிறது.",
"piped_source_description": "சுதந்திரமாக உணர்கிறீர்களா? YouTube போலவே ஆனால் மிகவும் சுதந்திரமானது.",
"jiosaavn_source_description": "தெற்காசியப் பிராந்தியத்திற்கு சிறந்தது.",
"invidious_source_description": "Piped ஐப் போன்றது ஆனால் அதிக கிடைக்கும் தன்மையுடன்.",
"highest_quality": "உயர்ந்த தரம்: {quality}",
"select_audio_source": "ஒலி மூலத்தைத் தேர்ந்தெடுக்கவும்",
"endless_playback_description": "வரிசையின் இறுதியில் புதிய பாடல்களை\nதானாகவே சேர்க்கவும்",
"choose_your_region": "உங்கள் பிராந்தியத்தைத் தேர்ந்தெடுக்கவும்",
"choose_your_region_description": "இது உங்கள் இருப்பிடத்திற்கான சரியான உள்ளடக்கத்தை\nSpotube காட்ட உதவும்.",
"choose_your_language": "உங்கள் மொழியைத் தேர்ந்தெடுக்கவும்",
"help_project_grow": "இந்த திட்டம் வளர உதவுங்கள்",
"help_project_grow_description": "Spotube ஒரு திறந்த மூல திட்டம். திட்டத்திற்கு பங்களிப்பு செய்வதன் மூலம், பிழைகளைப் புகாரளிப்பதன் மூலம் அல்லது புதிய அம்சங்களைப் பரிந்துரைப்பதன் மூலம் இந்தத் திட்டம் வளர உதவலாம்.",
"contribute_on_github": "GitHub இல் பங்களியுங்கள்",
"donate_on_open_collective": "Open Collective இல் நன்கொடை அளியுங்கள்",
"browse_anonymously": "அநாமதேயமாக உலாவுக",
"enable_connect": "இணைப்பை இயக்கு",
"enable_connect_description": "மற்ற சாதனங்களிலிருந்து Spotube ஐக் கட்டுப்படுத்தவும்",
"devices": "சாதனங்கள்",
"select": "தேர்ந்தெடு",
"connect_client_alert": "நீங்கள் {client} ஆல் கட்டுப்படுத்தப்படுகிறீர்கள்",
"this_device": "இந்த சாதனம்",
"remote": "தொலைநிலை",
"stats": "புள்ளிவிவரங்கள்",
"and_n_more": "மற்றும் {count} கூடுதலாக",
"recently_played": "சமீபத்தில் இயக்கியவை",
"browse_more": "மேலும் உலாவு",
"no_title": "தலைப்பு இல்லை",
"not_playing": "இயக்கப்படவில்லை",
"epic_failure": "மோசமான தோல்வி!",
"added_num_tracks_to_queue": "{tracks_length} பாடல்கள் வரிசையில் சேர்க்கப்பட்டன",
"spotube_has_an_update": "Spotube க்கு ஒரு புதுப்பிப்பு உள்ளது",
"download_now": "இப்போது பதிவிறக்கு",
"nightly_version": "Spotube Nightly {nightlyBuildNum} வெளியிடப்பட்டுள்ளது",
"release_version": "Spotube v{version} வெளியிடப்பட்டுள்ளது",
"read_the_latest": "சமீபத்திய ",
"release_notes": "வெளியீட்டு குறிப்புகளைப் படிக்கவும்",
"pick_color_scheme": "வண்ணத் திட்டத்தைத் தேர்ந்தெடுக்கவும்",
"save": "சேமி",
"choose_the_device": "சாதனத்தைத் தேர்ந்தெடுக்கவும்:",
"multiple_device_connected": "பல சாதனங்கள் இணைக்கப்பட்டுள்ளன.\nஇந்த செயல் நடைபெற வேண்டிய சாதனத்தைத் தேர்ந்தெடுக்கவும்",
"nothing_found": "எதுவும் கிடைக்கவில்லை",
"the_box_is_empty": "பெட்டி காலியாக உள்ளது",
"top_artists": "சிறந்த கலைஞர்கள்",
"top_albums": "சிறந்த ஆல்பங்கள்",
"this_week": "இந்த வாரம்",
"this_month": "இந்த மாதம்",
"last_6_months": "கடந்த 6 மாதங்கள்",
"this_year": "இந்த ஆண்டு",
"last_2_years": "கடந்த 2 ஆண்டுகள்",
"all_time": "எல்லா நேரமும்",
"powered_by_provider": "{providerName} ஆல் இயக்கப்படுகிறது",
"email": "மின்னஞ்சல்",
"profile_followers": "பின்தொடர்பவர்கள்",
"birthday": "பிறந்த நாள்",
"subscription": "சந்தா",
"not_born": "பிறக்கவில்லை",
"hacker": "ஹேக்கர்",
"profile": "சுயவிவரம்",
"no_name": "பெயர் இல்லை",
"edit": "திருத்து",
"user_profile": "பயனர் சுயவிவரம்",
"count_plays": "{count} முறை இசைக்கப்பட்டது",
"streaming_fees_hypothetical": "ஸ்ட்ரீமிங் கட்டணங்கள் (கற்பனை)",
"minutes_listened": "காலம் கேட்டது",
"streamed_songs": "ஸ்ட்ரீமிங் செய்யப்பட்ட பாடல்கள்",
"count_streams": "{count} ஸ்ட்ரீம்கள்",
"owned_by_you": "உங்களால் கொண்டது",
"copied_shareurl_to_clipboard": "நகலெடுக்கப்பட்டது {shareUrl} கிளிப்போர்டுக்காக",
"spotify_hipotetical_calculation": "*இது Spotify இன் ஒவ்வொரு ஸ்ட்ரீமிற்கும்\n$0.003 முதல் $0.005 வரை அளவீடு அடிப்படையில் கணக்கிடப்படுகிறது. இது ஒரு கற்பனை\nகணக்கீடு ஆகும், பயனர் எந்த அளவிற்கு கலைஞர்களுக்கு\nஅதோர் பாடலை Spotify மென்பொருளில் கேட்டால் எவ்வளவு பணம் செலுத்தினார்கள் என்பதைக் கண்டுபிடிக்க.",
"count_mins": "{minutes} நிமிடங்கள்",
"summary_minutes": "நிமிடங்கள்",
"summary_listened_to_music": "இசை கேட்டது",
"summary_songs": "பாடல்கள்",
"summary_streamed_overall": "மொத்தமாக ஸ்ட்ரீமிங்",
"summary_owed_to_artists": "கலைஞர்களுக்கு\nஇந்த மாதம் சொந்தமானது",
"summary_artists": "கலைஞர்கள்",
"summary_music_reached_you": "இசை உங்களுக்கு வந்தது",
"summary_full_albums": "முழு ஆல்பங்கள்",
"summary_got_your_love": "உங்கள் அன்பை பெற்றுக்கொண்டேன்",
"summary_playlists": "பாடல் பட்டியல்கள்",
"summary_were_on_repeat": "மீண்டும் மீண்டும் இருந்தன",
"total_money": "மொத்தம் {money}",
"webview_not_found": "வெப்வியூ கிடைக்கவில்லை",
"webview_not_found_description": "உங்கள் சாதனத்தில் எந்தவொரு வெப்வியூ இயக்கத்தை நிறுவவில்லை.\nஇது நிறுவப்பட்டிருந்தால், சுற்றுச்சூழல் பாதையில் PATH உள்ளது என்பதை உறுதிபடுத்தவும்\n\nநிறுவித்த பிறகு, செயலியை மறுதொடக்கம் செய்யவும்",
"unsupported_platform": "அதிர்ஷ்டகாத உருப்படியை ஆதரிக்கவில்லை",
"cache_music": "இசையை கேஷ் செய்",
"open": "திறக்கவும்",
"cache_folder": "கேஷ் அடைவு",
"export": "ஏற்றுமதி",
"clear_cache": "கேஷ் அழிக்கவும்",
"clear_cache_confirmation": "கேஷைப் அழிக்க விரும்புகிறீர்களா?",
"export_cache_files": "கேஷில் உள்ள கோப்புகளை ஏற்றுமதி செய்யவும்",
"found_n_files": "{count} கோப்புகள் கிடைத்தன",
"export_cache_confirmation": "இந்த கோப்புகளை ஏற்றுமதி செய்ய விரும்புகிறீர்களா?",
"exported_n_out_of_m_files": "{filesExported} கோப்புகள் ஏற்றுமதி செய்யப்பட்டன, {files} கோப்புகளில்",
"undo": "செயல்தவிர்",
"download_all": "அனைத்தையும் பதிவிறக்குக",
"add_all_to_playlist": "அனைத்தையும் பாடல் பட்டியலில் சேர்க்கவும்",
"add_all_to_queue": "அனைத்தையும் வரிசைப்படுத்து",
"play_all_next": "அடுத்த உள்ள அனைத்தையும் இயக்கு",
"pause": "நிறுத்து",
"view_all": "அனைத்தையும் காண்க",
"no_tracks_added_yet": "உங்கள் பாடல்களை இன்னும் சேர்க்கவில்லை என்றால் தெரியாதே",
"no_tracks": "இங்கு பாடல்கள் எதுவும் இல்லை",
"no_tracks_listened_yet": "இன்னும் எதையும் கேள்வியில்லை",
"not_following_artists": "நீங்கள் எந்த கலைஞரையும் பின்தொடரவில்லை",
"no_favorite_albums_yet": "நீங்கள் இன்னும் எந்த ஆல்பங்களையும் பிடித்தவையாகச் சேர்க்கவில்லை",
"no_logs_found": "பதிவுகள் எதுவும் கிடைக்கவில்லை",
"youtube_engine": "YouTube இயந்திரம்",
"youtube_engine_not_installed_title": "{engine} நிறுவியதில்லை",
"youtube_engine_not_installed_message": "{engine} உங்கள் கணினியில் நிறுவியதில்லை.",
"youtube_engine_set_path": "PATH மாறியில் கிடைக்கிறதா என்பதை உறுதிப்படுத்தவும் அல்லது\n{engine} செயல் செய்யக்கூடிய முறையை கீழே அமைக்கவும்",
"youtube_engine_unix_issue_message": "macOS/Linux/unix போல் OS இல், .zshrc/.bashrc/.bash_profile போன்றவை அமைப்பில் பாதையை PATH அமைப்பது இயலாது.\nநீங்கள்.shell configuration file இல் பாதையை அமைக்க வேண்டும்",
"download": "பதிவிறக்கு",
"file_not_found": "கோப்பு கிடைக்கவில்லை",
"custom": "தனிப்பயன்",
"add_custom_url": "தனிப்பயன் URL ஐச் சேர்க்கவும்"
}

View File

@ -427,9 +427,5 @@
"download": "ดาวน์โหลด",
"file_not_found": "ไม่พบไฟล์",
"custom": "กำหนดเอง",
"add_custom_url": "เพิ่ม URL แบบกำหนดเอง",
"edit_port": "แก้ไขพอร์ต",
"port_helper_msg": "ค่าเริ่มต้นคือ -1 ซึ่งหมายถึงหมายเลขสุ่ม หากคุณได้กำหนดค่าไฟร์วอลล์แล้ว แนะนำให้ตั้งค่านี้",
"connect_request": "อนุญาตให้ {client} เชื่อมต่อหรือไม่?",
"connection_request_denied": "การเชื่อมต่อล้มเหลว ผู้ใช้ปฏิเสธการเข้าถึง"
"add_custom_url": "เพิ่ม URL แบบกำหนดเอง"
}

View File

@ -1,432 +1,428 @@
{
"guest": "Bisita",
"browse": "Mag-browse",
"search": "Maghanap",
"library": "Silid-aklatan",
"lyrics": "Mga Liriko",
"settings": "Mga Setting",
"genre_categories_filter": "I-filter ang mga kategorya o genre...",
"genre": "Genre",
"personalized": "Naka-personalize",
"featured": "Tampok",
"new_releases": "Mga Bagong Paglabas",
"songs": "Mga Kanta",
"playing_track": "Tumutugtog ang {track}",
"queue_clear_alert": "Ito ay magbubura ng kasalukuyang pila. {track_length} na mga track ang tatanggalin\nGusto mo bang magpatuloy?",
"load_more": "Mag-load pa",
"playlists": "Mga Playlist",
"artists": "Mga Artista",
"albums": "Mga Album",
"tracks": "Mga Track",
"downloads": "Mga Download",
"filter_playlists": "I-filter ang iyong mga playlist...",
"liked_tracks": "Mga Nagustuhang Track",
"liked_tracks_description": "Lahat ng mga track na iyong nagustuhan",
"playlist": "Playlist",
"create_a_playlist": "Gumawa ng playlist",
"update_playlist": "I-update ang playlist",
"create": "Lumikha",
"cancel": "Ikansela",
"update": "I-update",
"playlist_name": "Pangalan ng Playlist",
"name_of_playlist": "Pangalan ng playlist",
"description": "Paglalarawan",
"public": "Pampubliko",
"collaborative": "Pakikipagtulungan",
"search_local_tracks": "Maghanap ng mga lokal na track...",
"play": "I-play",
"delete": "Burahin",
"none": "Wala",
"sort_a_z": "Ayusin ayon sa A-Z",
"sort_z_a": "Ayusin ayon sa Z-A",
"sort_artist": "Ayusin ayon sa Artista",
"sort_album": "Ayusin ayon sa Album",
"sort_duration": "Ayusin ayon sa Tagal",
"sort_tracks": "Ayusin ang mga Track",
"currently_downloading": "Kasalukuyang Nagda-download ({tracks_length})",
"cancel_all": "Kanselahin Lahat",
"filter_artist": "I-filter ang mga artista...",
"followers": "{followers} na mga Tagasunod",
"add_artist_to_blacklist": "Idagdag ang artista sa blacklist",
"top_tracks": "Mga Nangungunang Track",
"fans_also_like": "Gusto rin ng mga tagahanga",
"loading": "Naglo-load...",
"artist": "Artista",
"blacklisted": "Naka-blacklist",
"following": "Sinusundan",
"follow": "Sundan",
"artist_url_copied": "Na-copy sa clipboard ang URL ng artista",
"added_to_queue": "Idinagdag ang {tracks} na mga track sa pila",
"filter_albums": "I-filter ang mga album...",
"synced": "Naka-sync",
"plain": "Simpleng",
"shuffle": "I-shuffle",
"search_tracks": "Maghanap ng mga track...",
"released": "Inilabas",
"error": "Error {error}",
"title": "Pamagat",
"time": "Oras",
"more_actions": "Higit pang mga aksyon",
"download_count": "I-download ({count})",
"add_count_to_playlist": "Idagdag ({count}) sa Playlist",
"add_count_to_queue": "Idagdag ({count}) sa Pila",
"play_count_next": "I-play ({count}) kasunod",
"album": "Album",
"copied_to_clipboard": "Na-copy ang {data} sa clipboard",
"add_to_following_playlists": "Idagdag ang {track} sa mga sumusunod na Playlist",
"add": "Idagdag",
"added_track_to_queue": "Idinagdag ang {track} sa pila",
"add_to_queue": "Idagdag sa pila",
"track_will_play_next": "Ang {track} ay tutugtog susunod",
"play_next": "I-play susunod",
"removed_track_from_queue": "Tinanggal ang {track} mula sa pila",
"remove_from_queue": "Alisin mula sa pila",
"remove_from_favorites": "Alisin mula sa mga paborito",
"save_as_favorite": "I-save bilang paborito",
"add_to_playlist": "Idagdag sa playlist",
"remove_from_playlist": "Alisin mula sa playlist",
"add_to_blacklist": "Idagdag sa blacklist",
"remove_from_blacklist": "Alisin mula sa blacklist",
"share": "Ibahagi",
"mini_player": "Mini Player",
"slide_to_seek": "I-slide para mag-seek pasulong o pabalik",
"shuffle_playlist": "I-shuffle ang playlist",
"unshuffle_playlist": "I-unshuffle ang playlist",
"previous_track": "Nakaraang track",
"next_track": "Susunod na track",
"pause_playback": "I-pause ang Playback",
"resume_playback": "Ipagpatuloy ang Playback",
"loop_track": "I-loop ang track",
"no_loop": "Walang loop",
"repeat_playlist": "Ulitin ang playlist",
"queue": "Pila",
"alternative_track_sources": "Alternatibong mga pinagmulan ng track",
"download_track": "I-download ang track",
"tracks_in_queue": "{tracks} na mga track sa pila",
"clear_all": "Burahin lahat",
"show_hide_ui_on_hover": "Ipakita/Itago ang UI sa hover",
"always_on_top": "Palaging nasa ibabaw",
"exit_mini_player": "Lumabas sa Mini player",
"download_location": "Lokasyon ng pag-download",
"local_library": "Lokal na silid-aklatan",
"add_library_location": "Idagdag sa silid-aklatan",
"remove_library_location": "Alisin mula sa silid-aklatan",
"account": "Account",
"login_with_spotify": "Mag-login gamit ang iyong Spotify account",
"connect_with_spotify": "Kumonekta sa Spotify",
"logout": "Mag-logout",
"logout_of_this_account": "Mag-logout sa account na ito",
"language_region": "Wika at Rehiyon",
"language": "Wika",
"system_default": "Default ng Sistema",
"market_place_region": "Rehiyon ng Marketplace",
"recommendation_country": "Bansang Inirerekomenda",
"appearance": "Hitsura",
"layout_mode": "Mode ng Layout",
"override_layout_settings": "I-override ang mga setting ng responsive layout mode",
"adaptive": "Umaangkop",
"compact": "Kompakto",
"extended": "Pinalawig",
"theme": "Tema",
"dark": "Madilim",
"light": "Maliwanag",
"system": "Sistema",
"accent_color": "Kulay ng Accent",
"sync_album_color": "I-sync ang kulay ng album",
"sync_album_color_description": "Ginagamit ang pangunahing kulay ng album art bilang kulay ng accent",
"playback": "Playback",
"audio_quality": "Kalidad ng Audio",
"high": "Mataas",
"low": "Mababa",
"pre_download_play": "Mag-pre-download at i-play",
"pre_download_play_description": "Sa halip na mag-stream ng audio, mag-download ng bytes at i-play sa halip (Inirerekomenda para sa mga gumagamit ng mataas na bandwidth)",
"skip_non_music": "Laktawan ang mga segment na hindi musika (SponsorBlock)",
"blacklist_description": "Mga track at artista na nasa blacklist",
"wait_for_download_to_finish": "Mangyaring maghintay para matapos ang kasalukuyang pag-download",
"desktop": "Desktop",
"close_behavior": "Pag-uugali ng Pagsara",
"close": "Isara",
"minimize_to_tray": "I-minimize sa tray",
"show_tray_icon": "Ipakita ang icon ng System tray",
"about": "Tungkol sa",
"u_love_spotube": "Alam naming gusto mo ang Spotube",
"check_for_updates": "Maghanap ng mga update",
"about_spotube": "Tungkol sa Spotube",
"blacklist": "Blacklist",
"please_sponsor": "Mangyaring Mag-sponsor/Mag-donate",
"spotube_description": "Spotube, isang magaan, cross-platform, libreng-para-sa-lahat na spotify client",
"version": "Bersyon",
"build_number": "Build Number",
"founder": "Nagtatag",
"repository": "Repository",
"bug_issues": "Bug+Mga Isyu",
"made_with": "Ginawa nang may ❤️ sa Bangladesh🇧🇩",
"kingkor_roy_tirtho": "Kingkor Roy Tirtho",
"copyright": "© 2021-{current_year} Kingkor Roy Tirtho",
"license": "Lisensya",
"add_spotify_credentials": "Idagdag ang iyong mga kredensyal sa spotify para makapagsimula",
"credentials_will_not_be_shared_disclaimer": "Huwag mag-alala, ang alinman sa iyong mga kredensyal ay hindi kokolektahin o ibabahagi sa sinuman",
"know_how_to_login": "Hindi mo alam kung paano gawin ito?",
"follow_step_by_step_guide": "Sundin ang Hakbang-hakbang na gabay",
"spotify_cookie": "Spotify {name} Cookie",
"cookie_name_cookie": "{name} Cookie",
"fill_in_all_fields": "Mangyaring punan ang lahat ng field",
"submit": "Isumite",
"exit": "Lumabas",
"previous": "Nakaraan",
"next": "Susunod",
"done": "Tapos na",
"step_1": "Hakbang 1",
"first_go_to": "Una, Pumunta sa",
"login_if_not_logged_in": "at Mag-login/Mag-signup kung hindi ka naka-log in",
"step_2": "Hakbang 2",
"step_2_steps": "1. Kapag naka-log in ka na, pindutin ang F12 o i-right click ang Mouse > Inspect para Buksan ang Browser devtools.\n2. Pagkatapos ay pumunta sa \"Application\" Tab (Chrome, Edge, Brave atbp..) o \"Storage\" Tab (Firefox, Palemoon atbp..)\n3. Pumunta sa \"Cookies\" na seksyon at pagkatapos sa \"https://accounts.spotify.com\" na subseksyon",
"step_3": "Hakbang 3",
"step_3_steps": "Kopyahin ang halaga ng \"sp_dc\" Cookie",
"success_emoji": "Tagumpay🥳",
"success_message": "Ngayon ay matagumpay kang Naka-log in gamit ang iyong Spotify account. Magaling, kaibigan!",
"step_4": "Hakbang 4",
"step_4_steps": "I-paste ang na-kopyang halaga ng \"sp_dc\"",
"something_went_wrong": "May nangyaring mali",
"piped_instance": "Instance ng Piped Server",
"piped_description": "Ang instance ng Piped server na gagamitin para sa pagtutugma ng track",
"piped_warning": "Maaaring hindi gumagana nang mabuti ang ilan sa mga ito. Kaya gamitin sa sarili mong peligro",
"invidious_instance": "Instance ng Invidious Server",
"invidious_description": "Ang instance ng Invidious server na gagamitin para sa pagtutugma ng track",
"invidious_warning": "Maaaring hindi gumagana nang mabuti ang ilan sa mga ito. Kaya gamitin sa sarili mong peligro",
"generate": "Gumawa",
"track_exists": "Ang Track na {track} ay umiiral na",
"replace_downloaded_tracks": "Palitan ang lahat ng na-download na mga track",
"skip_download_tracks": "Laktawan ang pag-download ng lahat ng na-download na mga track",
"do_you_want_to_replace": "Gusto mo bang palitan ang umiiral na track??",
"replace": "Palitan",
"skip": "Laktawan",
"select_up_to_count_type": "Pumili ng hanggang {count} {type}",
"select_genres": "Pumili ng mga Genre",
"add_genres": "Magdagdag ng mga Genre",
"country": "Bansa",
"number_of_tracks_generate": "Bilang ng mga track na gagawin",
"acousticness": "Acoustic-ness",
"danceability": "Kakayahang Sayawin",
"energy": "Enerhiya",
"instrumentalness": "Instrumental-ness",
"liveness": "Liveness",
"loudness": "Lakas",
"speechiness": "Pagsasalita",
"valence": "Valence",
"popularity": "Popularidad",
"key": "Key",
"duration": "Tagal (s)",
"tempo": "Tempo (BPM)",
"mode": "Mode",
"time_signature": "Time Signature",
"short": "Maikli",
"medium": "Katamtaman",
"long": "Mahaba",
"min": "Min",
"max": "Max",
"target": "Target",
"moderate": "Katamtaman",
"deselect_all": "Alisin ang Pagkakapili sa Lahat",
"select_all": "Piliin Lahat",
"are_you_sure": "Sigurado ka ba?",
"generating_playlist": "Gumagawa ng iyong custom na playlist...",
"selected_count_tracks": "Napili ang {count} na mga track",
"download_warning": "Kung nag-download ka ng lahat ng Track sa maramihan, malinaw na nagpa-pirate ka ng Musika at nagsasanhi ng pinsala sa creative society ng Musika. Sana ay alam mo ito. Palaging, subukang igalang at suportahan ang masipag na paggawa ng Artist",
"download_ip_ban_warning": "Sa nga pala, ang iyong IP ay maaaring ma-block sa YouTube dahil sa sobrang mga kahilingan sa pag-download kaysa sa karaniwan. Ang IP block ay nangangahulugang hindi mo magagamit ang YouTube (kahit na naka-log in ka) sa loob ng hindi bababa sa 2-3 buwan mula sa device na may IP na iyon. At hindi pinanghahawakan ng Spotube ang anumang responsibilidad kung mangyayari ito",
"by_clicking_accept_terms": "Sa pamamagitan ng pag-click sa 'tanggapin', sumasang-ayon ka sa mga sumusunod na tuntunin:",
"download_agreement_1": "Alam kong nagpa-pirate ako ng Musika. Masama ako",
"download_agreement_2": "Susuportahan ko ang Artist saan man ako maaari at ginagawa ko lang ito dahil wala akong pera para bumili ng kanilang sining",
"download_agreement_3": "Lubos kong nauunawaan na ang aking IP ay maaaring ma-block sa YouTube at hindi ko pinanghahawakan ang Spotube o ang kanyang mga may-ari/nag-ambag na responsable para sa anumang aksidente na sanhi ng aking kasalukuyang aksyon",
"decline": "Tanggihan",
"accept": "Tanggapin",
"details": "Mga Detalye",
"youtube": "YouTube",
"channel": "Channel",
"likes": "Mga Like",
"dislikes": "Mga Dislike",
"views": "Mga View",
"streamUrl": "Stream URL",
"stop": "Ihinto",
"sort_newest": "Ayusin ayon sa pinakabagong idinagdag",
"sort_oldest": "Ayusin ayon sa pinakalumang idinagdag",
"sleep_timer": "Sleep Timer",
"mins": "{minutes} Minuto",
"hours": "{hours} Oras",
"hour": "{hours} Oras",
"custom_hours": "Custom na Oras",
"logs": "Mga Log",
"developers": "Mga Developer",
"not_logged_in": "Hindi ka naka-log in",
"search_mode": "Mode ng Paghahanap",
"audio_source": "Pinagmulan ng Audio",
"ok": "Ok",
"failed_to_encrypt": "Nabigong i-encrypt",
"encryption_failed_warning": "Gumagamit ng encryption ang Spotube para ligtas na i-store ang iyong data. Ngunit nabigo. Kaya babalik ito sa hindi secure na storage\nKung gumagamit ka ng linux, mangyaring tiyakin na mayroon kang anumang secret-service na naka-install (gnome-keyring, kde-wallet, keepassxc atbp)",
"querying_info": "Kinukuha ang impormasyon...",
"piped_api_down": "Ang Piped API ay hindi gumagana",
"piped_down_error_instructions": "Ang instance ng Piped na {pipedInstance} ay kasalukuyang hindi gumagana\n\nMaaari mong baguhin ang instance o baguhin ang 'Uri ng API' sa opisyal na YouTube API\n\nSiguraduhing i-restart ang app pagkatapos ng pagbabago",
"you_are_offline": "Kasalukuyan kang offline",
"connection_restored": "Naibalik na ang iyong koneksyon sa internet",
"use_system_title_bar": "Gamitin ang title bar ng system",
"crunching_results": "Pinaproseso ang mga resulta...",
"search_to_get_results": "Maghanap para makakuha ng mga resulta",
"use_amoled_mode": "Matingkad na itim na madilim na tema",
"pitch_dark_theme": "AMOLED Mode",
"normalize_audio": "I-normalize ang audio",
"change_cover": "Baguhin ang cover",
"add_cover": "Magdagdag ng cover",
"restore_defaults": "Ibalik ang mga default",
"download_music_codec": "Codec para sa pag-download ng musika",
"streaming_music_codec": "Codec para sa pag-stream ng musika",
"login_with_lastfm": "Mag-login gamit ang Last.fm",
"connect": "Kumonekta",
"disconnect_lastfm": "Idiskonekta ang Last.fm",
"disconnect": "Idiskonekta",
"username": "Username",
"password": "Password",
"login": "Mag-login",
"login_with_your_lastfm": "Mag-login gamit ang iyong Last.fm account",
"scrobble_to_lastfm": "I-scrobble sa Last.fm",
"go_to_album": "Pumunta sa Album",
"discord_rich_presence": "Discord Rich Presence",
"browse_all": "I-browse Lahat",
"genres": "Mga Genre",
"explore_genres": "Tuklasin ang mga Genre",
"friends": "Mga Kaibigan",
"no_lyrics_available": "Paumanhin, hindi mahanap ang lyrics para sa track na ito",
"start_a_radio": "Magsimula ng Radio",
"how_to_start_radio": "Paano mo gustong simulan ang radio?",
"replace_queue_question": "Gusto mo bang palitan ang kasalukuyang pila o idagdag dito?",
"endless_playback": "Walang Hanggang Playback",
"delete_playlist": "Burahin ang Playlist",
"delete_playlist_confirmation": "Sigurado ka bang gusto mong burahin ang playlist na ito?",
"local_tracks": "Mga Lokal na Track",
"local_tab": "Lokal",
"song_link": "Link ng Kanta",
"skip_this_nonsense": "Laktawan ang kalokohan na ito",
"freedom_of_music": "\"Kalayaan ng Musika\"",
"freedom_of_music_palm": "\"Kalayaan ng Musika sa iyong palad\"",
"get_started": "Magsimula na tayo",
"youtube_source_description": "Inirerekomenda at pinakamahusay na gumagana.",
"piped_source_description": "Gusto ng kalayaan? Kapareho ng YouTube ngunit mas malaya.",
"jiosaavn_source_description": "Pinakamahusay para sa rehiyon ng South Asia.",
"invidious_source_description": "Katulad ng Piped ngunit may mas mataas na availability.",
"highest_quality": "Pinakamataas na Kalidad: {quality}",
"select_audio_source": "Pumili ng Pinagmulan ng Audio",
"endless_playback_description": "Awtomatikong magdagdag ng mga bagong kanta\nsa dulo ng pila",
"choose_your_region": "Piliin ang iyong rehiyon",
"choose_your_region_description": "Ito ay tutulong sa Spotube na ipakita sa iyo ang tamang content\npara sa iyong lokasyon.",
"choose_your_language": "Piliin ang iyong wika",
"help_project_grow": "Tulungan ang proyektong ito na lumago",
"help_project_grow_description": "Ang Spotube ay isang open-source na proyekto. Maaari mong tulungan ang proyektong ito na lumago sa pamamagitan ng pag-contribute sa proyekto, pag-ulat ng mga bug, o pagmungkahi ng mga bagong feature.",
"contribute_on_github": "Mag-contribute sa GitHub",
"donate_on_open_collective": "Mag-donate sa Open Collective",
"browse_anonymously": "Mag-browse nang Anonymous",
"enable_connect": "I-enable ang Connect",
"enable_connect_description": "Kontrolin ang Spotube mula sa ibang mga device",
"devices": "Mga Device",
"select": "Pumili",
"connect_client_alert": "Ikaw ay kontrolado ng {client}",
"this_device": "Ang Device na ito",
"remote": "Remote",
"stats": "Mga Stat",
"and_n_more": "at {count} pa",
"recently_played": "Kamakailan Lang na Ni-play",
"browse_more": "Mag-browse pa",
"no_title": "Walang Pamagat",
"not_playing": "Hindi tumutugtog",
"epic_failure": "Epic na pagkabigo!",
"added_num_tracks_to_queue": "Nagdagdag ng {tracks_length} na mga track sa pila",
"spotube_has_an_update": "Ang Spotube ay may update",
"download_now": "I-download Ngayon",
"nightly_version": "Ang Spotube Nightly {nightlyBuildNum} ay inilabas na",
"release_version": "Ang Spotube v{version} ay inilabas na",
"read_the_latest": "Basahin ang pinakabagong ",
"release_notes": "release notes",
"pick_color_scheme": "Pumili ng color scheme",
"save": "I-save",
"choose_the_device": "Piliin ang device:",
"multiple_device_connected": "Mayroong maraming device na nakakonekta.\nPiliin ang device kung saan mo gustong maganap ang aksyon na ito",
"nothing_found": "Walang nahanap",
"the_box_is_empty": "Ang kahon ay walang laman",
"top_artists": "Nangungunang mga Artista",
"top_albums": "Nangungunang mga Album",
"this_week": "Ngayong linggo",
"this_month": "Ngayong buwan",
"last_6_months": "Nakaraang 6 na buwan",
"this_year": "Ngayong taon",
"last_2_years": "Nakaraang 2 taon",
"all_time": "Lahat ng panahon",
"powered_by_provider": "Pinapagana ng {providerName}",
"email": "Email",
"profile_followers": "Mga Tagasunod",
"birthday": "Kaarawan",
"subscription": "Subscription",
"not_born": "Hindi pa ipinanganak",
"hacker": "Hacker",
"profile": "Profile",
"no_name": "Walang Pangalan",
"edit": "I-edit",
"user_profile": "Profile ng User",
"count_plays": "{count} na mga play",
"streaming_fees_hypothetical": "Mga bayarin sa streaming (hypothetical)",
"minutes_listened": "Mga minutong pinapakinggan",
"streamed_songs": "Mga na-stream na kanta",
"count_streams": "{count} na mga stream",
"owned_by_you": "Pag-aari mo",
"copied_shareurl_to_clipboard": "Na-kopya ang {shareUrl} sa clipboard",
"spotify_hipotetical_calculation": "*Ito ay kinalkula batay sa bawat stream\nna bayad ng Spotify na $0.003 hanggang $0.005. Ito ay isang hypothetical\nna pagkalkula para bigyan ang user ng ideya kung magkano\nang kanilang ibabayad sa mga artista kung sila ay nakikinig\nng kanilang kanta sa Spotify.",
"count_mins": "{minutes} minuto",
"summary_minutes": "minuto",
"summary_listened_to_music": "Nakinig sa musika",
"summary_songs": "mga kanta",
"summary_streamed_overall": "Na-stream sa kabuuan",
"summary_owed_to_artists": "Utang sa mga artista\nngayong buwan",
"summary_artists": "artista",
"summary_music_reached_you": "Umabot sa iyo ang musika",
"summary_full_albums": "buong album",
"summary_got_your_love": "Nakuha ang iyong pagmamahal",
"summary_playlists": "mga playlist",
"summary_were_on_repeat": "Pinu-playlst muli",
"total_money": "Kabuuang {money}",
"webview_not_found": "Hindi nahanap ang Webview",
"webview_not_found_description": "Walang webview runtime na naka-install sa iyong device.\nKung naka-install ito, siguraduhing nasa Environment PATH\n\nPagkatapos mag-install, i-restart ang app",
"unsupported_platform": "Hindi suportadong platform",
"cache_music": "I-cache ang musika",
"open": "Buksan",
"cache_folder": "Folder ng cache",
"export": "I-export",
"clear_cache": "Burahin ang cache",
"clear_cache_confirmation": "Gusto mo bang burahin ang cache?",
"export_cache_files": "I-export ang mga Naka-cache na File",
"found_n_files": "Nahanap ang {count} na mga file",
"export_cache_confirmation": "Gusto mo bang i-export ang mga file na ito sa",
"exported_n_out_of_m_files": "Na-export ang {filesExported} mula sa {files} na mga file",
"undo": "I-undo",
"download_all": "I-download lahat",
"add_all_to_playlist": "Idagdag lahat sa playlist",
"add_all_to_queue": "Idagdag lahat sa pila",
"play_all_next": "I-play lahat susunod",
"pause": "Pause",
"view_all": "Tingnan lahat",
"no_tracks_added_yet": "Mukhang wala ka pang idinaragdag na mga track",
"no_tracks": "Mukhang walang mga track dito",
"no_tracks_listened_yet": "Mukhang wala ka pang pinakikinggan",
"not_following_artists": "Hindi ka sumusunod sa anumang mga artista",
"no_favorite_albums_yet": "Mukhang wala ka pang idinagdag na anumang mga album sa iyong mga paborito",
"no_logs_found": "Walang nahanap na mga log",
"youtube_engine": "YouTube Engine",
"youtube_engine_not_installed_title": "Hindi naka-install ang {engine}",
"youtube_engine_not_installed_message": "Hindi naka-install ang {engine} sa iyong sistema.",
"youtube_engine_set_path": "Siguraduhing available ito sa PATH variable o\ni-set ang absolute path sa {engine} executable sa ibaba",
"youtube_engine_unix_issue_message": "Sa macOS/Linux/unix tulad ng OS, ang pag-set ng path sa .zshrc/.bashrc/.bash_profile atbp. ay hindi gagana.\nKailangan mong i-set ang path sa configuration file ng shell",
"download": "I-download",
"file_not_found": "Hindi nahanap ang file",
"custom": "Custom",
"add_custom_url": "Magdagdag ng custom URL",
"edit_port": "I-edit ang port",
"port_helper_msg": "Ang default ay -1 na nagpapahiwatig ng random na numero. Kung na-configure mo ang firewall, inirerekomenda na itakda ito.",
"connect_request": "Payagan ang {client} na kumonekta?",
"connection_request_denied": "Tanggihan ang koneksyon. Tinanggihan ng gumagamit ang pag-access."
}
"guest": "Bisita",
"browse": "Mag-browse",
"search": "Maghanap",
"library": "Silid-aklatan",
"lyrics": "Mga Liriko",
"settings": "Mga Setting",
"genre_categories_filter": "I-filter ang mga kategorya o genre...",
"genre": "Genre",
"personalized": "Naka-personalize",
"featured": "Tampok",
"new_releases": "Mga Bagong Paglabas",
"songs": "Mga Kanta",
"playing_track": "Tumutugtog ang {track}",
"queue_clear_alert": "Ito ay magbubura ng kasalukuyang pila. {track_length} na mga track ang tatanggalin\nGusto mo bang magpatuloy?",
"load_more": "Mag-load pa",
"playlists": "Mga Playlist",
"artists": "Mga Artista",
"albums": "Mga Album",
"tracks": "Mga Track",
"downloads": "Mga Download",
"filter_playlists": "I-filter ang iyong mga playlist...",
"liked_tracks": "Mga Nagustuhang Track",
"liked_tracks_description": "Lahat ng mga track na iyong nagustuhan",
"playlist": "Playlist",
"create_a_playlist": "Gumawa ng playlist",
"update_playlist": "I-update ang playlist",
"create": "Lumikha",
"cancel": "Ikansela",
"update": "I-update",
"playlist_name": "Pangalan ng Playlist",
"name_of_playlist": "Pangalan ng playlist",
"description": "Paglalarawan",
"public": "Pampubliko",
"collaborative": "Pakikipagtulungan",
"search_local_tracks": "Maghanap ng mga lokal na track...",
"play": "I-play",
"delete": "Burahin",
"none": "Wala",
"sort_a_z": "Ayusin ayon sa A-Z",
"sort_z_a": "Ayusin ayon sa Z-A",
"sort_artist": "Ayusin ayon sa Artista",
"sort_album": "Ayusin ayon sa Album",
"sort_duration": "Ayusin ayon sa Tagal",
"sort_tracks": "Ayusin ang mga Track",
"currently_downloading": "Kasalukuyang Nagda-download ({tracks_length})",
"cancel_all": "Kanselahin Lahat",
"filter_artist": "I-filter ang mga artista...",
"followers": "{followers} na mga Tagasunod",
"add_artist_to_blacklist": "Idagdag ang artista sa blacklist",
"top_tracks": "Mga Nangungunang Track",
"fans_also_like": "Gusto rin ng mga tagahanga",
"loading": "Naglo-load...",
"artist": "Artista",
"blacklisted": "Naka-blacklist",
"following": "Sinusundan",
"follow": "Sundan",
"artist_url_copied": "Na-copy sa clipboard ang URL ng artista",
"added_to_queue": "Idinagdag ang {tracks} na mga track sa pila",
"filter_albums": "I-filter ang mga album...",
"synced": "Naka-sync",
"plain": "Simpleng",
"shuffle": "I-shuffle",
"search_tracks": "Maghanap ng mga track...",
"released": "Inilabas",
"error": "Error {error}",
"title": "Pamagat",
"time": "Oras",
"more_actions": "Higit pang mga aksyon",
"download_count": "I-download ({count})",
"add_count_to_playlist": "Idagdag ({count}) sa Playlist",
"add_count_to_queue": "Idagdag ({count}) sa Pila",
"play_count_next": "I-play ({count}) kasunod",
"album": "Album",
"copied_to_clipboard": "Na-copy ang {data} sa clipboard",
"add_to_following_playlists": "Idagdag ang {track} sa mga sumusunod na Playlist",
"add": "Idagdag",
"added_track_to_queue": "Idinagdag ang {track} sa pila",
"add_to_queue": "Idagdag sa pila",
"track_will_play_next": "Ang {track} ay tutugtog susunod",
"play_next": "I-play susunod",
"removed_track_from_queue": "Tinanggal ang {track} mula sa pila",
"remove_from_queue": "Alisin mula sa pila",
"remove_from_favorites": "Alisin mula sa mga paborito",
"save_as_favorite": "I-save bilang paborito",
"add_to_playlist": "Idagdag sa playlist",
"remove_from_playlist": "Alisin mula sa playlist",
"add_to_blacklist": "Idagdag sa blacklist",
"remove_from_blacklist": "Alisin mula sa blacklist",
"share": "Ibahagi",
"mini_player": "Mini Player",
"slide_to_seek": "I-slide para mag-seek pasulong o pabalik",
"shuffle_playlist": "I-shuffle ang playlist",
"unshuffle_playlist": "I-unshuffle ang playlist",
"previous_track": "Nakaraang track",
"next_track": "Susunod na track",
"pause_playback": "I-pause ang Playback",
"resume_playback": "Ipagpatuloy ang Playback",
"loop_track": "I-loop ang track",
"no_loop": "Walang loop",
"repeat_playlist": "Ulitin ang playlist",
"queue": "Pila",
"alternative_track_sources": "Alternatibong mga pinagmulan ng track",
"download_track": "I-download ang track",
"tracks_in_queue": "{tracks} na mga track sa pila",
"clear_all": "Burahin lahat",
"show_hide_ui_on_hover": "Ipakita/Itago ang UI sa hover",
"always_on_top": "Palaging nasa ibabaw",
"exit_mini_player": "Lumabas sa Mini player",
"download_location": "Lokasyon ng pag-download",
"local_library": "Lokal na silid-aklatan",
"add_library_location": "Idagdag sa silid-aklatan",
"remove_library_location": "Alisin mula sa silid-aklatan",
"account": "Account",
"login_with_spotify": "Mag-login gamit ang iyong Spotify account",
"connect_with_spotify": "Kumonekta sa Spotify",
"logout": "Mag-logout",
"logout_of_this_account": "Mag-logout sa account na ito",
"language_region": "Wika at Rehiyon",
"language": "Wika",
"system_default": "Default ng Sistema",
"market_place_region": "Rehiyon ng Marketplace",
"recommendation_country": "Bansang Inirerekomenda",
"appearance": "Hitsura",
"layout_mode": "Mode ng Layout",
"override_layout_settings": "I-override ang mga setting ng responsive layout mode",
"adaptive": "Umaangkop",
"compact": "Kompakto",
"extended": "Pinalawig",
"theme": "Tema",
"dark": "Madilim",
"light": "Maliwanag",
"system": "Sistema",
"accent_color": "Kulay ng Accent",
"sync_album_color": "I-sync ang kulay ng album",
"sync_album_color_description": "Ginagamit ang pangunahing kulay ng album art bilang kulay ng accent",
"playback": "Playback",
"audio_quality": "Kalidad ng Audio",
"high": "Mataas",
"low": "Mababa",
"pre_download_play": "Mag-pre-download at i-play",
"pre_download_play_description": "Sa halip na mag-stream ng audio, mag-download ng bytes at i-play sa halip (Inirerekomenda para sa mga gumagamit ng mataas na bandwidth)",
"skip_non_music": "Laktawan ang mga segment na hindi musika (SponsorBlock)",
"blacklist_description": "Mga track at artista na nasa blacklist",
"wait_for_download_to_finish": "Mangyaring maghintay para matapos ang kasalukuyang pag-download",
"desktop": "Desktop",
"close_behavior": "Pag-uugali ng Pagsara",
"close": "Isara",
"minimize_to_tray": "I-minimize sa tray",
"show_tray_icon": "Ipakita ang icon ng System tray",
"about": "Tungkol sa",
"u_love_spotube": "Alam naming gusto mo ang Spotube",
"check_for_updates": "Maghanap ng mga update",
"about_spotube": "Tungkol sa Spotube",
"blacklist": "Blacklist",
"please_sponsor": "Mangyaring Mag-sponsor/Mag-donate",
"spotube_description": "Spotube, isang magaan, cross-platform, libreng-para-sa-lahat na spotify client",
"version": "Bersyon",
"build_number": "Build Number",
"founder": "Nagtatag",
"repository": "Repository",
"bug_issues": "Bug+Mga Isyu",
"made_with": "Ginawa nang may ❤️ sa Bangladesh🇧🇩",
"kingkor_roy_tirtho": "Kingkor Roy Tirtho",
"copyright": "© 2021-{current_year} Kingkor Roy Tirtho",
"license": "Lisensya",
"add_spotify_credentials": "Idagdag ang iyong mga kredensyal sa spotify para makapagsimula",
"credentials_will_not_be_shared_disclaimer": "Huwag mag-alala, ang alinman sa iyong mga kredensyal ay hindi kokolektahin o ibabahagi sa sinuman",
"know_how_to_login": "Hindi mo alam kung paano gawin ito?",
"follow_step_by_step_guide": "Sundin ang Hakbang-hakbang na gabay",
"spotify_cookie": "Spotify {name} Cookie",
"cookie_name_cookie": "{name} Cookie",
"fill_in_all_fields": "Mangyaring punan ang lahat ng field",
"submit": "Isumite",
"exit": "Lumabas",
"previous": "Nakaraan",
"next": "Susunod",
"done": "Tapos na",
"step_1": "Hakbang 1",
"first_go_to": "Una, Pumunta sa",
"login_if_not_logged_in": "at Mag-login/Mag-signup kung hindi ka naka-log in",
"step_2": "Hakbang 2",
"step_2_steps": "1. Kapag naka-log in ka na, pindutin ang F12 o i-right click ang Mouse > Inspect para Buksan ang Browser devtools.\n2. Pagkatapos ay pumunta sa \"Application\" Tab (Chrome, Edge, Brave atbp..) o \"Storage\" Tab (Firefox, Palemoon atbp..)\n3. Pumunta sa \"Cookies\" na seksyon at pagkatapos sa \"https://accounts.spotify.com\" na subseksyon",
"step_3": "Hakbang 3",
"step_3_steps": "Kopyahin ang halaga ng \"sp_dc\" Cookie",
"success_emoji": "Tagumpay🥳",
"success_message": "Ngayon ay matagumpay kang Naka-log in gamit ang iyong Spotify account. Magaling, kaibigan!",
"step_4": "Hakbang 4",
"step_4_steps": "I-paste ang na-kopyang halaga ng \"sp_dc\"",
"something_went_wrong": "May nangyaring mali",
"piped_instance": "Instance ng Piped Server",
"piped_description": "Ang instance ng Piped server na gagamitin para sa pagtutugma ng track",
"piped_warning": "Maaaring hindi gumagana nang mabuti ang ilan sa mga ito. Kaya gamitin sa sarili mong peligro",
"invidious_instance": "Instance ng Invidious Server",
"invidious_description": "Ang instance ng Invidious server na gagamitin para sa pagtutugma ng track",
"invidious_warning": "Maaaring hindi gumagana nang mabuti ang ilan sa mga ito. Kaya gamitin sa sarili mong peligro",
"generate": "Gumawa",
"track_exists": "Ang Track na {track} ay umiiral na",
"replace_downloaded_tracks": "Palitan ang lahat ng na-download na mga track",
"skip_download_tracks": "Laktawan ang pag-download ng lahat ng na-download na mga track",
"do_you_want_to_replace": "Gusto mo bang palitan ang umiiral na track??",
"replace": "Palitan",
"skip": "Laktawan",
"select_up_to_count_type": "Pumili ng hanggang {count} {type}",
"select_genres": "Pumili ng mga Genre",
"add_genres": "Magdagdag ng mga Genre",
"country": "Bansa",
"number_of_tracks_generate": "Bilang ng mga track na gagawin",
"acousticness": "Acoustic-ness",
"danceability": "Kakayahang Sayawin",
"energy": "Enerhiya",
"instrumentalness": "Instrumental-ness",
"liveness": "Liveness",
"loudness": "Lakas",
"speechiness": "Pagsasalita",
"valence": "Valence",
"popularity": "Popularidad",
"key": "Key",
"duration": "Tagal (s)",
"tempo": "Tempo (BPM)",
"mode": "Mode",
"time_signature": "Time Signature",
"short": "Maikli",
"medium": "Katamtaman",
"long": "Mahaba",
"min": "Min",
"max": "Max",
"target": "Target",
"moderate": "Katamtaman",
"deselect_all": "Alisin ang Pagkakapili sa Lahat",
"select_all": "Piliin Lahat",
"are_you_sure": "Sigurado ka ba?",
"generating_playlist": "Gumagawa ng iyong custom na playlist...",
"selected_count_tracks": "Napili ang {count} na mga track",
"download_warning": "Kung nag-download ka ng lahat ng Track sa maramihan, malinaw na nagpa-pirate ka ng Musika at nagsasanhi ng pinsala sa creative society ng Musika. Sana ay alam mo ito. Palaging, subukang igalang at suportahan ang masipag na paggawa ng Artist",
"download_ip_ban_warning": "Sa nga pala, ang iyong IP ay maaaring ma-block sa YouTube dahil sa sobrang mga kahilingan sa pag-download kaysa sa karaniwan. Ang IP block ay nangangahulugang hindi mo magagamit ang YouTube (kahit na naka-log in ka) sa loob ng hindi bababa sa 2-3 buwan mula sa device na may IP na iyon. At hindi pinanghahawakan ng Spotube ang anumang responsibilidad kung mangyayari ito",
"by_clicking_accept_terms": "Sa pamamagitan ng pag-click sa 'tanggapin', sumasang-ayon ka sa mga sumusunod na tuntunin:",
"download_agreement_1": "Alam kong nagpa-pirate ako ng Musika. Masama ako",
"download_agreement_2": "Susuportahan ko ang Artist saan man ako maaari at ginagawa ko lang ito dahil wala akong pera para bumili ng kanilang sining",
"download_agreement_3": "Lubos kong nauunawaan na ang aking IP ay maaaring ma-block sa YouTube at hindi ko pinanghahawakan ang Spotube o ang kanyang mga may-ari/nag-ambag na responsable para sa anumang aksidente na sanhi ng aking kasalukuyang aksyon",
"decline": "Tanggihan",
"accept": "Tanggapin",
"details": "Mga Detalye",
"youtube": "YouTube",
"channel": "Channel",
"likes": "Mga Like",
"dislikes": "Mga Dislike",
"views": "Mga View",
"streamUrl": "Stream URL",
"stop": "Ihinto",
"sort_newest": "Ayusin ayon sa pinakabagong idinagdag",
"sort_oldest": "Ayusin ayon sa pinakalumang idinagdag",
"sleep_timer": "Sleep Timer",
"mins": "{minutes} Minuto",
"hours": "{hours} Oras",
"hour": "{hours} Oras",
"custom_hours": "Custom na Oras",
"logs": "Mga Log",
"developers": "Mga Developer",
"not_logged_in": "Hindi ka naka-log in",
"search_mode": "Mode ng Paghahanap",
"audio_source": "Pinagmulan ng Audio",
"ok": "Ok",
"failed_to_encrypt": "Nabigong i-encrypt",
"encryption_failed_warning": "Gumagamit ng encryption ang Spotube para ligtas na i-store ang iyong data. Ngunit nabigo. Kaya babalik ito sa hindi secure na storage\nKung gumagamit ka ng linux, mangyaring tiyakin na mayroon kang anumang secret-service na naka-install (gnome-keyring, kde-wallet, keepassxc atbp)",
"querying_info": "Kinukuha ang impormasyon...",
"piped_api_down": "Ang Piped API ay hindi gumagana",
"piped_down_error_instructions": "Ang instance ng Piped na {pipedInstance} ay kasalukuyang hindi gumagana\n\nMaaari mong baguhin ang instance o baguhin ang 'Uri ng API' sa opisyal na YouTube API\n\nSiguraduhing i-restart ang app pagkatapos ng pagbabago",
"you_are_offline": "Kasalukuyan kang offline",
"connection_restored": "Naibalik na ang iyong koneksyon sa internet",
"use_system_title_bar": "Gamitin ang title bar ng system",
"crunching_results": "Pinaproseso ang mga resulta...",
"search_to_get_results": "Maghanap para makakuha ng mga resulta",
"use_amoled_mode": "Matingkad na itim na madilim na tema",
"pitch_dark_theme": "AMOLED Mode",
"normalize_audio": "I-normalize ang audio",
"change_cover": "Baguhin ang cover",
"add_cover": "Magdagdag ng cover",
"restore_defaults": "Ibalik ang mga default",
"download_music_codec": "Codec para sa pag-download ng musika",
"streaming_music_codec": "Codec para sa pag-stream ng musika",
"login_with_lastfm": "Mag-login gamit ang Last.fm",
"connect": "Kumonekta",
"disconnect_lastfm": "Idiskonekta ang Last.fm",
"disconnect": "Idiskonekta",
"username": "Username",
"password": "Password",
"login": "Mag-login",
"login_with_your_lastfm": "Mag-login gamit ang iyong Last.fm account",
"scrobble_to_lastfm": "I-scrobble sa Last.fm",
"go_to_album": "Pumunta sa Album",
"discord_rich_presence": "Discord Rich Presence",
"browse_all": "I-browse Lahat",
"genres": "Mga Genre",
"explore_genres": "Tuklasin ang mga Genre",
"friends": "Mga Kaibigan",
"no_lyrics_available": "Paumanhin, hindi mahanap ang lyrics para sa track na ito",
"start_a_radio": "Magsimula ng Radio",
"how_to_start_radio": "Paano mo gustong simulan ang radio?",
"replace_queue_question": "Gusto mo bang palitan ang kasalukuyang pila o idagdag dito?",
"endless_playback": "Walang Hanggang Playback",
"delete_playlist": "Burahin ang Playlist",
"delete_playlist_confirmation": "Sigurado ka bang gusto mong burahin ang playlist na ito?",
"local_tracks": "Mga Lokal na Track",
"local_tab": "Lokal",
"song_link": "Link ng Kanta",
"skip_this_nonsense": "Laktawan ang kalokohan na ito",
"freedom_of_music": "\"Kalayaan ng Musika\"",
"freedom_of_music_palm": "\"Kalayaan ng Musika sa iyong palad\"",
"get_started": "Magsimula na tayo",
"youtube_source_description": "Inirerekomenda at pinakamahusay na gumagana.",
"piped_source_description": "Gusto ng kalayaan? Kapareho ng YouTube ngunit mas malaya.",
"jiosaavn_source_description": "Pinakamahusay para sa rehiyon ng South Asia.",
"invidious_source_description": "Katulad ng Piped ngunit may mas mataas na availability.",
"highest_quality": "Pinakamataas na Kalidad: {quality}",
"select_audio_source": "Pumili ng Pinagmulan ng Audio",
"endless_playback_description": "Awtomatikong magdagdag ng mga bagong kanta\nsa dulo ng pila",
"choose_your_region": "Piliin ang iyong rehiyon",
"choose_your_region_description": "Ito ay tutulong sa Spotube na ipakita sa iyo ang tamang content\npara sa iyong lokasyon.",
"choose_your_language": "Piliin ang iyong wika",
"help_project_grow": "Tulungan ang proyektong ito na lumago",
"help_project_grow_description": "Ang Spotube ay isang open-source na proyekto. Maaari mong tulungan ang proyektong ito na lumago sa pamamagitan ng pag-contribute sa proyekto, pag-ulat ng mga bug, o pagmungkahi ng mga bagong feature.",
"contribute_on_github": "Mag-contribute sa GitHub",
"donate_on_open_collective": "Mag-donate sa Open Collective",
"browse_anonymously": "Mag-browse nang Anonymous",
"enable_connect": "I-enable ang Connect",
"enable_connect_description": "Kontrolin ang Spotube mula sa ibang mga device",
"devices": "Mga Device",
"select": "Pumili",
"connect_client_alert": "Ikaw ay kontrolado ng {client}",
"this_device": "Ang Device na ito",
"remote": "Remote",
"stats": "Mga Stat",
"and_n_more": "at {count} pa",
"recently_played": "Kamakailan Lang na Ni-play",
"browse_more": "Mag-browse pa",
"no_title": "Walang Pamagat",
"not_playing": "Hindi tumutugtog",
"epic_failure": "Epic na pagkabigo!",
"added_num_tracks_to_queue": "Nagdagdag ng {tracks_length} na mga track sa pila",
"spotube_has_an_update": "Ang Spotube ay may update",
"download_now": "I-download Ngayon",
"nightly_version": "Ang Spotube Nightly {nightlyBuildNum} ay inilabas na",
"release_version": "Ang Spotube v{version} ay inilabas na",
"read_the_latest": "Basahin ang pinakabagong ",
"release_notes": "release notes",
"pick_color_scheme": "Pumili ng color scheme",
"save": "I-save",
"choose_the_device": "Piliin ang device:",
"multiple_device_connected": "Mayroong maraming device na nakakonekta.\nPiliin ang device kung saan mo gustong maganap ang aksyon na ito",
"nothing_found": "Walang nahanap",
"the_box_is_empty": "Ang kahon ay walang laman",
"top_artists": "Nangungunang mga Artista",
"top_albums": "Nangungunang mga Album",
"this_week": "Ngayong linggo",
"this_month": "Ngayong buwan",
"last_6_months": "Nakaraang 6 na buwan",
"this_year": "Ngayong taon",
"last_2_years": "Nakaraang 2 taon",
"all_time": "Lahat ng panahon",
"powered_by_provider": "Pinapagana ng {providerName}",
"email": "Email",
"profile_followers": "Mga Tagasunod",
"birthday": "Kaarawan",
"subscription": "Subscription",
"not_born": "Hindi pa ipinanganak",
"hacker": "Hacker",
"profile": "Profile",
"no_name": "Walang Pangalan",
"edit": "I-edit",
"user_profile": "Profile ng User",
"count_plays": "{count} na mga play",
"streaming_fees_hypothetical": "Mga bayarin sa streaming (hypothetical)",
"minutes_listened": "Mga minutong pinapakinggan",
"streamed_songs": "Mga na-stream na kanta",
"count_streams": "{count} na mga stream",
"owned_by_you": "Pag-aari mo",
"copied_shareurl_to_clipboard": "Na-kopya ang {shareUrl} sa clipboard",
"spotify_hipotetical_calculation": "*Ito ay kinalkula batay sa bawat stream\nna bayad ng Spotify na $0.003 hanggang $0.005. Ito ay isang hypothetical\nna pagkalkula para bigyan ang user ng ideya kung magkano\nang kanilang ibabayad sa mga artista kung sila ay nakikinig\nng kanilang kanta sa Spotify.",
"count_mins": "{minutes} minuto",
"summary_minutes": "minuto",
"summary_listened_to_music": "Nakinig sa musika",
"summary_songs": "mga kanta",
"summary_streamed_overall": "Na-stream sa kabuuan",
"summary_owed_to_artists": "Utang sa mga artista\nngayong buwan",
"summary_artists": "artista",
"summary_music_reached_you": "Umabot sa iyo ang musika",
"summary_full_albums": "buong album",
"summary_got_your_love": "Nakuha ang iyong pagmamahal",
"summary_playlists": "mga playlist",
"summary_were_on_repeat": "Pinu-playlst muli",
"total_money": "Kabuuang {money}",
"webview_not_found": "Hindi nahanap ang Webview",
"webview_not_found_description": "Walang webview runtime na naka-install sa iyong device.\nKung naka-install ito, siguraduhing nasa Environment PATH\n\nPagkatapos mag-install, i-restart ang app",
"unsupported_platform": "Hindi suportadong platform",
"cache_music": "I-cache ang musika",
"open": "Buksan",
"cache_folder": "Folder ng cache",
"export": "I-export",
"clear_cache": "Burahin ang cache",
"clear_cache_confirmation": "Gusto mo bang burahin ang cache?",
"export_cache_files": "I-export ang mga Naka-cache na File",
"found_n_files": "Nahanap ang {count} na mga file",
"export_cache_confirmation": "Gusto mo bang i-export ang mga file na ito sa",
"exported_n_out_of_m_files": "Na-export ang {filesExported} mula sa {files} na mga file",
"undo": "I-undo",
"download_all": "I-download lahat",
"add_all_to_playlist": "Idagdag lahat sa playlist",
"add_all_to_queue": "Idagdag lahat sa pila",
"play_all_next": "I-play lahat susunod",
"pause": "Pause",
"view_all": "Tingnan lahat",
"no_tracks_added_yet": "Mukhang wala ka pang idinaragdag na mga track",
"no_tracks": "Mukhang walang mga track dito",
"no_tracks_listened_yet": "Mukhang wala ka pang pinakikinggan",
"not_following_artists": "Hindi ka sumusunod sa anumang mga artista",
"no_favorite_albums_yet": "Mukhang wala ka pang idinagdag na anumang mga album sa iyong mga paborito",
"no_logs_found": "Walang nahanap na mga log",
"youtube_engine": "YouTube Engine",
"youtube_engine_not_installed_title": "Hindi naka-install ang {engine}",
"youtube_engine_not_installed_message": "Hindi naka-install ang {engine} sa iyong sistema.",
"youtube_engine_set_path": "Siguraduhing available ito sa PATH variable o\ni-set ang absolute path sa {engine} executable sa ibaba",
"youtube_engine_unix_issue_message": "Sa macOS/Linux/unix tulad ng OS, ang pag-set ng path sa .zshrc/.bashrc/.bash_profile atbp. ay hindi gagana.\nKailangan mong i-set ang path sa configuration file ng shell",
"download": "I-download",
"file_not_found": "Hindi nahanap ang file",
"custom": "Custom",
"add_custom_url": "Magdagdag ng custom URL"
}

View File

@ -426,9 +426,5 @@
"download": "İndir",
"file_not_found": "Dosya bulunamadı",
"custom": "Özel",
"add_custom_url": "Özel URL ekle",
"edit_port": "Portu düzenle",
"port_helper_msg": "Varsayılan -1'dir, bu da rastgele bir sayıyı gösterir. Bir güvenlik duvarınız varsa, bunu ayarlamanız önerilir.",
"connect_request": "{client} bağlantısına izin verilsin mi?",
"connection_request_denied": "Bağlantı reddedildi. Kullanıcı erişimi reddetti."
"add_custom_url": "Özel URL ekle"
}

View File

@ -426,9 +426,5 @@
"download": "Завантажити",
"file_not_found": "Файл не знайдено",
"custom": "Користувацький",
"add_custom_url": "Додати користувацький URL",
"edit_port": "Редагувати порт",
"port_helper_msg": "За замовчуванням -1, що означає випадкове число. Якщо у вас налаштований брандмауер, рекомендується це налаштувати.",
"connect_request": "Дозволити {client} підключення?",
"connection_request_denied": "Підключення відхилено. Користувач відмовив у доступі."
"add_custom_url": "Додати користувацький URL"
}

View File

@ -426,9 +426,5 @@
"download": "Tải xuống",
"file_not_found": "Không tìm thấy tệp",
"custom": "Tùy chỉnh",
"add_custom_url": "Thêm URL tùy chỉnh",
"edit_port": "Chỉnh sửa cổng",
"port_helper_msg": "Mặc định là -1, có nghĩa là số ngẫu nhiên. Nếu bạn đã cấu hình tường lửa, nên đặt điều này.",
"connect_request": "Cho phép {client} kết nối?",
"connection_request_denied": "Kết nối bị từ chối. Người dùng đã từ chối quyền truy cập."
"add_custom_url": "Thêm URL tùy chỉnh"
}

View File

@ -426,9 +426,5 @@
"download": "下载",
"file_not_found": "文件未找到",
"custom": "自定义",
"add_custom_url": "添加自定义 URL",
"edit_port": "编辑端口",
"port_helper_msg": "默认值为-1表示随机数。如果您已配置防火墙建议设置此项。",
"connect_request": "允许 {client} 连接吗?",
"connection_request_denied": "连接被拒绝。用户拒绝访问。"
"add_custom_url": "添加自定义 URL"
}

View File

@ -2704,30 +2704,6 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Add custom URL'**
String get add_custom_url;
/// No description provided for @edit_port.
///
/// In en, this message translates to:
/// **'Edit port'**
String get edit_port;
/// No description provided for @port_helper_msg.
///
/// In en, this message translates to:
/// **'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.'**
String get port_helper_msg;
/// No description provided for @connect_request.
///
/// In en, this message translates to:
/// **'Allow {client} to connect?'**
String connect_request(Object client);
/// No description provided for @connection_request_denied.
///
/// In en, this message translates to:
/// **'Connection denied. User denied access.'**
String get connection_request_denied;
}
class _AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get add_custom_url => 'إضافة URL مخصص';
@override
String get edit_port => 'تعديل المنفذ';
@override
String get port_helper_msg => 'القيمة الافتراضية هي -1 والتي تشير إلى رقم عشوائي. إذا كان لديك جدار ناري مُعد، يُوصى بتعيين هذا.';
@override
String connect_request(Object client) {
return 'السماح لـ $client بالاتصال؟';
}
@override
String get connection_request_denied => 'تم رفض الاتصال. المستخدم رفض الوصول.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsBn extends AppLocalizations {
@override
String get add_custom_url => 'কাস্টম URL যোগ করুন';
@override
String get edit_port => 'পোর্ট সম্পাদনা করুন';
@override
String get port_helper_msg => 'ডিফল্ট হল -1 যা এলোমেলো সংখ্যা নির্দেশ করে। যদি আপনার ফায়ারওয়াল কনফিগার করা থাকে, তবে এটি সেট করা সুপারিশ করা হয়।';
@override
String connect_request(Object client) {
return '$client কে সংযোগ করতে অনুমতি দেবেন?';
}
@override
String get connection_request_denied => 'সংযোগ অস্বীকৃত। ব্যবহারকারী প্রবেশাধিকার অস্বীকার করেছে।';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsCa extends AppLocalizations {
@override
String get add_custom_url => 'Afegir URL personalitzada';
@override
String get edit_port => 'Editar port';
@override
String get port_helper_msg => 'El valor per defecte és -1, que indica un número aleatori. Si teniu un tallafoc configurat, es recomana establir-ho.';
@override
String connect_request(Object client) {
return 'Permetre que $client es connecti?';
}
@override
String get connection_request_denied => 'Connexió denegada. L\'usuari ha denegat l\'accés.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsCs extends AppLocalizations {
@override
String get add_custom_url => 'Přidat vlastní URL';
@override
String get edit_port => 'Upravit port';
@override
String get port_helper_msg => 'Výchozí hodnota je -1, což znamená náhodné číslo. Pokud máte nakonfigurován firewall, doporučuje se to nastavit.';
@override
String connect_request(Object client) {
return 'Povolit $client připojení?';
}
@override
String get connection_request_denied => 'Připojení bylo zamítnuto. Uživatel odmítl přístup.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get add_custom_url => 'Benutzerdefinierte URL hinzufügen';
@override
String get edit_port => 'Port bearbeiten';
@override
String get port_helper_msg => 'Der Standardwert ist -1, was eine zufällige Zahl bedeutet. Wenn Sie eine Firewall konfiguriert haben, wird empfohlen, dies einzustellen.';
@override
String connect_request(Object client) {
return '$client die Verbindung erlauben?';
}
@override
String get connection_request_denied => 'Verbindung abgelehnt. Benutzer hat den Zugriff verweigert.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get add_custom_url => 'Add custom URL';
@override
String get edit_port => 'Edit port';
@override
String get port_helper_msg => 'Default is -1 which indicates random number. If you\'ve firewall configured, setting this is recommended.';
@override
String connect_request(Object client) {
return 'Allow $client to connect?';
}
@override
String get connection_request_denied => 'Connection denied. User denied access.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get add_custom_url => 'Agregar URL personalizada';
@override
String get edit_port => 'Editar puerto';
@override
String get port_helper_msg => 'El valor predeterminado es -1, lo que indica un número aleatorio. Si tienes un firewall configurado, se recomienda establecer esto.';
@override
String connect_request(Object client) {
return '¿Permitir que $client se conecte?';
}
@override
String get connection_request_denied => 'Conexión denegada. El usuario denegó el acceso.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsEu extends AppLocalizations {
@override
String get add_custom_url => 'Gehitu URL pertsonalizatua';
@override
String get edit_port => 'Editatu portua';
@override
String get port_helper_msg => 'Lehenetsitako balioa -1 da, zenbaki aleatorioa adierazten duena. Su firewall konfiguratu baduzu, gomendatzen da hau ezartzea.';
@override
String connect_request(Object client) {
return '$client konektatzea baimendu?';
}
@override
String get connection_request_denied => 'Konektatzea ukatu da. Erabiltzaileak sarbidea ukatu du.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsFa extends AppLocalizations {
@override
String get add_custom_url => 'اضافه کردن URL سفارشی';
@override
String get edit_port => 'ویرایش پورت';
@override
String get port_helper_msg => 'پیش‌فرض -1 است که نشان‌دهنده یک عدد تصادفی است. اگر فایروال شما پیکربندی شده است، توصیه می‌شود این را تنظیم کنید.';
@override
String connect_request(Object client) {
return 'آیا اجازه می‌دهید $client متصل شود؟';
}
@override
String get connection_request_denied => 'اتصال رد شد. کاربر دسترسی را رد کرد.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsFi extends AppLocalizations {
@override
String get add_custom_url => 'Lisää mukautettu URL';
@override
String get edit_port => 'Muokkaa porttia';
@override
String get port_helper_msg => 'Oletusarvo on -1, mikä tarkoittaa satunnaista numeroa. Jos sinulla on palomuuri määritetty, tämän asettamista suositellaan.';
@override
String connect_request(Object client) {
return 'Salli $client yhdistää?';
}
@override
String get connection_request_denied => 'Yhteys evätty. Käyttäjä eväsi pääsyn.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get add_custom_url => 'Ajouter une URL personnalisée';
@override
String get edit_port => 'Modifier le port';
@override
String get port_helper_msg => 'La valeur par défaut est -1, ce qui indique un nombre aléatoire. Si vous avez configuré un pare-feu, il est recommandé de le définir.';
@override
String connect_request(Object client) {
return 'Autoriser $client à se connecter ?';
}
@override
String get connection_request_denied => 'Connection denied. User denied access.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsHi extends AppLocalizations {
@override
String get add_custom_url => 'कस्टम URL जोड़ें';
@override
String get edit_port => 'पोर्ट संपादित करें';
@override
String get port_helper_msg => 'डिफ़ॉल्ट -1 है जो यादृच्छिक संख्या को दर्शाता है। यदि आपने फ़ायरवॉल कॉन्फ़िगर किया है, तो इसे सेट करना अनुशंसित है।';
@override
String connect_request(Object client) {
return '$client को कनेक्ट करने की अनुमति दें?';
}
@override
String get connection_request_denied => 'कनेक्शन अस्वीकृत। उपयोगकर्ता ने पहुंच अस्वीकृत कर दी।';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get add_custom_url => 'Add custom URL';
@override
String get edit_port => 'Edit port';
@override
String get port_helper_msg => 'Default adalah -1 yang menunjukkan angka acak. Jika Anda telah mengonfigurasi firewall, disarankan untuk mengatur ini.';
@override
String connect_request(Object client) {
return 'Izinkan $client untuk terhubung?';
}
@override
String get connection_request_denied => 'Koneksi ditolak. Pengguna menolak akses.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get add_custom_url => 'Aggiungi URL personalizzato';
@override
String get edit_port => 'Modifica porta';
@override
String get port_helper_msg => 'Il valore predefinito è -1, che indica un numero casuale. Se hai configurato un firewall, si consiglia di impostarlo.';
@override
String connect_request(Object client) {
return 'Consentire a $client di connettersi?';
}
@override
String get connection_request_denied => 'Connessione negata. L\'utente ha negato l\'accesso.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get add_custom_url => 'カスタムURLを追加';
@override
String get edit_port => 'ポートを編集';
@override
String get port_helper_msg => 'デフォルトは-1で、ランダムな番号を示します。ファイアウォールを設定している場合は、これを設定することをお勧めします。';
@override
String connect_request(Object client) {
return '$clientの接続を許可しますか';
}
@override
String get connection_request_denied => '接続が拒否されました。ユーザーがアクセスを拒否しました。';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsKa extends AppLocalizations {
@override
String get add_custom_url => 'დამატება პერსონალური URL';
@override
String get edit_port => 'პორტის რედაქტირება';
@override
String get port_helper_msg => 'ნაგულისხმევი არის -1, რაც შემთხვევითი ნომრის მითითებას ნიშნავს. თუ لديك firewall настроен, рекомендуется установить это.';
@override
String connect_request(Object client) {
return '$client-ის დაკავშირების ნებართვა?';
}
@override
String get connection_request_denied => 'კავშირი უარყოფილია. მომხმარებელმა უარყო წვდომა.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsKo extends AppLocalizations {
@override
String get add_custom_url => '사용자 정의 URL 추가';
@override
String get edit_port => '포트 편집';
@override
String get port_helper_msg => '기본값은 -1로 무작위 숫자를 나타냅니다. 방화벽이 구성된 경우 이를 설정하는 것이 좋습니다.';
@override
String connect_request(Object client) {
return '$client의 연결을 허용하시겠습니까?';
}
@override
String get connection_request_denied => '연결이 거부되었습니다. 사용자가 액세스를 거부했습니다.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsNe extends AppLocalizations {
@override
String get add_custom_url => 'कस्टम URL जोड़ें';
@override
String get edit_port => 'पोर्ट सम्पादन गर्नुहोस्';
@override
String get port_helper_msg => 'डिफ़ॉल्ट -1 हो जुन यादृच्छिक संख्या जनाउँछ। यदि तपाईंले फायरवाल कन्फिगर गर्नुभएको छ भने, यसलाई सेट गर्न सिफारिस गरिन्छ।';
@override
String connect_request(Object client) {
return '$client लाई जडान गर्न अनुमति दिनुहोस्?';
}
@override
String get connection_request_denied => 'जडान अस्वीकृत। प्रयोगकर्ताले पहुँच अस्वीकृत गर्यो।';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsNl extends AppLocalizations {
@override
String get add_custom_url => 'Voeg aangepaste URL toe';
@override
String get edit_port => 'Poort bewerken';
@override
String get port_helper_msg => 'Standaard is -1, wat een willekeurig nummer aangeeft. Als je een firewall hebt geconfigureerd, wordt aanbevolen dit in te stellen.';
@override
String connect_request(Object client) {
return 'Toestaan dat $client verbinding maakt?';
}
@override
String get connection_request_denied => 'Verbinding geweigerd. Gebruiker heeft toegang geweigerd.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsPl extends AppLocalizations {
@override
String get add_custom_url => 'Dodaj niestandardowy URL';
@override
String get edit_port => 'Edytuj port';
@override
String get port_helper_msg => 'Domyślna wartość to -1, co oznacza losową liczbę. Jeśli masz skonfigurowany zaporę, zaleca się jej ustawienie.';
@override
String connect_request(Object client) {
return 'Zezwolić $client na połączenie?';
}
@override
String get connection_request_denied => 'Połączenie odrzucone. Użytkownik odmówił dostępu.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get add_custom_url => 'Adicionar URL personalizada';
@override
String get edit_port => 'Editar porta';
@override
String get port_helper_msg => 'O padrão é -1, que indica um número aleatório. Se você tiver um firewall configurado, é recomendável definir isso.';
@override
String connect_request(Object client) {
return 'Permitir que $client se conecte?';
}
@override
String get connection_request_denied => 'Conexão negada. O usuário negou o acesso .';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get add_custom_url => 'Добавить пользовательский URL';
@override
String get edit_port => 'Редактировать порт';
@override
String get port_helper_msg => 'По умолчанию -1, что означает случайное число. Если у вас настроен брандмауэр, рекомендуется установить это.';
@override
String connect_request(Object client) {
return 'Разрешить $client подключение?';
}
@override
String get connection_request_denied => 'Подключение отклонено. Пользователь отказал в доступе.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsTa extends AppLocalizations {
@override
String get add_custom_url => 'தனிப்பயன் URL ஐச் சேர்க்கவும்';
@override
String get edit_port => 'போர்டு திருத்தவும்';
@override
String get port_helper_msg => 'இயல்புநிலை -1 ஆகும், இது சீரற்ற எண்ணை குறிக்கிறது. நீங்கள் தீயணைப்பு அமைக்கப்பட்டிருந்தால், இதை அமைப்பது பரிந்துரைக்கப்படுகிறது.';
@override
String connect_request(Object client) {
return '$client க்கு இணைக்க அனுமதிக்கவா?';
}
@override
String get connection_request_denied => 'இணைப்பு மறுக்கப்பட்டது. பயனர் அணுகலை மறுத்தார்.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsTh extends AppLocalizations {
@override
String get add_custom_url => 'เพิ่ม URL แบบกำหนดเอง';
@override
String get edit_port => 'แก้ไขพอร์ต';
@override
String get port_helper_msg => 'ค่าเริ่มต้นคือ -1 ซึ่งหมายถึงหมายเลขสุ่ม หากคุณได้กำหนดค่าไฟร์วอลล์แล้ว แนะนำให้ตั้งค่านี้';
@override
String connect_request(Object client) {
return 'อนุญาตให้ $client เชื่อมต่อหรือไม่?';
}
@override
String get connection_request_denied => 'การเชื่อมต่อล้มเหลว ผู้ใช้ปฏิเสธการเข้าถึง';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsTl extends AppLocalizations {
@override
String get add_custom_url => 'Magdagdag ng custom URL';
@override
String get edit_port => 'I-edit ang port';
@override
String get port_helper_msg => 'Ang default ay -1 na nagpapahiwatig ng random na numero. Kung na-configure mo ang firewall, inirerekomenda na itakda ito.';
@override
String connect_request(Object client) {
return 'Payagan ang $client na kumonekta?';
}
@override
String get connection_request_denied => 'Tanggihan ang koneksyon. Tinanggihan ng gumagamit ang pag-access.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get add_custom_url => 'Özel URL ekle';
@override
String get edit_port => 'Portu düzenle';
@override
String get port_helper_msg => 'Varsayılan -1\'dir, bu da rastgele bir sayıyı gösterir. Bir güvenlik duvarınız varsa, bunu ayarlamanız önerilir.';
@override
String connect_request(Object client) {
return '$client bağlantısına izin verilsin mi?';
}
@override
String get connection_request_denied => 'Bağlantı reddedildi. Kullanıcı erişimi reddetti.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsUk extends AppLocalizations {
@override
String get add_custom_url => 'Додати користувацький URL';
@override
String get edit_port => 'Редагувати порт';
@override
String get port_helper_msg => 'За замовчуванням -1, що означає випадкове число. Якщо у вас налаштований брандмауер, рекомендується це налаштувати.';
@override
String connect_request(Object client) {
return 'Дозволити $client підключення?';
}
@override
String get connection_request_denied => 'Підключення відхилено. Користувач відмовив у доступі.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsVi extends AppLocalizations {
@override
String get add_custom_url => 'Thêm URL tùy chỉnh';
@override
String get edit_port => 'Chỉnh sửa cổng';
@override
String get port_helper_msg => 'Mặc định là -1, có nghĩa là số ngẫu nhiên. Nếu bạn đã cấu hình tường lửa, nên đặt điều này.';
@override
String connect_request(Object client) {
return 'Cho phép $client kết nối?';
}
@override
String get connection_request_denied => 'Kết nối bị từ chối. Người dùng đã từ chối quyền truy cập.';
}

View File

@ -1371,18 +1371,4 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get add_custom_url => '添加自定义 URL';
@override
String get edit_port => '编辑端口';
@override
String get port_helper_msg => '默认值为-1表示随机数。如果您已配置防火墙建议设置此项。';
@override
String connect_request(Object client) {
return '允许 $client 连接吗?';
}
@override
String get connection_request_denied => '连接被拒绝。用户拒绝访问。';
}

View File

@ -62,7 +62,7 @@ class AppDatabase extends _$AppDatabase {
AppDatabase() : super(_openConnection());
@override
int get schemaVersion => 6;
int get schemaVersion => 5;
@override
MigrationStrategy get migration {
@ -114,13 +114,6 @@ class AppDatabase extends _$AppDatabase {
"SET $columnName = 'Orange:0xFFf97315' WHERE $columnName = 'Blue:0xFF2196F3'",
);
},
from5To6: (m, schema) async {
// Add new column to preferences table
await m.addColumn(
schema.preferencesTable,
schema.preferencesTable.connectPort,
);
},
),
);
}

View File

@ -823,14 +823,6 @@ class $PreferencesTableTable extends PreferencesTable
defaultConstraints: GeneratedColumn.constraintIsAlways(
'CHECK ("enable_connect" IN (0, 1))'),
defaultValue: const Constant(false));
static const VerificationMeta _connectPortMeta =
const VerificationMeta('connectPort');
@override
late final GeneratedColumn<int> connectPort = GeneratedColumn<int>(
'connect_port', aliasedName, false,
type: DriftSqlType.int,
requiredDuringInsert: false,
defaultValue: const Constant(-1));
static const VerificationMeta _cacheMusicMeta =
const VerificationMeta('cacheMusic');
@override
@ -870,7 +862,6 @@ class $PreferencesTableTable extends PreferencesTable
discordPresence,
endlessPlayback,
enableConnect,
connectPort,
cacheMusic
];
@override
@ -980,12 +971,6 @@ class $PreferencesTableTable extends PreferencesTable
enableConnect.isAcceptableOrUnknown(
data['enable_connect']!, _enableConnectMeta));
}
if (data.containsKey('connect_port')) {
context.handle(
_connectPortMeta,
connectPort.isAcceptableOrUnknown(
data['connect_port']!, _connectPortMeta));
}
if (data.containsKey('cache_music')) {
context.handle(
_cacheMusicMeta,
@ -1069,8 +1054,6 @@ class $PreferencesTableTable extends PreferencesTable
.read(DriftSqlType.bool, data['${effectivePrefix}endless_playback'])!,
enableConnect: attachedDatabase.typeMapping
.read(DriftSqlType.bool, data['${effectivePrefix}enable_connect'])!,
connectPort: attachedDatabase.typeMapping
.read(DriftSqlType.int, data['${effectivePrefix}connect_port'])!,
cacheMusic: attachedDatabase.typeMapping
.read(DriftSqlType.bool, data['${effectivePrefix}cache_music'])!,
);
@ -1143,7 +1126,6 @@ class PreferencesTableData extends DataClass
final bool discordPresence;
final bool endlessPlayback;
final bool enableConnect;
final int connectPort;
final bool cacheMusic;
const PreferencesTableData(
{required this.id,
@ -1173,7 +1155,6 @@ class PreferencesTableData extends DataClass
required this.discordPresence,
required this.endlessPlayback,
required this.enableConnect,
required this.connectPort,
required this.cacheMusic});
@override
Map<String, Expression> toColumns(bool nullToAbsent) {
@ -1249,7 +1230,6 @@ class PreferencesTableData extends DataClass
map['discord_presence'] = Variable<bool>(discordPresence);
map['endless_playback'] = Variable<bool>(endlessPlayback);
map['enable_connect'] = Variable<bool>(enableConnect);
map['connect_port'] = Variable<int>(connectPort);
map['cache_music'] = Variable<bool>(cacheMusic);
return map;
}
@ -1283,7 +1263,6 @@ class PreferencesTableData extends DataClass
discordPresence: Value(discordPresence),
endlessPlayback: Value(endlessPlayback),
enableConnect: Value(enableConnect),
connectPort: Value(connectPort),
cacheMusic: Value(cacheMusic),
);
}
@ -1331,7 +1310,6 @@ class PreferencesTableData extends DataClass
discordPresence: serializer.fromJson<bool>(json['discordPresence']),
endlessPlayback: serializer.fromJson<bool>(json['endlessPlayback']),
enableConnect: serializer.fromJson<bool>(json['enableConnect']),
connectPort: serializer.fromJson<int>(json['connectPort']),
cacheMusic: serializer.fromJson<bool>(json['cacheMusic']),
);
}
@ -1380,7 +1358,6 @@ class PreferencesTableData extends DataClass
'discordPresence': serializer.toJson<bool>(discordPresence),
'endlessPlayback': serializer.toJson<bool>(endlessPlayback),
'enableConnect': serializer.toJson<bool>(enableConnect),
'connectPort': serializer.toJson<int>(connectPort),
'cacheMusic': serializer.toJson<bool>(cacheMusic),
};
}
@ -1413,7 +1390,6 @@ class PreferencesTableData extends DataClass
bool? discordPresence,
bool? endlessPlayback,
bool? enableConnect,
int? connectPort,
bool? cacheMusic}) =>
PreferencesTableData(
id: id ?? this.id,
@ -1443,7 +1419,6 @@ class PreferencesTableData extends DataClass
discordPresence: discordPresence ?? this.discordPresence,
endlessPlayback: endlessPlayback ?? this.endlessPlayback,
enableConnect: enableConnect ?? this.enableConnect,
connectPort: connectPort ?? this.connectPort,
cacheMusic: cacheMusic ?? this.cacheMusic,
);
PreferencesTableData copyWithCompanion(PreferencesTableCompanion data) {
@ -1517,8 +1492,6 @@ class PreferencesTableData extends DataClass
enableConnect: data.enableConnect.present
? data.enableConnect.value
: this.enableConnect,
connectPort:
data.connectPort.present ? data.connectPort.value : this.connectPort,
cacheMusic:
data.cacheMusic.present ? data.cacheMusic.value : this.cacheMusic,
);
@ -1554,7 +1527,6 @@ class PreferencesTableData extends DataClass
..write('discordPresence: $discordPresence, ')
..write('endlessPlayback: $endlessPlayback, ')
..write('enableConnect: $enableConnect, ')
..write('connectPort: $connectPort, ')
..write('cacheMusic: $cacheMusic')
..write(')'))
.toString();
@ -1589,7 +1561,6 @@ class PreferencesTableData extends DataClass
discordPresence,
endlessPlayback,
enableConnect,
connectPort,
cacheMusic
]);
@override
@ -1623,7 +1594,6 @@ class PreferencesTableData extends DataClass
other.discordPresence == this.discordPresence &&
other.endlessPlayback == this.endlessPlayback &&
other.enableConnect == this.enableConnect &&
other.connectPort == this.connectPort &&
other.cacheMusic == this.cacheMusic);
}
@ -1655,7 +1625,6 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
final Value<bool> discordPresence;
final Value<bool> endlessPlayback;
final Value<bool> enableConnect;
final Value<int> connectPort;
final Value<bool> cacheMusic;
const PreferencesTableCompanion({
this.id = const Value.absent(),
@ -1685,7 +1654,6 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
this.discordPresence = const Value.absent(),
this.endlessPlayback = const Value.absent(),
this.enableConnect = const Value.absent(),
this.connectPort = const Value.absent(),
this.cacheMusic = const Value.absent(),
});
PreferencesTableCompanion.insert({
@ -1716,7 +1684,6 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
this.discordPresence = const Value.absent(),
this.endlessPlayback = const Value.absent(),
this.enableConnect = const Value.absent(),
this.connectPort = const Value.absent(),
this.cacheMusic = const Value.absent(),
});
static Insertable<PreferencesTableData> custom({
@ -1747,7 +1714,6 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
Expression<bool>? discordPresence,
Expression<bool>? endlessPlayback,
Expression<bool>? enableConnect,
Expression<int>? connectPort,
Expression<bool>? cacheMusic,
}) {
return RawValuesInsertable({
@ -1782,7 +1748,6 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
if (discordPresence != null) 'discord_presence': discordPresence,
if (endlessPlayback != null) 'endless_playback': endlessPlayback,
if (enableConnect != null) 'enable_connect': enableConnect,
if (connectPort != null) 'connect_port': connectPort,
if (cacheMusic != null) 'cache_music': cacheMusic,
});
}
@ -1815,7 +1780,6 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
Value<bool>? discordPresence,
Value<bool>? endlessPlayback,
Value<bool>? enableConnect,
Value<int>? connectPort,
Value<bool>? cacheMusic}) {
return PreferencesTableCompanion(
id: id ?? this.id,
@ -1845,7 +1809,6 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
discordPresence: discordPresence ?? this.discordPresence,
endlessPlayback: endlessPlayback ?? this.endlessPlayback,
enableConnect: enableConnect ?? this.enableConnect,
connectPort: connectPort ?? this.connectPort,
cacheMusic: cacheMusic ?? this.cacheMusic,
);
}
@ -1955,9 +1918,6 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
if (enableConnect.present) {
map['enable_connect'] = Variable<bool>(enableConnect.value);
}
if (connectPort.present) {
map['connect_port'] = Variable<int>(connectPort.value);
}
if (cacheMusic.present) {
map['cache_music'] = Variable<bool>(cacheMusic.value);
}
@ -1994,7 +1954,6 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
..write('discordPresence: $discordPresence, ')
..write('endlessPlayback: $endlessPlayback, ')
..write('enableConnect: $enableConnect, ')
..write('connectPort: $connectPort, ')
..write('cacheMusic: $cacheMusic')
..write(')'))
.toString();
@ -4667,7 +4626,6 @@ typedef $$PreferencesTableTableCreateCompanionBuilder
Value<bool> discordPresence,
Value<bool> endlessPlayback,
Value<bool> enableConnect,
Value<int> connectPort,
Value<bool> cacheMusic,
});
typedef $$PreferencesTableTableUpdateCompanionBuilder
@ -4699,7 +4657,6 @@ typedef $$PreferencesTableTableUpdateCompanionBuilder
Value<bool> discordPresence,
Value<bool> endlessPlayback,
Value<bool> enableConnect,
Value<int> connectPort,
Value<bool> cacheMusic,
});
@ -4829,9 +4786,6 @@ class $$PreferencesTableTableFilterComposer
ColumnFilters<bool> get enableConnect => $composableBuilder(
column: $table.enableConnect, builder: (column) => ColumnFilters(column));
ColumnFilters<int> get connectPort => $composableBuilder(
column: $table.connectPort, builder: (column) => ColumnFilters(column));
ColumnFilters<bool> get cacheMusic => $composableBuilder(
column: $table.cacheMusic, builder: (column) => ColumnFilters(column));
}
@ -4945,9 +4899,6 @@ class $$PreferencesTableTableOrderingComposer
column: $table.enableConnect,
builder: (column) => ColumnOrderings(column));
ColumnOrderings<int> get connectPort => $composableBuilder(
column: $table.connectPort, builder: (column) => ColumnOrderings(column));
ColumnOrderings<bool> get cacheMusic => $composableBuilder(
column: $table.cacheMusic, builder: (column) => ColumnOrderings(column));
}
@ -5052,9 +5003,6 @@ class $$PreferencesTableTableAnnotationComposer
GeneratedColumn<bool> get enableConnect => $composableBuilder(
column: $table.enableConnect, builder: (column) => column);
GeneratedColumn<int> get connectPort => $composableBuilder(
column: $table.connectPort, builder: (column) => column);
GeneratedColumn<bool> get cacheMusic => $composableBuilder(
column: $table.cacheMusic, builder: (column) => column);
}
@ -5115,7 +5063,6 @@ class $$PreferencesTableTableTableManager extends RootTableManager<
Value<bool> discordPresence = const Value.absent(),
Value<bool> endlessPlayback = const Value.absent(),
Value<bool> enableConnect = const Value.absent(),
Value<int> connectPort = const Value.absent(),
Value<bool> cacheMusic = const Value.absent(),
}) =>
PreferencesTableCompanion(
@ -5146,7 +5093,6 @@ class $$PreferencesTableTableTableManager extends RootTableManager<
discordPresence: discordPresence,
endlessPlayback: endlessPlayback,
enableConnect: enableConnect,
connectPort: connectPort,
cacheMusic: cacheMusic,
),
createCompanionCallback: ({
@ -5178,7 +5124,6 @@ class $$PreferencesTableTableTableManager extends RootTableManager<
Value<bool> discordPresence = const Value.absent(),
Value<bool> endlessPlayback = const Value.absent(),
Value<bool> enableConnect = const Value.absent(),
Value<int> connectPort = const Value.absent(),
Value<bool> cacheMusic = const Value.absent(),
}) =>
PreferencesTableCompanion.insert(
@ -5209,7 +5154,6 @@ class $$PreferencesTableTableTableManager extends RootTableManager<
discordPresence: discordPresence,
endlessPlayback: endlessPlayback,
enableConnect: enableConnect,
connectPort: connectPort,
cacheMusic: cacheMusic,
),
withReferenceMapper: (p0) => p0

View File

@ -1,11 +1,11 @@
// dart format width=80
import 'package:drift/internal/versioned_schema.dart' as i0;
import 'package:drift/drift.dart' as i1;
import 'package:drift/drift.dart'; // ignore_for_file: type=lint,unused_import
import 'package:drift/drift.dart';
import 'package:flutter/material.dart';
import 'package:spotify/spotify.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/services/sourced_track/enums.dart';
import 'package:spotube/services/sourced_track/enums.dart'; // ignore_for_file: type=lint,unused_import
// GENERATED BY drift_dev, DO NOT MODIFY.
final class Schema2 extends i0.VersionedSchema {
@ -1409,295 +1409,11 @@ i1.GeneratedColumn<String> _column_55(String aliasedName) =>
i1.GeneratedColumn<String>('accent_color_scheme', aliasedName, false,
type: i1.DriftSqlType.string,
defaultValue: const Constant("Orange:0xFFf97315"));
final class Schema6 extends i0.VersionedSchema {
Schema6({required super.database}) : super(version: 6);
@override
late final List<i1.DatabaseSchemaEntity> entities = [
authenticationTable,
blacklistTable,
preferencesTable,
scrobblerTable,
skipSegmentTable,
sourceMatchTable,
audioPlayerStateTable,
playlistTable,
playlistMediaTable,
historyTable,
lyricsTable,
uniqueBlacklist,
uniqTrackMatch,
];
late final Shape0 authenticationTable = Shape0(
source: i0.VersionedTable(
entityName: 'authentication_table',
withoutRowId: false,
isStrict: false,
tableConstraints: [],
columns: [
_column_0,
_column_1,
_column_2,
_column_3,
],
attachedDatabase: database,
),
alias: null);
late final Shape1 blacklistTable = Shape1(
source: i0.VersionedTable(
entityName: 'blacklist_table',
withoutRowId: false,
isStrict: false,
tableConstraints: [],
columns: [
_column_0,
_column_4,
_column_5,
_column_6,
],
attachedDatabase: database,
),
alias: null);
late final Shape13 preferencesTable = Shape13(
source: i0.VersionedTable(
entityName: 'preferences_table',
withoutRowId: false,
isStrict: false,
tableConstraints: [],
columns: [
_column_0,
_column_7,
_column_8,
_column_9,
_column_10,
_column_11,
_column_12,
_column_13,
_column_14,
_column_15,
_column_55,
_column_17,
_column_18,
_column_19,
_column_20,
_column_21,
_column_22,
_column_23,
_column_24,
_column_25,
_column_26,
_column_54,
_column_27,
_column_28,
_column_29,
_column_30,
_column_31,
_column_56,
_column_53,
],
attachedDatabase: database,
),
alias: null);
late final Shape3 scrobblerTable = Shape3(
source: i0.VersionedTable(
entityName: 'scrobbler_table',
withoutRowId: false,
isStrict: false,
tableConstraints: [],
columns: [
_column_0,
_column_32,
_column_33,
_column_34,
],
attachedDatabase: database,
),
alias: null);
late final Shape4 skipSegmentTable = Shape4(
source: i0.VersionedTable(
entityName: 'skip_segment_table',
withoutRowId: false,
isStrict: false,
tableConstraints: [],
columns: [
_column_0,
_column_35,
_column_36,
_column_37,
_column_32,
],
attachedDatabase: database,
),
alias: null);
late final Shape5 sourceMatchTable = Shape5(
source: i0.VersionedTable(
entityName: 'source_match_table',
withoutRowId: false,
isStrict: false,
tableConstraints: [],
columns: [
_column_0,
_column_37,
_column_38,
_column_39,
_column_32,
],
attachedDatabase: database,
),
alias: null);
late final Shape6 audioPlayerStateTable = Shape6(
source: i0.VersionedTable(
entityName: 'audio_player_state_table',
withoutRowId: false,
isStrict: false,
tableConstraints: [],
columns: [
_column_0,
_column_40,
_column_41,
_column_42,
_column_43,
],
attachedDatabase: database,
),
alias: null);
late final Shape7 playlistTable = Shape7(
source: i0.VersionedTable(
entityName: 'playlist_table',
withoutRowId: false,
isStrict: false,
tableConstraints: [],
columns: [
_column_0,
_column_44,
_column_45,
],
attachedDatabase: database,
),
alias: null);
late final Shape8 playlistMediaTable = Shape8(
source: i0.VersionedTable(
entityName: 'playlist_media_table',
withoutRowId: false,
isStrict: false,
tableConstraints: [],
columns: [
_column_0,
_column_46,
_column_47,
_column_48,
_column_49,
],
attachedDatabase: database,
),
alias: null);
late final Shape9 historyTable = Shape9(
source: i0.VersionedTable(
entityName: 'history_table',
withoutRowId: false,
isStrict: false,
tableConstraints: [],
columns: [
_column_0,
_column_32,
_column_50,
_column_51,
_column_52,
],
attachedDatabase: database,
),
alias: null);
late final Shape10 lyricsTable = Shape10(
source: i0.VersionedTable(
entityName: 'lyrics_table',
withoutRowId: false,
isStrict: false,
tableConstraints: [],
columns: [
_column_0,
_column_37,
_column_52,
],
attachedDatabase: database,
),
alias: null);
final i1.Index uniqueBlacklist = i1.Index('unique_blacklist',
'CREATE UNIQUE INDEX unique_blacklist ON blacklist_table (element_type, element_id)');
final i1.Index uniqTrackMatch = i1.Index('uniq_track_match',
'CREATE UNIQUE INDEX uniq_track_match ON source_match_table (track_id, source_id, source_type)');
}
class Shape13 extends i0.VersionedTable {
Shape13({required super.source, required super.alias}) : super.aliased();
i1.GeneratedColumn<int> get id =>
columnsByName['id']! as i1.GeneratedColumn<int>;
i1.GeneratedColumn<String> get audioQuality =>
columnsByName['audio_quality']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<bool> get albumColorSync =>
columnsByName['album_color_sync']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<bool> get amoledDarkTheme =>
columnsByName['amoled_dark_theme']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<bool> get checkUpdate =>
columnsByName['check_update']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<bool> get normalizeAudio =>
columnsByName['normalize_audio']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<bool> get showSystemTrayIcon =>
columnsByName['show_system_tray_icon']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<bool> get systemTitleBar =>
columnsByName['system_title_bar']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<bool> get skipNonMusic =>
columnsByName['skip_non_music']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<String> get closeBehavior =>
columnsByName['close_behavior']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get accentColorScheme =>
columnsByName['accent_color_scheme']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get layoutMode =>
columnsByName['layout_mode']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get locale =>
columnsByName['locale']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get market =>
columnsByName['market']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get searchMode =>
columnsByName['search_mode']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get downloadLocation =>
columnsByName['download_location']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get localLibraryLocation =>
columnsByName['local_library_location']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get pipedInstance =>
columnsByName['piped_instance']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get invidiousInstance =>
columnsByName['invidious_instance']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get themeMode =>
columnsByName['theme_mode']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get audioSource =>
columnsByName['audio_source']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get youtubeClientEngine =>
columnsByName['youtube_client_engine']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get streamMusicCodec =>
columnsByName['stream_music_codec']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<String> get downloadMusicCodec =>
columnsByName['download_music_codec']! as i1.GeneratedColumn<String>;
i1.GeneratedColumn<bool> get discordPresence =>
columnsByName['discord_presence']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<bool> get endlessPlayback =>
columnsByName['endless_playback']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<bool> get enableConnect =>
columnsByName['enable_connect']! as i1.GeneratedColumn<bool>;
i1.GeneratedColumn<int> get connectPort =>
columnsByName['connect_port']! as i1.GeneratedColumn<int>;
i1.GeneratedColumn<bool> get cacheMusic =>
columnsByName['cache_music']! as i1.GeneratedColumn<bool>;
}
i1.GeneratedColumn<int> _column_56(String aliasedName) =>
i1.GeneratedColumn<int>('connect_port', aliasedName, false,
type: i1.DriftSqlType.int, defaultValue: const Constant(-1));
i0.MigrationStepWithVersion migrationSteps({
required Future<void> Function(i1.Migrator m, Schema2 schema) from1To2,
required Future<void> Function(i1.Migrator m, Schema3 schema) from2To3,
required Future<void> Function(i1.Migrator m, Schema4 schema) from3To4,
required Future<void> Function(i1.Migrator m, Schema5 schema) from4To5,
required Future<void> Function(i1.Migrator m, Schema6 schema) from5To6,
}) {
return (currentVersion, database) async {
switch (currentVersion) {
@ -1721,11 +1437,6 @@ i0.MigrationStepWithVersion migrationSteps({
final migrator = i1.Migrator(database, schema);
await from4To5(migrator, schema);
return 5;
case 5:
final schema = Schema6(database: database);
final migrator = i1.Migrator(database, schema);
await from5To6(migrator, schema);
return 6;
default:
throw ArgumentError.value('Unknown migration from $currentVersion');
}
@ -1737,7 +1448,6 @@ i1.OnUpgrade stepByStep({
required Future<void> Function(i1.Migrator m, Schema3 schema) from2To3,
required Future<void> Function(i1.Migrator m, Schema4 schema) from3To4,
required Future<void> Function(i1.Migrator m, Schema5 schema) from4To5,
required Future<void> Function(i1.Migrator m, Schema6 schema) from5To6,
}) =>
i0.VersionedSchema.stepByStepHelper(
step: migrationSteps(
@ -1745,5 +1455,4 @@ i1.OnUpgrade stepByStep({
from2To3: from2To3,
from3To4: from3To4,
from4To5: from4To5,
from5To6: from5To6,
));

View File

@ -115,7 +115,6 @@ class PreferencesTable extends Table {
boolean().withDefault(const Constant(true))();
BoolColumn get enableConnect =>
boolean().withDefault(const Constant(false))();
IntColumn get connectPort => integer().withDefault(const Constant(-1))();
BoolColumn get cacheMusic => boolean().withDefault(const Constant(true))();
// Default values as PreferencesTableData
@ -149,7 +148,6 @@ class PreferencesTable extends Table {
endlessPlayback: true,
enableConnect: false,
cacheMusic: true,
connectPort: -1,
);
}
}

View File

@ -1,97 +0,0 @@
import 'package:flutter/services.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:form_builder_validators/form_builder_validators.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:spotube/components/form/text_form_field.dart';
import 'package:spotube/extensions/context.dart';
import 'package:spotube/hooks/controllers/use_shadcn_text_editing_controller.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
class SettingsPlaybackEditConnectPortDialog extends HookConsumerWidget {
const SettingsPlaybackEditConnectPortDialog({super.key});
@override
Widget build(BuildContext context, ref) {
final connectPort = ref.watch(
userPreferencesProvider.select((s) => s.connectPort),
);
final controller = useShadcnTextEditingController(
text: connectPort.toString(),
);
final formKey = useMemoized(() => GlobalKey<FormBuilderState>(), []);
return ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 400),
child: Alert(
title: Text(context.l10n.edit_port).h4(),
content: FormBuilder(
key: formKey,
child: Column(
children: [
const Gap(10),
TextFormBuilderField(
name: "port",
controller: controller,
placeholder: const Text("3000"),
validator: FormBuilderValidators.integer(radix: 10),
keyboardType: TextInputType.number,
inputFormatters: [
// Allow only signed integers
TextInputFormatter.withFunction(
(oldValue, newValue) {
if (newValue.text.isEmpty) {
return const TextEditingValue();
}
if (newValue.text.length == 1 && newValue.text == "-") {
return newValue;
}
final intValue = int.tryParse(newValue.text);
if (intValue == null) {
return oldValue;
}
return newValue;
},
),
],
),
const Gap(5),
Text(context.l10n.port_helper_msg).small.muted,
const Gap(20),
Row(
children: [
Expanded(
child: Button.secondary(
onPressed: () {
Navigator.of(context).pop();
},
child: Text(context.l10n.cancel),
),
),
const Gap(10),
Expanded(
child: Button.primary(
onPressed: () {
if (!formKey.currentState!.saveAndValidate()) {
return;
}
final port = int.parse(controller.text);
ref
.read(userPreferencesProvider.notifier)
.setConnectPort(port);
Navigator.of(context).pop();
},
child: Text(context.l10n.save),
),
),
],
),
],
),
),
),
);
}
}

View File

@ -1,75 +0,0 @@
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:form_builder_validators/form_builder_validators.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:spotube/components/form/text_form_field.dart';
import 'package:spotube/extensions/context.dart';
import 'package:spotube/hooks/controllers/use_shadcn_text_editing_controller.dart';
class SettingsPlaybackEditInstanceUrlDialog extends HookConsumerWidget {
final String title;
final String? initialValue;
final ValueChanged<String> onSave;
const SettingsPlaybackEditInstanceUrlDialog({
super.key,
required this.title,
required this.onSave,
this.initialValue,
});
@override
Widget build(BuildContext context, ref) {
final controller = useShadcnTextEditingController(
text: initialValue,
);
final formKey = useMemoized(() => GlobalKey<FormBuilderState>(), []);
return Alert(
title: Text(title).h4(),
content: FormBuilder(
key: formKey,
child: Column(
children: [
const Gap(10),
TextFormBuilderField(
name: "url",
controller: controller,
placeholder: Text(title),
validator: FormBuilderValidators.url(),
),
const Gap(10),
Row(
children: [
Expanded(
child: Button.secondary(
onPressed: () {
Navigator.of(context).pop();
},
child: Text(context.l10n.cancel),
),
),
const Gap(10),
Expanded(
child: Button.primary(
onPressed: () {
if (!formKey.currentState!.saveAndValidate()) {
return;
}
onSave(
controller.text,
);
Navigator.of(context).pop();
},
child: Text(context.l10n.save),
),
),
],
)
],
),
),
);
}
}

View File

@ -1,13 +1,9 @@
import 'dart:convert';
import 'package:auto_route/auto_route.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
import 'package:shadcn_flutter/shadcn_flutter_extension.dart';
import 'package:spotube/collections/routes.gr.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/models/connect/connect.dart';
import 'package:spotube/modules/player/player_queue.dart';
import 'package:spotube/modules/player/volume_slider.dart';
import 'package:spotube/components/image/universal_image.dart';
@ -61,7 +57,6 @@ class ConnectControlPage extends HookConsumerWidget {
final resolvedService =
ref.watch(connectClientsProvider).asData?.value.resolvedService;
final connect = ref.watch(connectProvider);
final connectNotifier = ref.read(connectProvider.notifier);
final playlist = ref.watch(queueProvider);
final playing = ref.watch(playingProvider);
@ -74,32 +69,12 @@ class ConnectControlPage extends HookConsumerWidget {
}
});
useEffect(() {
if (connect.asData?.value == null) return null;
final subscription = connect.asData?.value?.stream.listen((message) {
final event = WebSocketEvent.fromJson(
jsonDecode(message),
(data) => data,
);
event.onError((event) {
if (event.data != "Connection denied") return;
if (!context.mounted) return;
context.back();
});
});
return () {
subscription?.cancel();
};
}, [connect.asData?.value]);
return SafeArea(
bottom: false,
child: Scaffold(
headers: [
TitleBar(
title: Text(resolvedService?.name ?? ""),
title: Text(resolvedService!.name),
)
],
child: LayoutBuilder(builder: (context, constrains) {
@ -272,8 +247,7 @@ class ConnectControlPage extends HookConsumerWidget {
),
Tooltip(
tooltip: TooltipContainer(
child: Text(context.l10n.next_track))
.call,
child: Text(context.l10n.next_track)).call,
child: IconButton.ghost(
icon: const Icon(SpotubeIcons.skipForward),
onPressed: playlist.activeTrack == null

View File

@ -4,6 +4,9 @@ import 'package:auto_route/auto_route.dart';
import 'package:collection/collection.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart' show ListTile;
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:form_builder_validators/form_builder_validators.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
@ -11,9 +14,9 @@ import 'package:piped_client/piped_client.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
import 'package:spotube/collections/routes.gr.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/form/text_form_field.dart';
import 'package:spotube/hooks/controllers/use_shadcn_text_editing_controller.dart';
import 'package:spotube/models/database/database.dart';
import 'package:spotube/modules/settings/playback/edit_connect_port_dialog.dart';
import 'package:spotube/modules/settings/playback/edit_instance_url_dialog.dart';
import 'package:spotube/modules/settings/section_card_with_heading.dart';
import 'package:spotube/components/adaptive/adaptive_select_tile.dart';
import 'package:spotube/extensions/context.dart';
@ -111,12 +114,67 @@ class SettingsPlaybackSection extends HookConsumerWidget {
showDialog(
context: context,
barrierColor: Colors.black.withValues(alpha: 0.5),
builder: (context) =>
SettingsPlaybackEditInstanceUrlDialog(
title: context.l10n.piped_instance,
initialValue: preferences.pipedInstance,
onSave: (value) {
preferencesNotifier.setPipedInstance(value);
builder: (context) => HookBuilder(
builder: (context) {
final controller =
useShadcnTextEditingController(
text: preferences.pipedInstance,
);
final formKey = useMemoized(
() => GlobalKey<FormBuilderState>(), []);
return Alert(
title:
Text(context.l10n.piped_instance).h4(),
content: FormBuilder(
key: formKey,
child: Column(
children: [
const Gap(10),
TextFormBuilderField(
name: "url",
controller: controller,
placeholder: Text(
context.l10n.piped_instance),
validator:
FormBuilderValidators.url(),
),
const Gap(10),
Row(
children: [
Expanded(
child: Button.secondary(
onPressed: () {
Navigator.of(context).pop();
},
child:
Text(context.l10n.cancel),
),
),
const Gap(10),
Expanded(
child: Button.primary(
onPressed: () {
if (!formKey.currentState!
.saveAndValidate()) {
return;
}
preferencesNotifier
.setPipedInstance(
controller.text,
);
Navigator.of(context).pop();
},
child:
Text(context.l10n.save),
),
),
],
)
],
),
),
);
},
),
);
@ -211,13 +269,67 @@ class SettingsPlaybackSection extends HookConsumerWidget {
showDialog(
context: context,
barrierColor: Colors.black.withValues(alpha: 0.5),
builder: (context) =>
SettingsPlaybackEditInstanceUrlDialog(
title: context.l10n.invidious_instance,
initialValue: preferences.invidiousInstance,
onSave: (value) {
preferencesNotifier
.setInvidiousInstance(value);
builder: (context) => HookBuilder(
builder: (context) {
final controller =
useShadcnTextEditingController(
text: preferences.invidiousInstance,
);
final formKey = useMemoized(
() => GlobalKey<FormBuilderState>(), []);
return Alert(
title: Text(context.l10n.invidious_instance)
.h4(),
content: FormBuilder(
key: formKey,
child: Column(
children: [
const Gap(10),
TextFormBuilderField(
name: "url",
controller: controller,
placeholder: Text(context
.l10n.invidious_instance),
validator:
FormBuilderValidators.url(),
),
const Gap(10),
Row(
children: [
Expanded(
child: Button.secondary(
onPressed: () {
Navigator.of(context).pop();
},
child:
Text(context.l10n.cancel),
),
),
const Gap(10),
Expanded(
child: Button.primary(
onPressed: () {
if (!formKey.currentState!
.saveAndValidate()) {
return;
}
preferencesNotifier
.setInvidiousInstance(
controller.text,
);
Navigator.of(context).pop();
},
child:
Text(context.l10n.save),
),
),
],
)
],
),
),
);
},
),
);
@ -449,32 +561,9 @@ class SettingsPlaybackSection extends HookConsumerWidget {
title: Text(context.l10n.enable_connect),
subtitle: Text(context.l10n.enable_connect_description),
leading: const Icon(SpotubeIcons.connect),
trailing: Row(
mainAxisSize: MainAxisSize.min,
spacing: 10,
children: [
Tooltip(
tooltip: TooltipContainer(
child: Text(context.l10n.edit_port),
).call,
child: IconButton.outline(
icon: const Icon(SpotubeIcons.edit),
size: ButtonSize.small,
onPressed: () {
showDialog(
context: context,
barrierColor: Colors.black.withValues(alpha: 0.5),
builder: (context) =>
const SettingsPlaybackEditConnectPortDialog(),
);
},
),
),
Switch(
value: preferences.enableConnect,
onChanged: preferencesNotifier.setEnableConnect,
),
],
trailing: Switch(
value: preferences.enableConnect,
onChanged: preferencesNotifier.setEnableConnect,
),
),
],

View File

@ -1,10 +1,6 @@
import 'dart:convert';
import 'package:media_kit/media_kit.dart' hide Track;
import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:spotube/collections/routes.dart';
import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/extensions/context.dart';
import 'package:spotube/provider/audio_player/state.dart';
import 'package:spotube/services/audio_player/audio_player.dart';
import 'package:spotube/services/logger/logger.dart';
@ -50,17 +46,15 @@ final volumeProvider = StateProvider<double>(
(ref) => 1.0,
);
typedef ConnectState = ({WebSocketChannel channel, Stream stream});
class ConnectNotifier extends AsyncNotifier<ConnectState?> {
class ConnectNotifier extends AsyncNotifier<WebSocketChannel?> {
@override
build() async {
try {
final connectClients = await ref.watch(connectClientsProvider.future);
final connectClients = ref.watch(connectClientsProvider);
if (connectClients.resolvedService == null) return null;
if (connectClients.asData?.value.resolvedService == null) return null;
final service = connectClients.resolvedService!;
final service = connectClients.asData!.value.resolvedService!;
AppLogger.log.t(
'♾️ Connecting to ${service.name}: ws://${service.host}:${service.port}/ws',
@ -76,9 +70,7 @@ class ConnectNotifier extends AsyncNotifier<ConnectState?> {
'✅ Connected to ${service.name}: ws://${service.host}:${service.port}/ws',
);
final stream = channel.stream.asBroadcastStream();
final subscription = stream.listen(
final subscription = channel.stream.listen(
(message) {
final event =
WebSocketEvent.fromJson(jsonDecode(message), (data) => data);
@ -110,38 +102,6 @@ class ConnectNotifier extends AsyncNotifier<ConnectState?> {
event.onVolume((event) {
ref.read(volumeProvider.notifier).state = event.data;
});
event.onError((event) {
if (event.data == "Connection denied") {
ref.read(connectClientsProvider.notifier).clearResolvedService();
if (rootNavigatorKey.currentContext?.mounted == true) {
final theme = Theme.of(rootNavigatorKey.currentContext!);
showToast(
context: rootNavigatorKey.currentContext!,
location: ToastLocation.topRight,
dismissible: true,
builder: (context, overlay) {
return SurfaceCard(
fillColor: theme.colorScheme.destructive,
filled: true,
child: Basic(
leading: const Icon(SpotubeIcons.error),
title: Text(
context.l10n.connection_request_denied,
style: theme.typography.normal.copyWith(
color: theme.colorScheme.destructiveForeground,
),
),
leadingAlignment: Alignment.center,
),
);
},
);
}
}
});
},
onError: (error) {
AppLogger.reportError(error, StackTrace.current);
@ -153,7 +113,7 @@ class ConnectNotifier extends AsyncNotifier<ConnectState?> {
channel.sink.close(status.goingAway);
});
return (channel: channel, stream: stream);
return channel;
} catch (e, stack) {
AppLogger.reportError(e, stack);
rethrow;
@ -162,7 +122,7 @@ class ConnectNotifier extends AsyncNotifier<ConnectState?> {
Future<void> emit(Object message) async {
if (state.value == null) return;
state.value?.channel.sink.add(
state.value?.sink.add(
message is String ? message : (message as dynamic).toJson(),
);
}
@ -224,6 +184,7 @@ class ConnectNotifier extends AsyncNotifier<ConnectState?> {
}
}
final connectProvider = AsyncNotifierProvider<ConnectNotifier, ConnectState?>(
final connectProvider =
AsyncNotifierProvider<ConnectNotifier, WebSocketChannel?>(
() => ConnectNotifier(),
);

View File

@ -15,7 +15,6 @@ import 'package:spotube/models/local_track.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
// ignore: depend_on_referenced_packages
import 'package:flutter_rust_bridge/flutter_rust_bridge.dart' show FrbException;
import 'package:spotube/utils/service_utils.dart';
const supportedAudioTypes = [
"audio/webm",
@ -91,15 +90,12 @@ final localTracksProvider =
try {
final metadata = await MetadataGod.readMetadata(file: file.path);
final imageFile = File(
join(
(await getTemporaryDirectory()).path,
"spotube",
ServiceUtils.sanitizeFilename(
basenameWithoutExtension(file.path)) +
imgMimeToExt[metadata.picture?.mimeType ?? "image/jpeg"]!,
),
);
final imageFile = File(join(
(await getTemporaryDirectory()).path,
"spotube",
basenameWithoutExtension(file.path) +
imgMimeToExt[metadata.picture?.mimeType ?? "image/jpeg"]!,
));
if (!await imageFile.exists() && metadata.picture != null) {
await imageFile.create(recursive: true);
await imageFile.writeAsBytes(

View File

@ -3,12 +3,9 @@ import 'dart:convert';
import 'dart:io';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:shelf/shelf.dart';
import 'package:shelf_web_socket/shelf_web_socket.dart';
import 'package:spotify/spotify.dart';
import 'package:spotube/collections/routes.dart';
import 'package:spotube/extensions/context.dart';
import 'package:spotube/models/connect/connect.dart';
import 'package:spotube/provider/history/history.dart';
@ -46,8 +43,6 @@ class ServerConnectRoutes {
Stream<String> get connectClientStream =>
_connectClientStreamController.stream;
final List<String> _allowedConnections = [];
FutureOr<Response> websocket(Request req) {
return webSocketHandler(
(
@ -59,47 +54,6 @@ class ServerConnectRoutes {
final origin = "${context?.remoteAddress.host}:${context?.remotePort}";
_connectClientStreamController.add(origin);
// Confirm whether user allows to connect
if (rootNavigatorKey.currentContext?.mounted == true &&
_allowedConnections.contains(origin) == false) {
final confirmed = await showDialog<bool>(
context: rootNavigatorKey.currentContext!,
builder: (context) {
return AlertDialog(
title: Text(context.l10n.connect),
content: Text(
context.l10n.connect_request(origin),
),
actions: [
Button.secondary(
onPressed: () {
Navigator.of(context).pop(false);
},
child: Text(context.l10n.decline),
),
Button.primary(
onPressed: () {
Navigator.of(context).pop(true);
},
child: Text(context.l10n.accept),
),
],
);
},
) ??
false;
if (confirmed) {
_allowedConnections.add(origin);
} else {
channel.sink.addEvent(
WebSocketErrorEvent("Connection denied"),
);
await channel.sink.close();
return;
}
}
ref.listen(
audioPlayerProvider,
(previous, next) {
@ -152,7 +106,7 @@ class ServerConnectRoutes {
},
),
channel.stream.listen(
(message) async {
(message) {
try {
final event = WebSocketEvent.fromJson(
jsonDecode(message),

View File

@ -54,9 +54,7 @@ class ServerPlaybackRoutes {
final trackCacheFile = File(
join(
await UserPreferencesNotifier.getMusicCacheDir(),
ServiceUtils.sanitizeFilename(
'${track.name} - ${track.artists?.asString()} (${track.sourceInfo.id}).${track.codec.name}',
),
'${track.name} - ${track.artists?.asString()} (${track.sourceInfo.id}).${track.codec.name}',
),
);
final trackPartialCacheFile = File("${trackCacheFile.path}.part");

View File

@ -5,51 +5,30 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shelf/shelf_io.dart';
import 'package:spotube/provider/server/pipeline.dart';
import 'package:spotube/provider/server/router.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/services/audio_player/audio_player.dart';
import 'package:spotube/services/logger/logger.dart';
final serverProvider = FutureProvider(
(ref) async {
final enabledRemoteConnect = ref.watch(
userPreferencesProvider.select((value) => value.enableConnect),
);
final connectPort = ref.watch(
userPreferencesProvider.select((value) => value.connectPort),
);
final pipeline = ref.watch(pipelineProvider);
final router = ref.watch(serverRouterProvider);
final port = Random().nextInt(17500) + 5000;
// When connect port is -1, we need to generate a random port
// but we shouldn't reset it if it's already been set (caused by a state change)
if (connectPort == -1) {
if (SpotubeMedia.serverPort == 0) {
final port = Random().nextInt(17500) + 5000;
SpotubeMedia.serverPort = port;
}
} else {
SpotubeMedia.serverPort = connectPort;
}
SpotubeMedia.serverPort = port;
final server = await serve(
pipeline.addHandler(router.call),
enabledRemoteConnect
? InternetAddress.anyIPv4
: InternetAddress.loopbackIPv4,
SpotubeMedia.serverPort,
InternetAddress.anyIPv4,
port,
);
AppLogger.log.t(
'Playback server at http://${server.address.host}:${server.port}',
);
AppLogger.log
.t('Playback server at http://${server.address.host}:${server.port}');
ref.onDispose(() {
server.close();
});
return (
server: server,
port: SpotubeMedia.serverPort,
);
return (server: server, port: port);
},
);

View File

@ -240,14 +240,6 @@ class UserPreferencesNotifier extends Notifier<PreferencesTableData> {
setData(PreferencesTableCompanion(enableConnect: Value(enable)));
}
void setConnectPort(int port) {
assert(
port >= -1 && port <= 65535,
"Port must be between -1 and 65535, got $port",
);
setData(PreferencesTableCompanion(connectPort: Value(port)));
}
void setCacheMusic(bool cache) {
setData(PreferencesTableCompanion(cacheMusic: Value(cache)));
}

View File

@ -434,37 +434,4 @@ abstract class ServiceUtils {
return "Mozilla/5.0 (Linux; Android ${randomNumber(8, 13)}) AppleWebKit/${randomNumber(530, 537)}.${randomNumber(30, 36)} (KHTML, like Gecko) Chrome/${randomNumber(101, 116)}.0.${randomNumber(3000, 6000)}.${randomNumber(60, 125)} Mobile Safari/${randomNumber(530, 537)}.${randomNumber(30, 36)}";
}
}
static String sanitizeFilename(String input, {String replacement = ''}) {
final result = input
// illegalRe
.replaceAll(
RegExp(r'[\/\?<>\\:\*\|"]'),
replacement,
)
// controlRe
.replaceAll(
RegExp(
r'[\x00-\x1f\x80-\x9f]',
),
replacement,
)
// reservedRe
.replaceFirst(
RegExp(r'^\.+$'),
replacement,
)
// windowsReservedRe
.replaceFirst(
RegExp(
r'^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$',
caseSensitive: false,
),
replacement,
)
// windowsTrailingRe
.replaceFirst(RegExp(r'[\. ]+$'), replacement);
return result.length > 255 ? result.substring(0, 255) : result;
}
}

View File

@ -5,7 +5,6 @@ import 'package:drift/drift.dart';
import 'package:drift/internal/migrations.dart';
import 'schema_v3.dart' as v3;
import 'schema_v5.dart' as v5;
import 'schema_v6.dart' as v6;
import 'schema_v1.dart' as v1;
import 'schema_v2.dart' as v2;
import 'schema_v4.dart' as v4;
@ -18,8 +17,6 @@ class GeneratedHelper implements SchemaInstantiationHelper {
return v3.DatabaseAtV3(db);
case 5:
return v5.DatabaseAtV5(db);
case 6:
return v6.DatabaseAtV6(db);
case 1:
return v1.DatabaseAtV1(db);
case 2:
@ -31,5 +28,5 @@ class GeneratedHelper implements SchemaInstantiationHelper {
}
}
static const versions = const [1, 2, 3, 4, 5, 6];
static const versions = const [1, 2, 3, 4, 5];
}

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1 @@
{
"fr": [
"connection_request_denied"
]
}
{}