fix: local track not working and images of local not showing up

This commit is contained in:
Kingkor Roy Tirtho 2025-08-16 16:11:04 +06:00
parent c615d48e27
commit 5add53e269
8 changed files with 69 additions and 33 deletions

View File

@ -74,6 +74,7 @@ class TrackTile extends HookConsumerWidget {
final isSelected = isPlaying || isLoading.value; final isSelected = isPlaying || isLoading.value;
print('track.album.images: ${track.album.images}');
final imageProvider = useMemoized( final imageProvider = useMemoized(
() => UniversalImage.imageProvider( () => UniversalImage.imageProvider(
(track.album.images).smallest(ImagePlaceholder.albumArt), (track.album.images).smallest(ImagePlaceholder.albumArt),

View File

@ -60,6 +60,14 @@ class SpotubeTrackObject with _$SpotubeTrackObject {
], ],
releaseDate: releaseDate:
metadata?.year != null ? "${metadata!.year}-01-01" : "1970-01-01", 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, durationMs: metadata?.durationMs?.toInt() ?? 0,
path: file.path, path: file.path,

View File

@ -39,8 +39,9 @@ class TrackSourceQuery with _$TrackSourceQuery {
/// Parses [SpotubeMedia]'s [uri] property to create a [TrackSourceQuery]. /// Parses [SpotubeMedia]'s [uri] property to create a [TrackSourceQuery].
factory TrackSourceQuery.parseUri(String url) { factory TrackSourceQuery.parseUri(String url) {
final uri = Uri.parse(url); final uri = Uri.parse(url);
final isLocal = uri.queryParameters.isEmpty;
return TrackSourceQuery( return TrackSourceQuery(
id: uri.pathSegments.last, id: isLocal ? uri.path : uri.pathSegments.last,
title: uri.queryParameters['title'] ?? '', title: uri.queryParameters['title'] ?? '',
artists: uri.queryParameters['artists']?.split(',') ?? [], artists: uri.queryParameters['artists']?.split(',') ?? [],
album: uri.queryParameters['album'] ?? '', album: uri.queryParameters['album'] ?? '',

View File

@ -11,10 +11,15 @@ final queryingTrackInfoProvider = Provider<bool>((ref) {
return false; return false;
} }
if (audioPlayer.activeTrack is! SpotubeFullTrackObject) {
return false;
}
return ref return ref
.watch(trackSourcesProvider( .watch(trackSourcesProvider(
TrackSourceQuery.fromTrack( TrackSourceQuery.fromTrack(
audioPlayer.activeTrack! as SpotubeFullTrackObject), audioPlayer.activeTrack! as SpotubeFullTrackObject,
),
)) ))
.isLoading; .isLoading;
}); });

View File

@ -80,17 +80,20 @@ Future<void> _sendActiveTrack(SpotubeTrackObject? track) async {
final jsonTrack = track.toJson(); final jsonTrack = track.toJson();
final image = track.album?.images.first; final image = track.album.images.firstOrNull;
final cachedImage = await DefaultCacheManager().getSingleFile(image!.url); final cachedImage = image == null
? null
: await DefaultCacheManager().getSingleFile(image.url);
final data = { final data = {
...jsonTrack, ...jsonTrack,
"album": { "album": {
...jsonTrack["album"], ...jsonTrack["album"],
"images": [ "images": [
{ if (cachedImage != null && image != null)
...image.toJson(), {
"path": cachedImage.path, ...image.toJson(),
} "path": cachedImage.path,
}
] ]
} }
}; };

View File

@ -35,6 +35,12 @@ const imgMimeToExt = {
"image/gif": ".gif", "image/gif": ".gif",
}; };
typedef MetadataFile = ({
Metadata? metadata,
File file,
String? art,
});
final localTracksProvider = final localTracksProvider =
FutureProvider<Map<String, List<SpotubeLocalTrackObject>>>((ref) async { FutureProvider<Map<String, List<SpotubeLocalTrackObject>>>((ref) async {
try { try {
@ -89,7 +95,7 @@ final localTracksProvider =
} }
} }
final List<Map<dynamic, dynamic>> filesWithMetadata = await Future.wait( final List<MetadataFile> filesWithMetadata = await Future.wait(
entities.map((file) async { entities.map((file) async {
try { try {
final metadata = await MetadataGod.readMetadata(file: file.path); 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) { } catch (e, stack) {
if (e case FrbException() || TimeoutException()) { if (e case FrbException() || TimeoutException()) {
return {"file": file}; return (file: file, metadata: null, art: null);
} }
AppLogger.reportError(e, stack); AppLogger.reportError(e, stack);
return null; return null;
@ -125,9 +131,9 @@ final localTracksProvider =
final tracksFromMetadata = filesWithMetadata final tracksFromMetadata = filesWithMetadata
.map( .map(
(fileWithMetadata) => SpotubeTrackObject.localTrackFromFile( (fileWithMetadata) => SpotubeTrackObject.localTrackFromFile(
fileWithMetadata["file"] as File, fileWithMetadata.file,
metadata: fileWithMetadata["metadata"] as Metadata?, metadata: fileWithMetadata.metadata,
art: fileWithMetadata["art"] as String?, art: fileWithMetadata.art,
) as SpotubeLocalTrackObject, ) as SpotubeLocalTrackObject,
) )
.toList(); .toList();

View File

@ -670,10 +670,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: ffi name: ffi
sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.3" version: "2.1.4"
file: file:
dependency: transitive dependency: transitive
description: description:
@ -795,10 +795,11 @@ packages:
flutter_discord_rpc: flutter_discord_rpc:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_discord_rpc path: "packages/flutter_discord_rpc"
sha256: "9363a803863d56fd89c0a21639c70b126245fcbafaeb0a3d091e7ac06951d03f" ref: HEAD
url: "https://pub.dev" resolved-ref: "4896f78d32eab4d2508e914ad80a9537f035e407"
source: hosted url: "https://github.com/KRTirtho/frb_plugins.git"
source: git
version: "1.0.0" version: "1.0.0"
flutter_displaymode: flutter_displaymode:
dependency: "direct main" dependency: "direct main"
@ -983,10 +984,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: flutter_rust_bridge name: flutter_rust_bridge
sha256: "0ad5079de35d317650fec59b26cb4d0c116ebc2ce703a29f9367513b8a91c287" sha256: "37ef40bc6f863652e865f0b2563ea07f0d3c58d8efad803cc01933a4b2ee067e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.5.0" version: "2.11.1"
flutter_secure_storage: flutter_secure_storage:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1638,10 +1639,11 @@ packages:
metadata_god: metadata_god:
dependency: "direct main" dependency: "direct main"
description: description:
name: metadata_god path: "packages/metadata_god"
sha256: "025d8149059f62f44108ab9d74ebd77aa8f0af98b238f3f25121a4711ee3e5d0" ref: HEAD
url: "https://pub.dev" resolved-ref: "4896f78d32eab4d2508e914ad80a9537f035e407"
source: hosted url: "https://github.com/KRTirtho/frb_plugins.git"
source: git
version: "1.0.0" version: "1.0.0"
mime: mime:
dependency: "direct main" dependency: "direct main"
@ -2260,10 +2262,11 @@ packages:
smtc_windows: smtc_windows:
dependency: "direct main" dependency: "direct main"
description: description:
name: smtc_windows path: "packages/smtc_windows"
sha256: "80f7c10867da485ffdf87f842bf27e6763589933c18c11af5dc1cd1e158c3154" ref: HEAD
url: "https://pub.dev" resolved-ref: "4896f78d32eab4d2508e914ad80a9537f035e407"
source: hosted url: "https://github.com/KRTirtho/frb_plugins.git"
source: git
version: "1.0.0" version: "1.0.0"
source_gen: source_gen:
dependency: transitive dependency: transitive

View File

@ -52,7 +52,10 @@ dependencies:
url: https://github.com/KRTirtho/flutter_broadcasts.git url: https://github.com/KRTirtho/flutter_broadcasts.git
ref: 63931dfe06733d4fb7452e9981e1f0b23414d97a ref: 63931dfe06733d4fb7452e9981e1f0b23414d97a
flutter_cache_manager: ^3.3.0 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_displaymode: ^0.6.0
flutter_feather_icons: ^2.0.0+1 flutter_feather_icons: ^2.0.0+1
flutter_form_builder: ^9.6.0 flutter_form_builder: ^9.6.0
@ -87,7 +90,10 @@ dependencies:
lrc: ^1.0.2 lrc: ^1.0.2
media_kit: ^1.1.10+1 media_kit: ^1.1.10+1
media_kit_libs_audio: ^1.0.4 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 mime: ^2.0.0
open_file: ^3.5.10 open_file: ^3.5.10
package_info_plus: ^6.0.0 package_info_plus: ^6.0.0
@ -111,7 +117,10 @@ dependencies:
skeletonizer: ^2.1.0+1 skeletonizer: ^2.1.0+1
sliding_up_panel: ^2.0.0+1 sliding_up_panel: ^2.0.0+1
sliver_tools: ^0.2.12 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: ^2.4.3
sqlite3_flutter_libs: ^0.5.23 sqlite3_flutter_libs: ^0.5.23
stroke_text: ^0.0.2 stroke_text: ^0.0.2