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):
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):
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):
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):
import datetime
import os
-
-import mutagen
+import random
from django.conf import settings
from django.core.urlresolvers import reverse
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)
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
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):