music-assistant-server

2 KBPY
helper.py
2 KB65 lines • python
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