/
/
/
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 """Calculate popularity score using standard formula.
31
32 Returns:
33 Popularity score (0-100).
34 """
35 # Primary calculation: mylist*3 + like*1 (normalized to 0-100 scale)
36 if mylist_count is not None and like_count is not None:
37 return min(100, max(0, int((mylist_count * 3 + like_count) / 10)))
38
39 return 0
40
41 # ProviderMapping creation methods
42 def create_provider_mapping(
43 self,
44 item_id: str,
45 url_path: NicovideoUrlPath,
46 *,
47 available: bool = True,
48 audio_format: AudioFormat | None = None,
49 ) -> set[ProviderMapping]:
50 """Create provider mapping for media items."""
51 # Create mapping with required fields
52 mapping = ProviderMapping(
53 item_id=item_id,
54 provider_domain=self.provider.domain,
55 provider_instance=self.provider.instance_id,
56 url=f"https://www.nicovideo.jp/{url_path}/{item_id}",
57 available=available,
58 )
59
60 # Set audio_format if provided
61 if audio_format is not None:
62 mapping.audio_format = audio_format
63
64 return {mapping}
65