]> git.0d.be Git - django-panik-nonstop.git/commitdiff
handle mix deliveries
authorFrédéric Péters <fpeters@0d.be>
Sun, 14 Jun 2020 08:08:52 +0000 (10:08 +0200)
committerFrédéric Péters <fpeters@0d.be>
Thu, 2 Jul 2020 08:01:29 +0000 (10:01 +0200)
nonstop/management/commands/stamina.py
nonstop/models.py

index e376b89ba0a42f88aa7c604c7a642d931c1e609b..57fdc06fa484ef574d00b5bdc5b8305fdd722350 100644 (file)
@@ -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):
index f7b034cebd86078027a8e44ac3fd2d4cfbea6252..3b58480a0f662e7c439b79730fefcb569b9d3686 100644 (file)
@@ -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):