]> git.0d.be Git - django-panik-nonstop.git/commitdiff
handle recurring streamed diffusions
authorFrédéric Péters <fpeters@0d.be>
Thu, 21 May 2020 07:30:49 +0000 (09:30 +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 5beb556321d9a14bba8ad3f4b11ab903a0ad6671..789e4a50d99a119f06da5a6aa6700ca2f7c41138 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
+from nonstop.models import Track, ScheduledDiffusion, RecurringStreamOccurence
 
 
 class Command(BaseCommand):
@@ -134,13 +134,45 @@ class Command(BaseCommand):
         if playlist:
             self.playlist[self.playhead + 1:] = playlist
 
-    def recompute_slots(self):
+    def get_current_diffusion(self):
         now = datetime.datetime.now()
-        # print(now, 'recompute_slots')
         diffusion = ScheduledDiffusion.objects.filter(
                 diffusion__datetime__gt=now - datetime.timedelta(days=1),
-                diffusion__datetime__lt=now).last()
+                diffusion__datetime__lt=now).order_by('diffusion__datetime').last()
+        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
+        # running at the moment.
+        if occurence and occurence.end_datetime > now:
+            return occurence
         if diffusion and diffusion.end_datetime > now:
+            return diffusion
+        return None
+
+    def get_next_diffusion(self, before_datetime):
+        now = datetime.datetime.now()
+        diffusion = ScheduledDiffusion.objects.filter(
+                diffusion__datetime__gt=now,
+                diffusion__datetime__lt=before_datetime,
+                ).order_by('diffusion__datetime').first()
+        occurence = RecurringStreamOccurence.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
+        return None
+
+    def recompute_slots(self):
+        now = datetime.datetime.now()
+        # print(now, 'recompute_slots')
+        diffusion = self.get_current_diffusion()
+        if diffusion:
             self.slot = diffusion
         else:
             nonstops = list(Nonstop.objects.all().order_by('start'))
@@ -164,9 +196,7 @@ class Command(BaseCommand):
             if self.slot.end_datetime < self.slot.datetime:
                 self.slot.end_datetime += datetime.timedelta(days=1)
 
-            diffusion = ScheduledDiffusion.objects.filter(
-                diffusion__datetime__gt=now,
-                diffusion__datetime__lt=self.slot.end_datetime).first()
+            diffusion = self.get_next_diffusion(before_datetime=self.slot.end_datetime)
             if diffusion:
                 self.slot.end_datetime = diffusion.datetime
 
index 07d4ad339cef6f7b59e36979183a6222c8697483..f7b034cebd86078027a8e44ac3fd2d4cfbea6252 100644 (file)
@@ -300,6 +300,21 @@ class RecurringStreamOccurence(models.Model):
     diffusion = models.ForeignKey(RecurringStreamDiffusion, 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())
+
+    @property
+    def stream(self):
+        return self.diffusion.stream
+
+    def is_stream(self):
+        return True
+
 
 class RecurringRandomDirectoryDiffusion(models.Model):
     # between soundfiles and nonstop zones, this is used for the "mix