forked from rc/aircox
last sound logs + assets
This commit is contained in:
@ -55,7 +55,9 @@ class Monitor:
|
||||
sync_timeout = 5
|
||||
""" Timeout in minutes between two streamer's sync. """
|
||||
sync_next = None
|
||||
""" Datetime of the next sync """
|
||||
""" Datetime of the next sync. """
|
||||
last_sound_logs = None
|
||||
""" Last logged sounds, as ``{source_id: log}``. """
|
||||
|
||||
@property
|
||||
def station(self):
|
||||
@ -78,12 +80,21 @@ class Monitor:
|
||||
self.cancel_timeout = cancel_timeout
|
||||
self.__dict__.update(kwargs)
|
||||
self.logs = self.get_logs_queryset()
|
||||
self.init_last_sound_logs()
|
||||
|
||||
def get_logs_queryset(self):
|
||||
""" Return queryset to assign as `self.logs` """
|
||||
return self.station.log_set.select_related('diffusion', 'sound') \
|
||||
return self.station.log_set.select_related('diffusion', 'sound', 'track') \
|
||||
.order_by('-pk')
|
||||
|
||||
def init_last_sound_logs(self, key=None):
|
||||
""" Retrieve last logs and initialize `last_sound_logs` """
|
||||
logs = {}
|
||||
for source in self.streamer.sources:
|
||||
qs = self.logs.filter(source=source.id, sound__isnull=False)
|
||||
logs[source.id] = qs.first()
|
||||
self.last_sound_logs = logs
|
||||
|
||||
def monitor(self):
|
||||
""" Run all monitoring functions once. """
|
||||
if not self.streamer.is_ready:
|
||||
@ -122,36 +133,37 @@ class Monitor:
|
||||
self.handle_diffusions()
|
||||
self.sync()
|
||||
|
||||
__last_log_kwargs = None
|
||||
|
||||
def log(self, **kwargs):
|
||||
def log(self, source, **kwargs):
|
||||
""" Create a log using **kwargs, and print info """
|
||||
kwargs.setdefault('station', self.station)
|
||||
kwargs.setdefault('date', tz.now())
|
||||
|
||||
if self.__last_log_kwargs == kwargs:
|
||||
return
|
||||
|
||||
self.__last_log_kwargs = kwargs
|
||||
log = Log(**kwargs)
|
||||
log = Log(source=source, **kwargs)
|
||||
log.save()
|
||||
log.print()
|
||||
|
||||
if log.sound:
|
||||
self.last_sound_logs[source] = log
|
||||
return log
|
||||
|
||||
def trace_sound(self, source):
|
||||
""" Return on air sound log (create if not present). """
|
||||
air_uri, air_time = source.uri, source.air_time
|
||||
last_log = self.last_sound_logs.get(source.id)
|
||||
if last_log and last_log.sound.file.path == source.uri:
|
||||
return last_log
|
||||
|
||||
# FIXME: can be a sound played when no Sound instance? If not, remove
|
||||
# comment.
|
||||
# check if there is yet a log for this sound on the source
|
||||
log = self.logs.on_air().filter(
|
||||
Q(sound__file=air_uri) |
|
||||
# sound can be null when arbitrary sound file is played
|
||||
Q(sound__isnull=True, track__isnull=True, comment=air_uri),
|
||||
source=source.id,
|
||||
date__range=date_range(air_time, self.delay),
|
||||
).first()
|
||||
if log:
|
||||
return log
|
||||
# log = self.logs.on_air().filter(
|
||||
# Q(sound__file=air_uri) |
|
||||
# # sound can be null when arbitrary sound file is played
|
||||
# Q(sound__isnull=True, track__isnull=True, comment=air_uri),
|
||||
# source=source.id,
|
||||
# date__range=date_range(air_time, self.delay),
|
||||
# ).first()
|
||||
# if log:
|
||||
# return log
|
||||
|
||||
# get sound
|
||||
diff = None
|
||||
@ -185,7 +197,6 @@ class Monitor:
|
||||
pos = log.date + tz.timedelta(seconds=track.timestamp)
|
||||
if pos > now:
|
||||
break
|
||||
# log track on air
|
||||
self.log(type=Log.TYPE_ON_AIR, date=pos, source=log.source,
|
||||
track=track, comment=track)
|
||||
|
||||
|
Reference in New Issue
Block a user