From: Frédéric Péters Date: Sun, 14 Jun 2020 08:08:52 +0000 (+0200) Subject: handle mix deliveries X-Git-Url: https://git.0d.be/?p=django-panik-nonstop.git;a=commitdiff_plain;h=e5d72e6b9b0ce1cd2e7b40da4cdf71f6e24cc0d2 handle mix deliveries --- diff --git a/nonstop/management/commands/stamina.py b/nonstop/management/commands/stamina.py index e376b89..57fdc06 100644 --- a/nonstop/management/commands/stamina.py +++ b/nonstop/management/commands/stamina.py @@ -6,7 +6,7 @@ import signal from django.core.management.base import BaseCommand from emissions.models import Nonstop -from nonstop.models import Track, ScheduledDiffusion, RecurringStreamOccurence +from nonstop.models import Track, ScheduledDiffusion, RecurringStreamOccurence, RecurringRandomDirectoryOccurence class Command(BaseCommand): @@ -117,14 +117,25 @@ class Command(BaseCommand): self.playhead += 1 elif slot.is_stream(): print(now, 'playing stream', slot.stream) - # TODO: jingle + if slot.get_jingle_filepath(): + cmd = 'sleep 15 # jingle %s' % slot.get_jingle_filepath() + await self.player_process(cmd, timeout=60) cmd = 'sleep 86400 # stream' # will never stop by itself print('timeout at', (slot.end_datetime - now).total_seconds()) await self.player_process(cmd, timeout=(slot.end_datetime - now).total_seconds()) else: - print(now, 'playing sound', slot.episode) - # TODO: jingle - cmd = 'sleep %s # %s' % (slot.soundfile.duration, slot.episode) + if hasattr(slot, 'episode'): + print(now, 'playing sound', slot.episode) + else: + print(now, 'playing random') + if slot.get_jingle_filepath(): + cmd = 'sleep 15 # jingle %s' % slot.get_jingle_filepath() + await self.player_process(cmd, timeout=60) + filepath = slot.get_sound_filepath() + if hasattr(slot, 'soundfile'): + cmd = 'sleep %s # %s' % (slot.soundfile.duration, filepath) + else: + cmd = 'sleep %s # %s' % (45 * 60, filepath) await self.player_process(cmd) def recompute_playlist(self): @@ -143,12 +154,17 @@ class Command(BaseCommand): occurence = RecurringStreamOccurence.objects.filter( datetime__gt=now - datetime.timedelta(days=1), datetime__lt=now).order_by('datetime').last() - # note it shouldn't be possible to have both diffusion and occurence + directory_occurence = RecurringRandomDirectoryOccurence.objects.filter( + datetime__gt=now - datetime.timedelta(days=1), + datetime__lt=now).order_by('datetime').last() + # note it shouldn't be possible to have both diffusion and occurences # running at the moment. if occurence and occurence.end_datetime > now: return occurence if diffusion and diffusion.end_datetime > now: return diffusion + if directory_occurence and directory_occurence.end_datetime > now: + return directory_occurence return None def get_next_diffusion(self, before_datetime): @@ -161,12 +177,18 @@ class Command(BaseCommand): datetime__gt=now, datetime__lt=before_datetime, ).order_by('datetime').first() + directory_occurence = RecurringRandomDirectoryOccurence.objects.filter( + datetime__gt=now, + datetime__lt=before_datetime, + ).order_by('datetime').first() if diffusion and occurence: return diffusion if diffusion.diffusion__datetime < occurence.datetime else occurence if diffusion: return diffusion if occurence: return occurence + if directory_occurence: + return directory_occurence return None def recompute_slots(self): diff --git a/nonstop/models.py b/nonstop/models.py index f7b034c..3b58480 100644 --- a/nonstop/models.py +++ b/nonstop/models.py @@ -1,7 +1,6 @@ import datetime import os - -import mutagen +import random from django.conf import settings from django.core.urlresolvers import reverse @@ -276,6 +275,13 @@ class ScheduledDiffusion(models.Model): def is_stream(self): return bool(self.stream_id) + def get_jingle_filepath(self): + return self.jingle.get_local_filepath() if self.jingle_id else None + + def get_sound_filepath(self): + # TODO, copy and stuff + return self.soundfile.file.path + class NonstopZoneSettings(models.Model): nonstop = models.ForeignKey('emissions.Nonstop', on_delete=models.CASCADE) @@ -315,6 +321,9 @@ class RecurringStreamOccurence(models.Model): def is_stream(self): return True + def get_jingle_filepath(self): + return self.diffusion.jingle.get_local_filepath() if self.diffusion.jingle_id else None + class RecurringRandomDirectoryDiffusion(models.Model): # between soundfiles and nonstop zones, this is used for the "mix @@ -332,6 +341,24 @@ class RecurringRandomDirectoryOccurence(models.Model): diffusion = models.ForeignKey(RecurringRandomDirectoryDiffusion, on_delete=models.CASCADE) datetime = models.DateTimeField(_('Date/time'), db_index=True) + @property + def duration(self): + return self.diffusion.schedule.get_duration() * 60 + + @property + def end_datetime(self): + return self.datetime + datetime.timedelta(minutes=self.diffusion.schedule.get_duration()) + + def is_stream(self): + return False + + def get_jingle_filepath(self): + return self.diffusion.jingle.get_local_filepath() if self.diffusion.jingle_id else None + + def get_sound_filepath(self): + directory = self.diffusion.directory + return os.path.join(directory, random.choice(os.listdir(directory))) + @receiver(post_delete) def remove_soundfile(sender, instance=None, **kwargs):