]> git.0d.be Git - django-panik-nonstop.git/commitdiff
add play button for everybody, transcoding 1st minute
authorFrédéric Péters <fpeters@0d.be>
Wed, 5 Aug 2020 09:51:32 +0000 (11:51 +0200)
committerFrédéric Péters <fpeters@0d.be>
Wed, 5 Aug 2020 09:52:58 +0000 (11:52 +0200)
nonstop/templates/nonstop/track_detail.html
nonstop/templates/nonstop/tracks_metadata.html
nonstop/urls.py
nonstop/views.py

index 70eaac73d7d323b3029c50cc9ee874e480b4b34e..22f321e42d006234539df73ac9a442b055118a9d 100644 (file)
 </div>
 {% endif %}
 
+{% if object.file_exists %}
+<audio preload="none" src="{% url "nonstop-track-sound" pk=object.id %}" controls></audio>
+{% endif %}
+
 {% if object.recent_diffusions %}
 <div class="section">
+
 <ul class="soma-list">
     {% for somalog in object.recent_diffusions|slice:":20" %}
         <li><span class="timestamp">{{ somalog.play_timestamp|date:"d/m/Y H:i" }}</span>:
@@ -38,9 +43,6 @@
 
 {% block sidebar %}
 <aside id="sidebar">
-{% if internal_ip and object.file_exists%}
-<audio src="{{object.file_path}}" controls></audio>
-{% endif %}
 
 <h3>{% trans "Metadata" %}</h3>
 
index 0e38ab54d68fe219c2ffb447da001bede34682be..6602c236b297f37cb64ac727315349811612a81c 100644 (file)
@@ -32,6 +32,9 @@
  <td class="instru"><input type="checkbox" name="instru-{{track.id}}" {% if track.instru %}checked{% endif %}></td>
  <td class="sabam"><input type="checkbox" name="sabam-{{track.id}}" {% if track.sabam %}checked{% endif %}></td>
  <td class="cfwb"><input type="checkbox" name="cfwb-{{track.id}}" {% if track.cfwb %}checked{% endif %}></td>
+ {% if track.file_exists %}
+ <td><button class="play-track" data-url="{% url "nonstop-track-sound" pk=track.id %}">⏵</button>
+ {% endif %}
 </tr>
 {% endfor %}
 </tbody>
 </form>
 
 <script>
+var audio = null;
+
+$('button.play-track').on('click', function() {
+  if (audio) { audio.pause(); }
+  audio = new Audio($(this).data('url'));
+  audio.play();
+  return false;
+});
+
 $('table#edit-metadata th').on('click', function() {
   var propvalue = true;
   if ($(this)[0].className == 'sabam') propvalue = false;
index c9d320e9e1bbd63f6e26d43cf046a5aad9ae1187..f4fccd7e7701d75f4279161b74e3f1c02def7d4a 100644 (file)
@@ -8,7 +8,7 @@ from .views import (SomaDayArchiveView, SomaDayArchiveCsvView, RedirectTodayView
         QuickLinksView, SearchView, CleanupView, ArtistTracksMetadataView,
         SearchCsvView, AddSomaDiffusionView, DelSomaDiffusionView,
         DiffusionPropertiesView, AjaxProgram, ZonesView, ZoneSettings,
-        jingle_audio_view,
+        jingle_audio_view, track_sound,
         MuninTracks)
 
 urlpatterns = [
@@ -17,6 +17,7 @@ urlpatterns = [
 
     url(r'^stats/$', StatisticsView.as_view(), name='nonstop-stats'),
     url(r'^tracks/(?P<pk>\d+)/$', TrackDetailView.as_view(), name='track-view'),
+    url(r'^tracks/(?P<pk>\d+)/sound/$', track_sound, name='nonstop-track-sound'),
     url(r'^artists/$', ArtistListView.as_view(), name='artist-list'),
     url(r'^artists/(?P<pk>\d+)/$', ArtistDetailView.as_view(), name='artist-view'),
 
index 6544b5d059c1aad169e0559936cb6d4165656923..82f1f00bd58342246b719b21dba68695151c846d 100644 (file)
@@ -2,10 +2,12 @@ import copy
 import csv
 import datetime
 import os
+import subprocess
 import tempfile
 
 import mutagen
 
+from django.conf import settings
 from django.core.exceptions import PermissionDenied
 from django.core.files.storage import default_storage
 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
@@ -89,6 +91,34 @@ class TrackDetailView(DetailView):
         return HttpResponseRedirect('.')
 
 
+def track_sound(request, pk):
+    try:
+        track = Track.objects.get(id=pk)
+    except Track.DoesNotExist:
+        raise Http404()
+    if not track.file_exists():
+        raise Http404()
+    file_path = track.file_path()
+    remote_ip = (request.META.get('HTTP_X_FORWARDED_FOR') or
+            request.META.get('HTTP_X_REAL_IP') or
+            request.META.get('REMOTE_ADDR'))
+    if remote_ip in settings.INTERNAL_IPS:
+        # local user
+        return FileResponse(open(file_path, 'rb'))
+    # remote user, transcode and serve first minute
+    cmd = subprocess.run([
+        'ffmpeg',
+        '-loglevel', 'quiet',
+        '-t', '60',  # 60 seconds
+        '-y',
+        '-i', file_path,
+        '-f', 'opus',
+        '-b:a', '64000',
+        '-',  # send to stdout
+        ], capture_output=True)
+    return HttpResponse(cmd.stdout, content_type='audio/opus')
+
+
 class ArtistDetailView(DetailView):
     model = Artist