/
/
/
1"""
2Helper utilities for nicovideo converters.
3
4Provides common utility functions and lightweight mapping creation for converters.
5"""
6
7from __future__ import annotations
8
9from typing import TYPE_CHECKING, Literal
10
11from music_assistant_models.media_items import ProviderMapping
12
13from music_assistant.providers.nicovideo.converters.base import NicovideoConverterBase
14
15if TYPE_CHECKING:
16 from music_assistant_models.media_items import AudioFormat
17
18# Type alias for nicovideo URL path types
19type NicovideoUrlPath = Literal["watch", "mylist", "series", "user", "channel"]
20
21
22class NicovideoConverterHelper(NicovideoConverterBase):
23 """Helper for creating various mapping objects and utility functions."""
24
25 def calculate_popularity(
26 self,
27 mylist_count: int | None = None,
28 like_count: int | None = None,
29 ) -> int:
30 """
31 Calculate popularity score using standard formula.
32
33 Returns:
34 Popularity score (0-100).
35 """
36 # Primary calculation: mylist*3 + like*1 (normalized to 0-100 scale)
37 if mylist_count is not None and like_count is not None:
38 return min(100, max(0, int((mylist_count * 3 + like_count) / 10)))
39
40 return 0
41
42 # ProviderMapping creation methods
43 def create_provider_mapping(
44 self,
45 item_id: str,
46 url_path: NicovideoUrlPath,
47 *,
48 available: bool = True,
49 audio_format: AudioFormat | None = None,
50 ) -> set[ProviderMapping]:
51 """Create provider mapping for media items."""
52 # Create mapping with required fields
53 mapping = ProviderMapping(
54 item_id=item_id,
55 provider_domain=self.provider.domain,
56 provider_instance=self.provider.instance_id,
57 url=f"https://www.nicovideo.jp/{url_path}/{item_id}",
58 available=available,
59 )
60
61 # Set audio_format if provided
62 if audio_format is not None:
63 mapping.audio_format = audio_format
64
65 return {mapping}
66