From 5add53e269d807366ae8e9142266645c509064b5 Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sat, 16 Aug 2025 16:11:04 +0600 Subject: [PATCH] fix: local track not working and images of local not showing up --- lib/components/track_tile/track_tile.dart | 1 + lib/models/metadata/track.dart | 8 +++++ lib/models/playback/track_sources.dart | 3 +- .../audio_player/querying_track_info.dart | 7 +++- lib/provider/glance/glance.dart | 15 ++++---- .../local_tracks/local_tracks_provider.dart | 18 ++++++---- pubspec.lock | 35 ++++++++++--------- pubspec.yaml | 15 ++++++-- 8 files changed, 69 insertions(+), 33 deletions(-) diff --git a/lib/components/track_tile/track_tile.dart b/lib/components/track_tile/track_tile.dart index 955ac90d..0cdc3b35 100644 --- a/lib/components/track_tile/track_tile.dart +++ b/lib/components/track_tile/track_tile.dart @@ -74,6 +74,7 @@ class TrackTile extends HookConsumerWidget { final isSelected = isPlaying || isLoading.value; + print('track.album.images: ${track.album.images}'); final imageProvider = useMemoized( () => UniversalImage.imageProvider( (track.album.images).smallest(ImagePlaceholder.albumArt), diff --git a/lib/models/metadata/track.dart b/lib/models/metadata/track.dart index 84af429a..e62a54c2 100644 --- a/lib/models/metadata/track.dart +++ b/lib/models/metadata/track.dart @@ -60,6 +60,14 @@ class SpotubeTrackObject with _$SpotubeTrackObject { ], releaseDate: metadata?.year != null ? "${metadata!.year}-01-01" : "1970-01-01", + images: [ + if (art != null) + SpotubeImageObject( + url: art, + width: 300, + height: 300, + ), + ], ), durationMs: metadata?.durationMs?.toInt() ?? 0, path: file.path, diff --git a/lib/models/playback/track_sources.dart b/lib/models/playback/track_sources.dart index 6900e323..a1acf562 100644 --- a/lib/models/playback/track_sources.dart +++ b/lib/models/playback/track_sources.dart @@ -39,8 +39,9 @@ class TrackSourceQuery with _$TrackSourceQuery { /// Parses [SpotubeMedia]'s [uri] property to create a [TrackSourceQuery]. factory TrackSourceQuery.parseUri(String url) { final uri = Uri.parse(url); + final isLocal = uri.queryParameters.isEmpty; return TrackSourceQuery( - id: uri.pathSegments.last, + id: isLocal ? uri.path : uri.pathSegments.last, title: uri.queryParameters['title'] ?? '', artists: uri.queryParameters['artists']?.split(',') ?? [], album: uri.queryParameters['album'] ?? '', diff --git a/lib/provider/audio_player/querying_track_info.dart b/lib/provider/audio_player/querying_track_info.dart index d7e271ae..ce99b261 100644 --- a/lib/provider/audio_player/querying_track_info.dart +++ b/lib/provider/audio_player/querying_track_info.dart @@ -11,10 +11,15 @@ final queryingTrackInfoProvider = Provider((ref) { return false; } + if (audioPlayer.activeTrack is! SpotubeFullTrackObject) { + return false; + } + return ref .watch(trackSourcesProvider( TrackSourceQuery.fromTrack( - audioPlayer.activeTrack! as SpotubeFullTrackObject), + audioPlayer.activeTrack! as SpotubeFullTrackObject, + ), )) .isLoading; }); diff --git a/lib/provider/glance/glance.dart b/lib/provider/glance/glance.dart index 8afeda11..e781b85a 100644 --- a/lib/provider/glance/glance.dart +++ b/lib/provider/glance/glance.dart @@ -80,17 +80,20 @@ Future _sendActiveTrack(SpotubeTrackObject? track) async { final jsonTrack = track.toJson(); - final image = track.album?.images.first; - final cachedImage = await DefaultCacheManager().getSingleFile(image!.url); + final image = track.album.images.firstOrNull; + final cachedImage = image == null + ? null + : await DefaultCacheManager().getSingleFile(image.url); final data = { ...jsonTrack, "album": { ...jsonTrack["album"], "images": [ - { - ...image.toJson(), - "path": cachedImage.path, - } + if (cachedImage != null && image != null) + { + ...image.toJson(), + "path": cachedImage.path, + } ] } }; diff --git a/lib/provider/local_tracks/local_tracks_provider.dart b/lib/provider/local_tracks/local_tracks_provider.dart index 89ea6d57..8d44b607 100644 --- a/lib/provider/local_tracks/local_tracks_provider.dart +++ b/lib/provider/local_tracks/local_tracks_provider.dart @@ -35,6 +35,12 @@ const imgMimeToExt = { "image/gif": ".gif", }; +typedef MetadataFile = ({ + Metadata? metadata, + File file, + String? art, +}); + final localTracksProvider = FutureProvider>>((ref) async { try { @@ -89,7 +95,7 @@ final localTracksProvider = } } - final List> filesWithMetadata = await Future.wait( + final List filesWithMetadata = await Future.wait( entities.map((file) async { try { final metadata = await MetadataGod.readMetadata(file: file.path); @@ -111,10 +117,10 @@ final localTracksProvider = ); } - return {"metadata": metadata, "file": file, "art": imageFile.path}; + return (metadata: metadata, file: file, art: imageFile.path); } catch (e, stack) { if (e case FrbException() || TimeoutException()) { - return {"file": file}; + return (file: file, metadata: null, art: null); } AppLogger.reportError(e, stack); return null; @@ -125,9 +131,9 @@ final localTracksProvider = final tracksFromMetadata = filesWithMetadata .map( (fileWithMetadata) => SpotubeTrackObject.localTrackFromFile( - fileWithMetadata["file"] as File, - metadata: fileWithMetadata["metadata"] as Metadata?, - art: fileWithMetadata["art"] as String?, + fileWithMetadata.file, + metadata: fileWithMetadata.metadata, + art: fileWithMetadata.art, ) as SpotubeLocalTrackObject, ) .toList(); diff --git a/pubspec.lock b/pubspec.lock index f1c65465..5ca1126b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -670,10 +670,10 @@ packages: dependency: transitive description: name: ffi - sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" file: dependency: transitive description: @@ -795,10 +795,11 @@ packages: flutter_discord_rpc: dependency: "direct main" description: - name: flutter_discord_rpc - sha256: "9363a803863d56fd89c0a21639c70b126245fcbafaeb0a3d091e7ac06951d03f" - url: "https://pub.dev" - source: hosted + path: "packages/flutter_discord_rpc" + ref: HEAD + resolved-ref: "4896f78d32eab4d2508e914ad80a9537f035e407" + url: "https://github.com/KRTirtho/frb_plugins.git" + source: git version: "1.0.0" flutter_displaymode: dependency: "direct main" @@ -983,10 +984,10 @@ packages: dependency: transitive description: name: flutter_rust_bridge - sha256: "0ad5079de35d317650fec59b26cb4d0c116ebc2ce703a29f9367513b8a91c287" + sha256: "37ef40bc6f863652e865f0b2563ea07f0d3c58d8efad803cc01933a4b2ee067e" url: "https://pub.dev" source: hosted - version: "2.5.0" + version: "2.11.1" flutter_secure_storage: dependency: "direct main" description: @@ -1638,10 +1639,11 @@ packages: metadata_god: dependency: "direct main" description: - name: metadata_god - sha256: "025d8149059f62f44108ab9d74ebd77aa8f0af98b238f3f25121a4711ee3e5d0" - url: "https://pub.dev" - source: hosted + path: "packages/metadata_god" + ref: HEAD + resolved-ref: "4896f78d32eab4d2508e914ad80a9537f035e407" + url: "https://github.com/KRTirtho/frb_plugins.git" + source: git version: "1.0.0" mime: dependency: "direct main" @@ -2260,10 +2262,11 @@ packages: smtc_windows: dependency: "direct main" description: - name: smtc_windows - sha256: "80f7c10867da485ffdf87f842bf27e6763589933c18c11af5dc1cd1e158c3154" - url: "https://pub.dev" - source: hosted + path: "packages/smtc_windows" + ref: HEAD + resolved-ref: "4896f78d32eab4d2508e914ad80a9537f035e407" + url: "https://github.com/KRTirtho/frb_plugins.git" + source: git version: "1.0.0" source_gen: dependency: transitive diff --git a/pubspec.yaml b/pubspec.yaml index 4ce97201..56523591 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -52,7 +52,10 @@ dependencies: url: https://github.com/KRTirtho/flutter_broadcasts.git ref: 63931dfe06733d4fb7452e9981e1f0b23414d97a flutter_cache_manager: ^3.3.0 - flutter_discord_rpc: ^1.0.0 + flutter_discord_rpc: + git: + url: https://github.com/KRTirtho/frb_plugins.git + path: packages/flutter_discord_rpc flutter_displaymode: ^0.6.0 flutter_feather_icons: ^2.0.0+1 flutter_form_builder: ^9.6.0 @@ -87,7 +90,10 @@ dependencies: lrc: ^1.0.2 media_kit: ^1.1.10+1 media_kit_libs_audio: ^1.0.4 - metadata_god: ^1.0.0 + metadata_god: + git: + url: https://github.com/KRTirtho/frb_plugins.git + path: packages/metadata_god mime: ^2.0.0 open_file: ^3.5.10 package_info_plus: ^6.0.0 @@ -111,7 +117,10 @@ dependencies: skeletonizer: ^2.1.0+1 sliding_up_panel: ^2.0.0+1 sliver_tools: ^0.2.12 - smtc_windows: ^1.0.0 + smtc_windows: + git: + url: https://github.com/KRTirtho/frb_plugins.git + path: packages/smtc_windows sqlite3: ^2.4.3 sqlite3_flutter_libs: ^0.5.23 stroke_text: ^0.0.2