refactor: make compatible with spotify lib 0.12

This commit is contained in:
Kingkor Roy Tirtho 2023-09-26 19:49:59 +06:00
parent 52768a7ec9
commit afbb8ba5a7
17 changed files with 219 additions and 229 deletions

View File

@ -36,10 +36,10 @@ abstract class LanguageLocals {
// name: "Amharic", // name: "Amharic",
// nativeName: "አማርኛ", // nativeName: "አማርኛ",
// ), // ),
// "ar": const ISOLanguageName( "ar": const ISOLanguageName(
// name: "Arabic", name: "Arabic",
// nativeName: "العربية", nativeName: "العربية",
// ), ),
// "an": const ISOLanguageName( // "an": const ISOLanguageName(
// name: "Aragonese", // name: "Aragonese",
// nativeName: "Aragonés", // nativeName: "Aragonés",

View File

@ -1,187 +1,189 @@
// Country Codes contributed by momobobe <https://github.com/momobobe> // Country Codes contributed by momobobe <https://github.com/momobobe>
import 'package:spotify/spotify.dart';
final spotifyMarkets = [ final spotifyMarkets = [
("AL", "Albania (AL)"), (Market.AL, "Albania (AL)"),
("DZ", "Algeria (DZ)"), (Market.DZ, "Algeria (DZ)"),
("AD", "Andorra (AD)"), (Market.AD, "Andorra (AD)"),
("AO", "Angola (AO)"), (Market.AO, "Angola (AO)"),
("AG", "Antigua and Barbuda (AG)"), (Market.AG, "Antigua and Barbuda (AG)"),
("AR", "Argentina (AR)"), (Market.AR, "Argentina (AR)"),
("AM", "Armenia (AM)"), (Market.AM, "Armenia (AM)"),
("AU", "Australia (AU)"), (Market.AU, "Australia (AU)"),
("AT", "Austria (AT)"), (Market.AT, "Austria (AT)"),
("AZ", "Azerbaijan (AZ)"), (Market.AZ, "Azerbaijan (AZ)"),
("BH", "Bahrain (BH)"), (Market.BH, "Bahrain (BH)"),
("BD", "Bangladesh (BD)"), (Market.BD, "Bangladesh (BD)"),
("BB", "Barbados (BB)"), (Market.BB, "Barbados (BB)"),
("BY", "Belarus (BY)"), (Market.BY, "Belarus (BY)"),
("BE", "Belgium (BE)"), (Market.BE, "Belgium (BE)"),
("BZ", "Belize (BZ)"), (Market.BZ, "Belize (BZ)"),
("BJ", "Benin (BJ)"), (Market.BJ, "Benin (BJ)"),
("BT", "Bhutan (BT)"), (Market.BT, "Bhutan (BT)"),
("BO", "Bolivia (BO)"), (Market.BO, "Bolivia (BO)"),
("BA", "Bosnia and Herzegovina (BA)"), (Market.BA, "Bosnia and Herzegovina (BA)"),
("BW", "Botswana (BW)"), (Market.BW, "Botswana (BW)"),
("BR", "Brazil (BR)"), (Market.BR, "Brazil (BR)"),
("BN", "Brunei Darussalam (BN)"), (Market.BN, "Brunei Darussalam (BN)"),
("BG", "Bulgaria (BG)"), (Market.BG, "Bulgaria (BG)"),
("BF", "Burkina Faso (BF)"), (Market.BF, "Burkina Faso (BF)"),
("BI", "Burundi (BI)"), (Market.BI, "Burundi (BI)"),
("CV", "Cabo Verde / Cape Verde (CV)"), (Market.CV, "Cabo Verde / Cape Verde (CV)"),
("KH", "Cambodia (KH)"), (Market.KH, "Cambodia (KH)"),
("CM", "Cameroon (CM)"), (Market.CM, "Cameroon (CM)"),
("CA", "Canada (CA)"), (Market.CA, "Canada (CA)"),
("TD", "Chad (TD)"), (Market.TD, "Chad (TD)"),
("CL", "Chile (CL)"), (Market.CL, "Chile (CL)"),
("CO", "Colombia (CO)"), (Market.CO, "Colombia (CO)"),
("KM", "Comoros (KM)"), (Market.KM, "Comoros (KM)"),
("CR", "Costa Rica (CR)"), (Market.CR, "Costa Rica (CR)"),
("HR", "Croatia (HR)"), (Market.HR, "Croatia (HR)"),
("CW", "Curaçao (CW)"), (Market.CW, "Curaçao (CW)"),
("CY", "Cyprus (CY)"), (Market.CY, "Cyprus (CY)"),
("CZ", "Czech Republic (CZ)"), (Market.CZ, "Czech Republic (CZ)"),
("CI", "Ivory Coast (CI)"), (Market.CI, "Ivory Coast (CI)"),
("CD", "Congo (CD)"), (Market.CD, "Congo (CD)"),
("DK", "Denmark (DK)"), (Market.DK, "Denmark (DK)"),
("DJ", "Djibouti (DJ)"), (Market.DJ, "Djibouti (DJ)"),
("DM", "Dominica (DM)"), (Market.DM, "Dominica (DM)"),
("DO", "Dominican Republic (DO)"), (Market.DO, "Dominican Republic (DO)"),
("EC", "Ecuador (EC)"), (Market.EC, "Ecuador (EC)"),
("EG", "Egypt (EG)"), (Market.EG, "Egypt (EG)"),
("SV", "El Salvador (SV)"), (Market.SV, "El Salvador (SV)"),
("GQ", "Equatorial Guinea (GQ)"), (Market.GQ, "Equatorial Guinea (GQ)"),
("EE", "Estonia (EE)"), (Market.EE, "Estonia (EE)"),
("SZ", "Eswatini (SZ)"), (Market.SZ, "Eswatini (SZ)"),
("FJ", "Fiji (FJ)"), (Market.FJ, "Fiji (FJ)"),
("FI", "Finland (FI)"), (Market.FI, "Finland (FI)"),
("FR", "France (FR)"), (Market.FR, "France (FR)"),
("GA", "Gabon (GA)"), (Market.GA, "Gabon (GA)"),
("GE", "Georgia (GE)"), (Market.GE, "Georgia (GE)"),
("DE", "Germany (DE)"), (Market.DE, "Germany (DE)"),
("GH", "Ghana (GH)"), (Market.GH, "Ghana (GH)"),
("GR", "Greece (GR)"), (Market.GR, "Greece (GR)"),
("GD", "Grenada (GD)"), (Market.GD, "Grenada (GD)"),
("GT", "Guatemala (GT)"), (Market.GT, "Guatemala (GT)"),
("GN", "Guinea (GN)"), (Market.GN, "Guinea (GN)"),
("GW", "Guinea-Bissau (GW)"), (Market.GW, "Guinea-Bissau (GW)"),
("GY", "Guyana (GY)"), (Market.GY, "Guyana (GY)"),
("HT", "Haiti (HT)"), (Market.HT, "Haiti (HT)"),
("HN", "Honduras (HN)"), (Market.HN, "Honduras (HN)"),
("HK", "Hong Kong (HK)"), (Market.HK, "Hong Kong (HK)"),
("HU", "Hungary (HU)"), (Market.HU, "Hungary (HU)"),
("IS", "Iceland (IS)"), (Market.IS, "Iceland (IS)"),
("IN", "India (IN)"), (Market.IN, "India (IN)"),
("ID", "Indonesia (ID)"), (Market.ID, "Indonesia (ID)"),
("IQ", "Iraq (IQ)"), (Market.IQ, "Iraq (IQ)"),
("IE", "Ireland (IE)"), (Market.IE, "Ireland (IE)"),
("IL", "Israel (IL)"), (Market.IL, "Israel (IL)"),
("IT", "Italy (IT)"), (Market.IT, "Italy (IT)"),
("JM", "Jamaica (JM)"), (Market.JM, "Jamaica (JM)"),
("JP", "Japan (JP)"), (Market.JP, "Japan (JP)"),
("JO", "Jordan (JO)"), (Market.JO, "Jordan (JO)"),
("KZ", "Kazakhstan (KZ)"), (Market.KZ, "Kazakhstan (KZ)"),
("KE", "Kenya (KE)"), (Market.KE, "Kenya (KE)"),
("KI", "Kiribati (KI)"), (Market.KI, "Kiribati (KI)"),
("XK", "Kosovo (XK)"), (Market.XK, "Kosovo (XK)"),
("KW", "Kuwait (KW)"), (Market.KW, "Kuwait (KW)"),
("KG", "Kyrgyzstan (KG)"), (Market.KG, "Kyrgyzstan (KG)"),
("LA", "Laos (LA)"), (Market.LA, "Laos (LA)"),
("LV", "Latvia (LV)"), (Market.LV, "Latvia (LV)"),
("LB", "Lebanon (LB)"), (Market.LB, "Lebanon (LB)"),
("LS", "Lesotho (LS)"), (Market.LS, "Lesotho (LS)"),
("LR", "Liberia (LR)"), (Market.LR, "Liberia (LR)"),
("LY", "Libya (LY)"), (Market.LY, "Libya (LY)"),
("LI", "Liechtenstein (LI)"), (Market.LI, "Liechtenstein (LI)"),
("LT", "Lithuania (LT)"), (Market.LT, "Lithuania (LT)"),
("LU", "Luxembourg (LU)"), (Market.LU, "Luxembourg (LU)"),
("MO", "Macao / Macau (MO)"), (Market.MO, "Macao / Macau (MO)"),
("MG", "Madagascar (MG)"), (Market.MG, "Madagascar (MG)"),
("MW", "Malawi (MW)"), (Market.MW, "Malawi (MW)"),
("MY", "Malaysia (MY)"), (Market.MY, "Malaysia (MY)"),
("MV", "Maldives (MV)"), (Market.MV, "Maldives (MV)"),
("ML", "Mali (ML)"), (Market.ML, "Mali (ML)"),
("MT", "Malta (MT)"), (Market.MT, "Malta (MT)"),
("MH", "Marshall Islands (MH)"), (Market.MH, "Marshall Islands (MH)"),
("MR", "Mauritania (MR)"), (Market.MR, "Mauritania (MR)"),
("MU", "Mauritius (MU)"), (Market.MU, "Mauritius (MU)"),
("MX", "Mexico (MX)"), (Market.MX, "Mexico (MX)"),
("FM", "Micronesia (FM)"), (Market.FM, "Micronesia (FM)"),
("MD", "Moldova (MD)"), (Market.MD, "Moldova (MD)"),
("MC", "Monaco (MC)"), (Market.MC, "Monaco (MC)"),
("MN", "Mongolia (MN)"), (Market.MN, "Mongolia (MN)"),
("ME", "Montenegro (ME)"), (Market.ME, "Montenegro (ME)"),
("MA", "Morocco (MA)"), (Market.MA, "Morocco (MA)"),
("MZ", "Mozambique (MZ)"), (Market.MZ, "Mozambique (MZ)"),
("NA", "Namibia (NA)"), (Market.NA, "Namibia (NA)"),
("NR", "Nauru (NR)"), (Market.NR, "Nauru (NR)"),
("NP", "Nepal (NP)"), (Market.NP, "Nepal (NP)"),
("NL", "Netherlands (NL)"), (Market.NL, "Netherlands (NL)"),
("NZ", "New Zealand (NZ)"), (Market.NZ, "New Zealand (NZ)"),
("NI", "Nicaragua (NI)"), (Market.NI, "Nicaragua (NI)"),
("NE", "Niger (NE)"), (Market.NE, "Niger (NE)"),
("NG", "Nigeria (NG)"), (Market.NG, "Nigeria (NG)"),
("MK", "North Macedonia (MK)"), (Market.MK, "North Macedonia (MK)"),
("NO", "Norway (NO)"), (Market.NO, "Norway (NO)"),
("OM", "Oman (OM)"), (Market.OM, "Oman (OM)"),
("PK", "Pakistan (PK)"), (Market.PK, "Pakistan (PK)"),
("PW", "Palau (PW)"), (Market.PW, "Palau (PW)"),
("PS", "Palestine (PS)"), (Market.PS, "Palestine (PS)"),
("PA", "Panama (PA)"), (Market.PA, "Panama (PA)"),
("PG", "Papua New Guinea (PG)"), (Market.PG, "Papua New Guinea (PG)"),
("PY", "Paraguay (PY)"), (Market.PY, "Paraguay (PY)"),
("PE", "Peru (PE)"), (Market.PE, "Peru (PE)"),
("PH", "Philippines (PH)"), (Market.PH, "Philippines (PH)"),
("PL", "Poland (PL)"), (Market.PL, "Poland (PL)"),
("PT", "Portugal (PT)"), (Market.PT, "Portugal (PT)"),
("QA", "Qatar (QA)"), (Market.QA, "Qatar (QA)"),
("CG", "Congo (CG)"), (Market.CG, "Congo (CG)"),
("RO", "Romania (RO)"), (Market.RO, "Romania (RO)"),
("RU", "Russia (RU)"), (Market.RU, "Russia (RU)"),
("RW", "Rwanda (RW)"), (Market.RW, "Rwanda (RW)"),
("WS", "Samoa (WS)"), (Market.WS, "Samoa (WS)"),
("SM", "San Marino (SM)"), (Market.SM, "San Marino (SM)"),
("SA", "Saudi Arabia (SA)"), (Market.SA, "Saudi Arabia (SA)"),
("SN", "Senegal (SN)"), (Market.SN, "Senegal (SN)"),
("RS", "Serbia (RS)"), (Market.RS, "Serbia (RS)"),
("SC", "Seychelles (SC)"), (Market.SC, "Seychelles (SC)"),
("SL", "Sierra Leone (SL)"), (Market.SL, "Sierra Leone (SL)"),
("SG", "Singapore (SG)"), (Market.SG, "Singapore (SG)"),
("SK", "Slovakia (SK)"), (Market.SK, "Slovakia (SK)"),
("SI", "Slovenia (SI)"), (Market.SI, "Slovenia (SI)"),
("SB", "Solomon Islands (SB)"), (Market.SB, "Solomon Islands (SB)"),
("ZA", "South Africa (ZA)"), (Market.ZA, "South Africa (ZA)"),
("KR", "South Korea (KR)"), (Market.KR, "South Korea (KR)"),
("ES", "Spain (ES)"), (Market.ES, "Spain (ES)"),
("LK", "Sri Lanka (LK)"), (Market.LK, "Sri Lanka (LK)"),
("KN", "St. Kitts and Nevis (KN)"), (Market.KN, "St. Kitts and Nevis (KN)"),
("LC", "St. Lucia (LC)"), (Market.LC, "St. Lucia (LC)"),
("SR", "Suriname (SR)"), (Market.SR, "Suriname (SR)"),
("SE", "Sweden (SE)"), (Market.SE, "Sweden (SE)"),
("CH", "Switzerland (CH)"), (Market.CH, "Switzerland (CH)"),
("ST", "São Tomé and Príncipe (ST)"), (Market.ST, "São Tomé and Príncipe (ST)"),
("TW", "Taiwan (TW)"), (Market.TW, "Taiwan (TW)"),
("TJ", "Tajikistan (TJ)"), (Market.TJ, "Tajikistan (TJ)"),
("TZ", "Tanzania (TZ)"), (Market.TZ, "Tanzania (TZ)"),
("TH", "Thailand (TH)"), (Market.TH, "Thailand (TH)"),
("BS", "The Bahamas (BS)"), (Market.BS, "The Bahamas (BS)"),
("GM", "The Gambia (GM)"), (Market.GM, "The Gambia (GM)"),
("TL", "East Timor (TL)"), (Market.TL, "East Timor (TL)"),
("TG", "Togo (TG)"), (Market.TG, "Togo (TG)"),
("TO", "Tonga (TO)"), (Market.TO, "Tonga (TO)"),
("TT", "Trinidad and Tobago (TT)"), (Market.TT, "Trinidad and Tobago (TT)"),
("TN", "Tunisia (TN)"), (Market.TN, "Tunisia (TN)"),
("TR", "Turkey (TR)"), (Market.TR, "Turkey (TR)"),
("TV", "Tuvalu (TV)"), (Market.TV, "Tuvalu (TV)"),
("UG", "Uganda (UG)"), (Market.UG, "Uganda (UG)"),
("UA", "Ukraine (UA)"), (Market.UA, "Ukraine (UA)"),
("AE", "United Arab Emirates (AE)"), (Market.AE, "United Arab Emirates (AE)"),
("GB", "United Kingdom (GB)"), (Market.GB, "United Kingdom (GB)"),
("US", "United States (US)"), (Market.US, "United States (US)"),
("UY", "Uruguay (UY)"), (Market.UY, "Uruguay (UY)"),
("UZ", "Uzbekistan (UZ)"), (Market.UZ, "Uzbekistan (UZ)"),
("VU", "Vanuatu (VU)"), (Market.VU, "Vanuatu (VU)"),
("VE", "Venezuela (VE)"), (Market.VE, "Venezuela (VE)"),
("VN", "Vietnam (VN)"), (Market.VN, "Vietnam (VN)"),
("ZM", "Zambia (ZM)"), (Market.ZM, "Zambia (ZM)"),
("ZW", "Zimbabwe (ZW)"), (Market.ZW, "Zimbabwe (ZW)"),
]; ];

View File

@ -11,24 +11,7 @@ import 'package:spotube/services/audio_player/audio_player.dart';
import 'package:spotube/utils/service_utils.dart'; import 'package:spotube/utils/service_utils.dart';
import 'package:spotube/utils/type_conversion_utils.dart'; import 'package:spotube/utils/type_conversion_utils.dart';
enum AlbumType { extension FormattedAlbumType on 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;
}
}
String get formatted => name.replaceFirst(name[0], name[0].toUpperCase()); String get formatted => name.replaceFirst(name[0], name[0].toUpperCase());
} }
@ -71,7 +54,7 @@ class AlbumCard extends HookConsumerWidget {
isLoading: isPlaylistPlaying && playlist.isFetching == true, isLoading: isPlaylistPlaying && playlist.isFetching == true,
title: album.name!, title: album.name!,
description: description:
"${AlbumType.from(album.albumType!).formatted}${TypeConversionUtils.artists_X_String<ArtistSimple>(album.artists ?? [])}", "${album.albumType?.formatted}${TypeConversionUtils.artists_X_String<ArtistSimple>(album.artists ?? [])}",
onTap: () { onTap: () {
ServiceUtils.push(context, "/album/${album.id}", extra: album); ServiceUtils.push(context, "/album/${album.id}", extra: album);
}, },

View File

@ -42,6 +42,7 @@ class AdaptiveSelectTile<T> extends HookWidget {
items: options, items: options,
value: value, value: value,
onChanged: onChanged, onChanged: onChanged,
menuMaxHeight: mediaQuery.size.height * 0.6,
); );
final controlPlaceholder = useMemoized( final controlPlaceholder = useMemoized(
() => options () => options

View File

@ -121,7 +121,7 @@ class TrackCollectionHeading<T> extends HookConsumerWidget {
), ),
if (album != null) if (album != null)
Text( Text(
"${AlbumType.from(album?.albumType).formatted}${context.l10n.released}${DateTime.tryParse( "${album?.albumType?.formatted}${context.l10n.released}${DateTime.tryParse(
album?.releaseDate ?? "", album?.releaseDate ?? "",
)?.year}", )?.year}",
style: theme.textTheme.titleMedium!.copyWith( style: theme.textTheme.titleMedium!.copyWith(

View File

@ -227,7 +227,7 @@
"selected_count_tracks": "مقطوعات {count} مختارة", "selected_count_tracks": "مقطوعات {count} مختارة",
"download_warning": "إذا قمت بتنزيل جميع المقاطع الصوتية بكميات كبيرة، فمن الواضح أنك تقوم بقرصنة الموسيقى وتسبب الضرر للمجتمع الإبداعي للموسيقى. أتمنى أن تكون على علم بهذا. حاول دائمًا احترام ودعم العمل الجاد للفنان", "download_warning": "إذا قمت بتنزيل جميع المقاطع الصوتية بكميات كبيرة، فمن الواضح أنك تقوم بقرصنة الموسيقى وتسبب الضرر للمجتمع الإبداعي للموسيقى. أتمنى أن تكون على علم بهذا. حاول دائمًا احترام ودعم العمل الجاد للفنان",
"download_ip_ban_warning": "بالمناسبة، يمكن أن يتم حظر عنوان IP الخاص بك على YouTube بسبب طلبات التنزيل الزائدة عن المعتاد. يعني حظر IP أنه لا يمكنك استخدام YouTube (حتى إذا قمت بتسجيل الدخول) لمدة تتراوح بين شهرين إلى ثلاثة أشهر على الأقل من جهاز IP هذا. ولا يتحمل Spotube أي مسؤولية إذا حدث هذا على الإطلاق", "download_ip_ban_warning": "بالمناسبة، يمكن أن يتم حظر عنوان IP الخاص بك على YouTube بسبب طلبات التنزيل الزائدة عن المعتاد. يعني حظر IP أنه لا يمكنك استخدام YouTube (حتى إذا قمت بتسجيل الدخول) لمدة تتراوح بين شهرين إلى ثلاثة أشهر على الأقل من جهاز IP هذا. ولا يتحمل Spotube أي مسؤولية إذا حدث هذا على الإطلاق",
"by_clicking_accept_terms": "بالنقر على "قبول"، فإنك توافق على الشروط التالية:", "by_clicking_accept_terms": "بالنقر على \"قبول\"، فإنك توافق على الشروط التالية:",
"download_agreement_1": "أعلم أنني أقوم بقرصنة الموسيقى. انا سيئ", "download_agreement_1": "أعلم أنني أقوم بقرصنة الموسيقى. انا سيئ",
"download_agreement_2": "سأدعم الفنان أينما أستطيع، وأنا أفعل هذا فقط لأنني لا أملك المال لشراء أعمالهم الفنية", "download_agreement_2": "سأدعم الفنان أينما أستطيع، وأنا أفعل هذا فقط لأنني لا أملك المال لشراء أعمالهم الفنية",
"download_agreement_3": "أدرك تمامًا أنه يمكن حظر عنوان IP الخاص بي على YouTube ولا أحمل Spotube أو مالكيه/مساهميه المسؤولية عن أي حوادث ناجمة عن الإجراء الحالي الخاص بي", "download_agreement_3": "أدرك تمامًا أنه يمكن حظر عنوان IP الخاص بي على YouTube ولا أحمل Spotube أو مالكيه/مساهميه المسؤولية عن أي حوادث ناجمة عن الإجراء الحالي الخاص بي",

View File

@ -23,5 +23,6 @@ class L10n {
const Locale('ru', 'RU'), const Locale('ru', 'RU'),
const Locale('pt', 'PT'), const Locale('pt', 'PT'),
const Locale('uk', 'UA'), const Locale('uk', 'UA'),
const Locale('ar', 'SA'),
]; ];
} }

View File

@ -37,7 +37,7 @@ class PlaylistGeneratorPage extends HookConsumerWidget {
final genresCollection = useQueries.category.genreSeeds(ref); final genresCollection = useQueries.category.genreSeeds(ref);
final limit = useValueNotifier<int>(10); final limit = useValueNotifier<int>(10);
final market = useValueNotifier<String>(preferences.recommendationMarket); final market = useValueNotifier<Market>(preferences.recommendationMarket);
final genres = useState<List<String>>([]); final genres = useState<List<String>>([]);
final artists = useState<List<Artist>>([]); final artists = useState<List<Artist>>([]);
@ -220,7 +220,7 @@ class PlaylistGeneratorPage extends HookConsumerWidget {
final countrySelector = ValueListenableBuilder( final countrySelector = ValueListenableBuilder(
valueListenable: market, valueListenable: market,
builder: (context, value, _) { builder: (context, value, _) {
return DropdownButtonFormField<String>( return DropdownButtonFormField<Market>(
decoration: InputDecoration( decoration: InputDecoration(
labelText: context.l10n.country, labelText: context.l10n.country,
labelStyle: textTheme.titleMedium, labelStyle: textTheme.titleMedium,

View File

@ -18,7 +18,7 @@ typedef PlaylistGenerateResultRouteState = ({
({List<String> tracks, List<String> artists, List<String> genres})? seeds, ({List<String> tracks, List<String> artists, List<String> genres})? seeds,
RecommendationParameters? parameters, RecommendationParameters? parameters,
int limit, int limit,
String? market, Market? market,
}); });
class PlaylistGenerateResultPage extends HookConsumerWidget { class PlaylistGenerateResultPage extends HookConsumerWidget {

View File

@ -9,6 +9,7 @@ import 'package:go_router/go_router.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:piped_client/piped_client.dart'; import 'package:piped_client/piped_client.dart';
import 'package:spotify/spotify.dart';
import 'package:spotube/collections/env.dart'; import 'package:spotube/collections/env.dart';
import 'package:spotube/collections/language_codes.dart'; import 'package:spotube/collections/language_codes.dart';
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
@ -180,7 +181,7 @@ class SettingsPage extends HookConsumerWidget {
), ),
], ],
), ),
AdaptiveSelectTile<String>( AdaptiveSelectTile<Market>(
breakLayout: mediaQuery.lgAndUp, breakLayout: mediaQuery.lgAndUp,
secondary: const Icon(SpotubeIcons.shoppingBag), secondary: const Icon(SpotubeIcons.shoppingBag),
title: Text(context.l10n.market_place_region), title: Text(context.l10n.market_place_region),

View File

@ -6,6 +6,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_desktop_tools/flutter_desktop_tools.dart'; import 'package:flutter_desktop_tools/flutter_desktop_tools.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:path_provider/path_provider.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/components/settings/color_scheme_picker_dialog.dart';
import 'package:spotube/models/matched_track.dart'; import 'package:spotube/models/matched_track.dart';
import 'package:spotube/provider/palette_provider.dart'; import 'package:spotube/provider/palette_provider.dart';
@ -41,7 +42,7 @@ enum YoutubeApiType {
class UserPreferences extends PersistedChangeNotifier { class UserPreferences extends PersistedChangeNotifier {
ThemeMode themeMode; ThemeMode themeMode;
String recommendationMarket; Market recommendationMarket;
bool saveTrackLyrics; bool saveTrackLyrics;
bool checkUpdate; bool checkUpdate;
AudioQuality audioQuality; AudioQuality audioQuality;
@ -118,7 +119,7 @@ class UserPreferences extends PersistedChangeNotifier {
updatePersistence(); updatePersistence();
} }
void setRecommendationMarket(String country) { void setRecommendationMarket(Market country) {
recommendationMarket = country; recommendationMarket = country;
notifyListeners(); notifyListeners();
updatePersistence(); updatePersistence();
@ -342,7 +343,7 @@ class UserPreferences extends PersistedChangeNotifier {
SearchMode? searchMode, SearchMode? searchMode,
bool? skipNonMusic, bool? skipNonMusic,
YoutubeApiType? youtubeApiType, YoutubeApiType? youtubeApiType,
String? recommendationMarket, Market? recommendationMarket,
bool? saveTrackLyrics, bool? saveTrackLyrics,
}) { }) {
return UserPreferences( return UserPreferences(
@ -371,7 +372,7 @@ final userPreferencesProvider = ChangeNotifierProvider(
(ref) => UserPreferences( (ref) => UserPreferences(
ref, ref,
accentColorScheme: SpotubeColor(Colors.blue.value, name: "Blue"), accentColorScheme: SpotubeColor(Colors.blue.value, name: "Blue"),
recommendationMarket: 'US', recommendationMarket: Market.US,
themeMode: ThemeMode.system, themeMode: ThemeMode.system,
layoutMode: LayoutMode.adaptive, layoutMode: LayoutMode.adaptive,
), ),

View File

@ -43,8 +43,8 @@ class CustomSpotifyEndpoints {
String imageStyle = "gradient_overlay", String imageStyle = "gradient_overlay",
String includeExternal = "audio", String includeExternal = "audio",
String? locale, String? locale,
String? market, Market? market,
String? country, Market? country,
}) async { }) async {
if (accessToken.isEmpty) { if (accessToken.isEmpty) {
throw Exception('[CustomSpotifyEndpoints.getView]: accessToken is empty'); throw Exception('[CustomSpotifyEndpoints.getView]: accessToken is empty');
@ -124,7 +124,7 @@ class CustomSpotifyEndpoints {
Iterable<String>? seedGenres, Iterable<String>? seedGenres,
Iterable<String>? seedTracks, Iterable<String>? seedTracks,
int limit = 20, int limit = 20,
String? market, Market? market,
Map<String, num>? max, Map<String, num>? max,
Map<String, num>? min, Map<String, num>? min,
Map<String, num>? target, Map<String, num>? target,
@ -143,7 +143,7 @@ class CustomSpotifyEndpoints {
'seed_genres': seedGenres, 'seed_genres': seedGenres,
'seed_tracks': seedTracks 'seed_tracks': seedTracks
}.forEach((key, list) => _addList(parameters, key, list!)); }.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]) { for (var map in [min, max, target]) {
_addTunableTrackMap(parameters, map); _addTunableTrackMap(parameters, map);
} }

View File

@ -66,7 +66,7 @@ class AlbumQueries {
(pageParam, spotify) async { (pageParam, spotify) async {
try { try {
final albums = await spotify.browse final albums = await spotify.browse
.getNewReleases(country: market) .newReleases(country: market)
.getPage(50, pageParam); .getPage(50, pageParam);
return albums; return albums;

View File

@ -13,7 +13,7 @@ class CategoryQueries {
InfiniteQuery<Page<Category>, dynamic, int> list( InfiniteQuery<Page<Category>, dynamic, int> list(
WidgetRef ref, WidgetRef ref,
String recommendationMarket, Market recommendationMarket,
) { ) {
ref.watch(userPreferencesProvider.select((s) => s.locale)); ref.watch(userPreferencesProvider.select((s) => s.locale));
final locale = useContext().l10n.localeName; final locale = useContext().l10n.localeName;

View File

@ -1,6 +1,3 @@
import 'dart:io';
import 'dart:math';
import 'package:catcher/catcher.dart'; import 'package:catcher/catcher.dart';
import 'package:fl_query/fl_query.dart'; import 'package:fl_query/fl_query.dart';
import 'package:fl_query_hooks/fl_query_hooks.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_infinite_query.dart';
import 'package:spotube/hooks/use_spotify_query.dart'; import 'package:spotube/hooks/use_spotify_query.dart';
import 'package:spotube/pages/library/playlist_generate/playlist_generate.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/custom_spotify_endpoint_provider.dart';
import 'package:spotube/provider/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences_provider.dart';
@ -244,7 +240,7 @@ class PlaylistQueries {
({List<String> tracks, List<String> artists, List<String> genres})? seeds, ({List<String> tracks, List<String> artists, List<String> genres})? seeds,
RecommendationParameters? parameters, RecommendationParameters? parameters,
int limit = 20, int limit = 20,
String? market, Market? market,
}) { }) {
final marketOfPreference = ref.watch( final marketOfPreference = ref.watch(
userPreferencesProvider.select((s) => s.recommendationMarket), userPreferencesProvider.select((s) => s.recommendationMarket),

View File

@ -11,7 +11,7 @@ class SearchQueries {
SearchType searchType, SearchType searchType,
) { ) {
return useSpotifyInfiniteQuery<List<Page>, dynamic, int>( return useSpotifyInfiniteQuery<List<Page>, dynamic, int>(
"search-query/${searchType.key}", "search-query/${searchType.name}",
(page, spotify) { (page, spotify) {
if (query.trim().isEmpty) return []; if (query.trim().isEmpty) return [];
final queryString = query; final queryString = query;

View File

@ -1,4 +1,9 @@
{ {
"ar": [
"use_amoled_dark_theme",
"normalize_audio"
],
"bn": [ "bn": [
"use_amoled_dark_theme", "use_amoled_dark_theme",
"normalize_audio" "normalize_audio"