Added better jingle functionality.
This commit is contained in:
parent
efcb00c0ec
commit
3a3881f661
3 changed files with 68 additions and 9 deletions
|
@ -64,19 +64,17 @@ class NextRequest(RetrieveAPIView):
|
|||
def retrieve(self, request):
|
||||
dj_profile = RadioProfile.objects.get(user__is_dj=True)
|
||||
|
||||
limit = radio_settings['general__songs_per_jingle']
|
||||
queued_songs = SongRequest.music.get_queued_requests(limit)
|
||||
if [j for j in queued_songs if j.song.is_jingle]:
|
||||
if SongRequest.music.should_play_jingle():
|
||||
random_jingle = Song.music.get_random_jingle()
|
||||
next_request = SongRequest.objects.create(profile=dj_profile,
|
||||
song=random_jingle)
|
||||
else:
|
||||
if not SongRequest.music.new_requests().exists():
|
||||
random_song = Song.music.get_random_requestable_song()
|
||||
next_request = SongRequest.objects.create(profile=dj_profile,
|
||||
song=random_song)
|
||||
else:
|
||||
next_request = SongRequest.music.next_request()
|
||||
else:
|
||||
random_jingle = Song.music.get_random_jingle()
|
||||
next_request = SongRequest.objects.create(profile=dj_profile,
|
||||
song=random_jingle)
|
||||
|
||||
next_request.queued_at = timezone.now()
|
||||
next_request.save(update_fields=['queued_at'])
|
||||
|
|
|
@ -1,11 +1,16 @@
|
|||
from django.forms import ValidationError
|
||||
from django.utils import timezone
|
||||
|
||||
from dynamic_preferences.types import FloatPreference, IntegerPreference
|
||||
from dynamic_preferences.types import (
|
||||
BooleanPreference, ChoicePreference, DurationPreference,
|
||||
FloatPreference, IntegerPreference
|
||||
)
|
||||
from dynamic_preferences.preferences import Section
|
||||
from dynamic_preferences.registries import global_preferences_registry
|
||||
|
||||
|
||||
general = Section('general')
|
||||
jingles = Section('jingles')
|
||||
replay = Section('replay')
|
||||
|
||||
|
||||
|
@ -27,8 +32,30 @@ class MaxSongRequests(IntegerPreference):
|
|||
|
||||
|
||||
@global_preferences_registry.register
|
||||
class SongsPerJingle(IntegerPreference):
|
||||
class JinglesEnabled(BooleanPreference):
|
||||
section = general
|
||||
name = 'jingles_enabled'
|
||||
help_text = 'Enable jingle functionality for the radio.'
|
||||
default = False
|
||||
required = False
|
||||
|
||||
|
||||
@global_preferences_registry.register
|
||||
class JinglesFunction(ChoicePreference):
|
||||
section = jingles
|
||||
name = 'jingles_function'
|
||||
help_text = 'The function to determine when jingles are played.'
|
||||
choices = [
|
||||
('after_songs', 'After so many songs are played'),
|
||||
('after_time', 'After so much time has passed'),
|
||||
]
|
||||
default = 'after_songs'
|
||||
required = True
|
||||
|
||||
|
||||
@global_preferences_registry.register
|
||||
class SongsPerJingle(IntegerPreference):
|
||||
section = jingles
|
||||
name = 'songs_per_jingle'
|
||||
help_text = 'The amount of songs that will be played between jingles.'
|
||||
default = 30
|
||||
|
@ -39,6 +66,15 @@ class SongsPerJingle(IntegerPreference):
|
|||
raise ValidationError('Must be greater than 0.')
|
||||
|
||||
|
||||
@global_preferences_registry.register
|
||||
class TimeBeforeJingle(DurationPreference):
|
||||
section = jingles
|
||||
name = 'time_before_jingle'
|
||||
help_text = 'The amount of time before a jingle is played.'
|
||||
default = timezone.timedelta(hours=1)
|
||||
required = True
|
||||
|
||||
|
||||
@global_preferences_registry.register
|
||||
class ReplayRatio(FloatPreference):
|
||||
section = replay
|
||||
|
|
|
@ -1,4 +1,10 @@
|
|||
from django.db import models
|
||||
from django.utils import timezone
|
||||
|
||||
from dynamic_preferences.registries import global_preferences_registry
|
||||
|
||||
|
||||
radio_settings = global_preferences_registry.manager()
|
||||
|
||||
|
||||
class RequestManager(models.Manager):
|
||||
|
@ -34,3 +40,22 @@ class RequestManager(models.Manager):
|
|||
|
||||
def next_request(self):
|
||||
return self.new_requests().earliest('created_date')
|
||||
|
||||
def should_play_jingle(self):
|
||||
if radio_settings['general__jingles_enabled']:
|
||||
function = radio_settings['jingles__jingles_function']
|
||||
if function == 'after_songs':
|
||||
limit = radio_settings['jingles__songs_per_jingle']
|
||||
queued_songs = self.get_queued_requests(limit)
|
||||
if not [j for j in queued_songs if j.song.is_jingle]:
|
||||
return True
|
||||
elif function == 'after_time':
|
||||
now = timezone.now()
|
||||
delta = radio_settings['jingles__time_before_jingle']
|
||||
earlier = now - delta
|
||||
queued_songs = self.get_queued_requests().filter(
|
||||
queued_at__range=(earlier, now)
|
||||
)
|
||||
if not [j for j in queued_songs if j.song.is_jingle]:
|
||||
return True
|
||||
return False
|
||||
|
|
Loading…
Reference in a new issue