Chore: Add db migration for invalid release_date in db
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 30 Mar 2025 14:16:10 +0000 (16:16 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 30 Mar 2025 14:16:10 +0000 (16:16 +0200)
music_assistant/controllers/music.py

index a6e50b94a00cc6c27fe227f506c74fc2fe698cd7..3589510a2148aa2cf4a34031d93fcdce4005816a 100644 (file)
@@ -8,6 +8,7 @@ import os
 import shutil
 from collections.abc import Sequence
 from contextlib import suppress
+from datetime import datetime
 from itertools import zip_longest
 from math import inf
 from typing import TYPE_CHECKING, Final, cast
@@ -85,7 +86,7 @@ DEFAULT_SYNC_INTERVAL = 12 * 60  # default sync interval in minutes
 CONF_SYNC_INTERVAL = "sync_interval"
 CONF_DELETED_PROVIDERS = "deleted_providers"
 CONF_ADD_LIBRARY_ON_PLAY = "add_library_on_play"
-DB_SCHEMA_VERSION: Final[int] = 16
+DB_SCHEMA_VERSION: Final[int] = 17
 
 
 class MusicController(CoreController):
@@ -1511,6 +1512,31 @@ class MusicController(CoreController):
                         },
                     )
 
+        if prev_version <= 16:
+            # cleanup invalid release_date field in metadata
+            for table in (
+                DB_TABLE_TRACKS,
+                DB_TABLE_ALBUMS,
+                DB_TABLE_AUDIOBOOKS,
+                DB_TABLE_PODCASTS,
+            ):
+                async for db_row in self.database.iter_items(table):
+                    if '"release_date":null' in db_row["metadata"]:
+                        continue
+                    metadata = json_loads(db_row["metadata"])
+                    try:
+                        datetime.fromisoformat(metadata["release_date"])
+                    except (KeyError, ValueError):
+                        # this is not a valid date, so we set it to None
+                        metadata["release_date"] = None
+                        await self.database.update(
+                            table,
+                            {"item_id": db_row["item_id"]},
+                            {
+                                "metadata": serialize_to_json(metadata),
+                            },
+                        )
+
         # save changes
         await self.database.commit()