/
/
/
1"""Series adapter for nicovideo."""
2
3from __future__ import annotations
4
5from typing import TYPE_CHECKING
6
7from music_assistant.providers.nicovideo.helpers import AlbumWithTracks
8from music_assistant.providers.nicovideo.services.base import NicovideoBaseService
9
10if TYPE_CHECKING:
11 from music_assistant_models.media_items import Album
12
13 from music_assistant.providers.nicovideo.services.manager import NicovideoServiceManager
14
15
16class NicovideoSeriesService(NicovideoBaseService):
17 """Handles series related operations for nicovideo."""
18
19 def __init__(self, adapter: NicovideoServiceManager) -> None:
20 """Initialize NicovideoSeriesService with reference to parent adapter."""
21 super().__init__(adapter)
22
23 async def get_series_or_own_series(
24 self, series_id: str, page: int = 1, page_size: int = 100
25 ) -> AlbumWithTracks | None:
26 """Get series details with fallback to own series for private series."""
27 # Try public series first
28 album_with_tracks = await self._get_series(series_id, page=page, page_size=page_size)
29 if not album_with_tracks:
30 # Fallback to own series (for private series)
31 album_with_tracks = await self._get_own_series_detail(
32 series_id, page=page, page_size=page_size
33 )
34 return album_with_tracks
35
36 async def get_user_series(
37 self, user_id: str, page: int = 1, page_size: int = 100
38 ) -> list[Album]:
39 """Get user series and convert as Album list."""
40 user_series_items = await self.service_manager._call_with_throttler(
41 self.niconico_py_client.user.get_user_series,
42 user_id,
43 page=page,
44 page_size=page_size,
45 )
46 if not user_series_items:
47 return []
48
49 return [
50 self.converter_manager.album.convert_by_series(series_item)
51 for series_item in user_series_items
52 ]
53
54 async def _get_series(
55 self, series_id: str, page: int = 1, page_size: int = 100
56 ) -> AlbumWithTracks | None:
57 """Get series details and convert as AlbumWithTracks."""
58 series_data = await self.service_manager._call_with_throttler(
59 self.niconico_py_client.video.get_series,
60 series_id,
61 page=page,
62 page_size=page_size,
63 )
64 if not series_data:
65 return None
66
67 return self.converter_manager.album.convert_series_to_album_with_tracks(series_data)
68
69 async def _get_own_series_detail(
70 self, series_id: str, page: int = 1, page_size: int = 100
71 ) -> AlbumWithTracks | None:
72 """Get own series details and convert as AlbumWithTracks."""
73 series_data = await self.service_manager._call_with_throttler(
74 self.niconico_py_client.user.get_own_series_detail,
75 series_id,
76 page=page,
77 page_size=page_size,
78 )
79 if not series_data:
80 return None
81
82 return self.converter_manager.album.convert_series_to_album_with_tracks(series_data)
83