]> git.0d.be Git - panikdb.git/blob - panikdb/regie/views.py
1197bfdf228edbd9a42dd407f355b22a310b6584
[panikdb.git] / panikdb / regie / views.py
1 import datetime
2
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
11
12 from panikdb.context_processors import internal_ip
13
14 from emissions.models import Nonstop
15 from nonstop.models import Track, SomaLogLine
16
17 from .models import PigeEmailRequest
18
19
20 def is_internal(request):
21     return internal_ip(request).get('internal_ip')
22
23
24 class RegieHome(TemplateView):
25     template_name = 'regie-home.html'
26
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)]
35         return context
36
37
38 regie_home = RegieHome.as_view()
39
40
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):
47         name = name + '.wav'
48     else:
49         name = name + '.ogg'
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)
57
58
59 def json_tracks(tracks):
60     return JsonResponse({'data': [
61         {
62             'id': track.id,
63             'title': track.title,
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]})
71
72
73 def regie_tracks(request):
74     now = datetime.datetime.now()
75     current_zone = None
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
82             break
83
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))
87     if current_zone:
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])
92
93
94 def regie_tracks_search(request):
95     q = request.GET['q']
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])
101
102
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)
112     response = {}
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)