/
/
/
1"""Samsung WAM player provider for Music Assistant."""
2
3from __future__ import annotations
4
5import logging
6from typing import TYPE_CHECKING
7
8from music_assistant.constants import VERBOSE_LOG_LEVEL
9
10from .provider import SamsungWamProvider
11
12
13class SpeakerStatusFilter(logging.Filter):
14 """Suppress high-frequency SpeakerStatus events unless verbose logging is enabled."""
15
16 def __init__(self, provider_logger: logging.Logger, name: str = "") -> None:
17 """
18 Initialize the filter.
19
20 :param provider_logger: The logger instance attached to the provider.
21 :param name: Optional name for the filter.
22 """
23 super().__init__(name)
24 self.provider_logger = provider_logger
25
26 def filter(self, record: logging.LogRecord) -> bool:
27 """Filter SpeakerStatus logs if the provider is not in verbose mode."""
28 if self.provider_logger.isEnabledFor(VERBOSE_LOG_LEVEL):
29 return True
30 if record.msg == "Event: %s" and record.args and isinstance(record.args, tuple):
31 try:
32 event_obj = record.args[0]
33 if getattr(event_obj, "method", None) == "SpeakerStatus":
34 return False
35 except IndexError, AttributeError:
36 pass
37 return True
38
39
40if TYPE_CHECKING:
41 from music_assistant_models.config_entries import ProviderConfig
42 from music_assistant_models.provider import ProviderManifest
43
44 from music_assistant.mass import MusicAssistant
45 from music_assistant.models import ProviderInstanceType
46
47
48async def setup(
49 mass: MusicAssistant, manifest: ProviderManifest, config: ProviderConfig
50) -> ProviderInstanceType:
51 """
52 Set up and return a new Samsung WAM provider instance.
53
54 :param mass: The MusicAssistant instance.
55 :param manifest: The provider manifest.
56 :param config: The provider configuration.
57 :return: The initialized provider instance.
58 """
59 prov = SamsungWamProvider(mass, manifest, config)
60
61 # Suppress high-frequency SpeakerStatus events from pywam unless verbose logging is enabled
62 pywam_events_logger = logging.getLogger("pywam.events")
63 if not any(isinstance(f, SpeakerStatusFilter) for f in pywam_events_logger.filters):
64 pywam_events_logger.addFilter(SpeakerStatusFilter(prov.logger))
65
66 # Configure dependency log levels to match the provider's configured verbosity
67 if prov.logger.isEnabledFor(VERBOSE_LOG_LEVEL):
68 logging.getLogger("pywam").setLevel(logging.DEBUG)
69 elif prov.logger.isEnabledFor(logging.DEBUG):
70 logging.getLogger("pywam").setLevel(logging.DEBUG)
71 logging.getLogger("pywam.client").setLevel(logging.INFO)
72 else:
73 logging.getLogger("pywam").setLevel(logging.CRITICAL)
74
75 return prov
76
77
78__all__ = ["setup"]
79