Source code for radioco.apps.api.recorder_views

import datetime
import json

from django.conf import settings
from django.contrib.auth.decorators import user_passes_test
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from django.utils import timezone
from django.utils.translation import ugettext as _
from rest_framework.authentication import BasicAuthentication, TokenAuthentication
from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.permissions import IsAuthenticated

from radioco.apps.global_settings.models import PodcastConfiguration
from radioco.apps.programmes.models import Episode, Programme, Podcast
from radioco.apps.radioco.tz_utils import transform_dt_to_default_tz
from radioco.apps.schedules.models import Schedule, Transmission


[docs]def check_recorder_program(user): return user.username == settings.USERNAME_RADIOCO_RECORDER
@api_view(['GET']) @authentication_classes((BasicAuthentication, TokenAuthentication)) @permission_classes((IsAuthenticated,)) @user_passes_test(check_recorder_program)
[docs]def recording_schedules(request): podcast_config = PodcastConfiguration.get_global() default_tz = timezone.get_default_timezone() start = default_tz.localize(datetime.datetime.strptime(request.GET.get('start'), '%Y-%m-%d %H:%M:%S')) next_hours = int(request.GET.get("next_hours") or podcast_config.next_events) json_list = [] next_transmissions = Transmission.between( start, start + datetime.timedelta(hours=next_hours), schedules=Schedule.objects.filter(calendar__is_active=True, type='L') ) for transmission in next_transmissions: try: episode = Episode.objects.get(issue_date=transmission.start, programme=transmission.programme) except Episode.DoesNotExist: episode = Episode.objects.create_episode(transmission.start, transmission.programme) issue_date = transform_dt_to_default_tz(transmission.start) start_dt = issue_date + datetime.timedelta(seconds=podcast_config.start_delay) duration = transmission.schedule.runtime.seconds - podcast_config.start_delay - podcast_config.end_delay json_entry = { 'id': transmission.programme.id, 'issue_date': issue_date.strftime('%Y-%m-%d %H-%M-%S'), 'start': start_dt.strftime('%Y-%m-%d %H-%M-%S'), 'duration': str(duration), 'genre': transmission.programme.get_category_display(), 'programme_name': transmission.programme.slug, 'title': episode.title, 'author': transmission.programme.name, 'album': _('Season') + ' ' + str(episode.season), 'track': episode.number_in_season } json_list.append(json_entry) return HttpResponse(json.dumps(json_list), content_type='application/json')
@api_view(['GET']) @authentication_classes((BasicAuthentication, TokenAuthentication)) @permission_classes((IsAuthenticated,)) @user_passes_test(check_recorder_program)
[docs]def submit_recorder(request): podcast_config = PodcastConfiguration.get_global() default_tz = timezone.get_default_timezone() programme_id = int(request.GET.get('programme_id')) programme = get_object_or_404(Programme, id=programme_id) date = default_tz.localize(datetime.datetime.strptime(request.GET.get('date'), '%Y-%m-%d %H-%M-%S')) file_name = request.GET.get('file_name') mime_type = request.GET.get('mime_type') length = int(request.GET.get('length')) url = podcast_config.url_source + file_name try: episode = Episode.objects.select_related('programme').get(issue_date=date, programme=programme) except Episode.DoesNotExist: # This shouldn't happen, we are creating episodes when the recorder ask for programmes to record episode = Episode.objects.create_episode(date, programme) duration = episode.programme._runtime try: # Podcast can exist but it should have the same values # DECISION: overwrite values podcast = Podcast.objects.get(episode=episode) podcast.url = url podcast.mime_type = mime_type podcast.length = length podcast.duration = duration podcast.save() except Podcast.DoesNotExist: Podcast.objects.create(episode=episode, url=url, mime_type=mime_type, length=length, duration=duration) return HttpResponse()