monitor: playlist update and fetch to/from file only if changed; fix bug logs filter in on_air
This commit is contained in:
parent
ae8162643e
commit
4a7517c109
|
@ -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
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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: ''
|
||||||
}
|
}
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -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
|
||||||
|
|
1
notes.md
1
notes.md
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user