Skip to content

Commit b1e575b

Browse files
committed
fix: allow 0 to many subdirs under favorites media folder
1 parent 20214e9 commit b1e575b

File tree

2 files changed

+30
-12
lines changed

2 files changed

+30
-12
lines changed

src/services/media-browse-service.ts

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,28 +36,44 @@ export default class MediaBrowseService {
3636

3737
private async getFavoritesForPlayer(player: MediaPlayer) {
3838
try {
39-
const root = await this.hassService.browseMedia(player);
40-
const favorites = root.children?.find(
39+
const mediaRoot = await this.hassService.browseMedia(player);
40+
const favoritesStr = 'favorites';
41+
const favoritesDir = mediaRoot.children?.find(
4142
(child) =>
42-
child.media_content_type?.toLowerCase() === 'favorites' ||
43-
child.media_content_id?.toLowerCase() === 'favorites' ||
44-
child.title.toLowerCase() === 'favorites',
43+
child.media_content_type?.toLowerCase() === favoritesStr ||
44+
child.media_content_id?.toLowerCase() === favoritesStr ||
45+
child.title.toLowerCase() === favoritesStr,
4546
);
46-
if (!favorites) {
47+
if (!favoritesDir) {
4748
return [];
4849
}
49-
const favoritesRoot = await this.hassService.browseMedia(player, favorites.media_content_type, '');
50-
const favoriteTypesPromise = favoritesRoot.children?.map((favoriteItem) =>
51-
this.hassService.browseMedia(player, favoriteItem.media_content_type, favoriteItem.media_content_id),
52-
);
53-
const favoriteTypes = favoriteTypesPromise ? await Promise.all(favoriteTypesPromise) : [];
54-
return favoriteTypes.flatMap((item) => item.children ?? []);
50+
const favorites: MediaPlayerItem[] = [];
51+
await this.browseDir(player, favoritesDir, favorites);
52+
return favorites;
5553
} catch (e) {
5654
console.error(`Sonos Card: error getting favorites for player ${player.id}: ${JSON.stringify(e)}`);
5755
return [];
5856
}
5957
}
6058

59+
private async browseDir(player: MediaPlayer, favoritesDir: MediaPlayerItem, favorites: MediaPlayerItem[]) {
60+
console.log('browsing dir', favoritesDir.title);
61+
const dir = await this.hassService.browseMedia(
62+
player,
63+
favoritesDir.media_content_type,
64+
favoritesDir.media_content_id,
65+
);
66+
for (const child of dir.children ?? []) {
67+
if (child.can_expand) {
68+
await this.browseDir(player, child, favorites);
69+
}
70+
if (child.can_play) {
71+
console.log('adding favorite', child.title);
72+
favorites.push(child);
73+
}
74+
}
75+
}
76+
6177
private getFavoritesFromStates(mediaPlayer: MediaPlayer) {
6278
const titles = mediaPlayer.attributes.source_list ?? [];
6379
return titles.map((title: string) => ({ title }));

src/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ export interface CustomFavoriteThumbnails {
128128
}
129129

130130
export interface MediaPlayerItem {
131+
can_play: boolean;
132+
can_expand: boolean;
131133
title: string;
132134
thumbnail?: string;
133135
children?: MediaPlayerItem[];

0 commit comments

Comments
 (0)