/
/
/
1"""Utility functions for handling cookies and converting them into Netscape format."""
2
3from __future__ import annotations
4
5from dataclasses import dataclass
6from typing import TYPE_CHECKING
7
8from mashumaro import DataClassDictMixin
9
10# Playlist, Album, and Track cannot be placed under TYPE_CHECKING
11# because they are used at runtime by DataClassDictMixin
12from music_assistant_models.media_items import (
13 Album,
14 AudioFormat,
15 Playlist,
16 Track,
17)
18
19from music_assistant.constants import VERBOSE_LOG_LEVEL
20from music_assistant.providers.nicovideo.constants import (
21 NICOVIDEO_AUDIO_BIT_DEPTH,
22 NICOVIDEO_AUDIO_CHANNELS,
23 NICOVIDEO_CODEC_TYPE,
24 NICOVIDEO_CONTENT_TYPE,
25)
26
27if TYPE_CHECKING:
28 import logging
29
30
31@dataclass
32class PlaylistWithTracks(DataClassDictMixin):
33 """Helper class to hold playlist and its tracks."""
34
35 playlist: Playlist
36 tracks: list[Track]
37
38
39@dataclass
40class AlbumWithTracks(DataClassDictMixin):
41 """Helper class to hold album and its tracks."""
42
43 album: Album
44 tracks: list[Track]
45
46
47def log_verbose(logger: logging.Logger, message: str, *args: object) -> None:
48 """Log a message at VERBOSE level with performance optimization.
49
50 Args:
51 logger: Logger instance
52 message: Log message format string
53 *args: Arguments for the message format string
54 """
55 if logger.isEnabledFor(VERBOSE_LOG_LEVEL):
56 logger.log(VERBOSE_LOG_LEVEL, message, *args)
57
58
59def create_audio_format(
60 *, bit_rate: int | None = None, sample_rate: int | None = None
61) -> AudioFormat:
62 """Create AudioFormat from stream format data."""
63 audio_format = AudioFormat(
64 content_type=NICOVIDEO_CONTENT_TYPE,
65 codec_type=NICOVIDEO_CODEC_TYPE,
66 channels=NICOVIDEO_AUDIO_CHANNELS,
67 bit_depth=NICOVIDEO_AUDIO_BIT_DEPTH,
68 )
69
70 if bit_rate is not None:
71 audio_format.bit_rate = bit_rate
72 if sample_rate is not None:
73 audio_format.sample_rate = sample_rate
74
75 return audio_format
76