diff --git a/music_assistant/controllers/media/base.py b/music_assistant/controllers/media/base.py index 5aa69c6543..71105135fa 100644 --- a/music_assistant/controllers/media/base.py +++ b/music_assistant/controllers/media/base.py @@ -7,7 +7,7 @@ from abc import ABCMeta, abstractmethod from collections.abc import Iterable from contextlib import suppress -from datetime import datetime +from datetime import UTC, datetime from typing import TYPE_CHECKING, Any, TypeVar, cast, final from music_assistant_models.enums import EventType, ExternalID, MediaType, ProviderFeature @@ -1121,7 +1121,7 @@ def _parse_db_row(db_row: Mapping[str, Any]) -> dict[str, Any]: db_row_dict["favorite"] = bool(db_row_dict["favorite"]) db_row_dict["item_id"] = str(db_row_dict["item_id"]) db_row_dict["date_added"] = datetime.fromtimestamp( - db_row_dict["timestamp_added"] + db_row_dict["timestamp_added"], tz=UTC ).isoformat() for key in JSON_KEYS: diff --git a/music_assistant/helpers/podcast_parsers.py b/music_assistant/helpers/podcast_parsers.py index 31b2a2f6ec..a859611784 100644 --- a/music_assistant/helpers/podcast_parsers.py +++ b/music_assistant/helpers/podcast_parsers.py @@ -1,6 +1,6 @@ """Podcastfeed -> Mass.""" -from datetime import datetime +from datetime import UTC, datetime from io import BytesIO from typing import Any @@ -193,7 +193,7 @@ def parse_podcast_episode( }, ) if episode_published is not None: - mass_episode.metadata.release_date = datetime.fromtimestamp(episode_published) + mass_episode.metadata.release_date = datetime.fromtimestamp(episode_published, tz=UTC) # chapter if chapters := episode.get("chapters"): diff --git a/music_assistant/providers/ard_audiothek/__init__.py b/music_assistant/providers/ard_audiothek/__init__.py index 19a533c649..4fe4ad2c09 100644 --- a/music_assistant/providers/ard_audiothek/__init__.py +++ b/music_assistant/providers/ard_audiothek/__init__.py @@ -3,7 +3,7 @@ from __future__ import annotations from collections.abc import AsyncGenerator, Sequence -from datetime import datetime, timedelta +from datetime import UTC, datetime, timedelta from typing import TYPE_CHECKING, Any from gql import Client @@ -249,7 +249,7 @@ async def get_client(self) -> Client: self.token = self.config.get_value(CONF_TOKEN_BEARER) self.user_id = self.config.get_value(CONF_USERID) self.token_expire = datetime.fromtimestamp( - float(str(self.config.get_value(CONF_EXPIRY_TIME))) + float(str(self.config.get_value(CONF_EXPIRY_TIME))), tz=UTC ) self.max_bitrate = int(float(str(self.config.get_value(CONF_MAX_BITRATE)))) diff --git a/music_assistant/providers/audiobookshelf/parsers.py b/music_assistant/providers/audiobookshelf/parsers.py index 5cd04828fb..cb95a88bef 100644 --- a/music_assistant/providers/audiobookshelf/parsers.py +++ b/music_assistant/providers/audiobookshelf/parsers.py @@ -1,7 +1,7 @@ """Parser for ABS -> MASS.""" from contextlib import suppress -from datetime import datetime +from datetime import UTC, datetime from aioaudiobookshelf.schema.library import ( LibraryItemExpandedBook as AbsLibraryItemExpandedBook, @@ -182,7 +182,7 @@ def parse_podcast_episode( if episode.published_at is not None: position = -episode.published_at # abs published_at is ms epoch - release_date = datetime.fromtimestamp(episode.published_at / 1000) + release_date = datetime.fromtimestamp(episode.published_at / 1000, tz=UTC) else: position = 0 if fallback_episode_cnt is not None: @@ -303,6 +303,6 @@ def parse_audiobook( mass_audiobook.resume_position_ms = int(media_progress.current_time * 1000) mass_audiobook.fully_played = media_progress.is_finished - mass_audiobook.date_added = datetime.fromtimestamp(abs_audiobook.added_at / 1000) + mass_audiobook.date_added = datetime.fromtimestamp(abs_audiobook.added_at / 1000, tz=UTC) return mass_audiobook diff --git a/music_assistant/providers/bandcamp/converters.py b/music_assistant/providers/bandcamp/converters.py index 4838c39f9d..05131930de 100644 --- a/music_assistant/providers/bandcamp/converters.py +++ b/music_assistant/providers/bandcamp/converters.py @@ -1,7 +1,7 @@ """Converters for Bandcamp API models to Music Assistant models.""" from contextlib import suppress -from datetime import datetime +from datetime import UTC, datetime from typing import TypedDict from bandcamp_async_api.models import BCAlbum as APIAlbum @@ -362,7 +362,9 @@ def album_from_api(self, album: APIAlbum) -> MAAlbum: url=album.url, ) }, - year=datetime.fromtimestamp(album.release_date).year if album.release_date else None, + year=datetime.fromtimestamp(album.release_date, tz=UTC).year + if album.release_date + else None, ) output.metadata.add_image( MediaItemImage( diff --git a/music_assistant/providers/opensubsonic/parsers.py b/music_assistant/providers/opensubsonic/parsers.py index 8cb53c5b23..dafd7e698d 100644 --- a/music_assistant/providers/opensubsonic/parsers.py +++ b/music_assistant/providers/opensubsonic/parsers.py @@ -3,7 +3,7 @@ from __future__ import annotations import logging -from datetime import datetime +from datetime import UTC, datetime from typing import TYPE_CHECKING from music_assistant_models.enums import ContentType, ImageType, MediaType @@ -535,7 +535,7 @@ def parse_structured_lyrics(lyrics: StructuredLyrics) -> tuple[str, bool]: if line.start is None: raise InvalidDataError("Open Subsonic Synced lyric missing time index") ms = int(line.start) + offset - dt = datetime.fromtimestamp(ms / 1000) + dt = datetime.fromtimestamp(ms / 1000, tz=UTC) ts = dt.strftime("%M:%S.%f")[:-4] lines.append(f"[{ts}]{line.value}") else: diff --git a/music_assistant/providers/qobuz/__init__.py b/music_assistant/providers/qobuz/__init__.py index be3e9ac719..1cb2e5be02 100644 --- a/music_assistant/providers/qobuz/__init__.py +++ b/music_assistant/providers/qobuz/__init__.py @@ -7,6 +7,7 @@ import hashlib import time from contextlib import suppress +from datetime import UTC from typing import TYPE_CHECKING, Any, cast from aiohttp import client_exceptions @@ -665,7 +666,7 @@ async def _parse_album( album.metadata.label = album_obj["label"]["name"] if released_at := album_obj.get("released_at"): with suppress(ValueError): - album.year = datetime.datetime.fromtimestamp(released_at).year + album.year = datetime.datetime.fromtimestamp(released_at, tz=UTC).year if album_obj.get("copyright"): album.metadata.copyright = album_obj["copyright"] if album_obj.get("description"): diff --git a/pyproject.toml b/pyproject.toml index 549c4bd25b..e2e5b0629a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -251,7 +251,6 @@ ignore = [ "B904", "TRY401", "S324", - "DTZ006", "ERA001", "PTH206", "C901",