mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 16:05:18 +00:00
refactor: make compatible with spotify lib 0.12
This commit is contained in:
parent
52768a7ec9
commit
afbb8ba5a7
@ -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",
|
||||||
|
@ -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)"),
|
||||||
];
|
];
|
||||||
|
@ -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);
|
||||||
},
|
},
|
||||||
|
@ -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
|
||||||
|
@ -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(
|
||||||
|
@ -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 أو مالكيه/مساهميه المسؤولية عن أي حوادث ناجمة عن الإجراء الحالي الخاص بي",
|
||||||
|
@ -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'),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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 {
|
||||||
|
@ -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),
|
||||||
|
@ -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,
|
||||||
),
|
),
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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),
|
||||||
|
@ -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;
|
||||||
|
@ -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"
|
||||||
|
Loading…
Reference in New Issue
Block a user