This commit is contained in:
DJDoubleD
2024-08-04 23:02:21 +02:00
2 changed files with 133 additions and 105 deletions

View File

@@ -232,9 +232,18 @@ class AudioPlayerHandler extends BaseAudioHandler
}
}
final AndroidAuto _androidAuto = AndroidAuto(); // Create an instance of AndroidAuto
@override
Future<void> playFromMediaId(String mediaId,
[Map<String, dynamic>? extras]) async {
Future<void> playFromMediaId(String mediaId, [Map<String, dynamic>? extras]) async {
// 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
final index = queue.value.indexWhere((item) => item.id == mediaId);
if (index != -1) {
_player.seek(

View File

@@ -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<List<MediaItem>> 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<Playlist> playlists = await deezerAPI.getPlaylists();
List<MediaItem> out = playlists
.map<MediaItem>((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<MediaItem> out = playlists.map<MediaItem>((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<Album> albums = await deezerAPI.getAlbums();
List<MediaItem> out = albums
.map<MediaItem>((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<MediaItem> out = albums.map<MediaItem>((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<Artist> artists = await deezerAPI.getArtists();
List<MediaItem> out = artists
.map<MediaItem>((a) => MediaItem(
id: 'albums${a.id}',
title: a.name ?? '',
album: '',
displayTitle: a.name,
playable: false,
artUri: Uri.tryParse(a.picture?.thumb ?? '')))
.toList();
List<MediaItem> out = artists.map<MediaItem>((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<Album> albums = await deezerAPI.discographyPage(parentId.replaceFirst('albums', ''));
// Artist screen (albums, etc)
if (parentId.startsWith('${prefix}albums')) {
String artistId = parentId.replaceFirst('${prefix}albums', '');
List<Album> albums = await deezerAPI.discographyPage(artistId);
List<MediaItem> out = albums
.map<MediaItem>((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<MediaItem> out = albums.map<MediaItem>((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<MediaItem> 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<MediaItem> 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<void> playItem(String id) async {
if (kDebugMode) {
print(id);
}
//Play flow
if (id == 'flow' || id == 'stlflow') {
await GetIt.I<AudioPlayerHandler>().playFromSmartTrackList(SmartTrackList(id: 'flow', title: 'Flow'.i18n));
// Play flow
if (id == '${prefix}flow' || id == '${prefix}stlflow') {
await GetIt.I<AudioPlayerHandler>()
.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<AudioPlayerHandler>().playFromTrackList(favPlaylist!.tracks!, favPlaylist.tracks![0].id ?? '',
await GetIt.I<AudioPlayerHandler>().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<AudioPlayerHandler>().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<AudioPlayerHandler>().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<AudioPlayerHandler>().playFromSmartTrackList(stl);
return;
}
}
//Homescreen items
// Homescreen items
List<MediaItem> 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,