monitor: playlist update and fetch to/from file only if changed; fix bug logs filter in on_air

This commit is contained in:
bkfox 2016-08-22 20:55:30 +02:00
parent ae8162643e
commit 4a7517c109
7 changed files with 66 additions and 45 deletions

View File

@ -407,7 +407,6 @@ class ProgramPage(Publication):
diffs = programs.Diffusion.objects \ diffs = programs.Diffusion.objects \
.filter(end__gte = now, program = self.program) \ .filter(end__gte = now, program = self.program) \
.order_by('start').prefetch_related('page') .order_by('start').prefetch_related('page')
print(diffs)
return self.diffs_to_page(diffs) return self.diffs_to_page(diffs)
@property @property

View File

@ -884,6 +884,7 @@ class SectionLogsList(SectionItem):
Supports: Log/Track, Diffusion Supports: Log/Track, Diffusion
""" """
from aircox.cms.models import DiffusionPage from aircox.cms.models import DiffusionPage
print(log, type(log))
if type(log) == programs.Diffusion: if type(log) == programs.Diffusion:
return DiffusionPage.as_item(log) return DiffusionPage.as_item(log)
return ListItem( return ListItem(

View File

@ -344,7 +344,7 @@ Player.prototype = {
var data = JSON.parse(req.responseText) var data = JSON.parse(req.responseText)
if(data.type == 'track') if(data.type == 'track')
data = { data = {
title: '♫' + (data.artist ? data.artist + ' — ' : '') + title: '♫ ' + (data.artist ? data.artist + ' — ' : '') +
data.title, data.title,
url: '' url: ''
} }

View File

@ -180,7 +180,7 @@ class Station(programs.Nameable):
# each to put them too there # each to put them too there
items = [] items = []
diff_ = None diff_ = None
for diff in diffs: for diff in diffs.order_by('-start'):
logs_ = \ logs_ = \
logs.filter(date__gt = diff.end, date__lt = diff_.start) \ logs.filter(date__gt = diff.end, date__lt = diff_.start) \
if diff_ else \ if diff_ else \
@ -194,7 +194,6 @@ class Station(programs.Nameable):
if diff_: if diff_:
if count and len(items) >= count: if count and len(items) >= count:
return items[:count] return items[:count]
logs_ = logs.filter(date__lt = diff_.end) logs_ = logs.filter(date__lt = diff_.end)
else: else:
logs_ = logs.all() logs_ = logs.all()
@ -211,6 +210,7 @@ class Station(programs.Nameable):
* date: only for what happened on this date; * date: only for what happened on this date;
* count: number of items to retrieve if not zero; * count: number of items to retrieve if not zero;
If date is not specified, count MUST be set to a non-zero value.
Be careful with what you which for: the result is a plain list. Be careful with what you which for: the result is a plain list.
The list contains: The list contains:
@ -220,6 +220,9 @@ class Station(programs.Nameable):
# FIXME: as an iterator? # FIXME: as an iterator?
# TODO argument to get sound instead of tracks # TODO argument to get sound instead of tracks
# TODO #Station # TODO #Station
if not date and not count:
raise ValueError('at least one argument must be set')
if date and date > datetime.date.today(): if date and date > datetime.date.today():
return [] return []
@ -234,8 +237,7 @@ class Station(programs.Nameable):
diffs = programs.Diffusion.objects diffs = programs.Diffusion.objects
diffs = diffs.filter(type = programs.Diffusion.Type.normal) \ diffs = diffs.filter(type = programs.Diffusion.Type.normal) \
.filter(start__lte = tz.now()) \ .filter(start__lte = tz.now())
.order_by('-start')
return self.__mix_logs_and_diff(diffs, logs, count) return self.__mix_logs_and_diff(diffs, logs, count)
@ -345,33 +347,6 @@ class Source(programs.Nameable):
if fetch: if fetch:
self.controller.fetch() self.controller.fetch()
def load_playlist(self, diffusion = None, program = None):
"""
Load a playlist to the controller. If diffusion or program is
given use it, otherwise, try with self.program if exists, or
(if URI, self.value).
A playlist from a program uses all archives available for the
program.
"""
if diffusion:
self.controller.playlist = diffusion.playlist
return
program = program or self.program
if program:
self.controller.playlist = [ sound.path for sound in
programs.Sound.objects.filter(
type = programs.Sound.Type.archive,
program = program,
)
]
return
if self.type == self.Type.file and self.value:
self.controller.playlist = [ self.value ]
return
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if self.type in (self.Type.file, self.Type.fallback) and \ if self.type in (self.Type.file, self.Type.fallback) and \
not self.url: not self.url:
@ -462,7 +437,7 @@ class Log(programs.Related):
) )
date = models.DateTimeField( date = models.DateTimeField(
_('date'), _('date'),
auto_now_add=True, default=tz.now,
) )
comment = models.CharField( comment = models.CharField(
_('comment'), _('comment'),

View File

@ -44,8 +44,6 @@ class Monitor:
""" """
if not self.controller: if not self.controller:
self.station.prepare() self.station.prepare()
for stream in self.station.stream_sources:
stream.load_playlist()
self.controller = self.station.controller self.controller = self.station.controller
if not self.controller.ready(): if not self.controller.ready():
@ -78,12 +76,13 @@ class Monitor:
.filter(station = self.station).order_by('date').last() .filter(station = self.station).order_by('date').last()
# only streamed # only streamed
if log and not log.related.diffusion: if log and (log.related and not log.related.diffusion):
self.trace_sound_tracks(log) self.trace_sound_tracks(log)
# TODO: expiration # TODO: expiration
if log and (log.source == current_source.id_ and \ if log and (log.source == current_source.id_ and \
log.related.path == current_sound): log.related and
log.related.path == current_sound):
return return
sound = programs.Sound.objects.filter(path = current_sound) sound = programs.Sound.objects.filter(path = current_sound)
@ -133,9 +132,8 @@ class Monitor:
for source in self.station.stream_sources: for source in self.station.stream_sources:
playlist = [ sound.path for sound in playlist = [ sound.path for sound in
source.program.sound_set.all().order_by('path') ] source.program.sound_set.all() ]
if playlist != source.controller.playlist: source.controller.playlist = playlist
source.controller.playlist = playlist
def trace_canceled(self): def trace_canceled(self):
""" """

View File

@ -5,6 +5,8 @@ import atexit
from django.template.loader import render_to_string from django.template.loader import render_to_string
import aircox.programs.models as programs
class Plugins(type): class Plugins(type):
registry = {} registry = {}
@ -192,12 +194,15 @@ class SourceController:
""" """
Current playlist on the Source, list of paths to play Current playlist on the Source, list of paths to play
""" """
self.fetch()
return self.__playlist return self.__playlist
@playlist.setter @playlist.setter
def playlist(self, value): def playlist(self, value):
self.__playlist = value value = sorted(value)
self.push() if value != self.__playlist:
self.__playlist = value
self.push()
def __init__(self, **kwargs): def __init__(self, **kwargs):
self.__dict__.update(kwargs) self.__dict__.update(kwargs)
@ -205,6 +210,10 @@ class SourceController:
if not self.path: if not self.path:
self.path = os.path.join(self.source.station.path, self.path = os.path.join(self.source.station.path,
self.source.slug + '.m3u') self.source.slug + '.m3u')
self.from_file()
if not self.__playlist:
self.from_db()
def skip(self): def skip(self):
""" """
@ -225,7 +234,7 @@ class SourceController:
""" """
os.makedirs(os.path.dirname(self.path), exist_ok = True) os.makedirs(os.path.dirname(self.path), exist_ok = True)
with open(self.path, 'w') as file: with open(self.path, 'w') as file:
file.write('\n'.join(self.playlist or [])) file.write('\n'.join(self.__playlist or []))
def activate(self, value = True): def activate(self, value = True):
""" """
@ -234,6 +243,46 @@ class SourceController:
""" """
pass pass
def from_db(self, diffusion = None, program = None):
"""
Load a playlist to the controller from the database. If diffusion or
program is given use it, otherwise, try with self.program if exists, or
(if URI, self.url).
A playlist from a program uses all its available archives.
"""
if diffusion:
self.playlist = diffusion.playlist
return
source = self.source
program = program or source.program
if program:
self.playlist = [ sound.path for sound in
programs.Sound.objects.filter(
type = programs.Sound.Type.archive,
program = program,
)
]
return
if source.type == source.Type.file and source.url:
self.playlist = [ self.url ]
return
def from_file(self, path = None):
"""
Load a playlist from the given file (if not, use the
controller's one
"""
path = path or self.path
if not os.path.exists(path):
return
with open(path, 'r') as file:
self.__playlist = file.read()
self.__playlist = self.__playlist.split('\n') \
if self.__playlist else []
class Monitor: class Monitor:
station = None station = None

View File

@ -22,7 +22,6 @@ controllers:
- logs: archive functionnality - logs: archive functionnality
- tools: - tools:
- track stats for diffusions - track stats for diffusions
- rename controllers.Station into controllers.Streamer -> keep Station for sth else
cms: cms:
- player support diffusions with multiple archive files - player support diffusions with multiple archive files