refactor: artist name string as extension

This commit is contained in:
Kingkor Roy Tirtho 2024-03-21 00:30:27 +06:00
parent 7545ff6415
commit 1cea95bbda
17 changed files with 37 additions and 40 deletions

View File

@ -3,6 +3,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/components/shared/playbutton_card.dart'; import 'package:spotube/components/shared/playbutton_card.dart';
import 'package:spotube/extensions/artist_simple.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/extensions/image.dart'; import 'package:spotube/extensions/image.dart';
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart'; import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
@ -59,7 +60,7 @@ class AlbumCard extends HookConsumerWidget {
updating.value, updating.value,
title: album.name!, title: album.name!,
description: description:
"${album.albumType?.formatted}${TypeConversionUtils.artists_X_String<ArtistSimple>(album.artists ?? [])}", "${album.albumType?.formatted}${album.artists?.asString() ?? ""}",
onTap: () { onTap: () {
ServiceUtils.push(context, "/album/${album.id}", extra: album); ServiceUtils.push(context, "/album/${album.id}", extra: album);
}, },

View File

@ -21,6 +21,7 @@ import 'package:spotube/components/shared/fallbacks/not_found.dart';
import 'package:spotube/components/shared/inter_scrollbar/inter_scrollbar.dart'; import 'package:spotube/components/shared/inter_scrollbar/inter_scrollbar.dart';
import 'package:spotube/components/shared/sort_tracks_dropdown.dart'; import 'package:spotube/components/shared/sort_tracks_dropdown.dart';
import 'package:spotube/components/shared/track_tile/track_tile.dart'; import 'package:spotube/components/shared/track_tile/track_tile.dart';
import 'package:spotube/extensions/artist_simple.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/models/local_track.dart'; import 'package:spotube/models/local_track.dart';
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart'; import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
@ -242,7 +243,7 @@ class UserLocalTracks extends HookConsumerWidget {
return sortedTracks return sortedTracks
.map((e) => ( .map((e) => (
weightedRatio( weightedRatio(
"${e.name} - ${TypeConversionUtils.artists_X_String<Artist>(e.artists ?? [])}", "${e.name} - ${e.artists?.asString() ?? ""}",
searchController.text, searchController.text,
), ),
e, e,

View File

@ -16,6 +16,7 @@ import 'package:spotube/components/shared/dialogs/track_details_dialog.dart';
import 'package:spotube/components/shared/page_window_title_bar.dart'; import 'package:spotube/components/shared/page_window_title_bar.dart';
import 'package:spotube/components/shared/image/universal_image.dart'; import 'package:spotube/components/shared/image/universal_image.dart';
import 'package:spotube/components/shared/panels/sliding_up_panel.dart'; import 'package:spotube/components/shared/panels/sliding_up_panel.dart';
import 'package:spotube/extensions/artist_simple.dart';
import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/constrains.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/extensions/image.dart'; import 'package:spotube/extensions/image.dart';
@ -239,10 +240,7 @@ class PlayerView extends HookConsumerWidget {
), ),
if (isLocalTrack) if (isLocalTrack)
Text( Text(
TypeConversionUtils.artists_X_String< currentTrack?.artists?.asString() ?? "",
Artist>(
currentTrack?.artists ?? [],
),
style: theme.textTheme.bodyMedium!.copyWith( style: theme.textTheme.bodyMedium!.copyWith(
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
color: bodyTextColor, color: bodyTextColor,

View File

@ -3,11 +3,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotify/spotify.dart' hide Offset;
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/player/sibling_tracks_sheet.dart'; import 'package:spotube/components/player/sibling_tracks_sheet.dart';
import 'package:spotube/components/shared/adaptive/adaptive_pop_sheet_list.dart'; import 'package:spotube/components/shared/adaptive/adaptive_pop_sheet_list.dart';
import 'package:spotube/components/shared/heart_button.dart'; import 'package:spotube/components/shared/heart_button.dart';
import 'package:spotube/extensions/artist_simple.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/extensions/duration.dart'; import 'package:spotube/extensions/duration.dart';
import 'package:spotube/models/local_track.dart'; import 'package:spotube/models/local_track.dart';
@ -16,7 +16,6 @@ import 'package:spotube/provider/download_manager_provider.dart';
import 'package:spotube/provider/authentication_provider.dart'; import 'package:spotube/provider/authentication_provider.dart';
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart'; import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/provider/sleep_timer_provider.dart'; import 'package:spotube/provider/sleep_timer_provider.dart';
import 'package:spotube/utils/type_conversion_utils.dart';
class PlayerActions extends HookConsumerWidget { class PlayerActions extends HookConsumerWidget {
final MainAxisAlignment mainAxisAlignment; final MainAxisAlignment mainAxisAlignment;
@ -56,10 +55,8 @@ class PlayerActions extends HookConsumerWidget {
(element) => (element) =>
element.name == playlist.activeTrack?.name && element.name == playlist.activeTrack?.name &&
element.album?.name == playlist.activeTrack?.album?.name && element.album?.name == playlist.activeTrack?.album?.name &&
TypeConversionUtils.artists_X_String<Artist>( element.artists?.asString() ==
element.artists ?? []) == playlist.activeTrack?.artists?.asString(),
TypeConversionUtils.artists_X_String<Artist>(
playlist.activeTrack?.artists ?? []),
) == ) ==
true; true;
}, [localTracks, playlist.activeTrack]); }, [localTracks, playlist.activeTrack]);

View File

@ -12,11 +12,11 @@ import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/shared/fallbacks/not_found.dart'; import 'package:spotube/components/shared/fallbacks/not_found.dart';
import 'package:spotube/components/shared/inter_scrollbar/inter_scrollbar.dart'; import 'package:spotube/components/shared/inter_scrollbar/inter_scrollbar.dart';
import 'package:spotube/components/shared/track_tile/track_tile.dart'; import 'package:spotube/components/shared/track_tile/track_tile.dart';
import 'package:spotube/extensions/artist_simple.dart';
import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/constrains.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/hooks/controllers/use_auto_scroll_controller.dart'; import 'package:spotube/hooks/controllers/use_auto_scroll_controller.dart';
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart'; import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/utils/type_conversion_utils.dart';
class PlayerQueue extends HookConsumerWidget { class PlayerQueue extends HookConsumerWidget {
final bool floating; final bool floating;
@ -55,7 +55,7 @@ class PlayerQueue extends HookConsumerWidget {
return tracks return tracks
.map((e) => ( .map((e) => (
weightedRatio( weightedRatio(
'${e.name!} - ${TypeConversionUtils.artists_X_String(e.artists!)}', '${e.name!} - ${e.artists?.asString() ?? ""}',
searchText.value, searchText.value,
), ),
e e

View File

@ -5,6 +5,7 @@ import 'package:spotify/spotify.dart';
import 'package:spotube/collections/assets.gen.dart'; import 'package:spotube/collections/assets.gen.dart';
import 'package:spotube/components/shared/image/universal_image.dart'; import 'package:spotube/components/shared/image/universal_image.dart';
import 'package:spotube/components/shared/links/link_text.dart'; import 'package:spotube/components/shared/links/link_text.dart';
import 'package:spotube/extensions/artist_simple.dart';
import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/constrains.dart';
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart'; import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/utils/service_utils.dart'; import 'package:spotube/utils/service_utils.dart';
@ -54,9 +55,7 @@ class PlayerTrackDetails extends HookConsumerWidget {
), ),
), ),
Text( Text(
TypeConversionUtils.artists_X_String<Artist>( playback.activeTrack?.artists?.asString() ?? "",
playback.activeTrack?.artists ?? [],
),
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: theme.textTheme.bodySmall!.copyWith(color: color), style: theme.textTheme.bodySmall!.copyWith(color: color),
) )

View File

@ -10,6 +10,7 @@ import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/shared/image/universal_image.dart'; import 'package:spotube/components/shared/image/universal_image.dart';
import 'package:spotube/components/shared/inter_scrollbar/inter_scrollbar.dart'; import 'package:spotube/components/shared/inter_scrollbar/inter_scrollbar.dart';
import 'package:spotube/extensions/artist_simple.dart';
import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/constrains.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/extensions/duration.dart'; import 'package:spotube/extensions/duration.dart';
@ -67,7 +68,7 @@ class SiblingTracksSheet extends HookConsumerWidget {
).trim(); ).trim();
final defaultSearchTerm = final defaultSearchTerm =
"$title - ${TypeConversionUtils.artists_X_String<Artist>(playlist.activeTrack?.artists ?? [])}"; "$title - ${playlist.activeTrack?.artists?.asString() ?? ""}";
final searchController = useTextEditingController( final searchController = useTextEditingController(
text: defaultSearchTerm, text: defaultSearchTerm,
); );

View File

@ -11,6 +11,7 @@ import 'package:spotube/components/shared/hover_builder.dart';
import 'package:spotube/components/shared/image/universal_image.dart'; import 'package:spotube/components/shared/image/universal_image.dart';
import 'package:spotube/components/shared/links/link_text.dart'; import 'package:spotube/components/shared/links/link_text.dart';
import 'package:spotube/components/shared/track_tile/track_options.dart'; import 'package:spotube/components/shared/track_tile/track_options.dart';
import 'package:spotube/extensions/artist_simple.dart';
import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/constrains.dart';
import 'package:spotube/extensions/duration.dart'; import 'package:spotube/extensions/duration.dart';
import 'package:spotube/extensions/image.dart'; import 'package:spotube/extensions/image.dart';
@ -230,9 +231,7 @@ class TrackTile extends HookConsumerWidget {
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: track is LocalTrack child: track is LocalTrack
? Text( ? Text(
TypeConversionUtils.artists_X_String<Artist>( track.artists?.asString() ?? '',
track.artists ?? [],
),
) )
: ClipRect( : ClipRect(
child: ConstrainedBox( child: ConstrainedBox(

View File

@ -11,3 +11,9 @@ extension ArtistJson on ArtistSimple {
}; };
} }
} }
extension ArtistExtension on List<ArtistSimple> {
String asString() {
return map((e) => e.name?.replaceAll(",", " ")).join(", ");
}
}

View File

@ -8,6 +8,7 @@ import 'package:spotify/spotify.dart';
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/lyrics/zoom_controls.dart'; import 'package:spotube/components/lyrics/zoom_controls.dart';
import 'package:spotube/components/shared/shimmers/shimmer_lyrics.dart'; import 'package:spotube/components/shared/shimmers/shimmer_lyrics.dart';
import 'package:spotube/extensions/artist_simple.dart';
import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/constrains.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
@ -55,8 +56,7 @@ class PlainLyrics extends HookConsumerWidget {
), ),
Center( Center(
child: Text( child: Text(
TypeConversionUtils.artists_X_String<Artist>( playlist.activeTrack?.artists?.asString() ?? "",
playlist.activeTrack?.artists ?? []),
style: (mediaQuery.mdAndUp style: (mediaQuery.mdAndUp
? textTheme.headlineSmall ? textTheme.headlineSmall
: textTheme.titleLarge) : textTheme.titleLarge)

View File

@ -3,10 +3,10 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:palette_generator/palette_generator.dart'; import 'package:palette_generator/palette_generator.dart';
import 'package:spotify/spotify.dart' hide Offset;
import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/collections/spotube_icons.dart';
import 'package:spotube/components/lyrics/zoom_controls.dart'; import 'package:spotube/components/lyrics/zoom_controls.dart';
import 'package:spotube/components/shared/shimmers/shimmer_lyrics.dart'; import 'package:spotube/components/shared/shimmers/shimmer_lyrics.dart';
import 'package:spotube/extensions/artist_simple.dart';
import 'package:spotube/extensions/constrains.dart'; import 'package:spotube/extensions/constrains.dart';
import 'package:spotube/extensions/context.dart'; import 'package:spotube/extensions/context.dart';
import 'package:spotube/hooks/controllers/use_auto_scroll_controller.dart'; import 'package:spotube/hooks/controllers/use_auto_scroll_controller.dart';
@ -16,7 +16,6 @@ import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/provider/spotify/spotify.dart'; import 'package:spotube/provider/spotify/spotify.dart';
import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/audio_player/audio_player.dart';
import 'package:spotube/utils/type_conversion_utils.dart';
import 'package:stroke_text/stroke_text.dart'; import 'package:stroke_text/stroke_text.dart';
class SyncedLyrics extends HookConsumerWidget { class SyncedLyrics extends HookConsumerWidget {
@ -84,8 +83,7 @@ class SyncedLyrics extends HookConsumerWidget {
if (isModal != true) if (isModal != true)
Center( Center(
child: Text( child: Text(
TypeConversionUtils.artists_X_String<Artist>( playlist.activeTrack?.artists?.asString() ?? "",
playlist.activeTrack?.artists ?? []),
style: mediaQuery.mdAndUp style: mediaQuery.mdAndUp
? textTheme.headlineSmall ? textTheme.headlineSmall
: textTheme.titleLarge, : textTheme.titleLarge,

View File

@ -4,9 +4,9 @@ import 'package:flutter_desktop_tools/flutter_desktop_tools.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/collections/env.dart'; import 'package:spotube/collections/env.dart';
import 'package:spotube/extensions/artist_simple.dart';
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart'; import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/utils/type_conversion_utils.dart';
class Discord extends ChangeNotifier { class Discord extends ChangeNotifier {
final DiscordRPC? discordRPC; final DiscordRPC? discordRPC;
@ -23,8 +23,7 @@ class Discord extends ChangeNotifier {
void updatePresence(Track track) { void updatePresence(Track track) {
clear(); clear();
final artistNames = final artistNames = track.artists?.asString() ?? "";
TypeConversionUtils.artists_X_String(track.artists ?? <Artist>[]);
discordRPC?.updatePresence( discordRPC?.updatePresence(
DiscordPresence( DiscordPresence(
details: "Song: ${track.name} by $artistNames", details: "Song: ${track.name} by $artistNames",

View File

@ -9,6 +9,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:metadata_god/metadata_god.dart'; import 'package:metadata_god/metadata_god.dart';
import 'package:path/path.dart'; import 'package:path/path.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/extensions/artist_simple.dart';
import 'package:spotube/extensions/image.dart'; import 'package:spotube/extensions/image.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
import 'package:spotube/services/download_manager/download_manager.dart'; import 'package:spotube/services/download_manager/download_manager.dart';
@ -137,7 +138,7 @@ class DownloadManagerProvider extends ChangeNotifier {
String getTrackFileUrl(Track track) { String getTrackFileUrl(Track track) {
final name = final name =
"${track.name} - ${TypeConversionUtils.artists_X_String(track.artists ?? <Artist>[])}.${downloadCodec.name}"; "${track.name} - ${track.artists?.asString() ?? ""}.${downloadCodec.name}";
return join(downloadDirectory, PrimitiveUtils.toSafeFileName(name)); return join(downloadDirectory, PrimitiveUtils.toSafeFileName(name));
} }

View File

@ -5,6 +5,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:scrobblenaut/scrobblenaut.dart'; import 'package:scrobblenaut/scrobblenaut.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/collections/env.dart'; import 'package:spotube/collections/env.dart';
import 'package:spotube/extensions/artist_simple.dart';
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart'; import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/utils/persisted_state_notifier.dart'; import 'package:spotube/utils/persisted_state_notifier.dart';
import 'package:spotube/utils/type_conversion_utils.dart'; import 'package:spotube/utils/type_conversion_utils.dart';
@ -85,14 +86,14 @@ class ScrobblerNotifier extends PersistedStateNotifier<ScrobblerState?> {
Future<void> love(Track track) async { Future<void> love(Track track) async {
await state?.scrobblenaut.track.love( await state?.scrobblenaut.track.love(
artist: TypeConversionUtils.artists_X_String(track.artists!), artist: track.artists!.asString(),
track: track.name!, track: track.name!,
); );
} }
Future<void> unlove(Track track) async { Future<void> unlove(Track track) async {
await state?.scrobblenaut.track.unLove( await state?.scrobblenaut.track.unLove(
artist: TypeConversionUtils.artists_X_String(track.artists!), artist: track.artists!.asString(),
track: track.name!, track: track.name!,
); );
} }

View File

@ -47,7 +47,7 @@ class AudioServices {
id: track.id!, id: track.id!,
album: track.album?.name ?? "", album: track.album?.name ?? "",
title: track.name!, title: track.name!,
artist: TypeConversionUtils.artists_X_String(track.artists ?? <Artist>[]), artist: track.artists?.toString() ?? "",
duration: track is SourcedTrack duration: track is SourcedTrack
? track.sourceInfo.duration ? track.sourceInfo.duration
: Duration(milliseconds: track.durationMs ?? 0), : Duration(milliseconds: track.durationMs ?? 0),

View File

@ -3,6 +3,7 @@ import 'dart:async';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:smtc_windows/smtc_windows.dart'; import 'package:smtc_windows/smtc_windows.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/extensions/artist_simple.dart';
import 'package:spotube/extensions/image.dart'; import 'package:spotube/extensions/image.dart';
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart'; import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/audio_player/audio_player.dart';
@ -85,8 +86,7 @@ class WindowsAudioService {
MusicMetadata( MusicMetadata(
title: track.name!, title: track.name!,
albumArtist: track.artists?.firstOrNull?.name ?? "Unknown", albumArtist: track.artists?.firstOrNull?.name ?? "Unknown",
artist: artist: track.artists?.asString() ?? "Unknown",
TypeConversionUtils.artists_X_String<Artist>(track.artists ?? []),
album: track.album?.name ?? "Unknown", album: track.album?.name ?? "Unknown",
thumbnail: (track.album?.images).asUrlString( thumbnail: (track.album?.images).asUrlString(
placeholder: ImagePlaceholder.albumArt, placeholder: ImagePlaceholder.albumArt,

View File

@ -17,10 +17,6 @@ enum ImagePlaceholder {
} }
abstract class TypeConversionUtils { abstract class TypeConversionUtils {
static String artists_X_String<T extends ArtistSimple>(List<T> artists) {
return artists.map((e) => e.name?.replaceAll(",", " ")).join(", ");
}
static Widget artists_X_ClickableArtists( static Widget artists_X_ClickableArtists(
List<ArtistSimple> artists, { List<ArtistSimple> artists, {
WrapCrossAlignment crossAxisAlignment = WrapCrossAlignment.center, WrapCrossAlignment crossAxisAlignment = WrapCrossAlignment.center,