From 423bcce99294b6135b921590c24a440967560a8b Mon Sep 17 00:00:00 2001 From: bw8686 <51877146+bw8686@users.noreply.github.com> Date: Sun, 4 Aug 2024 01:24:20 +0100 Subject: [PATCH 1/4] Fix Homepage handling. --- lib/ui/android_auto.dart | 225 +++++++++++++++++++++------------------ 1 file changed, 122 insertions(+), 103 deletions(-) diff --git a/lib/ui/android_auto.dart b/lib/ui/android_auto.dart index 4ebf88f..74cac33 100644 --- a/lib/ui/android_auto.dart +++ b/lib/ui/android_auto.dart @@ -1,174 +1,186 @@ import 'package:audio_service/audio_service.dart'; import 'package:flutter/foundation.dart'; import 'package:get_it/get_it.dart'; - import '../api/deezer.dart'; import '../api/definitions.dart'; import '../service/audio_service.dart'; import '../translations.i18n.dart'; class AndroidAuto { - //Prefix for "playable" MediaItem + // Prefix for "playable" MediaItem static const prefix = '_aa_'; - //Get media items for parent id + // Get media items for parent id Future> getScreen(String parentId) async { if (kDebugMode) { print(parentId); } - //Homescreen + // Homescreen if (parentId == 'root') return homeScreen(); - //Playlists screen + // Playlists screen if (parentId == 'playlists') { - //Fetch + // Fetch List playlists = await deezerAPI.getPlaylists(); - List out = playlists - .map((p) => MediaItem( - id: '${prefix}playlist${p.id}', - title: p.title ?? '', - album: '', - displayTitle: p.title, - displaySubtitle: p.trackCount.toString() + ' ' + 'Tracks'.i18n, - playable: true, - artUri: Uri.tryParse(p.image?.thumb ?? ''))) - .toList(); + List out = playlists.map((p) { + return MediaItem( + id: '${prefix}playlist${p.id}', + title: p.title ?? '', + album: '', + displayTitle: p.title, + displaySubtitle: '${p.trackCount} ${'Tracks'.i18n}', + playable: true, + artUri: Uri.tryParse(p.image?.thumb ?? ''), + ); + }).toList(); return out; } - //Albums screen + // Albums screen if (parentId == 'albums') { List albums = await deezerAPI.getAlbums(); - List out = albums - .map((a) => MediaItem( - id: '${prefix}album${a.id}', - title: a.title ?? '', - album: a.title ?? '', - displayTitle: a.title, - displaySubtitle: a.artistString, - playable: true, - artUri: Uri.tryParse(a.art?.thumb ?? ''), - )) - .toList(); + List out = albums.map((a) { + return MediaItem( + id: '${prefix}album${a.id}', + title: a.title ?? '', + album: a.title ?? '', + displayTitle: a.title, + displaySubtitle: a.artistString, + playable: true, + artUri: Uri.tryParse(a.art?.thumb ?? ''), + ); + }).toList(); return out; } - //Artists screen + // Artists screen if (parentId == 'artists') { List artists = await deezerAPI.getArtists(); - List out = artists - .map((a) => MediaItem( - id: 'albums${a.id}', - title: a.name ?? '', - album: '', - displayTitle: a.name, - playable: false, - artUri: Uri.tryParse(a.picture?.thumb ?? ''))) - .toList(); + List out = artists.map((a) { + return MediaItem( + id: '${prefix}albums${a.id}', + title: a.name ?? '', + album: '', + displayTitle: a.name, + playable: false, + artUri: Uri.tryParse(a.picture?.thumb ?? ''), + ); + }).toList(); return out; } - //Artist screen (albums, etc) - if (parentId.startsWith('albums')) { - List albums = await deezerAPI.discographyPage(parentId.replaceFirst('albums', '')); + // Artist screen (albums, etc) + if (parentId.startsWith('${prefix}albums')) { + String artistId = parentId.replaceFirst('${prefix}albums', ''); + List albums = await deezerAPI.discographyPage(artistId); - List out = albums - .map((a) => MediaItem( - id: '${prefix}album${a.id}', - title: a.title ?? '', - album: a.title ?? '', - displayTitle: a.title, - displaySubtitle: a.artistString, - playable: true, - artUri: Uri.tryParse(a.art?.thumb ?? ''))) - .toList(); + List out = albums.map((a) { + return MediaItem( + id: '${prefix}album${a.id}', + title: a.title ?? '', + album: a.title ?? '', + displayTitle: a.title, + displaySubtitle: a.artistString, + playable: true, + artUri: Uri.tryParse(a.art?.thumb ?? ''), + ); + }).toList(); return out; } - //Homescreen + // Homescreen if (parentId == 'homescreen') { - HomePage hp = await deezerAPI.homePage(); - List out = []; - for (HomePageSection section in hp.sections) { - for (int i = 0; i < (section.items?.length ?? 0); i++) { - //Limit to max 5 items - if (i == 5) break; + try { + HomePage hp = await deezerAPI.homePage(); + List out = []; + for (HomePageSection section in hp.sections) { + for (int i = 0; i < (section.items?.length ?? 0); i++) { + if (i == 5) break; - //Check type - var data = section.items![i]?.value; - switch (section.items![i]?.type) { - case HomePageItemType.PLAYLIST: - out.add(MediaItem( + // Check type + var item = section.items![i]; + var data = item?.value; + switch (item?.type) { + case HomePageItemType.PLAYLIST: + out.add(MediaItem( id: '${prefix}playlist${data.id}', title: data.title, album: '', displayTitle: data.title, playable: true, - artUri: data.image.thumb)); - break; + artUri: Uri.tryParse(data.image.thumb), + )); + break; - case HomePageItemType.ALBUM: - out.add(MediaItem( + case HomePageItemType.ALBUM: + out.add(MediaItem( id: '${prefix}album${data.id}', title: data.title, album: data.title, displayTitle: data.title, displaySubtitle: data.artistString, playable: true, - artUri: data.art.thumb)); - break; + artUri: Uri.tryParse(data.art.thumb), + )); + break; - case HomePageItemType.ARTIST: - out.add(MediaItem( - id: 'albums${data.id}', - title: data.title, + case HomePageItemType.ARTIST: + out.add(MediaItem( + id: '${prefix}albums${data.id}', + title: data.name, album: '', displayTitle: data.name, playable: false, - artUri: data.picture.thumb)); - break; + artUri: Uri.tryParse(data.picture.thumb), + )); + break; - case HomePageItemType.SMARTTRACKLIST: - out.add(MediaItem( + case HomePageItemType.SMARTTRACKLIST: + out.add(MediaItem( id: '${prefix}stl${data.id}', title: data.title, album: '', displayTitle: data.title, displaySubtitle: data.subtitle, playable: true, - artUri: data.cover.thumb)); - break; + artUri: Uri.tryParse(data.cover.thumb), + )); + break; - default: - break; + default: + break; + } } } - } - return out; + return out; + } catch (error) { + return []; + } } return []; } - //Load virtual mediaItem - Future playItem(String id) async { + // Load virtual mediaItem + Future playItem(String id) async { if (kDebugMode) { print(id); } - //Play flow - if (id == 'flow' || id == 'stlflow') { - await GetIt.I().playFromSmartTrackList(SmartTrackList(id: 'flow', title: 'Flow'.i18n)); + // Play flow + if (id == 'flow' || id == '${prefix}stlflow') { + await GetIt.I() + .playFromSmartTrackList(SmartTrackList(id: 'flow', title: 'Flow'.i18n)); return; } - //Play library tracks - if (id == 'tracks') { - //Load tracks + // Play library tracks + if (id == '${prefix}tracks') { + // Load tracks Playlist? favPlaylist; try { favPlaylist = await deezerAPI.fullPlaylist(deezerAPI.favoritesPlaylistId ?? ''); @@ -179,34 +191,41 @@ class AndroidAuto { } if ((favPlaylist?.tracks?.length ?? 0) == 0) return; - await GetIt.I().playFromTrackList(favPlaylist!.tracks!, favPlaylist.tracks![0].id ?? '', + await GetIt.I().playFromTrackList( + favPlaylist!.tracks!, favPlaylist.tracks![0].id ?? '', QueueSource(id: 'allTracks', text: 'All offline tracks'.i18n, source: 'offline')); return; } - //Play playlists - if (id.startsWith('playlist')) { - Playlist p = await deezerAPI.fullPlaylist(id.replaceFirst('playlist', '')); + // Play playlists + if (id.startsWith('${prefix}playlist')) { + Playlist p = await deezerAPI.fullPlaylist(id.replaceFirst('${prefix}playlist', '')); await GetIt.I().playFromPlaylist(p, p.tracks?[0].id ?? ''); return; } - //Play albums - if (id.startsWith('album')) { - Album a = await deezerAPI.album(id.replaceFirst('album', '')); + // Play albums + if (id.startsWith('${prefix}album')) { + Album a = await deezerAPI.album(id.replaceFirst('${prefix}album', '')); await GetIt.I().playFromAlbum(a, a.tracks?[0].id ?? ''); return; } - //Play smart track list - if (id.startsWith('stl')) { - SmartTrackList stl = await deezerAPI.smartTrackList(id.replaceFirst('stl', '')); + // Play smart track list + if (id.startsWith('${prefix}stl')) { + SmartTrackList stl = await deezerAPI.smartTrackList(id.replaceFirst('${prefix}stl', '')); await GetIt.I().playFromSmartTrackList(stl); return; } } - //Homescreen items + // Homescreen items List homeScreen() { return [ - MediaItem(id: '${prefix}flow', title: 'Flow'.i18n, album: 'Flow'.i18n, displayTitle: 'Flow'.i18n, playable: true), + MediaItem( + id: '${prefix}flow', + title: 'Flow'.i18n, + album: 'Flow'.i18n, + displayTitle: 'Flow'.i18n, + playable: true, + ), MediaItem( id: 'homescreen', title: 'Home'.i18n, From 85c831b400f53a7337e1c859d1541738af1ad30d Mon Sep 17 00:00:00 2001 From: bw8686 <51877146+bw8686@users.noreply.github.com> Date: Sun, 4 Aug 2024 01:27:38 +0100 Subject: [PATCH 2/4] Fix Android Auto PlayItem handling. --- lib/service/audio_service.dart | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/service/audio_service.dart b/lib/service/audio_service.dart index 9801359..ec34964 100644 --- a/lib/service/audio_service.dart +++ b/lib/service/audio_service.dart @@ -232,8 +232,18 @@ class AudioPlayerHandler extends BaseAudioHandler } } + final AndroidAuto _androidAuto = AndroidAuto(); // Create an instance of AndroidAuto + @override Future playFromMediaId(String mediaId, + // Check if the mediaId is for Android Auto + if (mediaId.startsWith(AndroidAuto.prefix)) { + // Forward the event to Android Auto + await _androidAuto.playItem(mediaId); + return; + } + + // Handle other mediaIds by seeking to the appropriate item in the queue [Map? extras]) async { final index = queue.value.indexWhere((item) => item.id == mediaId); if (index != -1) { From 175c562db378df0d2b13d6f0aa84dc38714b3156 Mon Sep 17 00:00:00 2001 From: bw8686 <51877146+bw8686@users.noreply.github.com> Date: Sun, 4 Aug 2024 01:40:59 +0100 Subject: [PATCH 3/4] Fix Flow Button | It's almost 2am forgive me. --- lib/ui/android_auto.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ui/android_auto.dart b/lib/ui/android_auto.dart index 74cac33..c061d4c 100644 --- a/lib/ui/android_auto.dart +++ b/lib/ui/android_auto.dart @@ -173,7 +173,7 @@ class AndroidAuto { } // Play flow - if (id == 'flow' || id == '${prefix}stlflow') { + if (id == '${prefix}flow' || id == '${prefix}stlflow') { await GetIt.I() .playFromSmartTrackList(SmartTrackList(id: 'flow', title: 'Flow'.i18n)); return; From 5dc174d33cbf1af597d64835de91f4fa45164135 Mon Sep 17 00:00:00 2001 From: bw8686 <51877146+bw8686@users.noreply.github.com> Date: Sun, 4 Aug 2024 20:06:14 +0100 Subject: [PATCH 4/4] Fix Issue --- lib/service/audio_service.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/service/audio_service.dart b/lib/service/audio_service.dart index ec34964..c5bbe1a 100644 --- a/lib/service/audio_service.dart +++ b/lib/service/audio_service.dart @@ -235,7 +235,7 @@ class AudioPlayerHandler extends BaseAudioHandler final AndroidAuto _androidAuto = AndroidAuto(); // Create an instance of AndroidAuto @override - Future playFromMediaId(String mediaId, + Future playFromMediaId(String mediaId, [Map? extras]) async { // Check if the mediaId is for Android Auto if (mediaId.startsWith(AndroidAuto.prefix)) { // Forward the event to Android Auto @@ -244,7 +244,6 @@ class AudioPlayerHandler extends BaseAudioHandler } // Handle other mediaIds by seeking to the appropriate item in the queue - [Map? extras]) async { final index = queue.value.indexWhere((item) => item.id == mediaId); if (index != -1) { _player.seek(