</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>:
{% block sidebar %}
<aside id="sidebar">
-{% if internal_ip and object.file_exists%}
-<audio src="{{object.file_path}}" controls></audio>
-{% endif %}
<h3>{% trans "Metadata" %}</h3>
<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;
QuickLinksView, SearchView, CleanupView, ArtistTracksMetadataView,
SearchCsvView, AddSomaDiffusionView, DelSomaDiffusionView,
DiffusionPropertiesView, AjaxProgram, ZonesView, ZoneSettings,
- jingle_audio_view,
+ jingle_audio_view, track_sound,
MuninTracks)
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'),
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
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