Merge branch 'devel' of dev.sourcefabric.org:airtime into devel
This commit is contained in:
commit
3eac8c8531
|
@ -14,11 +14,8 @@ class Application_Model_Schedule
|
|||
$sql = "SELECT COUNT(*) FROM ".$CC_CONFIG["scheduleTable"]
|
||||
." WHERE file_id = {$p_fileId} AND ends > NOW() AT TIME ZONE 'UTC'";
|
||||
$count = $con->query($sql)->fetchColumn(0);
|
||||
if (is_numeric($count) && ($count != '0')) {
|
||||
return TRUE;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return (is_numeric($count) && ($count != '0'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -605,7 +602,7 @@ SQL;
|
|||
}
|
||||
|
||||
// Scheduler wants everything in a playlist
|
||||
$items = Application_Model_Schedule::GetItems($range_start, $range_end);
|
||||
$items = self::GetItems($range_start, $range_end);
|
||||
|
||||
$data = array();
|
||||
$utcTimeZone = new DateTimeZone("UTC");
|
||||
|
|
|
@ -24,7 +24,11 @@ class Application_Model_Scheduler
|
|||
{
|
||||
$this->con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME);
|
||||
|
||||
$this->epochNow = microtime(true);
|
||||
//subtracting one because sometimes when we cancel a track, we set its end time
|
||||
//to epochNow and then send the new schedule to pypo. Sometimes the currently cancelled
|
||||
//track can still be included in the new schedule because it may have a few ms left to play.
|
||||
//subtracting 1 second from epochNow resolves this issue.
|
||||
$this->epochNow = microtime(true)-1;
|
||||
$this->nowDT = DateTime::createFromFormat("U.u", $this->epochNow, new DateTimeZone("UTC"));
|
||||
|
||||
if ($this->nowDT === false) {
|
||||
|
@ -324,6 +328,8 @@ class Application_Model_Scheduler
|
|||
* @param int $showInstance
|
||||
* @param array $exclude
|
||||
* ids of sched items to remove from the calulation.
|
||||
* This function squeezes all items of a show together so that
|
||||
* there are no gaps between them.
|
||||
*/
|
||||
private function removeGaps($showInstance, $exclude=null)
|
||||
{
|
||||
|
@ -660,6 +666,9 @@ class Application_Model_Scheduler
|
|||
$cueOutSec = bcadd($cueinSec , $length, 6);
|
||||
$cueout = Application_Common_DateHelper::secondsToPlaylistTime($cueOutSec);
|
||||
|
||||
//Set DbEnds - 1 second because otherwise there can be a timing issue
|
||||
//when sending the new schedule to Pypo where Pypo thinks the track is still
|
||||
//playing.
|
||||
$removedItem->setDbCueOut($cueout)
|
||||
->setDbClipLength($cliplength)
|
||||
->setDbEnds($this->nowDT)
|
||||
|
|
|
@ -37,21 +37,6 @@ rm airtime/airtime_mvc/library/soundcloud-api/README.md
|
|||
# Remove Liquidsoap binaries
|
||||
rm -r airtime/python_apps/pypo/liquidsoap_bin/
|
||||
|
||||
# Disable installation of Liquidsoap symlink
|
||||
sed -i '84s:print:#print:g' airtime/python_apps/pypo/install/pypo-initialize.py
|
||||
sed -i '86s:p = Popen:#p = Popen:g' airtime/python_apps/pypo/install/pypo-initialize.py
|
||||
sed -i '87s:liq_path:#liq_path:g' airtime/python_apps/pypo/install/pypo-initialize.py
|
||||
sed -i '88s:symlink_path:#symlink_path:g' airtime/python_apps/pypo/install/pypo-initialize.py
|
||||
sed -i '90s:if p.returncode:#if p.returncode:g' airtime/python_apps/pypo/install/pypo-initialize.py
|
||||
sed -i '91s:tr:#tr:g' airtime/python_apps/pypo/install/pypo-initialize.py
|
||||
sed -i '92s:os.unlink:#os.unlink:g' airtime/python_apps/pypo/install/pypo-initialize.py
|
||||
sed -i '93s:except:#except:g' airtime/python_apps/pypo/install/pypo-initialize.py
|
||||
sed -i '95s:pass:#pass:g' airtime/python_apps/pypo/install/pypo-initialize.py
|
||||
sed -i '98s:os.symlink:#os.symlink:g' airtime/python_apps/pypo/install/pypo-initialize.py
|
||||
sed -i '99s:else:#else:g' airtime/python_apps/pypo/install/pypo-initialize.py
|
||||
sed -i '100s:print:#print:g' airtime/python_apps/pypo/install/pypo-initialize.py
|
||||
sed -i '101s:sys.exit:#sys.exit:g' airtime/python_apps/pypo/install/pypo-initialize.py
|
||||
|
||||
#Remove phing library
|
||||
rm -r airtime/airtime_mvc/library/phing/
|
||||
|
||||
|
@ -71,7 +56,7 @@ echo "running the build..."
|
|||
debuild -b -uc -us $@ || exit
|
||||
|
||||
# copy the new package to the public server
|
||||
scp /tmp/airtime_${VERSION}_all.deb apt.sourcefabric.org:/var/www/apt/snapshots/
|
||||
# scp /tmp/airtime_${VERSION}_all.deb apt.sourcefabric.org:/var/www/apt/snapshots/
|
||||
|
||||
# copy the build log too
|
||||
scp /tmp/airtime_${VERSION}_amd64.build apt.sourcefabric.org:/var/www/apt/snapshots/
|
||||
# scp /tmp/airtime_${VERSION}_amd64.build apt.sourcefabric.org:/var/www/apt/snapshots/
|
||||
|
|
|
@ -81,7 +81,7 @@ try:
|
|||
(codename, fullname) = get_os_codename()
|
||||
print " Found %s (%s) on %s architecture" % (fullname, codename, arch)
|
||||
|
||||
print " * Installing Liquidsoap binary"
|
||||
print " * Creating symlink to Liquidsoap binary"
|
||||
|
||||
p = Popen("which liquidsoap", shell=True, stdout=PIPE)
|
||||
liq_path = p.communicate()[0].strip()
|
||||
|
|
|
@ -81,27 +81,29 @@ class PypoPush(Thread):
|
|||
chains.remove(original_chain)
|
||||
except ValueError, e:
|
||||
self.logger.error(str(e))
|
||||
if len(liquidsoap_queue_approx) == 0 and current_event_chain[0]['type'] == 'file':
|
||||
#Something is scheduled but Liquidsoap is not playing anything!
|
||||
#Need to schedule it immediately..this might happen if Liquidsoap crashed.
|
||||
self.modify_cue_point(current_event_chain[0])
|
||||
next_media_item_chain = current_event_chain
|
||||
time_until_next_play = 0
|
||||
#sleep for 0.2 seconds to give pypo-file time to copy.
|
||||
time.sleep(0.2)
|
||||
continue
|
||||
if not self.current_stream_info and current_event_chain[0]['type'] == 'stream':
|
||||
#a stream is schedule but Liquidsoap is not playing it. Need to start it.
|
||||
next_media_item_chain = current_event_chain
|
||||
time_until_next_play = 0
|
||||
continue
|
||||
|
||||
if len(liquidsoap_queue_approx) == 0 and not self.current_stream_info:
|
||||
#Nothing is currently being playing by Liquidsoap
|
||||
if current_event_chain[0]['type'] == 'file':
|
||||
#Something is scheduled but Liquidsoap is not playing anything!
|
||||
#Need to schedule it immediately..this might happen if Liquidsoap crashed.
|
||||
self.modify_cue_point(current_event_chain[0])
|
||||
next_media_item_chain = current_event_chain
|
||||
time_until_next_play = 0
|
||||
#sleep for 0.2 seconds to give pypo-file time to copy.
|
||||
time.sleep(0.2)
|
||||
continue
|
||||
if current_event_chain[0]['type'] == 'stream':
|
||||
#a stream is schedule but Liquidsoap is not playing it. Need to start it.
|
||||
next_media_item_chain = current_event_chain
|
||||
time_until_next_play = 0
|
||||
continue
|
||||
|
||||
#At this point we know that Liquidsoap is playing something, and that something
|
||||
#is scheduled. We need to verify whether the schedule we just received matches
|
||||
#what Liquidsoap is playing, and if not, correct it.
|
||||
media_chain = filter(lambda item: (item["type"] == "file"), current_event_chain)
|
||||
stream_chain = filter(lambda item: (item["type"] == "stream"), current_event_chain)
|
||||
self.handle_new_schedule(media_schedule, liquidsoap_queue_approx, media_chain, stream_chain)
|
||||
|
||||
self.handle_new_schedule(media_schedule, liquidsoap_queue_approx, current_event_chain)
|
||||
|
||||
|
||||
#At this point everything in the present has been taken care of and Liquidsoap
|
||||
|
@ -184,7 +186,7 @@ class PypoPush(Thread):
|
|||
|
||||
return liquidsoap_queue_approx
|
||||
|
||||
def handle_new_schedule(self, media_schedule, liquidsoap_queue_approx, media_chain, stream_chain):
|
||||
def handle_new_schedule(self, media_schedule, liquidsoap_queue_approx, current_event_chain):
|
||||
"""
|
||||
This function's purpose is to gracefully handle situations where
|
||||
Liquidsoap already has a track in its queue, but the schedule
|
||||
|
@ -192,18 +194,24 @@ class PypoPush(Thread):
|
|||
call other functions that will connect to Liquidsoap and alter its
|
||||
queue.
|
||||
"""
|
||||
media_chain = filter(lambda item: (item["type"] == "file"), current_event_chain)
|
||||
stream_chain = filter(lambda item: (item["type"] == "stream"), current_event_chain)
|
||||
|
||||
self.logger.debug(self.current_stream_info)
|
||||
self.logger.debug(current_event_chain)
|
||||
|
||||
|
||||
if self.current_stream_info:
|
||||
if len(stream_chain) == 0:
|
||||
if len(current_event_chain) > 0 and current_event_chain[0]['type'] == "stream":
|
||||
if self.current_stream_info['uri'] != stream_chain[0]['uri']:
|
||||
#Liquidsoap is rebroadcasting a webstream and a webstream is scheduled
|
||||
#to play, but they are not the same!
|
||||
self.stop_web_stream(self.current_stream_info)
|
||||
self.start_web_stream(stream_chain[0])
|
||||
else:
|
||||
#Liquidsoap is rebroadcasting a webstream, but there is no stream
|
||||
#in the schedule. Let's stop streaming.
|
||||
self.stop_web_stream(self.current_stream_info)
|
||||
elif self.current_stream_info['uri'] != stream_chain[0]['uri']:
|
||||
#Liquidsoap is rebroadcasting a webstream and a webstream is scheduled
|
||||
#to play, but they are not the same!
|
||||
self.stop_web_stream(self.current_stream_info)
|
||||
self.start_web_stream(stream_chain[0])
|
||||
|
||||
|
||||
problem_at_iteration = self.find_removed_items(media_schedule, liquidsoap_queue_approx)
|
||||
|
||||
|
|
Loading…
Reference in New Issue