Provide an annotate string directly if requested.
This commit is contained in:
parent
e7d30d7f3b
commit
568b3f2f66
4 changed files with 82 additions and 0 deletions
52
savepointradio/api/renderers.py
Normal file
52
savepointradio/api/renderers.py
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
from rest_framework import renderers
|
||||||
|
|
||||||
|
from core.utils import beautify_artists, clean_quotes
|
||||||
|
|
||||||
|
|
||||||
|
ANNOTATE_FORMAT = (
|
||||||
|
'annotate:req_id="{}",'
|
||||||
|
'type="{}",'
|
||||||
|
'artist="{}",'
|
||||||
|
'title="{}",'
|
||||||
|
'game="{}",'
|
||||||
|
'replay_gain="{}":{}'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def build_annotate_string(request_obj):
|
||||||
|
'''
|
||||||
|
Takes the song request object and returns a Liquidsoap annotate string
|
||||||
|
from the attributes.
|
||||||
|
'''
|
||||||
|
song = request_obj['song']
|
||||||
|
if song['song_type'] == 'J':
|
||||||
|
artist = settings.RADIO_NAME
|
||||||
|
title = 'Jingle'
|
||||||
|
game = settings.RADIO_NAME
|
||||||
|
else:
|
||||||
|
artist = beautify_artists(song['artists'])
|
||||||
|
title = clean_quotes(song['title'])
|
||||||
|
game = clean_quotes(song['game'])
|
||||||
|
return ANNOTATE_FORMAT.format(
|
||||||
|
request_obj['id'],
|
||||||
|
song['song_type'],
|
||||||
|
artist,
|
||||||
|
title,
|
||||||
|
game,
|
||||||
|
song['replaygain'],
|
||||||
|
song['path']
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class LiquidsoapAnnotateRenderer(renderers.BaseRenderer):
|
||||||
|
'''
|
||||||
|
Custom renderer to accept and respond with an "annotate" string
|
||||||
|
specific to Liquidsoap requests.
|
||||||
|
'''
|
||||||
|
media_type = 'application/vnd.liquidsoap.annotate'
|
||||||
|
format = 'txt'
|
||||||
|
|
||||||
|
def render(self, data, media_type=None, renderer_context=None):
|
||||||
|
return data.encode(self.charset)
|
|
@ -6,6 +6,7 @@ from rest_framework.authentication import (SessionAuthentication,
|
||||||
TokenAuthentication)
|
TokenAuthentication)
|
||||||
from rest_framework.generics import RetrieveAPIView
|
from rest_framework.generics import RetrieveAPIView
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
|
from rest_framework.renderers import BrowsableAPIRenderer, JSONRenderer
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
|
|
||||||
|
@ -14,6 +15,7 @@ from profiles.exceptions import MakeRequestError
|
||||||
from profiles.models import RadioProfile, SongRequest
|
from profiles.models import RadioProfile, SongRequest
|
||||||
from radio.models import Song
|
from radio.models import Song
|
||||||
from ..permissions import IsDJ
|
from ..permissions import IsDJ
|
||||||
|
from ..renderers import build_annotate_string, LiquidsoapAnnotateRenderer
|
||||||
from ..serializers.controls import (JustPlayedSerializer,
|
from ..serializers.controls import (JustPlayedSerializer,
|
||||||
MakeRequestSerializer,
|
MakeRequestSerializer,
|
||||||
GetRequestSerializer)
|
GetRequestSerializer)
|
||||||
|
@ -51,6 +53,11 @@ class NextRequest(RetrieveAPIView):
|
||||||
authentication_classes = [TokenAuthentication]
|
authentication_classes = [TokenAuthentication]
|
||||||
permission_classes = [IsDJ]
|
permission_classes = [IsDJ]
|
||||||
queryset = SongRequest.objects.all()
|
queryset = SongRequest.objects.all()
|
||||||
|
renderer_classes = [
|
||||||
|
JSONRenderer,
|
||||||
|
BrowsableAPIRenderer,
|
||||||
|
LiquidsoapAnnotateRenderer
|
||||||
|
]
|
||||||
serializer = GetRequestSerializer
|
serializer = GetRequestSerializer
|
||||||
|
|
||||||
def retrieve(self, request):
|
def retrieve(self, request):
|
||||||
|
@ -74,6 +81,10 @@ class NextRequest(RetrieveAPIView):
|
||||||
next_play.save(update_fields=['queued_at'])
|
next_play.save(update_fields=['queued_at'])
|
||||||
|
|
||||||
serializer = GetRequestSerializer(next_play, many=False)
|
serializer = GetRequestSerializer(next_play, many=False)
|
||||||
|
|
||||||
|
media_type = request.accepted_renderer.media_type
|
||||||
|
if media_type == 'application/vnd.liquidsoap.annotate':
|
||||||
|
return Response(build_annotate_string(serializer.data))
|
||||||
return Response(serializer.data)
|
return Response(serializer.data)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -191,3 +191,20 @@ def iri_to_path(iri):
|
||||||
return '\\' + url2ntpathname('/' + parse.netloc + parse.path)
|
return '\\' + url2ntpathname('/' + parse.netloc + parse.path)
|
||||||
return url2ntpathname(parse.path)
|
return url2ntpathname(parse.path)
|
||||||
return url2pathname(urlparse(uri).path)
|
return url2pathname(urlparse(uri).path)
|
||||||
|
|
||||||
|
|
||||||
|
def clean_quotes(unclean_string):
|
||||||
|
'''
|
||||||
|
Escapes quotes for use in the Liquidsoap parser.
|
||||||
|
'''
|
||||||
|
return unclean_string.replace('"', '\\"')
|
||||||
|
|
||||||
|
|
||||||
|
def beautify_artists(artists):
|
||||||
|
'''
|
||||||
|
Turns a list of one or more artists into a proper English listing.
|
||||||
|
'''
|
||||||
|
output = ', '
|
||||||
|
if len(artists) == 2:
|
||||||
|
output = ' & '
|
||||||
|
return clean_quotes(output.join(artists))
|
||||||
|
|
|
@ -145,3 +145,5 @@ REST_FRAMEWORK = {
|
||||||
RADIO_DJ_EMAIL = config('RADIO_DJ_EMAIL', default='dj@radiostation.net')
|
RADIO_DJ_EMAIL = config('RADIO_DJ_EMAIL', default='dj@radiostation.net')
|
||||||
|
|
||||||
RADIO_DJ_NAME = config('RADIO_DJ_NAME', default='DJ Reinhardt')
|
RADIO_DJ_NAME = config('RADIO_DJ_NAME', default='DJ Reinhardt')
|
||||||
|
|
||||||
|
RADIO_NAME = config('RADIO_NAME', default='Django Unstringed')
|
||||||
|
|
Loading…
Reference in a new issue