diff --git a/lib/collections/language_codes.dart b/lib/collections/language_codes.dart index c17e04a9..d420ba96 100644 --- a/lib/collections/language_codes.dart +++ b/lib/collections/language_codes.dart @@ -36,10 +36,10 @@ abstract class LanguageLocals { // name: "Amharic", // nativeName: "አማርኛ", // ), - // "ar": const ISOLanguageName( - // name: "Arabic", - // nativeName: "العربية", - // ), + "ar": const ISOLanguageName( + name: "Arabic", + nativeName: "العربية", + ), // "an": const ISOLanguageName( // name: "Aragonese", // nativeName: "Aragonés", diff --git a/lib/collections/spotify_markets.dart b/lib/collections/spotify_markets.dart index a24fd768..514b3f0b 100644 --- a/lib/collections/spotify_markets.dart +++ b/lib/collections/spotify_markets.dart @@ -1,187 +1,189 @@ // Country Codes contributed by momobobe +import 'package:spotify/spotify.dart'; + final spotifyMarkets = [ - ("AL", "Albania (AL)"), - ("DZ", "Algeria (DZ)"), - ("AD", "Andorra (AD)"), - ("AO", "Angola (AO)"), - ("AG", "Antigua and Barbuda (AG)"), - ("AR", "Argentina (AR)"), - ("AM", "Armenia (AM)"), - ("AU", "Australia (AU)"), - ("AT", "Austria (AT)"), - ("AZ", "Azerbaijan (AZ)"), - ("BH", "Bahrain (BH)"), - ("BD", "Bangladesh (BD)"), - ("BB", "Barbados (BB)"), - ("BY", "Belarus (BY)"), - ("BE", "Belgium (BE)"), - ("BZ", "Belize (BZ)"), - ("BJ", "Benin (BJ)"), - ("BT", "Bhutan (BT)"), - ("BO", "Bolivia (BO)"), - ("BA", "Bosnia and Herzegovina (BA)"), - ("BW", "Botswana (BW)"), - ("BR", "Brazil (BR)"), - ("BN", "Brunei Darussalam (BN)"), - ("BG", "Bulgaria (BG)"), - ("BF", "Burkina Faso (BF)"), - ("BI", "Burundi (BI)"), - ("CV", "Cabo Verde / Cape Verde (CV)"), - ("KH", "Cambodia (KH)"), - ("CM", "Cameroon (CM)"), - ("CA", "Canada (CA)"), - ("TD", "Chad (TD)"), - ("CL", "Chile (CL)"), - ("CO", "Colombia (CO)"), - ("KM", "Comoros (KM)"), - ("CR", "Costa Rica (CR)"), - ("HR", "Croatia (HR)"), - ("CW", "Curaçao (CW)"), - ("CY", "Cyprus (CY)"), - ("CZ", "Czech Republic (CZ)"), - ("CI", "Ivory Coast (CI)"), - ("CD", "Congo (CD)"), - ("DK", "Denmark (DK)"), - ("DJ", "Djibouti (DJ)"), - ("DM", "Dominica (DM)"), - ("DO", "Dominican Republic (DO)"), - ("EC", "Ecuador (EC)"), - ("EG", "Egypt (EG)"), - ("SV", "El Salvador (SV)"), - ("GQ", "Equatorial Guinea (GQ)"), - ("EE", "Estonia (EE)"), - ("SZ", "Eswatini (SZ)"), - ("FJ", "Fiji (FJ)"), - ("FI", "Finland (FI)"), - ("FR", "France (FR)"), - ("GA", "Gabon (GA)"), - ("GE", "Georgia (GE)"), - ("DE", "Germany (DE)"), - ("GH", "Ghana (GH)"), - ("GR", "Greece (GR)"), - ("GD", "Grenada (GD)"), - ("GT", "Guatemala (GT)"), - ("GN", "Guinea (GN)"), - ("GW", "Guinea-Bissau (GW)"), - ("GY", "Guyana (GY)"), - ("HT", "Haiti (HT)"), - ("HN", "Honduras (HN)"), - ("HK", "Hong Kong (HK)"), - ("HU", "Hungary (HU)"), - ("IS", "Iceland (IS)"), - ("IN", "India (IN)"), - ("ID", "Indonesia (ID)"), - ("IQ", "Iraq (IQ)"), - ("IE", "Ireland (IE)"), - ("IL", "Israel (IL)"), - ("IT", "Italy (IT)"), - ("JM", "Jamaica (JM)"), - ("JP", "Japan (JP)"), - ("JO", "Jordan (JO)"), - ("KZ", "Kazakhstan (KZ)"), - ("KE", "Kenya (KE)"), - ("KI", "Kiribati (KI)"), - ("XK", "Kosovo (XK)"), - ("KW", "Kuwait (KW)"), - ("KG", "Kyrgyzstan (KG)"), - ("LA", "Laos (LA)"), - ("LV", "Latvia (LV)"), - ("LB", "Lebanon (LB)"), - ("LS", "Lesotho (LS)"), - ("LR", "Liberia (LR)"), - ("LY", "Libya (LY)"), - ("LI", "Liechtenstein (LI)"), - ("LT", "Lithuania (LT)"), - ("LU", "Luxembourg (LU)"), - ("MO", "Macao / Macau (MO)"), - ("MG", "Madagascar (MG)"), - ("MW", "Malawi (MW)"), - ("MY", "Malaysia (MY)"), - ("MV", "Maldives (MV)"), - ("ML", "Mali (ML)"), - ("MT", "Malta (MT)"), - ("MH", "Marshall Islands (MH)"), - ("MR", "Mauritania (MR)"), - ("MU", "Mauritius (MU)"), - ("MX", "Mexico (MX)"), - ("FM", "Micronesia (FM)"), - ("MD", "Moldova (MD)"), - ("MC", "Monaco (MC)"), - ("MN", "Mongolia (MN)"), - ("ME", "Montenegro (ME)"), - ("MA", "Morocco (MA)"), - ("MZ", "Mozambique (MZ)"), - ("NA", "Namibia (NA)"), - ("NR", "Nauru (NR)"), - ("NP", "Nepal (NP)"), - ("NL", "Netherlands (NL)"), - ("NZ", "New Zealand (NZ)"), - ("NI", "Nicaragua (NI)"), - ("NE", "Niger (NE)"), - ("NG", "Nigeria (NG)"), - ("MK", "North Macedonia (MK)"), - ("NO", "Norway (NO)"), - ("OM", "Oman (OM)"), - ("PK", "Pakistan (PK)"), - ("PW", "Palau (PW)"), - ("PS", "Palestine (PS)"), - ("PA", "Panama (PA)"), - ("PG", "Papua New Guinea (PG)"), - ("PY", "Paraguay (PY)"), - ("PE", "Peru (PE)"), - ("PH", "Philippines (PH)"), - ("PL", "Poland (PL)"), - ("PT", "Portugal (PT)"), - ("QA", "Qatar (QA)"), - ("CG", "Congo (CG)"), - ("RO", "Romania (RO)"), - ("RU", "Russia (RU)"), - ("RW", "Rwanda (RW)"), - ("WS", "Samoa (WS)"), - ("SM", "San Marino (SM)"), - ("SA", "Saudi Arabia (SA)"), - ("SN", "Senegal (SN)"), - ("RS", "Serbia (RS)"), - ("SC", "Seychelles (SC)"), - ("SL", "Sierra Leone (SL)"), - ("SG", "Singapore (SG)"), - ("SK", "Slovakia (SK)"), - ("SI", "Slovenia (SI)"), - ("SB", "Solomon Islands (SB)"), - ("ZA", "South Africa (ZA)"), - ("KR", "South Korea (KR)"), - ("ES", "Spain (ES)"), - ("LK", "Sri Lanka (LK)"), - ("KN", "St. Kitts and Nevis (KN)"), - ("LC", "St. Lucia (LC)"), - ("SR", "Suriname (SR)"), - ("SE", "Sweden (SE)"), - ("CH", "Switzerland (CH)"), - ("ST", "São Tomé and Príncipe (ST)"), - ("TW", "Taiwan (TW)"), - ("TJ", "Tajikistan (TJ)"), - ("TZ", "Tanzania (TZ)"), - ("TH", "Thailand (TH)"), - ("BS", "The Bahamas (BS)"), - ("GM", "The Gambia (GM)"), - ("TL", "East Timor (TL)"), - ("TG", "Togo (TG)"), - ("TO", "Tonga (TO)"), - ("TT", "Trinidad and Tobago (TT)"), - ("TN", "Tunisia (TN)"), - ("TR", "Turkey (TR)"), - ("TV", "Tuvalu (TV)"), - ("UG", "Uganda (UG)"), - ("UA", "Ukraine (UA)"), - ("AE", "United Arab Emirates (AE)"), - ("GB", "United Kingdom (GB)"), - ("US", "United States (US)"), - ("UY", "Uruguay (UY)"), - ("UZ", "Uzbekistan (UZ)"), - ("VU", "Vanuatu (VU)"), - ("VE", "Venezuela (VE)"), - ("VN", "Vietnam (VN)"), - ("ZM", "Zambia (ZM)"), - ("ZW", "Zimbabwe (ZW)"), + (Market.AL, "Albania (AL)"), + (Market.DZ, "Algeria (DZ)"), + (Market.AD, "Andorra (AD)"), + (Market.AO, "Angola (AO)"), + (Market.AG, "Antigua and Barbuda (AG)"), + (Market.AR, "Argentina (AR)"), + (Market.AM, "Armenia (AM)"), + (Market.AU, "Australia (AU)"), + (Market.AT, "Austria (AT)"), + (Market.AZ, "Azerbaijan (AZ)"), + (Market.BH, "Bahrain (BH)"), + (Market.BD, "Bangladesh (BD)"), + (Market.BB, "Barbados (BB)"), + (Market.BY, "Belarus (BY)"), + (Market.BE, "Belgium (BE)"), + (Market.BZ, "Belize (BZ)"), + (Market.BJ, "Benin (BJ)"), + (Market.BT, "Bhutan (BT)"), + (Market.BO, "Bolivia (BO)"), + (Market.BA, "Bosnia and Herzegovina (BA)"), + (Market.BW, "Botswana (BW)"), + (Market.BR, "Brazil (BR)"), + (Market.BN, "Brunei Darussalam (BN)"), + (Market.BG, "Bulgaria (BG)"), + (Market.BF, "Burkina Faso (BF)"), + (Market.BI, "Burundi (BI)"), + (Market.CV, "Cabo Verde / Cape Verde (CV)"), + (Market.KH, "Cambodia (KH)"), + (Market.CM, "Cameroon (CM)"), + (Market.CA, "Canada (CA)"), + (Market.TD, "Chad (TD)"), + (Market.CL, "Chile (CL)"), + (Market.CO, "Colombia (CO)"), + (Market.KM, "Comoros (KM)"), + (Market.CR, "Costa Rica (CR)"), + (Market.HR, "Croatia (HR)"), + (Market.CW, "Curaçao (CW)"), + (Market.CY, "Cyprus (CY)"), + (Market.CZ, "Czech Republic (CZ)"), + (Market.CI, "Ivory Coast (CI)"), + (Market.CD, "Congo (CD)"), + (Market.DK, "Denmark (DK)"), + (Market.DJ, "Djibouti (DJ)"), + (Market.DM, "Dominica (DM)"), + (Market.DO, "Dominican Republic (DO)"), + (Market.EC, "Ecuador (EC)"), + (Market.EG, "Egypt (EG)"), + (Market.SV, "El Salvador (SV)"), + (Market.GQ, "Equatorial Guinea (GQ)"), + (Market.EE, "Estonia (EE)"), + (Market.SZ, "Eswatini (SZ)"), + (Market.FJ, "Fiji (FJ)"), + (Market.FI, "Finland (FI)"), + (Market.FR, "France (FR)"), + (Market.GA, "Gabon (GA)"), + (Market.GE, "Georgia (GE)"), + (Market.DE, "Germany (DE)"), + (Market.GH, "Ghana (GH)"), + (Market.GR, "Greece (GR)"), + (Market.GD, "Grenada (GD)"), + (Market.GT, "Guatemala (GT)"), + (Market.GN, "Guinea (GN)"), + (Market.GW, "Guinea-Bissau (GW)"), + (Market.GY, "Guyana (GY)"), + (Market.HT, "Haiti (HT)"), + (Market.HN, "Honduras (HN)"), + (Market.HK, "Hong Kong (HK)"), + (Market.HU, "Hungary (HU)"), + (Market.IS, "Iceland (IS)"), + (Market.IN, "India (IN)"), + (Market.ID, "Indonesia (ID)"), + (Market.IQ, "Iraq (IQ)"), + (Market.IE, "Ireland (IE)"), + (Market.IL, "Israel (IL)"), + (Market.IT, "Italy (IT)"), + (Market.JM, "Jamaica (JM)"), + (Market.JP, "Japan (JP)"), + (Market.JO, "Jordan (JO)"), + (Market.KZ, "Kazakhstan (KZ)"), + (Market.KE, "Kenya (KE)"), + (Market.KI, "Kiribati (KI)"), + (Market.XK, "Kosovo (XK)"), + (Market.KW, "Kuwait (KW)"), + (Market.KG, "Kyrgyzstan (KG)"), + (Market.LA, "Laos (LA)"), + (Market.LV, "Latvia (LV)"), + (Market.LB, "Lebanon (LB)"), + (Market.LS, "Lesotho (LS)"), + (Market.LR, "Liberia (LR)"), + (Market.LY, "Libya (LY)"), + (Market.LI, "Liechtenstein (LI)"), + (Market.LT, "Lithuania (LT)"), + (Market.LU, "Luxembourg (LU)"), + (Market.MO, "Macao / Macau (MO)"), + (Market.MG, "Madagascar (MG)"), + (Market.MW, "Malawi (MW)"), + (Market.MY, "Malaysia (MY)"), + (Market.MV, "Maldives (MV)"), + (Market.ML, "Mali (ML)"), + (Market.MT, "Malta (MT)"), + (Market.MH, "Marshall Islands (MH)"), + (Market.MR, "Mauritania (MR)"), + (Market.MU, "Mauritius (MU)"), + (Market.MX, "Mexico (MX)"), + (Market.FM, "Micronesia (FM)"), + (Market.MD, "Moldova (MD)"), + (Market.MC, "Monaco (MC)"), + (Market.MN, "Mongolia (MN)"), + (Market.ME, "Montenegro (ME)"), + (Market.MA, "Morocco (MA)"), + (Market.MZ, "Mozambique (MZ)"), + (Market.NA, "Namibia (NA)"), + (Market.NR, "Nauru (NR)"), + (Market.NP, "Nepal (NP)"), + (Market.NL, "Netherlands (NL)"), + (Market.NZ, "New Zealand (NZ)"), + (Market.NI, "Nicaragua (NI)"), + (Market.NE, "Niger (NE)"), + (Market.NG, "Nigeria (NG)"), + (Market.MK, "North Macedonia (MK)"), + (Market.NO, "Norway (NO)"), + (Market.OM, "Oman (OM)"), + (Market.PK, "Pakistan (PK)"), + (Market.PW, "Palau (PW)"), + (Market.PS, "Palestine (PS)"), + (Market.PA, "Panama (PA)"), + (Market.PG, "Papua New Guinea (PG)"), + (Market.PY, "Paraguay (PY)"), + (Market.PE, "Peru (PE)"), + (Market.PH, "Philippines (PH)"), + (Market.PL, "Poland (PL)"), + (Market.PT, "Portugal (PT)"), + (Market.QA, "Qatar (QA)"), + (Market.CG, "Congo (CG)"), + (Market.RO, "Romania (RO)"), + (Market.RU, "Russia (RU)"), + (Market.RW, "Rwanda (RW)"), + (Market.WS, "Samoa (WS)"), + (Market.SM, "San Marino (SM)"), + (Market.SA, "Saudi Arabia (SA)"), + (Market.SN, "Senegal (SN)"), + (Market.RS, "Serbia (RS)"), + (Market.SC, "Seychelles (SC)"), + (Market.SL, "Sierra Leone (SL)"), + (Market.SG, "Singapore (SG)"), + (Market.SK, "Slovakia (SK)"), + (Market.SI, "Slovenia (SI)"), + (Market.SB, "Solomon Islands (SB)"), + (Market.ZA, "South Africa (ZA)"), + (Market.KR, "South Korea (KR)"), + (Market.ES, "Spain (ES)"), + (Market.LK, "Sri Lanka (LK)"), + (Market.KN, "St. Kitts and Nevis (KN)"), + (Market.LC, "St. Lucia (LC)"), + (Market.SR, "Suriname (SR)"), + (Market.SE, "Sweden (SE)"), + (Market.CH, "Switzerland (CH)"), + (Market.ST, "São Tomé and Príncipe (ST)"), + (Market.TW, "Taiwan (TW)"), + (Market.TJ, "Tajikistan (TJ)"), + (Market.TZ, "Tanzania (TZ)"), + (Market.TH, "Thailand (TH)"), + (Market.BS, "The Bahamas (BS)"), + (Market.GM, "The Gambia (GM)"), + (Market.TL, "East Timor (TL)"), + (Market.TG, "Togo (TG)"), + (Market.TO, "Tonga (TO)"), + (Market.TT, "Trinidad and Tobago (TT)"), + (Market.TN, "Tunisia (TN)"), + (Market.TR, "Turkey (TR)"), + (Market.TV, "Tuvalu (TV)"), + (Market.UG, "Uganda (UG)"), + (Market.UA, "Ukraine (UA)"), + (Market.AE, "United Arab Emirates (AE)"), + (Market.GB, "United Kingdom (GB)"), + (Market.US, "United States (US)"), + (Market.UY, "Uruguay (UY)"), + (Market.UZ, "Uzbekistan (UZ)"), + (Market.VU, "Vanuatu (VU)"), + (Market.VE, "Venezuela (VE)"), + (Market.VN, "Vietnam (VN)"), + (Market.ZM, "Zambia (ZM)"), + (Market.ZW, "Zimbabwe (ZW)"), ]; diff --git a/lib/components/album/album_card.dart b/lib/components/album/album_card.dart index b946209a..d8f8d85b 100644 --- a/lib/components/album/album_card.dart +++ b/lib/components/album/album_card.dart @@ -11,24 +11,7 @@ import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/utils/service_utils.dart'; import 'package:spotube/utils/type_conversion_utils.dart'; -enum AlbumType { - album, - single, - compilation; - - factory AlbumType.from(String? type) { - switch (type) { - case "album": - return AlbumType.album; - case "single": - return AlbumType.single; - case "compilation": - return AlbumType.compilation; - default: - return AlbumType.album; - } - } - +extension FormattedAlbumType on AlbumType { String get formatted => name.replaceFirst(name[0], name[0].toUpperCase()); } @@ -71,7 +54,7 @@ class AlbumCard extends HookConsumerWidget { isLoading: isPlaylistPlaying && playlist.isFetching == true, title: album.name!, description: - "${AlbumType.from(album.albumType!).formatted} • ${TypeConversionUtils.artists_X_String(album.artists ?? [])}", + "${album.albumType?.formatted} • ${TypeConversionUtils.artists_X_String(album.artists ?? [])}", onTap: () { ServiceUtils.push(context, "/album/${album.id}", extra: album); }, diff --git a/lib/components/shared/adaptive/adaptive_select_tile.dart b/lib/components/shared/adaptive/adaptive_select_tile.dart index 17e652b7..58666e46 100644 --- a/lib/components/shared/adaptive/adaptive_select_tile.dart +++ b/lib/components/shared/adaptive/adaptive_select_tile.dart @@ -42,6 +42,7 @@ class AdaptiveSelectTile extends HookWidget { items: options, value: value, onChanged: onChanged, + menuMaxHeight: mediaQuery.size.height * 0.6, ); final controlPlaceholder = useMemoized( () => options diff --git a/lib/components/shared/track_table/track_collection_view/track_collection_heading.dart b/lib/components/shared/track_table/track_collection_view/track_collection_heading.dart index a8a60109..6436f7cd 100644 --- a/lib/components/shared/track_table/track_collection_view/track_collection_heading.dart +++ b/lib/components/shared/track_table/track_collection_view/track_collection_heading.dart @@ -121,7 +121,7 @@ class TrackCollectionHeading extends HookConsumerWidget { ), if (album != null) Text( - "${AlbumType.from(album?.albumType).formatted} • ${context.l10n.released} • ${DateTime.tryParse( + "${album?.albumType?.formatted} • ${context.l10n.released} • ${DateTime.tryParse( album?.releaseDate ?? "", )?.year}", style: theme.textTheme.titleMedium!.copyWith( diff --git a/lib/l10n/app_ar.arb b/lib/l10n/app_ar.arb index e0765c9f..7a1ce1b3 100644 --- a/lib/l10n/app_ar.arb +++ b/lib/l10n/app_ar.arb @@ -227,7 +227,7 @@ "selected_count_tracks": "مقطوعات {count} مختارة", "download_warning": "إذا قمت بتنزيل جميع المقاطع الصوتية بكميات كبيرة، فمن الواضح أنك تقوم بقرصنة الموسيقى وتسبب الضرر للمجتمع الإبداعي للموسيقى. أتمنى أن تكون على علم بهذا. حاول دائمًا احترام ودعم العمل الجاد للفنان", "download_ip_ban_warning": "بالمناسبة، يمكن أن يتم حظر عنوان IP الخاص بك على YouTube بسبب طلبات التنزيل الزائدة عن المعتاد. يعني حظر IP أنه لا يمكنك استخدام YouTube (حتى إذا قمت بتسجيل الدخول) لمدة تتراوح بين شهرين إلى ثلاثة أشهر على الأقل من جهاز IP هذا. ولا يتحمل Spotube أي مسؤولية إذا حدث هذا على الإطلاق", - "by_clicking_accept_terms": "بالنقر على "قبول"، فإنك توافق على الشروط التالية:", + "by_clicking_accept_terms": "بالنقر على \"قبول\"، فإنك توافق على الشروط التالية:", "download_agreement_1": "أعلم أنني أقوم بقرصنة الموسيقى. انا سيئ", "download_agreement_2": "سأدعم الفنان أينما أستطيع، وأنا أفعل هذا فقط لأنني لا أملك المال لشراء أعمالهم الفنية", "download_agreement_3": "أدرك تمامًا أنه يمكن حظر عنوان IP الخاص بي على YouTube ولا أحمل Spotube أو مالكيه/مساهميه المسؤولية عن أي حوادث ناجمة عن الإجراء الحالي الخاص بي", @@ -264,4 +264,4 @@ "use_system_title_bar": "استخدم شريط عنوان النظام", "crunching_results": "تدمير النتائج", "search_to_get_results": "إبحث للحصول على النتائج" -} +} \ No newline at end of file diff --git a/lib/l10n/l10n.dart b/lib/l10n/l10n.dart index 585b5a48..b892982c 100644 --- a/lib/l10n/l10n.dart +++ b/lib/l10n/l10n.dart @@ -23,5 +23,6 @@ class L10n { const Locale('ru', 'RU'), const Locale('pt', 'PT'), const Locale('uk', 'UA'), + const Locale('ar', 'SA'), ]; } diff --git a/lib/pages/library/playlist_generate/playlist_generate.dart b/lib/pages/library/playlist_generate/playlist_generate.dart index 2a2e16ca..33e244b0 100644 --- a/lib/pages/library/playlist_generate/playlist_generate.dart +++ b/lib/pages/library/playlist_generate/playlist_generate.dart @@ -37,7 +37,7 @@ class PlaylistGeneratorPage extends HookConsumerWidget { final genresCollection = useQueries.category.genreSeeds(ref); final limit = useValueNotifier(10); - final market = useValueNotifier(preferences.recommendationMarket); + final market = useValueNotifier(preferences.recommendationMarket); final genres = useState>([]); final artists = useState>([]); @@ -220,7 +220,7 @@ class PlaylistGeneratorPage extends HookConsumerWidget { final countrySelector = ValueListenableBuilder( valueListenable: market, builder: (context, value, _) { - return DropdownButtonFormField( + return DropdownButtonFormField( decoration: InputDecoration( labelText: context.l10n.country, labelStyle: textTheme.titleMedium, diff --git a/lib/pages/library/playlist_generate/playlist_generate_result.dart b/lib/pages/library/playlist_generate/playlist_generate_result.dart index 653a2263..015685f1 100644 --- a/lib/pages/library/playlist_generate/playlist_generate_result.dart +++ b/lib/pages/library/playlist_generate/playlist_generate_result.dart @@ -18,7 +18,7 @@ typedef PlaylistGenerateResultRouteState = ({ ({List tracks, List artists, List genres})? seeds, RecommendationParameters? parameters, int limit, - String? market, + Market? market, }); class PlaylistGenerateResultPage extends HookConsumerWidget { diff --git a/lib/pages/settings/settings.dart b/lib/pages/settings/settings.dart index dd1969dd..e346bc2d 100644 --- a/lib/pages/settings/settings.dart +++ b/lib/pages/settings/settings.dart @@ -9,6 +9,7 @@ import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:piped_client/piped_client.dart'; +import 'package:spotify/spotify.dart'; import 'package:spotube/collections/env.dart'; import 'package:spotube/collections/language_codes.dart'; import 'package:spotube/collections/spotube_icons.dart'; @@ -180,7 +181,7 @@ class SettingsPage extends HookConsumerWidget { ), ], ), - AdaptiveSelectTile( + AdaptiveSelectTile( breakLayout: mediaQuery.lgAndUp, secondary: const Icon(SpotubeIcons.shoppingBag), title: Text(context.l10n.market_place_region), diff --git a/lib/provider/user_preferences_provider.dart b/lib/provider/user_preferences_provider.dart index 20765fd2..f56b541d 100644 --- a/lib/provider/user_preferences_provider.dart +++ b/lib/provider/user_preferences_provider.dart @@ -6,6 +6,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_desktop_tools/flutter_desktop_tools.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:spotify/spotify.dart'; import 'package:spotube/components/settings/color_scheme_picker_dialog.dart'; import 'package:spotube/models/matched_track.dart'; import 'package:spotube/provider/palette_provider.dart'; @@ -41,7 +42,7 @@ enum YoutubeApiType { class UserPreferences extends PersistedChangeNotifier { ThemeMode themeMode; - String recommendationMarket; + Market recommendationMarket; bool saveTrackLyrics; bool checkUpdate; AudioQuality audioQuality; @@ -118,7 +119,7 @@ class UserPreferences extends PersistedChangeNotifier { updatePersistence(); } - void setRecommendationMarket(String country) { + void setRecommendationMarket(Market country) { recommendationMarket = country; notifyListeners(); updatePersistence(); @@ -342,7 +343,7 @@ class UserPreferences extends PersistedChangeNotifier { SearchMode? searchMode, bool? skipNonMusic, YoutubeApiType? youtubeApiType, - String? recommendationMarket, + Market? recommendationMarket, bool? saveTrackLyrics, }) { return UserPreferences( @@ -371,7 +372,7 @@ final userPreferencesProvider = ChangeNotifierProvider( (ref) => UserPreferences( ref, accentColorScheme: SpotubeColor(Colors.blue.value, name: "Blue"), - recommendationMarket: 'US', + recommendationMarket: Market.US, themeMode: ThemeMode.system, layoutMode: LayoutMode.adaptive, ), diff --git a/lib/services/custom_spotify_endpoints/spotify_endpoints.dart b/lib/services/custom_spotify_endpoints/spotify_endpoints.dart index a0c54fb9..44a507fc 100644 --- a/lib/services/custom_spotify_endpoints/spotify_endpoints.dart +++ b/lib/services/custom_spotify_endpoints/spotify_endpoints.dart @@ -43,8 +43,8 @@ class CustomSpotifyEndpoints { String imageStyle = "gradient_overlay", String includeExternal = "audio", String? locale, - String? market, - String? country, + Market? market, + Market? country, }) async { if (accessToken.isEmpty) { throw Exception('[CustomSpotifyEndpoints.getView]: accessToken is empty'); @@ -124,7 +124,7 @@ class CustomSpotifyEndpoints { Iterable? seedGenres, Iterable? seedTracks, int limit = 20, - String? market, + Market? market, Map? max, Map? min, Map? target, @@ -143,7 +143,7 @@ class CustomSpotifyEndpoints { 'seed_genres': seedGenres, 'seed_tracks': seedTracks }.forEach((key, list) => _addList(parameters, key, list!)); - if (market != null) parameters['market'] = market; + if (market != null) parameters['market'] = market.name; for (var map in [min, max, target]) { _addTunableTrackMap(parameters, map); } diff --git a/lib/services/queries/album.dart b/lib/services/queries/album.dart index 76a7937e..f9e83ba3 100644 --- a/lib/services/queries/album.dart +++ b/lib/services/queries/album.dart @@ -66,7 +66,7 @@ class AlbumQueries { (pageParam, spotify) async { try { final albums = await spotify.browse - .getNewReleases(country: market) + .newReleases(country: market) .getPage(50, pageParam); return albums; diff --git a/lib/services/queries/category.dart b/lib/services/queries/category.dart index 91513fd7..e5d0651a 100644 --- a/lib/services/queries/category.dart +++ b/lib/services/queries/category.dart @@ -13,7 +13,7 @@ class CategoryQueries { InfiniteQuery, dynamic, int> list( WidgetRef ref, - String recommendationMarket, + Market recommendationMarket, ) { ref.watch(userPreferencesProvider.select((s) => s.locale)); final locale = useContext().l10n.localeName; diff --git a/lib/services/queries/playlist.dart b/lib/services/queries/playlist.dart index 0204f9b7..a51eab54 100644 --- a/lib/services/queries/playlist.dart +++ b/lib/services/queries/playlist.dart @@ -1,6 +1,3 @@ -import 'dart:io'; -import 'dart:math'; - import 'package:catcher/catcher.dart'; import 'package:fl_query/fl_query.dart'; import 'package:fl_query_hooks/fl_query_hooks.dart'; @@ -13,7 +10,6 @@ import 'package:spotube/extensions/track.dart'; import 'package:spotube/hooks/use_spotify_infinite_query.dart'; import 'package:spotube/hooks/use_spotify_query.dart'; import 'package:spotube/pages/library/playlist_generate/playlist_generate.dart'; -import 'package:spotube/provider/authentication_provider.dart'; import 'package:spotube/provider/custom_spotify_endpoint_provider.dart'; import 'package:spotube/provider/user_preferences_provider.dart'; @@ -244,7 +240,7 @@ class PlaylistQueries { ({List tracks, List artists, List genres})? seeds, RecommendationParameters? parameters, int limit = 20, - String? market, + Market? market, }) { final marketOfPreference = ref.watch( userPreferencesProvider.select((s) => s.recommendationMarket), diff --git a/lib/services/queries/search.dart b/lib/services/queries/search.dart index 7eb3e139..eaf9c1b7 100644 --- a/lib/services/queries/search.dart +++ b/lib/services/queries/search.dart @@ -11,7 +11,7 @@ class SearchQueries { SearchType searchType, ) { return useSpotifyInfiniteQuery, dynamic, int>( - "search-query/${searchType.key}", + "search-query/${searchType.name}", (page, spotify) { if (query.trim().isEmpty) return []; final queryString = query; diff --git a/untranslated_messages.json b/untranslated_messages.json index 47f1c420..ebcc49ee 100644 --- a/untranslated_messages.json +++ b/untranslated_messages.json @@ -1,4 +1,9 @@ { + "ar": [ + "use_amoled_dark_theme", + "normalize_audio" + ], + "bn": [ "use_amoled_dark_theme", "normalize_audio"