fix stuff; sound inline in admin

This commit is contained in:
bkfox 2020-09-16 15:12:05 +02:00
parent 35e7e407e7
commit 361cf88bb2
8 changed files with 36 additions and 64 deletions

View File

@ -1,5 +1,6 @@
from django.contrib import admin
from django.utils.translation import gettext as _, gettext_lazy
from django.utils.safestring import mark_safe
from django.utils.translation import gettext as _
from adminsortable2.admin import SortableInlineAdminMixin
@ -21,9 +22,13 @@ class SoundTrackInline(TrackInline):
class SoundInline(admin.TabularInline):
model = Sound
fields = ['type', 'path', 'embed', 'duration', 'is_public']
readonly_fields = ['type', 'path', 'duration']
fields = ['type', 'name', 'audio', 'duration', 'is_good_quality', 'is_public']
readonly_fields = ['type', 'audio', 'duration', 'is_good_quality']
extra = 0
max_num = 0
def audio(self, obj):
return mark_safe('<audio src="{}" controls></audio>'.format(obj.url()))
def get_queryset(self, request):
return super().get_queryset(request).available()
@ -40,11 +45,10 @@ class SoundAdmin(admin.ModelAdmin):
'is_public', 'is_good_quality', 'episode', 'filename']
list_filter = ('type', 'is_good_quality', 'is_public')
search_fields = ['name', 'program']
search_fields = ['name', 'program__title']
fieldsets = [
(None, {'fields': ['name', 'path', 'type', 'program', 'episode']}),
(None, {'fields': ['embed', 'duration', 'is_public', 'mtime']}),
(None, {'fields': ['is_good_quality']})
(None, {'fields': ['duration', 'is_public', 'is_good_quality', 'mtime']}),
]
readonly_fields = ('path', 'duration',)
inlines = [SoundTrackInline]

View File

@ -60,6 +60,12 @@ class Stats:
self.parse(str(out, encoding='utf-8'))
#class SoundFile:
# path = None
# sample_rate = None
# length = None
class Sound:
path = None # file path
sample_length = 120 # default sample length in seconds

View File

@ -37,9 +37,9 @@ class SoundQuerySet(models.QuerySet):
def available(self):
return self.exclude(type=Sound.TYPE_REMOVED)
def podcasts(self):
def public(self):
""" Return sounds available as podcasts """
return self.filter(Q(embed__isnull=False) | Q(is_public=True))
return self.filter(is_public=True)
def archive(self):
""" Return sounds that are archives """
@ -103,11 +103,11 @@ class Sound(models.Model):
recursive=True, max_length=255,
blank=True, null=True, unique=True,
)
embed = models.TextField(
_('embed'),
blank=True, null=True,
help_text=_('HTML code to embed a sound from an external plateform'),
)
#embed = models.TextField(
# _('embed'),
# blank=True, null=True,
# help_text=_('HTML code to embed a sound from an external plateform'),
#)
duration = models.TimeField(
_('duration'),
blank=True, null=True,
@ -156,19 +156,12 @@ class Sound(models.Model):
return tz.make_aware(mtime, tz.get_current_timezone())
def url(self):
"""
Return an url to the stream
"""
# path = self._meta.get_field('path').path
""" Return an url to the stream. """
path = self.path.replace(main_settings.MEDIA_ROOT, '', 1)
#path = self.path.replace(path, '', 1)
return main_settings.MEDIA_URL + '/' + path
def file_exists(self):
"""
Return true if the file still exists
"""
""" Return true if the file still exists. """
return os.path.exists(self.path)
@ -241,23 +234,6 @@ class Sound(models.Model):
return changed
def check_perms(self):
"""
Check file permissions and update it if the sound is public
"""
if not settings.AIRCOX_SOUND_AUTO_CHMOD or \
self.removed or not os.path.exists(self.path):
return
flags = settings.AIRCOX_SOUND_CHMOD_FLAGS[self.is_public]
try:
os.chmod(self.path, flags)
except PermissionError as err:
logger.error('cannot set permissions {} to file {}: {}'.format(
self.flags[self.is_public], self.path, err))
def __check_name(self):
if not self.name and self.path:
# FIXME: later, remove date?

View File

@ -1,5 +1,4 @@
import os
import stat
from django.conf import settings
@ -38,8 +37,6 @@ from django.conf import settings
# sounds_default_dir = os.path.join(settings.MEDIA_ROOT, 'programs/defaults')
# sound_archive_dir = 'archives'
# sound_excerpt_dir = 'excerpts'
# sound_auto_chmod = True
# sound_chmod_flags = (stat.S_IRWXU, stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH)
# sound_quality = {
# 'attribute': 'RMS lev dB',
# 'range': (-18.0, -8.0),
@ -116,15 +113,6 @@ ensure('AIRCOX_SOUND_ARCHIVES_SUBDIR', 'archives')
# Sub directory used for the excerpts of the episode
ensure('AIRCOX_SOUND_EXCERPTS_SUBDIR', 'excerpts')
# Change sound perms based on 'public' attribute if True
ensure('AIRCOX_SOUND_AUTO_CHMOD', True)
# Chmod bits flags as a tuple for (not public, public). Use os.chmod
# and stat.*
ensure(
'AIRCOX_SOUND_CHMOD_FLAGS',
(stat.S_IRWXU, stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH)
)
# Quality attributes passed to sound_quality_check from sounds_monitor
ensure('AIRCOX_SOUND_QUALITY', {
'attribute': 'RMS lev dB',

View File

@ -28,7 +28,7 @@ The audio player
</template>
<template v-slot:track="{ onAir }">
<h4 class="title is-4">
<h4 class="title is-4" :aria-description="{% trans "Track currently on air" %}">
<span class="has-text-info is-size-3">&#9836;</span>
<span>[[ onAir.title ]]</span>
<span class="has-text-grey-dark has-text-weight-light">
@ -39,14 +39,14 @@ The audio player
</template>
<template v-slot:diffusion="{ onAir }">
<h4 class="title is-4">
<h4 class="title is-4" :aria-description="{% trans "Diffusion currently on air" %}">
<a :href="onAir.url">[[ onAir.title ]]</a>
</h4>
<div class="">[[ onAir.info ]]</div>
</template>
<template v-slot:empty>
<h4 class="title is-4">{{ station.name }}</h4>
<h4 class="title is-4" :aria-description="{% trans "Currently playing" %}">{{ station.name }}</h4>
</template>
</a-player>
</div>

View File

@ -3,9 +3,11 @@ List item for a podcast.
{% endcomment %}
<div class="podcast">
{# comment #}
{% if object.embed %}
{{ object.embed|safe }}
{% else %}
{# endcomment #}
<audio src="{{ object.url }}" controls>
{% endif %}
</div>

View File

@ -2,7 +2,6 @@ from collections import OrderedDict
import datetime
from django.views.generic import ListView
from django.utils.translation import gettext as _
from ..models import Diffusion, Episode, Program, StaticPage, Sound
from .base import BaseView
@ -17,14 +16,11 @@ __all__ = ['EpisodeDetailView', 'EpisodeListView', 'DiffusionListView']
class EpisodeDetailView(ProgramPageDetailView):
model = Episode
def get_podcasts(self, diffusion):
return Sound.objects.diffusion(diffusion).podcasts()
def get_context_data(self, **kwargs):
if not 'tracks' in kwargs:
kwargs['tracks'] = self.object.track_set.order_by('position')
if not 'podcasts' in kwargs:
kwargs['podcasts'] = self.object.sound_set.podcasts()
kwargs['podcasts'] = self.object.sound_set.public()
return super().get_context_data(**kwargs)

View File

@ -38,7 +38,8 @@ export default {
data() {
return {
state: State.paused,
liveInfo: new LiveInfo(this.liveInfoUrl, this.liveInfoTimeout),
liveInfo: this.liveInfoUrl ? new LiveInfo(this.liveInfoUrl, this.liveInfoTimeout)
: null,
}
},
@ -55,7 +56,7 @@ export default {
loading() { return this.state == State.loading; },
onAir() {
return this.liveInfo.items && this.liveInfo.items[0];
return this.liveInfo && this.liveInfo.items && this.liveInfo.items[0];
},
buttonStyle() {
@ -83,7 +84,6 @@ export default {
},
toggle() {
console.log('tooogle', this.paused, '-', this.$refs.audio.src)
if(this.paused)
this.play()
else
@ -97,11 +97,11 @@ export default {
},
mounted() {
this.liveInfo.refresh()
this.liveInfo && this.liveInfo.refresh()
},
destroyed() {
this.liveInfo.drop()
this.liveInfo && this.liveInfo.drop()
},
}