/
/
/
1"""MixIn for NicovideoMusicProvider: artist-related methods."""
2
3from __future__ import annotations
4
5from collections.abc import AsyncGenerator
6from typing import override
7
8from music_assistant_models.errors import MediaNotFoundError
9from music_assistant_models.media_items import ( # noqa: TC002 - used in @use_cache
10 Album,
11 Artist,
12 Track,
13)
14
15from music_assistant.controllers.cache import use_cache
16from music_assistant.providers.nicovideo.provider_mixins.base import (
17 NicovideoMusicProviderMixinBase,
18)
19
20
21class NicovideoMusicProviderArtistMixin(NicovideoMusicProviderMixinBase):
22 """Artist-related methods for NicovideoMusicProvider."""
23
24 @override
25 @use_cache(3600 * 24 * 14) # Cache for 14 days
26 async def get_artist(self, prov_artist_id: str) -> Artist:
27 """Get full artist details by id."""
28 artist = await self.service_manager.user.get_user(prov_artist_id)
29 if not artist:
30 raise MediaNotFoundError(f"Artist with id {prov_artist_id} not found on nicovideo.")
31 return artist
32
33 @override
34 async def get_library_artists(
35 self,
36 ) -> AsyncGenerator[Artist, None]:
37 """Retrieve library artists from the provider."""
38 # Include followed artists if user is logged in
39 following_artists = await self.service_manager.user.get_own_followings()
40 for artist in following_artists:
41 yield artist
42
43 @override
44 @use_cache(3600 * 24 * 14) # Cache for 14 days
45 async def get_artist_albums(self, prov_artist_id: str) -> list[Album]:
46 """Get a list of all albums for the given artist (user's series)."""
47 return await self.service_manager.series.get_user_series(prov_artist_id)
48
49 @override
50 @use_cache(3600 * 24 * 14) # Cache for 14 days
51 async def get_artist_toptracks(self, prov_artist_id: str) -> list[Track]:
52 """Get newest 50 tracks of an artist."""
53 return await self.service_manager.video.get_user_videos(
54 prov_artist_id,
55 page=1,
56 page_size=50,
57 )
58