Compare commits

...

11 Commits

Author SHA1 Message Date
VARUN M
a6be3017e4
Merge 60b46a3dc7 into 95e09ffc94 2025-03-15 14:12:56 +05:30
Kingkor Roy Tirtho
95e09ffc94 chore: remove certificate check for dio 2025-03-15 14:23:38 +06:00
Kingkor Roy Tirtho
968fd09eb3 chore: add random user agent 2025-03-15 10:48:34 +06:00
Kingkor Roy Tirtho
1a32264bc7 fix: spotify authentication 429 errors 2025-03-15 10:37:29 +06:00
vishnumur777
60b46a3dc7 feat: add tamil language for spotube 2025-03-14 21:33:29 +05:30
Kingkor Roy Tirtho
464666c01a
Merge pull request #2410 from KRTirtho/dev
chore: update linux appdata screenshot
2025-03-07 20:22:32 +06:00
Kingkor Roy Tirtho
0e58cd0e99
Merge pull request #2408 from KRTirtho/dev
chore: add new images
2025-03-07 20:18:03 +06:00
Kingkor Roy Tirtho
d4f70f56e4
Merge pull request #2405 from KRTirtho/dev
Release 4.0.0
2025-03-07 18:05:55 +06:00
Kingkor Roy Tirtho
8c1337d1fc
Merge pull request #2118 from KRTirtho/dev
chore: release 3.9.0
2024-12-09 00:04:29 +06:00
Kingkor Roy Tirtho
94e704087f Merge branch 'dev' 2024-10-09 16:38:23 +06:00
Kingkor Roy Tirtho
8e287ab1e5
Merge pull request #1981 from KRTirtho/dev
Release 3.8.3
2024-10-09 15:39:31 +06:00
7 changed files with 494 additions and 14 deletions

View File

@ -625,10 +625,10 @@ abstract class LanguageLocals {
// name: "Swedish", // name: "Swedish",
// nativeName: "svenska", // nativeName: "svenska",
// ), // ),
// "ta": const ISOLanguageName( "ta": const ISOLanguageName(
// name: "Tamil", name: "Tamil",
// nativeName: "தமிழ்", nativeName: "தமிழ்",
// ), ),
// "te": const ISOLanguageName( // "te": const ISOLanguageName(
// name: "Telugu", // name: "Telugu",
// nativeName: "తెలుగు", // nativeName: "తెలుగు",

428
lib/l10n/app_ta.arb Normal file
View File

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

View File

@ -12,6 +12,7 @@
/// doannc2212@github => Vietnamese /// doannc2212@github => Vietnamese
/// sappho192@github => Korean /// sappho192@github => Korean
/// watchakorn-18k@github => Thai /// watchakorn-18k@github => Thai
/// llama3, vishnumur777@github => Tamil
/// Microsoft Copilot, Tutislav@github => Czech /// Microsoft Copilot, Tutislav@github => Czech
library l10n; library l10n;
@ -43,6 +44,7 @@ class L10n {
const Locale('ru', 'RU'), const Locale('ru', 'RU'),
const Locale('uk', 'UA'), const Locale('uk', 'UA'),
const Locale('th', 'TH'), const Locale('th', 'TH'),
const Locale('ta', 'IN')
const Locale('tr', 'TR'), const Locale('tr', 'TR'),
const Locale('zh', 'CN'), const Locale('zh', 'CN'),
const Locale('vi', 'VN'), const Locale('vi', 'VN'),

View File

@ -5,7 +5,7 @@ import 'dart:io';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:desktop_webview_window/desktop_webview_window.dart'; import 'package:desktop_webview_window/desktop_webview_window.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:dio/io.dart'; import 'package:dio_http2_adapter/dio_http2_adapter.dart';
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart' import 'package:flutter_inappwebview/flutter_inappwebview.dart'
hide X509Certificate; hide X509Certificate;
@ -19,6 +19,7 @@ import 'package:spotube/utils/platform.dart';
import 'package:otp_util/otp_util.dart'; import 'package:otp_util/otp_util.dart';
// ignore: implementation_imports // ignore: implementation_imports
import 'package:otp_util/src/utils/generic_util.dart'; import 'package:otp_util/src/utils/generic_util.dart';
import 'package:spotube/utils/service_utils.dart';
extension ExpirationAuthenticationTableData on AuthenticationTableData { extension ExpirationAuthenticationTableData on AuthenticationTableData {
bool get isExpired => DateTime.now().isAfter(expiration); bool get isExpired => DateTime.now().isAfter(expiration);
@ -34,13 +35,17 @@ extension ExpirationAuthenticationTableData on AuthenticationTableData {
class AuthenticationNotifier extends AsyncNotifier<AuthenticationTableData?> { class AuthenticationNotifier extends AsyncNotifier<AuthenticationTableData?> {
static final Dio dio = () { static final Dio dio = () {
final dio = Dio(); final dio = Dio()
..httpClientAdapter = Http2Adapter(
(dio.httpClientAdapter as IOHttpClientAdapter) ConnectionManager(
.createHttpClient = () => HttpClient() idleTimeout: const Duration(seconds: 10),
..badCertificateCallback = (X509Certificate cert, String host, int port) { onClientCreate: (uri, clientSettings) {
return host.endsWith("spotify.com") && port == 443; clientSettings.onBadCertificate = (X509Certificate cert) {
return uri.host.endsWith("spotify.com");
}; };
},
),
);
return dio; return dio;
}(); }();
@ -163,7 +168,18 @@ class AuthenticationNotifier extends AsyncNotifier<AuthenticationTableData?> {
final secret = base32FromBytes(secretBytes, secretSauce); final secret = base32FromBytes(secretBytes, secretSauce);
final res = await dio.get("https://open.spotify.com/server-time"); final res = await dio.get(
"https://open.spotify.com/server-time",
options: Options(
headers: {
"Host": "open.spotify.com",
"User-Agent": ServiceUtils.randomUserAgent(
kIsDesktop ? UserAgentDevice.desktop : UserAgentDevice.mobile,
),
"accept": "*/*",
},
),
);
final serverTimeSeconds = res.data["serverTime"] as int; final serverTimeSeconds = res.data["serverTime"] as int;
final totp = TOTP( final totp = TOTP(

View File

@ -1,6 +1,6 @@
import 'dart:math';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:auto_route/auto_route.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart';
@ -28,6 +28,11 @@ import 'package:spotube/collections/env.dart';
import 'package:version/version.dart'; import 'package:version/version.dart';
enum UserAgentDevice {
desktop,
mobile,
}
abstract class ServiceUtils { abstract class ServiceUtils {
static final _englishMatcherRegex = RegExp( static final _englishMatcherRegex = RegExp(
"^[a-zA-Z0-9\\s!\"#\$%&\\'()*+,-.\\/:;<=>?@\\[\\]^_`{|}~]*\$", "^[a-zA-Z0-9\\s!\"#\$%&\\'()*+,-.\\/:;<=>?@\\[\\]^_`{|}~]*\$",
@ -417,4 +422,16 @@ abstract class ServiceUtils {
return null; return null;
} }
} }
static int randomNumber(int min, int max) {
return min + Random().nextInt(max - min);
}
static String randomUserAgent(UserAgentDevice type) {
if (type == UserAgentDevice.desktop) {
return "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_${randomNumber(11, 15)}_${randomNumber(4, 9)}) AppleWebKit/${randomNumber(530, 537)}.${randomNumber(30, 37)} (KHTML, like Gecko) Chrome/${randomNumber(80, 105)}.0.${randomNumber(3000, 4500)}.${randomNumber(60, 125)} Safari/${randomNumber(530, 537)}.${randomNumber(30, 36)}";
} else {
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)}";
}
}
} }

View File

@ -544,6 +544,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.7.0" version: "5.7.0"
dio_http2_adapter:
dependency: "direct main"
description:
name: dio_http2_adapter
sha256: b8bd5d587fd228a461711f8b82f378ccd4bf1fbf7802e7663ca60d7b5ce0e3aa
url: "https://pub.dev"
source: hosted
version: "2.6.0"
dio_web_adapter: dio_web_adapter:
dependency: transitive dependency: transitive
description: description:
@ -1186,6 +1194,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.2" version: "1.2.2"
http2:
dependency: transitive
description:
name: http2
sha256: "382d3aefc5bd6dc68c6b892d7664f29b5beb3251611ae946a98d35158a82bbfa"
url: "https://pub.dev"
source: hosted
version: "2.3.1"
http_methods: http_methods:
dependency: transitive dependency: transitive
description: description:

View File

@ -141,6 +141,7 @@ dependencies:
http_parser: ^4.1.2 http_parser: ^4.1.2
collection: any collection: any
otp_util: ^1.0.2 otp_util: ^1.0.2
dio_http2_adapter: ^2.6.0
dev_dependencies: dev_dependencies:
build_runner: ^2.4.13 build_runner: ^2.4.13