mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-12 23:45:18 +00:00
Merge pull request #2687 from KRTirtho/fix/path-traversal-through-websocket
fix: path traversal through websocket
This commit is contained in:
commit
76f0f18592
1
drift_schemas/app_db/drift_schema_v6.json
Normal file
1
drift_schemas/app_db/drift_schema_v6.json
Normal file
File diff suppressed because one or more lines are too long
@ -15,8 +15,7 @@ class TextFormBuilderField extends StatelessWidget {
|
||||
// final AlignmentGeometry? leadingAlignment;
|
||||
// final AlignmentGeometry? trailingAlignment;
|
||||
final bool border;
|
||||
final Widget? leading;
|
||||
final Widget? trailing;
|
||||
final List<InputFeature> features;
|
||||
final EdgeInsetsGeometry? padding;
|
||||
final ValueChanged<String>? onSubmitted;
|
||||
final VoidCallback? onEditingComplete;
|
||||
@ -63,8 +62,6 @@ class TextFormBuilderField extends StatelessWidget {
|
||||
this.filled = false,
|
||||
this.placeholder,
|
||||
this.border = true,
|
||||
this.leading,
|
||||
this.trailing,
|
||||
this.padding,
|
||||
this.onSubmitted,
|
||||
this.onEditingComplete,
|
||||
@ -96,6 +93,7 @@ class TextFormBuilderField extends StatelessWidget {
|
||||
// this.leadingAlignment,
|
||||
// this.trailingAlignment,
|
||||
this.statesController,
|
||||
this.features = const [],
|
||||
});
|
||||
|
||||
@override
|
||||
@ -130,10 +128,7 @@ class TextFormBuilderField extends StatelessWidget {
|
||||
filled: filled,
|
||||
placeholder: placeholder,
|
||||
border: border,
|
||||
features: [
|
||||
if (leading != null) InputFeature.leading(leading!),
|
||||
if (trailing != null) InputFeature.trailing(trailing!),
|
||||
],
|
||||
features: features,
|
||||
padding: padding,
|
||||
onSubmitted: (value) {
|
||||
field.validate();
|
||||
|
@ -426,5 +426,9 @@
|
||||
"download": "تنزيل",
|
||||
"file_not_found": "الملف غير موجود",
|
||||
"custom": "مخصص",
|
||||
"add_custom_url": "إضافة URL مخصص"
|
||||
"add_custom_url": "إضافة URL مخصص",
|
||||
"edit_port": "تعديل المنفذ",
|
||||
"port_helper_msg": "القيمة الافتراضية هي -1 والتي تشير إلى رقم عشوائي. إذا كان لديك جدار ناري مُعد، يُوصى بتعيين هذا.",
|
||||
"connect_request": "السماح لـ {client} بالاتصال؟",
|
||||
"connection_request_denied": "تم رفض الاتصال. المستخدم رفض الوصول."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "ডাউনলোড",
|
||||
"file_not_found": "ফাইল পাওয়া যায়নি",
|
||||
"custom": "কাস্টম",
|
||||
"add_custom_url": "কাস্টম URL যোগ করুন"
|
||||
"add_custom_url": "কাস্টম URL যোগ করুন",
|
||||
"edit_port": "পোর্ট সম্পাদনা করুন",
|
||||
"port_helper_msg": "ডিফল্ট হল -1 যা এলোমেলো সংখ্যা নির্দেশ করে। যদি আপনার ফায়ারওয়াল কনফিগার করা থাকে, তবে এটি সেট করা সুপারিশ করা হয়।",
|
||||
"connect_request": "{client} কে সংযোগ করতে অনুমতি দেবেন?",
|
||||
"connection_request_denied": "সংযোগ অস্বীকৃত। ব্যবহারকারী প্রবেশাধিকার অস্বীকার করেছে।"
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "Descarregar",
|
||||
"file_not_found": "Fitxer no trobat",
|
||||
"custom": "Personalitzat",
|
||||
"add_custom_url": "Afegir URL personalitzada"
|
||||
"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."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "Stáhnout",
|
||||
"file_not_found": "Soubor nenalezen",
|
||||
"custom": "Vlastní",
|
||||
"add_custom_url": "Přidat vlastní URL"
|
||||
"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."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "Herunterladen",
|
||||
"file_not_found": "Datei nicht gefunden",
|
||||
"custom": "Benutzerdefiniert",
|
||||
"add_custom_url": "Benutzerdefinierte URL hinzufügen"
|
||||
"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."
|
||||
}
|
@ -424,5 +424,9 @@
|
||||
"download": "Download",
|
||||
"file_not_found": "File not found",
|
||||
"custom": "Custom",
|
||||
"add_custom_url": "Add custom URL"
|
||||
"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."
|
||||
}
|
||||
|
@ -426,5 +426,9 @@
|
||||
"download": "Descargar",
|
||||
"file_not_found": "Archivo no encontrado",
|
||||
"custom": "Personalizado",
|
||||
"add_custom_url": "Agregar URL personalizada"
|
||||
"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."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "Deskargatu",
|
||||
"file_not_found": "Fitxategia ez da aurkitu",
|
||||
"custom": "Pertsonalizatua",
|
||||
"add_custom_url": "Gehitu URL 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."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "دانلود",
|
||||
"file_not_found": "فایل پیدا نشد",
|
||||
"custom": "شخصیسازی شده",
|
||||
"add_custom_url": "اضافه کردن URL سفارشی"
|
||||
"add_custom_url": "اضافه کردن URL سفارشی",
|
||||
"edit_port": "ویرایش پورت",
|
||||
"port_helper_msg": "پیشفرض -1 است که نشاندهنده یک عدد تصادفی است. اگر فایروال شما پیکربندی شده است، توصیه میشود این را تنظیم کنید.",
|
||||
"connect_request": "آیا اجازه میدهید {client} متصل شود؟",
|
||||
"connection_request_denied": "اتصال رد شد. کاربر دسترسی را رد کرد."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "Lataa",
|
||||
"file_not_found": "Tiedostoa ei löydy",
|
||||
"custom": "Mukautettu",
|
||||
"add_custom_url": "Lisää mukautettu URL"
|
||||
"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."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "Télécharger",
|
||||
"file_not_found": "Fichier non trouvé",
|
||||
"custom": "Personnalisé",
|
||||
"add_custom_url": "Ajouter une URL personnalisée"
|
||||
"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."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "डाउनलोड करें",
|
||||
"file_not_found": "फाइल नहीं मिली",
|
||||
"custom": "कस्टम",
|
||||
"add_custom_url": "कस्टम URL जोड़ें"
|
||||
"add_custom_url": "कस्टम URL जोड़ें",
|
||||
"edit_port": "पोर्ट संपादित करें",
|
||||
"port_helper_msg": "डिफ़ॉल्ट -1 है जो यादृच्छिक संख्या को दर्शाता है। यदि आपने फ़ायरवॉल कॉन्फ़िगर किया है, तो इसे सेट करना अनुशंसित है।",
|
||||
"connect_request": "{client} को कनेक्ट करने की अनुमति दें?",
|
||||
"connection_request_denied": "कनेक्शन अस्वीकृत। उपयोगकर्ता ने पहुंच अस्वीकृत कर दी।"
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "Download",
|
||||
"file_not_found": "File not found",
|
||||
"custom": "Custom",
|
||||
"add_custom_url": "Add custom URL"
|
||||
"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."
|
||||
}
|
@ -427,5 +427,9 @@
|
||||
"download": "Scarica",
|
||||
"file_not_found": "File non trovato",
|
||||
"custom": "Personalizzato",
|
||||
"add_custom_url": "Aggiungi URL 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."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "ダウンロード",
|
||||
"file_not_found": "ファイルが見つかりません",
|
||||
"custom": "カスタム",
|
||||
"add_custom_url": "カスタムURLを追加"
|
||||
"add_custom_url": "カスタムURLを追加",
|
||||
"edit_port": "ポートを編集",
|
||||
"port_helper_msg": "デフォルトは-1で、ランダムな番号を示します。ファイアウォールを設定している場合は、これを設定することをお勧めします。",
|
||||
"connect_request": "{client}の接続を許可しますか?",
|
||||
"connection_request_denied": "接続が拒否されました。ユーザーがアクセスを拒否しました。"
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "ჩამოტვირთვა",
|
||||
"file_not_found": "ფაილი ვერ მოიძებნა",
|
||||
"custom": "პერსონალიზირებული",
|
||||
"add_custom_url": "დამატება პერსონალური URL"
|
||||
"add_custom_url": "დამატება პერსონალური URL",
|
||||
"edit_port": "პორტის რედაქტირება",
|
||||
"port_helper_msg": "ნაგულისხმევი არის -1, რაც შემთხვევითი ნომრის მითითებას ნიშნავს. თუ لديك firewall настроен, рекомендуется установить это.",
|
||||
"connect_request": "{client}-ის დაკავშირების ნებართვა?",
|
||||
"connection_request_denied": "კავშირი უარყოფილია. მომხმარებელმა უარყო წვდომა."
|
||||
}
|
@ -427,5 +427,9 @@
|
||||
"download": "다운로드",
|
||||
"file_not_found": "파일을 찾을 수 없습니다",
|
||||
"custom": "사용자 정의",
|
||||
"add_custom_url": "사용자 정의 URL 추가"
|
||||
"add_custom_url": "사용자 정의 URL 추가",
|
||||
"edit_port": "포트 편집",
|
||||
"port_helper_msg": "기본값은 -1로 무작위 숫자를 나타냅니다. 방화벽이 구성된 경우 이를 설정하는 것이 좋습니다.",
|
||||
"connect_request": "{client}의 연결을 허용하시겠습니까?",
|
||||
"connection_request_denied": "연결이 거부되었습니다. 사용자가 액세스를 거부했습니다."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "डाउनलोड",
|
||||
"file_not_found": "फ़ाइल नहीं मिली",
|
||||
"custom": "कस्टम",
|
||||
"add_custom_url": "कस्टम URL जोड़ें"
|
||||
"add_custom_url": "कस्टम URL जोड़ें",
|
||||
"edit_port": "पोर्ट सम्पादन गर्नुहोस्",
|
||||
"port_helper_msg": "डिफ़ॉल्ट -1 हो जुन यादृच्छिक संख्या जनाउँछ। यदि तपाईंले फायरवाल कन्फिगर गर्नुभएको छ भने, यसलाई सेट गर्न सिफारिस गरिन्छ।",
|
||||
"connect_request": "{client} लाई जडान गर्न अनुमति दिनुहोस्?",
|
||||
"connection_request_denied": "जडान अस्वीकृत। प्रयोगकर्ताले पहुँच अस्वीकृत गर्यो।"
|
||||
}
|
@ -427,5 +427,9 @@
|
||||
"download": "Downloaden",
|
||||
"file_not_found": "Bestand niet gevonden",
|
||||
"custom": "Aangepast",
|
||||
"add_custom_url": "Voeg aangepaste URL toe"
|
||||
"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."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "Pobierz",
|
||||
"file_not_found": "Plik nie znaleziony",
|
||||
"custom": "Niestandardowy",
|
||||
"add_custom_url": "Dodaj niestandardowy URL"
|
||||
"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."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "Baixar",
|
||||
"file_not_found": "Arquivo não encontrado",
|
||||
"custom": "Personalizado",
|
||||
"add_custom_url": "Adicionar URL personalizada"
|
||||
"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 ."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "Скачать",
|
||||
"file_not_found": "Файл не найден",
|
||||
"custom": "Пользовательский",
|
||||
"add_custom_url": "Добавить пользовательский URL"
|
||||
"add_custom_url": "Добавить пользовательский URL",
|
||||
"edit_port": "Редактировать порт",
|
||||
"port_helper_msg": "По умолчанию -1, что означает случайное число. Если у вас настроен брандмауэр, рекомендуется установить это.",
|
||||
"connect_request": "Разрешить {client} подключение?",
|
||||
"connection_request_denied": "Подключение отклонено. Пользователь отказал в доступе."
|
||||
}
|
@ -1,428 +1,432 @@
|
||||
{
|
||||
"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 ஐச் சேர்க்கவும்"
|
||||
"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": "இணைப்பு மறுக்கப்பட்டது. பயனர் அணுகலை மறுத்தார்."
|
||||
}
|
@ -427,5 +427,9 @@
|
||||
"download": "ดาวน์โหลด",
|
||||
"file_not_found": "ไม่พบไฟล์",
|
||||
"custom": "กำหนดเอง",
|
||||
"add_custom_url": "เพิ่ม URL แบบกำหนดเอง"
|
||||
"add_custom_url": "เพิ่ม URL แบบกำหนดเอง",
|
||||
"edit_port": "แก้ไขพอร์ต",
|
||||
"port_helper_msg": "ค่าเริ่มต้นคือ -1 ซึ่งหมายถึงหมายเลขสุ่ม หากคุณได้กำหนดค่าไฟร์วอลล์แล้ว แนะนำให้ตั้งค่านี้",
|
||||
"connect_request": "อนุญาตให้ {client} เชื่อมต่อหรือไม่?",
|
||||
"connection_request_denied": "การเชื่อมต่อล้มเหลว ผู้ใช้ปฏิเสธการเข้าถึง"
|
||||
}
|
@ -1,428 +1,432 @@
|
||||
{
|
||||
"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"
|
||||
}
|
||||
"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."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "İndir",
|
||||
"file_not_found": "Dosya bulunamadı",
|
||||
"custom": "Özel",
|
||||
"add_custom_url": "Özel URL ekle"
|
||||
"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."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "Завантажити",
|
||||
"file_not_found": "Файл не знайдено",
|
||||
"custom": "Користувацький",
|
||||
"add_custom_url": "Додати користувацький URL"
|
||||
"add_custom_url": "Додати користувацький URL",
|
||||
"edit_port": "Редагувати порт",
|
||||
"port_helper_msg": "За замовчуванням -1, що означає випадкове число. Якщо у вас налаштований брандмауер, рекомендується це налаштувати.",
|
||||
"connect_request": "Дозволити {client} підключення?",
|
||||
"connection_request_denied": "Підключення відхилено. Користувач відмовив у доступі."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"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"
|
||||
"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."
|
||||
}
|
@ -426,5 +426,9 @@
|
||||
"download": "下载",
|
||||
"file_not_found": "文件未找到",
|
||||
"custom": "自定义",
|
||||
"add_custom_url": "添加自定义 URL"
|
||||
"add_custom_url": "添加自定义 URL",
|
||||
"edit_port": "编辑端口",
|
||||
"port_helper_msg": "默认值为-1,表示随机数。如果您已配置防火墙,建议设置此项。",
|
||||
"connect_request": "允许 {client} 连接吗?",
|
||||
"connection_request_denied": "连接被拒绝。用户拒绝访问。"
|
||||
}
|
@ -2704,6 +2704,30 @@ 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> {
|
||||
|
@ -1371,4 +1371,18 @@ 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 => 'تم رفض الاتصال. المستخدم رفض الوصول.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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 => 'সংযোগ অস্বীকৃত। ব্যবহারকারী প্রবেশাধিকার অস্বীকার করেছে।';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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 => 'اتصال رد شد. کاربر دسترسی را رد کرد.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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 => 'कनेक्शन अस्वीकृत। उपयोगकर्ता ने पहुंच अस्वीकृत कर दी।';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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 => '接続が拒否されました。ユーザーがアクセスを拒否しました。';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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 => 'კავშირი უარყოფილია. მომხმარებელმა უარყო წვდომა.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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 => '연결이 거부되었습니다. 사용자가 액세스를 거부했습니다.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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 => 'जडान अस्वीकृत। प्रयोगकर्ताले पहुँच अस्वीकृत गर्यो।';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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 .';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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 => 'Подключение отклонено. Пользователь отказал в доступе.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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 => 'இணைப்பு மறுக்கப்பட்டது. பயனர் அணுகலை மறுத்தார்.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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 => 'การเชื่อมต่อล้มเหลว ผู้ใช้ปฏิเสธการเข้าถึง';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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 => 'Підключення відхилено. Користувач відмовив у доступі.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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.';
|
||||
}
|
||||
|
@ -1371,4 +1371,18 @@ 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 => '连接被拒绝。用户拒绝访问。';
|
||||
}
|
||||
|
@ -62,7 +62,7 @@ class AppDatabase extends _$AppDatabase {
|
||||
AppDatabase() : super(_openConnection());
|
||||
|
||||
@override
|
||||
int get schemaVersion => 5;
|
||||
int get schemaVersion => 6;
|
||||
|
||||
@override
|
||||
MigrationStrategy get migration {
|
||||
@ -114,6 +114,13 @@ 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,
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
@ -823,6 +823,14 @@ 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
|
||||
@ -862,6 +870,7 @@ class $PreferencesTableTable extends PreferencesTable
|
||||
discordPresence,
|
||||
endlessPlayback,
|
||||
enableConnect,
|
||||
connectPort,
|
||||
cacheMusic
|
||||
];
|
||||
@override
|
||||
@ -971,6 +980,12 @@ 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,
|
||||
@ -1054,6 +1069,8 @@ 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'])!,
|
||||
);
|
||||
@ -1126,6 +1143,7 @@ class PreferencesTableData extends DataClass
|
||||
final bool discordPresence;
|
||||
final bool endlessPlayback;
|
||||
final bool enableConnect;
|
||||
final int connectPort;
|
||||
final bool cacheMusic;
|
||||
const PreferencesTableData(
|
||||
{required this.id,
|
||||
@ -1155,6 +1173,7 @@ 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) {
|
||||
@ -1230,6 +1249,7 @@ 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;
|
||||
}
|
||||
@ -1263,6 +1283,7 @@ class PreferencesTableData extends DataClass
|
||||
discordPresence: Value(discordPresence),
|
||||
endlessPlayback: Value(endlessPlayback),
|
||||
enableConnect: Value(enableConnect),
|
||||
connectPort: Value(connectPort),
|
||||
cacheMusic: Value(cacheMusic),
|
||||
);
|
||||
}
|
||||
@ -1310,6 +1331,7 @@ 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']),
|
||||
);
|
||||
}
|
||||
@ -1358,6 +1380,7 @@ 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),
|
||||
};
|
||||
}
|
||||
@ -1390,6 +1413,7 @@ class PreferencesTableData extends DataClass
|
||||
bool? discordPresence,
|
||||
bool? endlessPlayback,
|
||||
bool? enableConnect,
|
||||
int? connectPort,
|
||||
bool? cacheMusic}) =>
|
||||
PreferencesTableData(
|
||||
id: id ?? this.id,
|
||||
@ -1419,6 +1443,7 @@ 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) {
|
||||
@ -1492,6 +1517,8 @@ 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,
|
||||
);
|
||||
@ -1527,6 +1554,7 @@ class PreferencesTableData extends DataClass
|
||||
..write('discordPresence: $discordPresence, ')
|
||||
..write('endlessPlayback: $endlessPlayback, ')
|
||||
..write('enableConnect: $enableConnect, ')
|
||||
..write('connectPort: $connectPort, ')
|
||||
..write('cacheMusic: $cacheMusic')
|
||||
..write(')'))
|
||||
.toString();
|
||||
@ -1561,6 +1589,7 @@ class PreferencesTableData extends DataClass
|
||||
discordPresence,
|
||||
endlessPlayback,
|
||||
enableConnect,
|
||||
connectPort,
|
||||
cacheMusic
|
||||
]);
|
||||
@override
|
||||
@ -1594,6 +1623,7 @@ class PreferencesTableData extends DataClass
|
||||
other.discordPresence == this.discordPresence &&
|
||||
other.endlessPlayback == this.endlessPlayback &&
|
||||
other.enableConnect == this.enableConnect &&
|
||||
other.connectPort == this.connectPort &&
|
||||
other.cacheMusic == this.cacheMusic);
|
||||
}
|
||||
|
||||
@ -1625,6 +1655,7 @@ 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(),
|
||||
@ -1654,6 +1685,7 @@ 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({
|
||||
@ -1684,6 +1716,7 @@ 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({
|
||||
@ -1714,6 +1747,7 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
|
||||
Expression<bool>? discordPresence,
|
||||
Expression<bool>? endlessPlayback,
|
||||
Expression<bool>? enableConnect,
|
||||
Expression<int>? connectPort,
|
||||
Expression<bool>? cacheMusic,
|
||||
}) {
|
||||
return RawValuesInsertable({
|
||||
@ -1748,6 +1782,7 @@ 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,
|
||||
});
|
||||
}
|
||||
@ -1780,6 +1815,7 @@ 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,
|
||||
@ -1809,6 +1845,7 @@ 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,
|
||||
);
|
||||
}
|
||||
@ -1918,6 +1955,9 @@ 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);
|
||||
}
|
||||
@ -1954,6 +1994,7 @@ class PreferencesTableCompanion extends UpdateCompanion<PreferencesTableData> {
|
||||
..write('discordPresence: $discordPresence, ')
|
||||
..write('endlessPlayback: $endlessPlayback, ')
|
||||
..write('enableConnect: $enableConnect, ')
|
||||
..write('connectPort: $connectPort, ')
|
||||
..write('cacheMusic: $cacheMusic')
|
||||
..write(')'))
|
||||
.toString();
|
||||
@ -4626,6 +4667,7 @@ typedef $$PreferencesTableTableCreateCompanionBuilder
|
||||
Value<bool> discordPresence,
|
||||
Value<bool> endlessPlayback,
|
||||
Value<bool> enableConnect,
|
||||
Value<int> connectPort,
|
||||
Value<bool> cacheMusic,
|
||||
});
|
||||
typedef $$PreferencesTableTableUpdateCompanionBuilder
|
||||
@ -4657,6 +4699,7 @@ typedef $$PreferencesTableTableUpdateCompanionBuilder
|
||||
Value<bool> discordPresence,
|
||||
Value<bool> endlessPlayback,
|
||||
Value<bool> enableConnect,
|
||||
Value<int> connectPort,
|
||||
Value<bool> cacheMusic,
|
||||
});
|
||||
|
||||
@ -4786,6 +4829,9 @@ 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));
|
||||
}
|
||||
@ -4899,6 +4945,9 @@ 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));
|
||||
}
|
||||
@ -5003,6 +5052,9 @@ 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);
|
||||
}
|
||||
@ -5063,6 +5115,7 @@ 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(
|
||||
@ -5093,6 +5146,7 @@ class $$PreferencesTableTableTableManager extends RootTableManager<
|
||||
discordPresence: discordPresence,
|
||||
endlessPlayback: endlessPlayback,
|
||||
enableConnect: enableConnect,
|
||||
connectPort: connectPort,
|
||||
cacheMusic: cacheMusic,
|
||||
),
|
||||
createCompanionCallback: ({
|
||||
@ -5124,6 +5178,7 @@ 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(
|
||||
@ -5154,6 +5209,7 @@ class $$PreferencesTableTableTableManager extends RootTableManager<
|
||||
discordPresence: discordPresence,
|
||||
endlessPlayback: endlessPlayback,
|
||||
enableConnect: enableConnect,
|
||||
connectPort: connectPort,
|
||||
cacheMusic: cacheMusic,
|
||||
),
|
||||
withReferenceMapper: (p0) => p0
|
||||
|
@ -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';
|
||||
import 'package:drift/drift.dart'; // ignore_for_file: type=lint,unused_import
|
||||
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'; // ignore_for_file: type=lint,unused_import
|
||||
import 'package:spotube/services/sourced_track/enums.dart';
|
||||
|
||||
// GENERATED BY drift_dev, DO NOT MODIFY.
|
||||
final class Schema2 extends i0.VersionedSchema {
|
||||
@ -1409,11 +1409,295 @@ 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) {
|
||||
@ -1437,6 +1721,11 @@ 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');
|
||||
}
|
||||
@ -1448,6 +1737,7 @@ 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(
|
||||
@ -1455,4 +1745,5 @@ i1.OnUpgrade stepByStep({
|
||||
from2To3: from2To3,
|
||||
from3To4: from3To4,
|
||||
from4To5: from4To5,
|
||||
from5To6: from5To6,
|
||||
));
|
||||
|
@ -115,6 +115,7 @@ 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
|
||||
@ -148,6 +149,7 @@ class PreferencesTable extends Table {
|
||||
endlessPlayback: true,
|
||||
enableConnect: false,
|
||||
cacheMusic: true,
|
||||
connectPort: -1,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
97
lib/modules/settings/playback/edit_connect_port_dialog.dart
Normal file
97
lib/modules/settings/playback/edit_connect_port_dialog.dart
Normal file
@ -0,0 +1,97 @@
|
||||
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),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
75
lib/modules/settings/playback/edit_instance_url_dialog.dart
Normal file
75
lib/modules/settings/playback/edit_instance_url_dialog.dart
Normal file
@ -0,0 +1,75 @@
|
||||
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),
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -1,9 +1,13 @@
|
||||
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';
|
||||
@ -57,6 +61,7 @@ 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);
|
||||
@ -69,12 +74,32 @@ 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) {
|
||||
@ -247,7 +272,8 @@ 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
|
||||
|
@ -4,9 +4,6 @@ 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';
|
||||
@ -14,9 +11,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';
|
||||
@ -114,67 +111,12 @@ class SettingsPlaybackSection extends HookConsumerWidget {
|
||||
showDialog(
|
||||
context: context,
|
||||
barrierColor: Colors.black.withValues(alpha: 0.5),
|
||||
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),
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
builder: (context) =>
|
||||
SettingsPlaybackEditInstanceUrlDialog(
|
||||
title: context.l10n.piped_instance,
|
||||
initialValue: preferences.pipedInstance,
|
||||
onSave: (value) {
|
||||
preferencesNotifier.setPipedInstance(value);
|
||||
},
|
||||
),
|
||||
);
|
||||
@ -269,67 +211,13 @@ class SettingsPlaybackSection extends HookConsumerWidget {
|
||||
showDialog(
|
||||
context: context,
|
||||
barrierColor: Colors.black.withValues(alpha: 0.5),
|
||||
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),
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
builder: (context) =>
|
||||
SettingsPlaybackEditInstanceUrlDialog(
|
||||
title: context.l10n.invidious_instance,
|
||||
initialValue: preferences.invidiousInstance,
|
||||
onSave: (value) {
|
||||
preferencesNotifier
|
||||
.setInvidiousInstance(value);
|
||||
},
|
||||
),
|
||||
);
|
||||
@ -561,9 +449,32 @@ class SettingsPlaybackSection extends HookConsumerWidget {
|
||||
title: Text(context.l10n.enable_connect),
|
||||
subtitle: Text(context.l10n.enable_connect_description),
|
||||
leading: const Icon(SpotubeIcons.connect),
|
||||
trailing: Switch(
|
||||
value: preferences.enableConnect,
|
||||
onChanged: preferencesNotifier.setEnableConnect,
|
||||
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,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
|
@ -1,6 +1,10 @@
|
||||
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';
|
||||
@ -46,15 +50,17 @@ final volumeProvider = StateProvider<double>(
|
||||
(ref) => 1.0,
|
||||
);
|
||||
|
||||
class ConnectNotifier extends AsyncNotifier<WebSocketChannel?> {
|
||||
typedef ConnectState = ({WebSocketChannel channel, Stream stream});
|
||||
|
||||
class ConnectNotifier extends AsyncNotifier<ConnectState?> {
|
||||
@override
|
||||
build() async {
|
||||
try {
|
||||
final connectClients = ref.watch(connectClientsProvider);
|
||||
final connectClients = await ref.watch(connectClientsProvider.future);
|
||||
|
||||
if (connectClients.asData?.value.resolvedService == null) return null;
|
||||
if (connectClients.resolvedService == null) return null;
|
||||
|
||||
final service = connectClients.asData!.value.resolvedService!;
|
||||
final service = connectClients.resolvedService!;
|
||||
|
||||
AppLogger.log.t(
|
||||
'♾️ Connecting to ${service.name}: ws://${service.host}:${service.port}/ws',
|
||||
@ -70,7 +76,9 @@ class ConnectNotifier extends AsyncNotifier<WebSocketChannel?> {
|
||||
'✅ Connected to ${service.name}: ws://${service.host}:${service.port}/ws',
|
||||
);
|
||||
|
||||
final subscription = channel.stream.listen(
|
||||
final stream = channel.stream.asBroadcastStream();
|
||||
|
||||
final subscription = stream.listen(
|
||||
(message) {
|
||||
final event =
|
||||
WebSocketEvent.fromJson(jsonDecode(message), (data) => data);
|
||||
@ -102,6 +110,38 @@ class ConnectNotifier extends AsyncNotifier<WebSocketChannel?> {
|
||||
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);
|
||||
@ -113,7 +153,7 @@ class ConnectNotifier extends AsyncNotifier<WebSocketChannel?> {
|
||||
channel.sink.close(status.goingAway);
|
||||
});
|
||||
|
||||
return channel;
|
||||
return (channel: channel, stream: stream);
|
||||
} catch (e, stack) {
|
||||
AppLogger.reportError(e, stack);
|
||||
rethrow;
|
||||
@ -122,7 +162,7 @@ class ConnectNotifier extends AsyncNotifier<WebSocketChannel?> {
|
||||
|
||||
Future<void> emit(Object message) async {
|
||||
if (state.value == null) return;
|
||||
state.value?.sink.add(
|
||||
state.value?.channel.sink.add(
|
||||
message is String ? message : (message as dynamic).toJson(),
|
||||
);
|
||||
}
|
||||
@ -184,7 +224,6 @@ class ConnectNotifier extends AsyncNotifier<WebSocketChannel?> {
|
||||
}
|
||||
}
|
||||
|
||||
final connectProvider =
|
||||
AsyncNotifierProvider<ConnectNotifier, WebSocketChannel?>(
|
||||
final connectProvider = AsyncNotifierProvider<ConnectNotifier, ConnectState?>(
|
||||
() => ConnectNotifier(),
|
||||
);
|
||||
|
@ -15,6 +15,7 @@ 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",
|
||||
@ -90,12 +91,15 @@ final localTracksProvider =
|
||||
try {
|
||||
final metadata = await MetadataGod.readMetadata(file: file.path);
|
||||
|
||||
final imageFile = File(join(
|
||||
(await getTemporaryDirectory()).path,
|
||||
"spotube",
|
||||
basenameWithoutExtension(file.path) +
|
||||
imgMimeToExt[metadata.picture?.mimeType ?? "image/jpeg"]!,
|
||||
));
|
||||
final imageFile = File(
|
||||
join(
|
||||
(await getTemporaryDirectory()).path,
|
||||
"spotube",
|
||||
ServiceUtils.sanitizeFilename(
|
||||
basenameWithoutExtension(file.path)) +
|
||||
imgMimeToExt[metadata.picture?.mimeType ?? "image/jpeg"]!,
|
||||
),
|
||||
);
|
||||
if (!await imageFile.exists() && metadata.picture != null) {
|
||||
await imageFile.create(recursive: true);
|
||||
await imageFile.writeAsBytes(
|
||||
|
@ -3,9 +3,12 @@ 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';
|
||||
@ -43,6 +46,8 @@ class ServerConnectRoutes {
|
||||
Stream<String> get connectClientStream =>
|
||||
_connectClientStreamController.stream;
|
||||
|
||||
final List<String> _allowedConnections = [];
|
||||
|
||||
FutureOr<Response> websocket(Request req) {
|
||||
return webSocketHandler(
|
||||
(
|
||||
@ -54,6 +59,47 @@ 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) {
|
||||
@ -106,7 +152,7 @@ class ServerConnectRoutes {
|
||||
},
|
||||
),
|
||||
channel.stream.listen(
|
||||
(message) {
|
||||
(message) async {
|
||||
try {
|
||||
final event = WebSocketEvent.fromJson(
|
||||
jsonDecode(message),
|
||||
|
@ -54,7 +54,9 @@ class ServerPlaybackRoutes {
|
||||
final trackCacheFile = File(
|
||||
join(
|
||||
await UserPreferencesNotifier.getMusicCacheDir(),
|
||||
'${track.name} - ${track.artists?.asString()} (${track.sourceInfo.id}).${track.codec.name}',
|
||||
ServiceUtils.sanitizeFilename(
|
||||
'${track.name} - ${track.artists?.asString()} (${track.sourceInfo.id}).${track.codec.name}',
|
||||
),
|
||||
),
|
||||
);
|
||||
final trackPartialCacheFile = File("${trackCacheFile.path}.part");
|
||||
|
@ -5,30 +5,51 @@ 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;
|
||||
|
||||
SpotubeMedia.serverPort = port;
|
||||
// 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;
|
||||
}
|
||||
|
||||
final server = await serve(
|
||||
pipeline.addHandler(router.call),
|
||||
InternetAddress.anyIPv4,
|
||||
port,
|
||||
enabledRemoteConnect
|
||||
? InternetAddress.anyIPv4
|
||||
: InternetAddress.loopbackIPv4,
|
||||
SpotubeMedia.serverPort,
|
||||
);
|
||||
|
||||
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: port);
|
||||
return (
|
||||
server: server,
|
||||
port: SpotubeMedia.serverPort,
|
||||
);
|
||||
},
|
||||
);
|
||||
|
@ -240,6 +240,14 @@ 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)));
|
||||
}
|
||||
|
@ -434,4 +434,37 @@ 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;
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ 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;
|
||||
@ -17,6 +18,8 @@ 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:
|
||||
@ -28,5 +31,5 @@ class GeneratedHelper implements SchemaInstantiationHelper {
|
||||
}
|
||||
}
|
||||
|
||||
static const versions = const [1, 2, 3, 4, 5];
|
||||
static const versions = const [1, 2, 3, 4, 5, 6];
|
||||
}
|
||||
|
3465
test/drift/app_db/generated/schema_v6.dart
Normal file
3465
test/drift/app_db/generated/schema_v6.dart
Normal file
File diff suppressed because it is too large
Load Diff
@ -1 +1,5 @@
|
||||
{}
|
||||
{
|
||||
"fr": [
|
||||
"connection_request_denied"
|
||||
]
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user