mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 07:55:18 +00:00
refactor: use extension methods for simple album to album and simple track to track conversion
This commit is contained in:
parent
1a6cea926f
commit
9f96b5c537
@ -6,11 +6,11 @@ import 'package:spotube/components/shared/playbutton_card.dart';
|
|||||||
import 'package:spotube/extensions/artist_simple.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/extensions/track.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/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/service_utils.dart';
|
import 'package:spotube/utils/service_utils.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
extension FormattedAlbumType on AlbumType {
|
extension FormattedAlbumType on AlbumType {
|
||||||
String get formatted => name.replaceFirst(name[0], name[0].toUpperCase());
|
String get formatted => name.replaceFirst(name[0], name[0].toUpperCase());
|
||||||
@ -41,10 +41,7 @@ class AlbumCard extends HookConsumerWidget {
|
|||||||
|
|
||||||
Future<List<Track>> fetchAllTrack() async {
|
Future<List<Track>> fetchAllTrack() async {
|
||||||
if (album.tracks != null && album.tracks!.isNotEmpty) {
|
if (album.tracks != null && album.tracks!.isNotEmpty) {
|
||||||
return album.tracks!
|
return album.tracks!.map((track) => track.asTrack(album)).toList();
|
||||||
.map((track) =>
|
|
||||||
TypeConversionUtils.simpleTrack_X_Track(track, album))
|
|
||||||
.toList();
|
|
||||||
}
|
}
|
||||||
await ref.read(albumTracksProvider(album).future);
|
await ref.read(albumTracksProvider(album).future);
|
||||||
return ref.read(albumTracksProvider(album).notifier).fetchAll();
|
return ref.read(albumTracksProvider(album).notifier).fetchAll();
|
||||||
|
@ -11,7 +11,6 @@ import 'package:spotube/hooks/utils/use_breakpoint_value.dart';
|
|||||||
import 'package:spotube/hooks/utils/use_brightness_value.dart';
|
import 'package:spotube/hooks/utils/use_brightness_value.dart';
|
||||||
import 'package:spotube/provider/blacklist_provider.dart';
|
import 'package:spotube/provider/blacklist_provider.dart';
|
||||||
import 'package:spotube/utils/service_utils.dart';
|
import 'package:spotube/utils/service_utils.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class ArtistCard extends HookConsumerWidget {
|
class ArtistCard extends HookConsumerWidget {
|
||||||
final Artist artist;
|
final Artist artist;
|
||||||
|
@ -5,7 +5,6 @@ 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/extensions/image.dart';
|
import 'package:spotube/extensions/image.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class SimpleTrackTile extends HookWidget {
|
class SimpleTrackTile extends HookWidget {
|
||||||
final Track track;
|
final Track track;
|
||||||
|
@ -12,12 +12,11 @@ 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/fallbacks/anonymous_fallback.dart';
|
import 'package:spotube/components/shared/fallbacks/anonymous_fallback.dart';
|
||||||
import 'package:spotube/components/shared/waypoint.dart';
|
import 'package:spotube/components/shared/waypoint.dart';
|
||||||
|
import 'package:spotube/extensions/album_simple.dart';
|
||||||
import 'package:spotube/extensions/context.dart';
|
import 'package:spotube/extensions/context.dart';
|
||||||
import 'package:spotube/provider/authentication_provider.dart';
|
import 'package:spotube/provider/authentication_provider.dart';
|
||||||
import 'package:spotube/provider/spotify/spotify.dart';
|
import 'package:spotube/provider/spotify/spotify.dart';
|
||||||
|
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class UserAlbums extends HookConsumerWidget {
|
class UserAlbums extends HookConsumerWidget {
|
||||||
const UserAlbums({super.key});
|
const UserAlbums({super.key});
|
||||||
|
|
||||||
@ -99,10 +98,7 @@ class UserAlbums extends HookConsumerWidget {
|
|||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [NotFound()],
|
children: [NotFound()],
|
||||||
),
|
),
|
||||||
for (final album in albums)
|
for (final album in albums) AlbumCard(album.toAlbum()),
|
||||||
AlbumCard(
|
|
||||||
TypeConversionUtils.simpleAlbum_X_Album(album),
|
|
||||||
),
|
|
||||||
if (albums.isNotEmpty &&
|
if (albums.isNotEmpty &&
|
||||||
albumsQuery.asData?.value.hasMore == true)
|
albumsQuery.asData?.value.hasMore == true)
|
||||||
Skeletonizer(
|
Skeletonizer(
|
||||||
|
@ -10,7 +10,6 @@ import 'package:spotube/extensions/image.dart';
|
|||||||
import 'package:spotube/provider/download_manager_provider.dart';
|
import 'package:spotube/provider/download_manager_provider.dart';
|
||||||
import 'package:spotube/services/download_manager/download_status.dart';
|
import 'package:spotube/services/download_manager/download_status.dart';
|
||||||
import 'package:spotube/services/sourced_track/sourced_track.dart';
|
import 'package:spotube/services/sourced_track/sourced_track.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class DownloadItem extends HookConsumerWidget {
|
class DownloadItem extends HookConsumerWidget {
|
||||||
final Track track;
|
final Track track;
|
||||||
|
@ -23,11 +23,11 @@ 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/artist_simple.dart';
|
||||||
import 'package:spotube/extensions/context.dart';
|
import 'package:spotube/extensions/context.dart';
|
||||||
|
import 'package:spotube/extensions/track.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';
|
||||||
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
|
import 'package:spotube/provider/user_preferences/user_preferences_provider.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:flutter_rust_bridge/flutter_rust_bridge.dart' show FfiException;
|
import 'package:flutter_rust_bridge/flutter_rust_bridge.dart' show FfiException;
|
||||||
|
|
||||||
const supportedAudioTypes = [
|
const supportedAudioTypes = [
|
||||||
@ -112,7 +112,7 @@ final localTracksProvider = FutureProvider<List<LocalTrack>>((ref) async {
|
|||||||
final tracks = filesWithMetadata
|
final tracks = filesWithMetadata
|
||||||
.map(
|
.map(
|
||||||
(fileWithMetadata) => LocalTrack.fromTrack(
|
(fileWithMetadata) => LocalTrack.fromTrack(
|
||||||
track: TypeConversionUtils.localTrack_X_Track(
|
track: Track().fromFile(
|
||||||
fileWithMetadata["file"],
|
fileWithMetadata["file"],
|
||||||
metadata: fileWithMetadata["metadata"],
|
metadata: fileWithMetadata["metadata"],
|
||||||
art: fileWithMetadata["art"],
|
art: fileWithMetadata["art"],
|
||||||
|
@ -27,7 +27,7 @@ import 'package:spotube/pages/lyrics/lyrics.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/services/sourced_track/sources/youtube.dart';
|
import 'package:spotube/services/sourced_track/sources/youtube.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
import 'package:url_launcher/url_launcher_string.dart';
|
import 'package:url_launcher/url_launcher_string.dart';
|
||||||
|
|
||||||
class PlayerView extends HookConsumerWidget {
|
class PlayerView extends HookConsumerWidget {
|
||||||
|
@ -10,7 +10,6 @@ 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';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class PlayerTrackDetails extends HookConsumerWidget {
|
class PlayerTrackDetails extends HookConsumerWidget {
|
||||||
final String? albumArt;
|
final String? albumArt;
|
||||||
|
@ -25,7 +25,6 @@ import 'package:spotube/services/sourced_track/sources/jiosaavn.dart';
|
|||||||
import 'package:spotube/services/sourced_track/sources/piped.dart';
|
import 'package:spotube/services/sourced_track/sources/piped.dart';
|
||||||
import 'package:spotube/services/sourced_track/sources/youtube.dart';
|
import 'package:spotube/services/sourced_track/sources/youtube.dart';
|
||||||
import 'package:spotube/utils/service_utils.dart';
|
import 'package:spotube/utils/service_utils.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
final sourceInfoToIconMap = {
|
final sourceInfoToIconMap = {
|
||||||
YoutubeSourceInfo: const Icon(SpotubeIcons.youtube, color: Color(0xFFFF0000)),
|
YoutubeSourceInfo: const Icon(SpotubeIcons.youtube, color: Color(0xFFFF0000)),
|
||||||
|
@ -8,7 +8,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/service_utils.dart';
|
import 'package:spotube/utils/service_utils.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class PlaylistCard extends HookConsumerWidget {
|
class PlaylistCard extends HookConsumerWidget {
|
||||||
final PlaylistSimple playlist;
|
final PlaylistSimple playlist;
|
||||||
|
@ -17,7 +17,6 @@ import 'package:spotube/extensions/context.dart';
|
|||||||
import 'package:spotube/extensions/image.dart';
|
import 'package:spotube/extensions/image.dart';
|
||||||
import 'package:spotube/provider/spotify/spotify.dart';
|
import 'package:spotube/provider/spotify/spotify.dart';
|
||||||
import 'package:spotube/provider/spotify_provider.dart';
|
import 'package:spotube/provider/spotify_provider.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class PlaylistCreateDialog extends HookConsumerWidget {
|
class PlaylistCreateDialog extends HookConsumerWidget {
|
||||||
/// Track ids to add to the playlist
|
/// Track ids to add to the playlist
|
||||||
|
@ -23,7 +23,6 @@ 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/provider/user_preferences/user_preferences_state.dart';
|
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
|
||||||
import 'package:spotube/utils/platform.dart';
|
import 'package:spotube/utils/platform.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class BottomPlayer extends HookConsumerWidget {
|
class BottomPlayer extends HookConsumerWidget {
|
||||||
BottomPlayer({super.key});
|
BottomPlayer({super.key});
|
||||||
|
@ -21,7 +21,6 @@ import 'package:spotube/provider/spotify/spotify.dart';
|
|||||||
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
|
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
|
||||||
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
|
import 'package:spotube/provider/user_preferences/user_preferences_state.dart';
|
||||||
import 'package:spotube/utils/platform.dart';
|
import 'package:spotube/utils/platform.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class Sidebar extends HookConsumerWidget {
|
class Sidebar extends HookConsumerWidget {
|
||||||
final int? selectedIndex;
|
final int? selectedIndex;
|
||||||
|
@ -9,7 +9,6 @@ import 'package:spotube/components/shared/image/universal_image.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/spotify/spotify.dart';
|
import 'package:spotube/provider/spotify/spotify.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class PlaylistAddTrackDialog extends HookConsumerWidget {
|
class PlaylistAddTrackDialog extends HookConsumerWidget {
|
||||||
/// The id of the playlist this dialog was opened from
|
/// The id of the playlist this dialog was opened from
|
||||||
|
@ -26,7 +26,7 @@ import 'package:spotube/provider/download_manager_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/spotify/spotify.dart';
|
import 'package:spotube/provider/spotify/spotify.dart';
|
||||||
import 'package:spotube/provider/spotify_provider.dart';
|
import 'package:spotube/provider/spotify_provider.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
import 'package:url_launcher/url_launcher_string.dart';
|
import 'package:url_launcher/url_launcher_string.dart';
|
||||||
|
|
||||||
enum TrackOptionValue {
|
enum TrackOptionValue {
|
||||||
|
@ -19,7 +19,6 @@ import 'package:spotube/extensions/image.dart';
|
|||||||
import 'package:spotube/models/local_track.dart';
|
import 'package:spotube/models/local_track.dart';
|
||||||
import 'package:spotube/provider/blacklist_provider.dart';
|
import 'package:spotube/provider/blacklist_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/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class TrackTile extends HookConsumerWidget {
|
class TrackTile extends HookConsumerWidget {
|
||||||
/// [index] will not be shown if null
|
/// [index] will not be shown if null
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import 'package:spotify/spotify.dart';
|
import 'package:spotify/spotify.dart';
|
||||||
|
|
||||||
extension AlbumJson on AlbumSimple {
|
extension AlbumExtensions on AlbumSimple {
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
return {
|
return {
|
||||||
"albumType": albumType?.name,
|
"albumType": albumType?.name,
|
||||||
@ -15,4 +15,22 @@ extension AlbumJson on AlbumSimple {
|
|||||||
.toList(),
|
.toList(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Album toAlbum() {
|
||||||
|
Album album = Album();
|
||||||
|
album.albumType = albumType;
|
||||||
|
album.artists = artists;
|
||||||
|
album.availableMarkets = availableMarkets;
|
||||||
|
album.externalUrls = externalUrls;
|
||||||
|
album.href = href;
|
||||||
|
album.id = id;
|
||||||
|
album.images = images;
|
||||||
|
album.name = name;
|
||||||
|
album.releaseDate = releaseDate;
|
||||||
|
album.releaseDatePrecision = releaseDatePrecision;
|
||||||
|
album.tracks = tracks;
|
||||||
|
album.type = type;
|
||||||
|
album.uri = uri;
|
||||||
|
return album;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,15 @@
|
|||||||
import 'package:spotify/spotify.dart';
|
import 'package:spotify/spotify.dart';
|
||||||
import 'package:spotube/collections/assets.gen.dart';
|
import 'package:spotube/collections/assets.gen.dart';
|
||||||
import 'package:spotube/utils/primitive_utils.dart';
|
import 'package:spotube/utils/primitive_utils.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
|
|
||||||
|
enum ImagePlaceholder {
|
||||||
|
albumArt,
|
||||||
|
artist,
|
||||||
|
collection,
|
||||||
|
online,
|
||||||
|
}
|
||||||
|
|
||||||
extension SpotifyImageExtensions on List<Image>? {
|
extension SpotifyImageExtensions on List<Image>? {
|
||||||
String asUrlString({
|
String asUrlString({
|
||||||
int index = 1,
|
int index = 1,
|
||||||
|
@ -1,10 +1,46 @@
|
|||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:metadata_god/metadata_god.dart';
|
||||||
|
import 'package:path/path.dart';
|
||||||
import 'package:spotify/spotify.dart';
|
import 'package:spotify/spotify.dart';
|
||||||
import 'package:spotube/extensions/album_simple.dart';
|
import 'package:spotube/extensions/album_simple.dart';
|
||||||
import 'package:spotube/extensions/artist_simple.dart';
|
import 'package:spotube/extensions/artist_simple.dart';
|
||||||
|
|
||||||
extension TrackJson on Track {
|
extension TrackExtensions on Track {
|
||||||
|
Track fromFile(
|
||||||
|
File file, {
|
||||||
|
Metadata? metadata,
|
||||||
|
String? art,
|
||||||
|
}) {
|
||||||
|
album = Album()
|
||||||
|
..name = metadata?.album ?? "Unknown"
|
||||||
|
..images = [if (art != null) Image()..url = art]
|
||||||
|
..genres = [if (metadata?.genre != null) metadata!.genre!]
|
||||||
|
..artists = [
|
||||||
|
Artist()
|
||||||
|
..name = metadata?.albumArtist ?? "Unknown"
|
||||||
|
..id = metadata?.albumArtist ?? "Unknown"
|
||||||
|
..type = "artist",
|
||||||
|
]
|
||||||
|
..id = metadata?.album
|
||||||
|
..releaseDate = metadata?.year?.toString();
|
||||||
|
artists = [
|
||||||
|
Artist()
|
||||||
|
..name = metadata?.artist ?? "Unknown"
|
||||||
|
..id = metadata?.artist ?? "Unknown"
|
||||||
|
];
|
||||||
|
|
||||||
|
id = metadata?.title ?? basenameWithoutExtension(file.path);
|
||||||
|
name = metadata?.title ?? basenameWithoutExtension(file.path);
|
||||||
|
type = "track";
|
||||||
|
uri = file.path;
|
||||||
|
durationMs = (metadata?.durationMs?.toInt() ?? 0);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
return TrackJson.trackToJson(this);
|
return TrackExtensions.trackToJson(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Map<String, dynamic> trackToJson(Track track) {
|
static Map<String, dynamic> trackToJson(Track track) {
|
||||||
@ -30,3 +66,27 @@ extension TrackJson on Track {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension TrackSimpleExtensions on TrackSimple {
|
||||||
|
Track asTrack(AlbumSimple album) {
|
||||||
|
Track track = Track();
|
||||||
|
track.name = name;
|
||||||
|
track.album = album;
|
||||||
|
track.artists = artists;
|
||||||
|
track.availableMarkets = availableMarkets;
|
||||||
|
track.discNumber = discNumber;
|
||||||
|
track.durationMs = durationMs;
|
||||||
|
track.explicit = explicit;
|
||||||
|
track.externalUrls = externalUrls;
|
||||||
|
track.href = href;
|
||||||
|
track.id = id;
|
||||||
|
track.isPlayable = isPlayable;
|
||||||
|
track.linkedFrom = linkedFrom;
|
||||||
|
track.name = name;
|
||||||
|
track.previewUrl = previewUrl;
|
||||||
|
track.trackNumber = trackNumber;
|
||||||
|
track.type = type;
|
||||||
|
track.uri = uri;
|
||||||
|
return track;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -37,7 +37,7 @@ class LocalTrack extends Track {
|
|||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
return {
|
return {
|
||||||
...TrackJson.trackToJson(this),
|
...TrackExtensions.trackToJson(this),
|
||||||
'path': path,
|
'path': path,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,6 @@ import 'package:spotube/components/shared/tracks_view/track_view_props.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/spotify/spotify.dart';
|
import 'package:spotube/provider/spotify/spotify.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class AlbumPage extends HookConsumerWidget {
|
class AlbumPage extends HookConsumerWidget {
|
||||||
final AlbumSimple album;
|
final AlbumSimple album;
|
||||||
|
@ -7,7 +7,7 @@ import 'package:spotube/components/shared/image/universal_image.dart';
|
|||||||
import 'package:spotube/extensions/constrains.dart';
|
import 'package:spotube/extensions/constrains.dart';
|
||||||
import 'package:spotube/extensions/image.dart';
|
import 'package:spotube/extensions/image.dart';
|
||||||
import 'package:spotube/provider/spotify/spotify.dart';
|
import 'package:spotube/provider/spotify/spotify.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
import 'package:url_launcher/url_launcher_string.dart';
|
import 'package:url_launcher/url_launcher_string.dart';
|
||||||
|
|
||||||
class ArtistPageFooter extends ConsumerWidget {
|
class ArtistPageFooter extends ConsumerWidget {
|
||||||
|
@ -14,7 +14,6 @@ import 'package:spotube/provider/authentication_provider.dart';
|
|||||||
import 'package:spotube/provider/blacklist_provider.dart';
|
import 'package:spotube/provider/blacklist_provider.dart';
|
||||||
import 'package:spotube/provider/spotify/spotify.dart';
|
import 'package:spotube/provider/spotify/spotify.dart';
|
||||||
import 'package:spotube/utils/primitive_utils.dart';
|
import 'package:spotube/utils/primitive_utils.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class ArtistPageHeader extends HookConsumerWidget {
|
class ArtistPageHeader extends HookConsumerWidget {
|
||||||
final String artistId;
|
final String artistId;
|
||||||
|
@ -20,7 +20,6 @@ import 'package:spotube/models/spotify/recommendation_seeds.dart';
|
|||||||
import 'package:spotube/provider/spotify/spotify.dart';
|
import 'package:spotube/provider/spotify/spotify.dart';
|
||||||
import 'package:spotube/provider/spotify_provider.dart';
|
import 'package:spotube/provider/spotify_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';
|
|
||||||
|
|
||||||
const RecommendationAttribute zeroValues = (min: 0, target: 0, max: 0);
|
const RecommendationAttribute zeroValues = (min: 0, target: 0, max: 0);
|
||||||
|
|
||||||
|
@ -19,7 +19,6 @@ import 'package:spotube/pages/lyrics/synced_lyrics.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/utils/platform.dart';
|
import 'package:spotube/utils/platform.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class LyricsPage extends HookConsumerWidget {
|
class LyricsPage extends HookConsumerWidget {
|
||||||
final bool isModal;
|
final bool isModal;
|
||||||
|
@ -15,8 +15,6 @@ import 'package:spotube/extensions/context.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/spotify/spotify.dart';
|
import 'package:spotube/provider/spotify/spotify.dart';
|
||||||
|
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class PlainLyrics extends HookConsumerWidget {
|
class PlainLyrics extends HookConsumerWidget {
|
||||||
final PaletteColor palette;
|
final PaletteColor palette;
|
||||||
final bool? isModal;
|
final bool? isModal;
|
||||||
|
@ -8,7 +8,6 @@ import 'package:spotube/components/shared/tracks_view/track_view_props.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/spotify/spotify.dart';
|
import 'package:spotube/provider/spotify/spotify.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class PlaylistPage extends HookConsumerWidget {
|
class PlaylistPage extends HookConsumerWidget {
|
||||||
final PlaylistSimple playlist;
|
final PlaylistSimple playlist;
|
||||||
|
@ -4,9 +4,9 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|||||||
|
|
||||||
import 'package:spotify/spotify.dart';
|
import 'package:spotify/spotify.dart';
|
||||||
import 'package:spotube/components/shared/horizontal_playbutton_card_view/horizontal_playbutton_card_view.dart';
|
import 'package:spotube/components/shared/horizontal_playbutton_card_view/horizontal_playbutton_card_view.dart';
|
||||||
|
import 'package:spotube/extensions/album_simple.dart';
|
||||||
import 'package:spotube/extensions/context.dart';
|
import 'package:spotube/extensions/context.dart';
|
||||||
import 'package:spotube/provider/spotify/spotify.dart';
|
import 'package:spotube/provider/spotify/spotify.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class SearchAlbumsSection extends HookConsumerWidget {
|
class SearchAlbumsSection extends HookConsumerWidget {
|
||||||
const SearchAlbumsSection({
|
const SearchAlbumsSection({
|
||||||
@ -21,7 +21,7 @@ class SearchAlbumsSection extends HookConsumerWidget {
|
|||||||
() =>
|
() =>
|
||||||
query.asData?.value.items
|
query.asData?.value.items
|
||||||
.cast<AlbumSimple>()
|
.cast<AlbumSimple>()
|
||||||
.map(TypeConversionUtils.simpleAlbum_X_Album)
|
.map((e) => e.toAlbum())
|
||||||
.toList() ??
|
.toList() ??
|
||||||
[],
|
[],
|
||||||
[query.value],
|
[query.value],
|
||||||
|
@ -17,7 +17,7 @@ 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/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:spotube/extensions/constrains.dart';
|
import 'package:spotube/extensions/constrains.dart';
|
||||||
|
|
||||||
class TrackPage extends HookConsumerWidget {
|
class TrackPage extends HookConsumerWidget {
|
||||||
|
@ -16,7 +16,6 @@ import 'package:spotube/services/download_manager/download_manager.dart';
|
|||||||
import 'package:spotube/services/sourced_track/enums.dart';
|
import 'package:spotube/services/sourced_track/enums.dart';
|
||||||
import 'package:spotube/services/sourced_track/sourced_track.dart';
|
import 'package:spotube/services/sourced_track/sourced_track.dart';
|
||||||
import 'package:spotube/utils/primitive_utils.dart';
|
import 'package:spotube/utils/primitive_utils.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class DownloadManagerProvider extends ChangeNotifier {
|
class DownloadManagerProvider extends ChangeNotifier {
|
||||||
DownloadManagerProvider({required this.ref})
|
DownloadManagerProvider({required this.ref})
|
||||||
|
@ -33,7 +33,6 @@ import 'package:spotube/services/sourced_track/sources/piped.dart';
|
|||||||
import 'package:spotube/services/sourced_track/sources/youtube.dart';
|
import 'package:spotube/services/sourced_track/sources/youtube.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';
|
|
||||||
|
|
||||||
/// Things implemented:
|
/// Things implemented:
|
||||||
/// * [x] Sponsor-Block skip
|
/// * [x] Sponsor-Block skip
|
||||||
|
@ -8,7 +8,6 @@ import 'package:spotube/collections/env.dart';
|
|||||||
import 'package:spotube/extensions/artist_simple.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';
|
|
||||||
|
|
||||||
class ScrobblerState {
|
class ScrobblerState {
|
||||||
final String username;
|
final String username;
|
||||||
|
@ -36,10 +36,7 @@ class AlbumReleasesNotifier
|
|||||||
.newReleases(country: market)
|
.newReleases(country: market)
|
||||||
.getPage(limit, offset);
|
.getPage(limit, offset);
|
||||||
|
|
||||||
return albums.items
|
return albums.items?.map((album) => album.toAlbum()).toList() ?? [];
|
||||||
?.map(TypeConversionUtils.simpleAlbum_X_Album)
|
|
||||||
.toList() ??
|
|
||||||
[];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -31,10 +31,7 @@ class AlbumTracksNotifier extends AutoDisposeFamilyPaginatedAsyncNotifier<Track,
|
|||||||
@override
|
@override
|
||||||
fetch(arg, offset, limit) async {
|
fetch(arg, offset, limit) async {
|
||||||
final tracks = await spotify.albums.tracks(arg.id!).getPage(limit, offset);
|
final tracks = await spotify.albums.tracks(arg.id!).getPage(limit, offset);
|
||||||
return tracks.items
|
return tracks.items?.map((e) => e.asTrack(arg)).toList() ?? [];
|
||||||
?.map((e) => TypeConversionUtils.simpleTrack_X_Track(e, arg))
|
|
||||||
.toList() ??
|
|
||||||
[];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -12,6 +12,7 @@ import 'package:spotify/spotify.dart';
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
// ignore: depend_on_referenced_packages, implementation_imports
|
// ignore: depend_on_referenced_packages, implementation_imports
|
||||||
import 'package:riverpod/src/async_notifier.dart';
|
import 'package:riverpod/src/async_notifier.dart';
|
||||||
|
import 'package:spotube/extensions/album_simple.dart';
|
||||||
import 'package:spotube/extensions/map.dart';
|
import 'package:spotube/extensions/map.dart';
|
||||||
import 'package:spotube/extensions/track.dart';
|
import 'package:spotube/extensions/track.dart';
|
||||||
import 'package:spotube/models/lyrics.dart';
|
import 'package:spotube/models/lyrics.dart';
|
||||||
@ -23,7 +24,7 @@ import 'package:spotube/provider/user_preferences/user_preferences_provider.dart
|
|||||||
import 'package:spotube/services/wikipedia/wikipedia.dart';
|
import 'package:spotube/services/wikipedia/wikipedia.dart';
|
||||||
import 'package:spotube/utils/persisted_state_notifier.dart';
|
import 'package:spotube/utils/persisted_state_notifier.dart';
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
import 'package:wikipedia_api/wikipedia_api.dart';
|
import 'package:wikipedia_api/wikipedia_api.dart';
|
||||||
|
|
||||||
part 'album/favorite.dart';
|
part 'album/favorite.dart';
|
||||||
|
@ -7,7 +7,6 @@ import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
|
|||||||
import 'package:spotube/services/audio_services/mobile_audio_service.dart';
|
import 'package:spotube/services/audio_services/mobile_audio_service.dart';
|
||||||
import 'package:spotube/services/audio_services/windows_audio_service.dart';
|
import 'package:spotube/services/audio_services/windows_audio_service.dart';
|
||||||
import 'package:spotube/services/sourced_track/sourced_track.dart';
|
import 'package:spotube/services/sourced_track/sourced_track.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class AudioServices {
|
class AudioServices {
|
||||||
final MobileAudioService? mobile;
|
final MobileAudioService? mobile;
|
||||||
|
@ -9,7 +9,6 @@ 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';
|
||||||
import 'package:spotube/services/audio_player/loop_mode.dart';
|
import 'package:spotube/services/audio_player/loop_mode.dart';
|
||||||
import 'package:spotube/services/sourced_track/sourced_track.dart';
|
import 'package:spotube/services/sourced_track/sourced_track.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
final dbus = DBusClient.session();
|
final dbus = DBusClient.session();
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@ 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';
|
||||||
import 'package:spotube/services/audio_player/playback_state.dart';
|
import 'package:spotube/services/audio_player/playback_state.dart';
|
||||||
import 'package:spotube/utils/type_conversion_utils.dart';
|
|
||||||
|
|
||||||
class WindowsAudioService {
|
class WindowsAudioService {
|
||||||
final SMTCWindows smtc;
|
final SMTCWindows smtc;
|
||||||
|
@ -1,89 +0,0 @@
|
|||||||
// ignore_for_file: non_constant_identifier_names
|
|
||||||
|
|
||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:metadata_god/metadata_god.dart';
|
|
||||||
import 'package:path/path.dart';
|
|
||||||
import 'package:spotify/spotify.dart';
|
|
||||||
|
|
||||||
enum ImagePlaceholder {
|
|
||||||
albumArt,
|
|
||||||
artist,
|
|
||||||
collection,
|
|
||||||
online,
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class TypeConversionUtils {
|
|
||||||
static Album simpleAlbum_X_Album(AlbumSimple albumSimple) {
|
|
||||||
Album album = Album();
|
|
||||||
album.albumType = albumSimple.albumType;
|
|
||||||
album.artists = albumSimple.artists;
|
|
||||||
album.availableMarkets = albumSimple.availableMarkets;
|
|
||||||
album.externalUrls = albumSimple.externalUrls;
|
|
||||||
album.href = albumSimple.href;
|
|
||||||
album.id = albumSimple.id;
|
|
||||||
album.images = albumSimple.images;
|
|
||||||
album.name = albumSimple.name;
|
|
||||||
album.releaseDate = albumSimple.releaseDate;
|
|
||||||
album.releaseDatePrecision = albumSimple.releaseDatePrecision;
|
|
||||||
album.tracks = albumSimple.tracks;
|
|
||||||
album.type = albumSimple.type;
|
|
||||||
album.uri = albumSimple.uri;
|
|
||||||
return album;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Track simpleTrack_X_Track(TrackSimple trackSmp, AlbumSimple album) {
|
|
||||||
Track track = Track();
|
|
||||||
track.name = trackSmp.name;
|
|
||||||
track.album = album;
|
|
||||||
track.artists = trackSmp.artists;
|
|
||||||
track.availableMarkets = trackSmp.availableMarkets;
|
|
||||||
track.discNumber = trackSmp.discNumber;
|
|
||||||
track.durationMs = trackSmp.durationMs;
|
|
||||||
track.explicit = trackSmp.explicit;
|
|
||||||
track.externalUrls = trackSmp.externalUrls;
|
|
||||||
track.href = trackSmp.href;
|
|
||||||
track.id = trackSmp.id;
|
|
||||||
track.isPlayable = trackSmp.isPlayable;
|
|
||||||
track.linkedFrom = trackSmp.linkedFrom;
|
|
||||||
track.name = trackSmp.name;
|
|
||||||
track.previewUrl = trackSmp.previewUrl;
|
|
||||||
track.trackNumber = trackSmp.trackNumber;
|
|
||||||
track.type = trackSmp.type;
|
|
||||||
track.uri = trackSmp.uri;
|
|
||||||
return track;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Track localTrack_X_Track(
|
|
||||||
File file, {
|
|
||||||
Metadata? metadata,
|
|
||||||
String? art,
|
|
||||||
}) {
|
|
||||||
final track = Track();
|
|
||||||
track.album = Album()
|
|
||||||
..name = metadata?.album ?? "Unknown"
|
|
||||||
..images = [if (art != null) Image()..url = art]
|
|
||||||
..genres = [if (metadata?.genre != null) metadata!.genre!]
|
|
||||||
..artists = [
|
|
||||||
Artist()
|
|
||||||
..name = metadata?.albumArtist ?? "Unknown"
|
|
||||||
..id = metadata?.albumArtist ?? "Unknown"
|
|
||||||
..type = "artist",
|
|
||||||
]
|
|
||||||
..id = metadata?.album
|
|
||||||
..releaseDate = metadata?.year?.toString();
|
|
||||||
track.artists = [
|
|
||||||
Artist()
|
|
||||||
..name = metadata?.artist ?? "Unknown"
|
|
||||||
..id = metadata?.artist ?? "Unknown"
|
|
||||||
];
|
|
||||||
|
|
||||||
track.id = metadata?.title ?? basenameWithoutExtension(file.path);
|
|
||||||
track.name = metadata?.title ?? basenameWithoutExtension(file.path);
|
|
||||||
track.type = "track";
|
|
||||||
track.uri = file.path;
|
|
||||||
track.durationMs = (metadata?.durationMs?.toInt() ?? 0);
|
|
||||||
|
|
||||||
return track;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user