Look for substitutes for unavailable items while syncing (#255)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Mon, 11 Apr 2022 09:15:05 +0000 (11:15 +0200)
committerGitHub <noreply@github.com>
Mon, 11 Apr 2022 09:15:05 +0000 (11:15 +0200)
* Look for substitutes for unavailable items while syncing

* change log for unavailable track

music_assistant/controllers/music/__init__.py
music_assistant/controllers/stream.py

index ae00a0960edf86f20d352bb01b9e14d1db557d58..fced39d9440daaf9d60514139c485cae45fa487e 100755 (executable)
@@ -399,6 +399,9 @@ class MusicController:
                     db_item = await controller.get(
                         prov_item.item_id, prov_item.provider, details=prov_item
                     )
+                elif not db_item or not db_item.available:
+                    # use auto matching magic to find a substitute for missing item
+                    db_item = await controller.add(prov_item)
                 elif not db_item:
                     # for other mediatypes its enough to simply dump the item in the db
                     db_item = await controller.add_db_item(prov_item)
@@ -431,8 +434,12 @@ class MusicController:
                 db_track = await self.tracks.get_db_item_by_prov_id(
                     album_track.provider, album_track.item_id
                 )
-                if not db_track:
+                if not db_track or not db_track.available:
+                    # use auto matching magic to find a substitute for missing track
+                    db_track = await self.tracks.add(album_track)
+                elif not db_track:
                     db_track = await self.tracks.add_db_item(album_track)
+
                 # add track to album_tracks
                 await self.mass.music.albums.add_db_album_track(
                     db_album.item_id,
@@ -455,7 +462,10 @@ class MusicController:
                 db_track = await self.tracks.get_db_item_by_prov_id(
                     playlist_track.provider, playlist_track.item_id
                 )
-                if not db_track:
+                if not db_track or not db_track.available:
+                    # use auto matching magic to find a substitute for missing track
+                    db_track = await self.tracks.add(playlist_track)
+                elif not db_track:
                     db_track = await self.tracks.add_db_item(playlist_track)
                 assert playlist_track.position is not None
                 await self.playlists.add_db_playlist_track(
index 2f9897d8120236b6bbd1f3191451ebe35525eb3d..c7ef8683562db115605900d65869c442842bc0d6 100644 (file)
@@ -371,11 +371,9 @@ class StreamController:
                     self.mass, queue_track, queue.queue_id, lazy=track_count == 1
                 )
             except MediaNotFoundError as err:
-                self.logger.error(str(err), exc_info=err)
-                streamdetails = None
-
-            if not streamdetails:
-                self.logger.warning("Skip track due to missing streamdetails")
+                self.logger.warning(
+                    "Skip track due to missing streamdetails", exc_info=err
+                )
                 continue
 
             # check the PCM samplerate/bitrate