222 .ChunkException("Failed due to stream error, code: {}".format(stream_error))
223
224
225class AudioKeyManager(PacketsReceiver, Closeable):226 audio_key_request_timeout = 20
227 logger = logging.getLogger("Librespot:AudioKeyManager")
228 __callbacks: typing.Dict[int, Callback] = {}
11import urllib.parse
12
13
14class DeviceStateHandler(Closeable, MessageListener, RequestListener): 15 logger = logging.getLogger("Librespot:DeviceStateHandler")
16 __closing = False
17 __connection_id: str = None
11import urllib.parse
12
13
14class DeviceStateHandler(Closeable, MessageListener, RequestListener): 15 logger = logging.getLogger("Librespot:DeviceStateHandler")
16 __closing = False
17 __connection_id: str = None
36import websocket
37
38
39class ApiClient(Closeable): 40 logger = logging.getLogger("Librespot:ApiClient")
41 __base_url: str
42 __session: Session
A method marked with @abstractmethod
is not defined in the concrete class. This can result in unintended behavior.
It is recommended to implement all abstract methods in the derived classes.
from abc import ABC, abstractmethod
class Vehicle(ABC):
@abstractmethod
def start():
pass
class Car(Vehicle):
# No overridden `start` method here. Can cause unintended behavior
def stop():
self.speed = 0
from abc import ABC, abstractmethod
class Vehicle(ABC):
@abstractmethod
def start():
pass
class Car(Vehicle):
def start():
self.speed = 3
def stop():
self.speed = 0