/
/
/
1"""Playlist converter for nicovideo objects."""
2
3from __future__ import annotations
4
5from typing import TYPE_CHECKING
6
7from music_assistant_models.enums import ImageType, LinkType
8from music_assistant_models.media_items import (
9 MediaItemImage,
10 MediaItemLink,
11 MediaItemMetadata,
12 Playlist,
13)
14from music_assistant_models.unique_list import UniqueList
15from niconico.objects.video.search import EssentialMylist
16
17from music_assistant.providers.nicovideo.converters.base import NicovideoConverterBase
18from music_assistant.providers.nicovideo.helpers import PlaylistWithTracks
19
20if TYPE_CHECKING:
21 from niconico.objects.nvapi import FollowingMylistItem
22 from niconico.objects.user import UserMylistItem
23 from niconico.objects.video import Mylist
24
25
26class NicovideoPlaylistConverter(NicovideoConverterBase):
27 """Handles playlist conversion for nicovideo."""
28
29 def convert_by_mylist(self, mylist: UserMylistItem | Mylist | EssentialMylist) -> Playlist:
30 """Convert a nicovideo UserMylistItem into a Playlist."""
31 playlist = Playlist(
32 item_id=str(mylist.id_),
33 provider=self.provider.instance_id,
34 name=(mylist.title if isinstance(mylist, EssentialMylist) else mylist.name),
35 owner=mylist.owner.id_ or "",
36 is_editable=True, # Own mylists are editable by default
37 metadata=MediaItemMetadata(
38 description=mylist.description,
39 links={
40 MediaItemLink(
41 type=LinkType.WEBSITE,
42 url=f"https://www.nicovideo.jp/mylist/{mylist.id_}",
43 )
44 },
45 ),
46 provider_mappings=self.helper.create_provider_mapping(str(mylist.id_), "mylist"),
47 )
48
49 if mylist.owner.icon_url:
50 if not playlist.metadata.images:
51 playlist.metadata.images = UniqueList()
52 playlist.metadata.images.append(
53 MediaItemImage(
54 type=ImageType.THUMB,
55 path=mylist.owner.icon_url,
56 provider=self.provider.instance_id,
57 remotely_accessible=True,
58 )
59 )
60 return playlist
61
62 def convert_following_by_mylist(self, mylist: FollowingMylistItem) -> Playlist:
63 """Convert a nicovideo UserMylistItem from following users into a read-only Playlist."""
64 playlist = self.convert_by_mylist(mylist.detail)
65 # Mark following mylists as non-editable
66 playlist.is_editable = False
67 return playlist
68
69 def convert_with_tracks_by_mylist(self, mylist: Mylist) -> PlaylistWithTracks:
70 """Convert a nicovideo UserMylistItem into a PlaylistWithTracks."""
71 playlist = self.convert_by_mylist(mylist)
72 tracks = []
73 for item in mylist.items:
74 track = self.converter_manager.track.convert_by_essential_video(item.video)
75 if track:
76 tracks.append(track)
77 return PlaylistWithTracks(playlist, tracks)
78