@@ -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 } ) ) ;
0 commit comments