From 3be1eb22d1a7703b9cf2283bac40ad5d5880bd16 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Mon, 9 May 2022 14:25:01 +0200 Subject: [PATCH] Prevent crash of filesystem provider when invalid ID3 tag found --- music_assistant/controllers/music/__init__.py | 2 +- music_assistant/controllers/music/albums.py | 6 +++++- music_assistant/providers/filesystem.py | 6 ++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/music_assistant/controllers/music/__init__.py b/music_assistant/controllers/music/__init__.py index abac150f..74c0190f 100755 --- a/music_assistant/controllers/music/__init__.py +++ b/music_assistant/controllers/music/__init__.py @@ -416,7 +416,7 @@ class MusicController: # in case of filestem, removal from library means the whole item is # moved/deleted so we remove the prov mapping from db. if provider_id == "filesystem": - if db_item := controller.get_db_item(item_id): + if db_item := await controller.get_db_item(item_id): db_item.provider_ids = { x for x in db_item.provider_ids diff --git a/music_assistant/controllers/music/albums.py b/music_assistant/controllers/music/albums.py index a9d976b4..188a4a93 100644 --- a/music_assistant/controllers/music/albums.py +++ b/music_assistant/controllers/music/albums.py @@ -150,7 +150,11 @@ class AlbumsController(MediaControllerBase[Album]): """Update Album record in the database.""" async with self.mass.database.get_db() as _db: cur_item = await self.get_db_item(item_id) - if album.artist.musicbrainz_id and album.artist.provider != "database": + if ( + not isinstance(album.artist, ItemMapping) + and album.artist.musicbrainz_id + and album.artist.provider != "database" + ): album_artist = await self.mass.music.artists.add_db_item(album.artist) else: album_artist = ( diff --git a/music_assistant/providers/filesystem.py b/music_assistant/providers/filesystem.py index e87334ce..7ceeb6c7 100644 --- a/music_assistant/providers/filesystem.py +++ b/music_assistant/providers/filesystem.py @@ -303,6 +303,12 @@ class FileSystemProvider(MusicProvider): # TODO: Fall back to parsing base details from filename if no tags found/supported tag = await self.mass.loop.run_in_executor(None, parse_tag) + + # we need at least a title and artist + if tag.title is None or tag.artist is None: + self.logger.warning("Skipping track due to invalid ID3 tags: %s", filename) + return None + prov_item_id = await self._get_item_id(filename, MediaType.TRACK) name, version = parse_title_and_version(tag.title) track = Track( -- 2.34.1