import logging import tzlocal from django.utils import timezone as tz from django.utils.translation import gettext_lazy as _ __all__ = ( "Metadata", "Request", ) local_tz = tzlocal.get_localzone() logger = logging.getLogger("aircox") # FIXME liquidsoap does not manage timezones -- we have to convert # 'on_air' metadata we get from it into utc one in order to work # correctly. class Metadata: """Base class for handling request metadata.""" controller = None """Controller.""" rid = None """Request id.""" uri = None """Request uri.""" status = None """Current playing status.""" request_status = None """Requests' status.""" air_time = None """Launch datetime.""" def __init__(self, controller=None, rid=None, data=None): self.controller = controller self.rid = rid if data is not None: self.validate(data) @property def is_playing(self): """True if the source is playing.""" # FIXME: validate on controller's current source? return self.status == "playing" @property def status_verbose(self): """Verbose version of self's status (translated string).""" status = self.validate_status(self.status) return _(status) if status else "" def fetch(self): data = self.controller.send("request.metadata ", self.rid, parse=True) if data: self.validate(data) def validate_status(self, status): """Return correct status for this metadata based on provided one and controller. :returns: status string """ on_air = self.controller.source if "playing" and on_air and (on_air == self or on_air.rid == self.rid): return "playing" elif status in ("paused", "playing"): return "paused" else: return "stopped" def validate_air_time(self, air_time): if air_time: air_time = tz.datetime.strptime(air_time, "%Y/%m/%d %H:%M:%S") return local_tz.localize(air_time) def validate(self, data): """Validate provided data and set as attribute (must already be declared)""" for key, value in data.items(): if hasattr(self, key) and not callable(getattr(self, key)): setattr(self, key, value) self.uri = data.get("initial_uri") self.air_time = self.validate_air_time(data.get("on_air")) self.status = self.validate_status(data.get("status")) self.request_status = data.get("status") class Request(Metadata): title = None artist = None