CC-2175: Overbooking: Cut off shows when they are done
-fixed
This commit is contained in:
parent
7e6ce1514f
commit
33b24b581c
|
@ -314,7 +314,9 @@ class Schedule {
|
||||||
." MIN(st.playlist_id) AS playlist_id,"
|
." MIN(st.playlist_id) AS playlist_id,"
|
||||||
." MIN(st.starts) AS starts,"
|
." MIN(st.starts) AS starts,"
|
||||||
." MAX(st.ends) AS ends,"
|
." MAX(st.ends) AS ends,"
|
||||||
." MIN(sh.name) AS show_name"
|
." MIN(sh.name) AS show_name,"
|
||||||
|
." MIN(si.starts) AS show_start,"
|
||||||
|
." MAX(si.ends) AS show_end"
|
||||||
." FROM $CC_CONFIG[scheduleTable] as st"
|
." FROM $CC_CONFIG[scheduleTable] as st"
|
||||||
." LEFT JOIN $CC_CONFIG[playListTable] as pt"
|
." LEFT JOIN $CC_CONFIG[playListTable] as pt"
|
||||||
." ON st.playlist_id = pt.id"
|
." ON st.playlist_id = pt.id"
|
||||||
|
@ -608,10 +610,8 @@ class Schedule {
|
||||||
$data = Schedule::GetItems($range_start, $range_end, true);
|
$data = Schedule::GetItems($range_start, $range_end, true);
|
||||||
$playlists = array();
|
$playlists = array();
|
||||||
|
|
||||||
if (is_array($data))
|
if (is_array($data)){
|
||||||
{
|
foreach ($data as $dx){
|
||||||
foreach ($data as $dx)
|
|
||||||
{
|
|
||||||
$start = $dx['start'];
|
$start = $dx['start'];
|
||||||
|
|
||||||
//chop off subseconds
|
//chop off subseconds
|
||||||
|
@ -628,6 +628,8 @@ class Schedule {
|
||||||
$playlists[$pkey]['played'] = '0';
|
$playlists[$pkey]['played'] = '0';
|
||||||
$playlists[$pkey]['schedule_id'] = $dx['group_id'];
|
$playlists[$pkey]['schedule_id'] = $dx['group_id'];
|
||||||
$playlists[$pkey]['show_name'] = $dx['show_name'];
|
$playlists[$pkey]['show_name'] = $dx['show_name'];
|
||||||
|
$playlists[$pkey]['show_start'] = Schedule::AirtimeTimeToPypoTime($dx['show_start']);
|
||||||
|
$playlists[$pkey]['show_end'] = Schedule::AirtimeTimeToPypoTime($dx['show_end']);
|
||||||
$playlists[$pkey]['user_id'] = 0;
|
$playlists[$pkey]['user_id'] = 0;
|
||||||
$playlists[$pkey]['id'] = $dx['group_id'];
|
$playlists[$pkey]['id'] = $dx['group_id'];
|
||||||
$playlists[$pkey]['start'] = Schedule::AirtimeTimeToPypoTime($dx["start"]);
|
$playlists[$pkey]['start'] = Schedule::AirtimeTimeToPypoTime($dx["start"]);
|
||||||
|
|
|
@ -101,7 +101,7 @@ class PypoFetch(Thread):
|
||||||
"""
|
"""
|
||||||
def process_schedule(self, schedule_data, export_source):
|
def process_schedule(self, schedule_data, export_source):
|
||||||
logger = logging.getLogger('fetch')
|
logger = logging.getLogger('fetch')
|
||||||
self.schedule = schedule_data["playlists"]
|
playlists = schedule_data["playlists"]
|
||||||
|
|
||||||
self.check_matching_timezones(schedule_data["server_timezone"])
|
self.check_matching_timezones(schedule_data["server_timezone"])
|
||||||
|
|
||||||
|
@ -121,13 +121,13 @@ class PypoFetch(Thread):
|
||||||
|
|
||||||
# Download all the media and put playlists in liquidsoap format
|
# Download all the media and put playlists in liquidsoap format
|
||||||
try:
|
try:
|
||||||
playlists = self.prepare_playlists()
|
liquidsoap_playlists = self.prepare_playlists(playlists)
|
||||||
except Exception, e: logger.error("%s", e)
|
except Exception, e: logger.error("%s", e)
|
||||||
|
|
||||||
# Send the data to pypo-push
|
# Send the data to pypo-push
|
||||||
scheduled_data = dict()
|
scheduled_data = dict()
|
||||||
scheduled_data['playlists'] = playlists
|
scheduled_data['liquidsoap_playlists'] = liquidsoap_playlists
|
||||||
scheduled_data['schedule'] = self.schedule
|
scheduled_data['schedule'] = playlists
|
||||||
scheduled_data['stream_metadata'] = schedule_data["stream_metadata"]
|
scheduled_data['stream_metadata'] = schedule_data["stream_metadata"]
|
||||||
self.queue.put(scheduled_data)
|
self.queue.put(scheduled_data)
|
||||||
|
|
||||||
|
@ -141,23 +141,22 @@ class PypoFetch(Thread):
|
||||||
and stored in a playlist folder.
|
and stored in a playlist folder.
|
||||||
file is e.g. 2010-06-23-15-00-00/17_cue_10.132-123.321.mp3
|
file is e.g. 2010-06-23-15-00-00/17_cue_10.132-123.321.mp3
|
||||||
"""
|
"""
|
||||||
def prepare_playlists(self):
|
def prepare_playlists(self, playlists):
|
||||||
logger = logging.getLogger('fetch')
|
logger = logging.getLogger('fetch')
|
||||||
|
|
||||||
schedule = self.schedule
|
liquidsoap_playlists = dict()
|
||||||
playlists = dict()
|
|
||||||
|
|
||||||
# Dont do anything if schedule is empty
|
# Dont do anything if playlists is empty
|
||||||
if not schedule:
|
if not playlists:
|
||||||
logger.debug("Schedule is empty.")
|
logger.debug("Schedule is empty.")
|
||||||
return playlists
|
return liquidsoap_playlists
|
||||||
|
|
||||||
scheduleKeys = sorted(schedule.iterkeys())
|
scheduleKeys = sorted(playlists.iterkeys())
|
||||||
|
|
||||||
try:
|
try:
|
||||||
for pkey in scheduleKeys:
|
for pkey in scheduleKeys:
|
||||||
logger.info("Playlist starting at %s", pkey)
|
logger.info("Playlist starting at %s", pkey)
|
||||||
playlist = schedule[pkey]
|
playlist = playlists[pkey]
|
||||||
|
|
||||||
# create playlist directory
|
# create playlist directory
|
||||||
try:
|
try:
|
||||||
|
@ -181,10 +180,10 @@ class PypoFetch(Thread):
|
||||||
elif int(playlist['subtype']) > 0 and int(playlist['subtype']) < 5:
|
elif int(playlist['subtype']) > 0 and int(playlist['subtype']) < 5:
|
||||||
ls_playlist = self.handle_media_file(playlist, pkey)
|
ls_playlist = self.handle_media_file(playlist, pkey)
|
||||||
|
|
||||||
playlists[pkey] = ls_playlist
|
liquidsoap_playlists[pkey] = ls_playlist
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
logger.info("%s", e)
|
logger.info("%s", e)
|
||||||
return playlists
|
return liquidsoap_playlists
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -48,6 +48,10 @@ class PypoPush(Thread):
|
||||||
self.push_ahead = 10
|
self.push_ahead = 10
|
||||||
self.push_ahead2 = self.push_ahead -5
|
self.push_ahead2 = self.push_ahead -5
|
||||||
|
|
||||||
|
#toggle between "stop" and "play". Keeps track of the state of
|
||||||
|
#liquidsoap
|
||||||
|
self.liquidsoap_state_play = True
|
||||||
|
|
||||||
def set_export_source(self, export_source):
|
def set_export_source(self, export_source):
|
||||||
self.export_source = export_source
|
self.export_source = export_source
|
||||||
self.cache_dir = config["cache_dir"] + self.export_source + '/'
|
self.cache_dir = config["cache_dir"] + self.export_source + '/'
|
||||||
|
@ -67,14 +71,13 @@ class PypoPush(Thread):
|
||||||
scheduled_data = self.queue.get()
|
scheduled_data = self.queue.get()
|
||||||
logger.debug("Received data from pypo-fetch")
|
logger.debug("Received data from pypo-fetch")
|
||||||
self.schedule = scheduled_data['schedule']
|
self.schedule = scheduled_data['schedule']
|
||||||
self.playlists = scheduled_data['playlists']
|
self.playlists = scheduled_data['liquidsoap_playlists']
|
||||||
self.stream_metadata = scheduled_data['stream_metadata']
|
self.stream_metadata = scheduled_data['stream_metadata']
|
||||||
|
logger.debug('schedule %s' % json.dumps(self.schedule))
|
||||||
|
logger.debug('playlists %s' % json.dumps(self.playlists))
|
||||||
|
|
||||||
schedule = self.schedule
|
schedule = self.schedule
|
||||||
playlists = self.playlists
|
playlists = self.playlists
|
||||||
|
|
||||||
logger.debug('schedule %s' % json.dumps(schedule))
|
|
||||||
logger.debug('playlists %s' % json.dumps(playlists))
|
|
||||||
|
|
||||||
currently_on_air = False
|
currently_on_air = False
|
||||||
if schedule:
|
if schedule:
|
||||||
|
@ -92,9 +95,7 @@ class PypoPush(Thread):
|
||||||
|
|
||||||
for pkey in schedule:
|
for pkey in schedule:
|
||||||
plstart = pkey[0:19]
|
plstart = pkey[0:19]
|
||||||
start = schedule[pkey]['start']
|
|
||||||
end = schedule[pkey]['end']
|
|
||||||
|
|
||||||
playedFlag = (pkey in playedItems) and playedItems[pkey].get("played", 0)
|
playedFlag = (pkey in playedItems) and playedItems[pkey].get("played", 0)
|
||||||
|
|
||||||
if plstart == str_tcoming_s or (plstart < str_tcoming_s and plstart > str_tcoming2_s and not playedFlag):
|
if plstart == str_tcoming_s or (plstart < str_tcoming_s and plstart > str_tcoming2_s and not playedFlag):
|
||||||
|
@ -120,21 +121,23 @@ class PypoPush(Thread):
|
||||||
# Call API to update schedule states
|
# Call API to update schedule states
|
||||||
logger.debug("Doing callback to server to update 'played' status.")
|
logger.debug("Doing callback to server to update 'played' status.")
|
||||||
self.api_client.notify_scheduled_item_start_playing(pkey, schedule)
|
self.api_client.notify_scheduled_item_start_playing(pkey, schedule)
|
||||||
|
|
||||||
start = schedule[pkey]['start']
|
|
||||||
end = schedule[pkey]['end']
|
|
||||||
|
|
||||||
if start <= str_tnow_s and str_tnow_s < end:
|
show_start = schedule[pkey]['show_start']
|
||||||
|
show_end = schedule[pkey]['show_end']
|
||||||
|
|
||||||
|
if show_start <= str_tnow_s and str_tnow_s < show_end:
|
||||||
currently_on_air = True
|
currently_on_air = True
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
#logger.debug('Empty schedule')
|
#logger.debug('Empty schedule')
|
||||||
|
|
||||||
if not currently_on_air:
|
if not currently_on_air and self.liquidsoap_state_play:
|
||||||
|
logger.debug('Notifying Liquidsoap to stop playback.')
|
||||||
tn = telnetlib.Telnet(LS_HOST, LS_PORT)
|
tn = telnetlib.Telnet(LS_HOST, LS_PORT)
|
||||||
tn.write('source.skip\n')
|
tn.write('source.skip\n')
|
||||||
tn.write('exit\n')
|
tn.write('exit\n')
|
||||||
tn.read_all()
|
tn.read_all()
|
||||||
|
self.liquidsoap_state_play = False
|
||||||
|
|
||||||
def push_liquidsoap(self, pkey, schedule, playlists):
|
def push_liquidsoap(self, pkey, schedule, playlists):
|
||||||
logger = logging.getLogger('push')
|
logger = logging.getLogger('push')
|
||||||
|
@ -185,6 +188,8 @@ class PypoPush(Thread):
|
||||||
tn.write("exit\n")
|
tn.write("exit\n")
|
||||||
logger.debug(tn.read_all())
|
logger.debug(tn.read_all())
|
||||||
|
|
||||||
|
self.liquidsoap_state_play = True
|
||||||
|
|
||||||
status = 1
|
status = 1
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
logger.error('%s', e)
|
logger.error('%s', e)
|
||||||
|
|
Loading…
Reference in New Issue