/
/
/
1"""Artist converter for nicovideo objects."""
2
3from __future__ import annotations
4
5from music_assistant_models.enums import ImageType, LinkType
6from music_assistant_models.media_items import (
7 Artist,
8 MediaItemImage,
9 MediaItemLink,
10 MediaItemMetadata,
11)
12from niconico.objects.user import NicoUser, RelationshipUser
13from niconico.objects.video import Owner
14
15from music_assistant.providers.nicovideo.converters.base import NicovideoConverterBase
16from music_assistant.providers.nicovideo.converters.helper import NicovideoUrlPath
17
18
19class NicovideoArtistConverter(NicovideoConverterBase):
20 """Handles artist conversion for nicovideo."""
21
22 def convert_by_owner_or_user(
23 self, owner_or_user: Owner | NicoUser | RelationshipUser
24 ) -> Artist:
25 """Convert an Owner, NicoUser, or RelationshipUser into an Artist."""
26 item_id = str(owner_or_user.id_)
27
28 # Handle name extraction for different types
29 if isinstance(owner_or_user, Owner):
30 name = str(owner_or_user.name)
31 else: # NicoUser or RelationshipUser
32 name = str(owner_or_user.nickname)
33
34 # Handle icon URL extraction for different types
35 if isinstance(owner_or_user, Owner):
36 icon_url = owner_or_user.icon_url
37 else: # NicoUser or RelationshipUser
38 icon_url = owner_or_user.icons.large
39
40 # Determine URL path based on owner type
41 url_path: NicovideoUrlPath = "user" # Default for users, NicoUser, and RelationshipUser
42 if isinstance(owner_or_user, Owner) and owner_or_user.owner_type == "channel":
43 url_path = "channel"
44
45 artist = Artist(
46 item_id=item_id,
47 provider=self.provider.instance_id,
48 name=name,
49 metadata=MediaItemMetadata(
50 description=owner_or_user.description
51 if isinstance(owner_or_user, (NicoUser, RelationshipUser))
52 else None,
53 ),
54 provider_mappings=self.helper.create_provider_mapping(
55 item_id=item_id,
56 url_path=url_path,
57 ),
58 )
59
60 # Add icon image if available
61 if icon_url:
62 artist.metadata.add_image(
63 MediaItemImage(
64 type=ImageType.THUMB,
65 path=icon_url,
66 provider=self.provider.instance_id,
67 remotely_accessible=True,
68 )
69 )
70
71 # Add links to artist metadata
72 artist.metadata.links = {
73 MediaItemLink(
74 type=LinkType.WEBSITE,
75 url=f"https://www.nicovideo.jp/{url_path}/{item_id}",
76 )
77 }
78 if isinstance(owner_or_user, NicoUser):
79 # Add SNS links if available
80 for sns in owner_or_user.sns:
81 artist.metadata.links.add(
82 MediaItemLink(
83 type=LinkType(sns.type_),
84 url=sns.url,
85 )
86 )
87
88 return artist
89