/
/
/
1"""
2MixIn for NicovideoMusicProvider: album-related methods.
3
4In this section, we treat niconico's "series" as an album.
5"""
6
7from __future__ import annotations
8
9from typing import override
10
11from music_assistant_models.errors import MediaNotFoundError
12from music_assistant_models.media_items import Album, Track # noqa: TC002 - used in @use_cache
13
14from music_assistant.controllers.cache import use_cache
15from music_assistant.providers.nicovideo.provider_mixins.base import (
16 NicovideoMusicProviderMixinBase,
17)
18
19
20class NicovideoMusicProviderAlbumMixin(NicovideoMusicProviderMixinBase):
21 """Album-related methods for NicovideoMusicProvider."""
22
23 @override
24 @use_cache(3600 * 24 * 7) # Cache for 7 days
25 async def get_album(self, prov_album_id: str) -> Album:
26 """Get full album details by id (series as album)."""
27 album_with_tracks = await self.service_manager.series.get_series_or_own_series(
28 prov_album_id
29 )
30 if not album_with_tracks:
31 raise MediaNotFoundError(f"Album with id {prov_album_id} not found on nicovideo.")
32
33 return album_with_tracks.album
34
35 @override
36 @use_cache(3600 * 24 * 7) # Cache for 7 days
37 async def get_album_tracks(self, prov_album_id: str) -> list[Track]:
38 """Get album tracks for given album id (series tracks)."""
39 album_with_tracks = await self.service_manager.series.get_series_or_own_series(
40 prov_album_id
41 )
42 if not album_with_tracks:
43 return []
44
45 # Set album information on tracks (cached by @use_cache)
46 for track in album_with_tracks.tracks:
47 track.album = album_with_tracks.album
48
49 return album_with_tracks.tracks
50