last sound logs + assets

This commit is contained in:
bkfox
2022-05-21 19:11:56 +02:00
parent 59d5a1c3dc
commit a87b9c7e72
3 changed files with 35 additions and 23 deletions

View File

@ -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)