3 from django.conf import settings
4 from django.contrib import messages
5 from django.contrib.auth.forms import AuthenticationForm
6 from django.core.urlresolvers import reverse
7 from django.db.models import Q
8 from django.http import HttpResponseNotAllowed, HttpResponseRedirect, JsonResponse
9 from django.utils.translation import ugettext_lazy as _
10 from django.views.generic.base import TemplateView
12 from panikdb.context_processors import internal_ip
14 from emissions.models import Nonstop
15 from nonstop.models import Track, SomaLogLine
17 from .models import PigeEmailRequest
20 def is_internal(request):
21 return internal_ip(request).get('internal_ip')
24 class RegieHome(TemplateView):
25 template_name = 'regie-home.html'
27 def get_context_data(self, **kwargs):
28 context = super().get_context_data(**kwargs)
29 context['login_form'] = AuthenticationForm()
30 if settings.PIGE_DOWNLOAD_BASE_URL:
31 context['has_pige'] = True
32 context['pige_minimum_date'] = datetime.datetime.now() - datetime.timedelta(days=100)
33 context['pige_hours'] = ['%02d' % x for x in range(24)]
34 context['pige_minutes'] = ['%02d' % x for x in range(0, 60, 15)]
38 regie_home = RegieHome.as_view()
41 def pige_post(request, *args, **kwargs):
42 if request.method != 'POST':
43 return HttpResponseNotAllowed(['POST'])
44 # studio2-20160515-13h45-14h00m05.flac
45 name = '%(src)s-%(date)s-%(start_hour)sh%(start_min)s-%(end_hour)sh%(end_min)s' % request.POST
46 if is_internal(request):
50 if 'sendmail' in request.POST:
51 email = request.POST['email']
52 PigeEmailRequest.objects.create(email=email, download_spec=name)
53 messages.info(request, _('An email with a download link will soon be sent to %s.') % email)
54 return HttpResponseRedirect(reverse('regie-home'))
55 else: # direct download
56 return HttpResponseRedirect(settings.PIGE_DOWNLOAD_BASE_URL + '/' + name)
59 def json_tracks(tracks):
60 return JsonResponse({'data': [
64 'artist': track.artist.name if track.artist_id else None,
65 'instru': track.instru,
66 'language': track.language,
67 'duration': '%d:%02d' % (
68 track.duration.total_seconds() / 60,
69 track.duration.total_seconds() % 60),
70 } for track in tracks]})
73 def regie_tracks(request):
74 now = datetime.datetime.now()
76 for nonstop in Nonstop.objects.all():
77 if (nonstop.start < nonstop.end and (
78 now.time() >= nonstop.start and now.time() < nonstop.end)) or \
79 (nonstop.start > nonstop.end and (
80 now.time() >= nonstop.start or now.time() < nonstop.end)):
81 current_zone = nonstop
84 tracks = Track.objects.filter(duration__isnull=False)
85 tracks = tracks.filter(duration__gte=datetime.timedelta(minutes=2, seconds=30))
86 tracks = tracks.filter(duration__lt=datetime.timedelta(minutes=4, seconds=30))
88 tracks = tracks.filter(nonstop_zones__in=[current_zone.id])
89 tracks = tracks.exclude(language__isnull=True).exclude(language='')
90 tracks = tracks.order_by('?')
91 return json_tracks(tracks[:5])
94 def regie_tracks_search(request):
96 tracks = Track.objects.filter(
97 duration__isnull=False).filter(
98 Q(title__icontains=q.lower()) | Q(artist__name__icontains=q.lower()))
99 tracks = tracks.order_by('?')
100 return json_tracks(tracks[:5])
103 def playing(request):
104 latest_played = SomaLogLine.objects.select_related('track', 'track__artist').latest('play_timestamp')
105 duration = latest_played.track.duration
106 elapsed = datetime.datetime.now() - latest_played.play_timestamp
107 remaining = duration - elapsed
108 if remaining.total_seconds() < 2:
109 return JsonResponse({})
110 elif remaining.total_seconds() < 0:
111 remaining = datetime.timedelta(seconds=0)
113 if latest_played.track.artist:
114 response['artist'] = latest_played.track.artist.name
115 response['title'] = latest_played.track.title
116 response['duration'] = duration.seconds
117 response['elapsed'] = int(elapsed.total_seconds())
118 return JsonResponse(response)