music-assistant-server

3 KBPY
playlist.py
3 KB78 lines • python
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