diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php index 94cb7e518..033369802 100644 --- a/airtime_mvc/application/controllers/ApiController.php +++ b/airtime_mvc/application/controllers/ApiController.php @@ -796,6 +796,7 @@ class ApiController extends Zend_Controller_Action { Logging::info("Notifying RabbitMQ to send message to pypo"); + Application_Model_RabbitMq::SendMessageToPypo("reset_liquidsoap_bootstrap", array()); Application_Model_RabbitMq::PushSchedule(); } diff --git a/airtime_mvc/application/controllers/ScheduleController.php b/airtime_mvc/application/controllers/ScheduleController.php index c567a510f..f65ce1332 100644 --- a/airtime_mvc/application/controllers/ScheduleController.php +++ b/airtime_mvc/application/controllers/ScheduleController.php @@ -190,8 +190,9 @@ class ScheduleController extends Zend_Controller_Action if ($user->isUserType(array(UTYPE_ADMIN, UTYPE_PROGRAM_MANAGER))) { try { - $showInstance = new Application_Model_ShowInstance($showInstanceId); + $showInstance = new Application_Model_ShowInstance($showInstanceId); } catch (Exception $e) { + Logging::info($e->getMessage()); $this->view->show_error = true; return false; diff --git a/airtime_mvc/application/models/RabbitMq.php b/airtime_mvc/application/models/RabbitMq.php index ab73a018f..d92975413 100644 --- a/airtime_mvc/application/models/RabbitMq.php +++ b/airtime_mvc/application/models/RabbitMq.php @@ -3,14 +3,14 @@ require_once 'php-amqplib/amqp.inc'; class Application_Model_RabbitMq { - public static $doPush = FALSE; + public static $doPush = false; /** * Sets a flag to push the schedule at the end of the request. */ public static function PushSchedule() { - Application_Model_RabbitMq::$doPush = TRUE; + self::$doPush = true; } private static function sendMessage($exchange, $data) diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index eb538f57f..4914302b6 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -558,6 +558,7 @@ WHERE st.ends > :startTime1 AND st.starts < :endTime AND st.playout_status > 0 AND si.ends > :startTime2 + AND si.modified_instance = 'f' ORDER BY st.starts SQL; @@ -578,6 +579,7 @@ WHERE st.ends > :startTime1 AND st.starts < :rangeEnd AND st.playout_status > 0 AND si.ends > :startTime2 + AND si.modified_instance = 'f' ORDER BY st.starts LIMIT 3 SQL; diff --git a/airtime_mvc/application/models/Show.php b/airtime_mvc/application/models/Show.php index 4cb90d1bc..7f905b687 100644 --- a/airtime_mvc/application/models/Show.php +++ b/airtime_mvc/application/models/Show.php @@ -275,8 +275,6 @@ SQL; public function cancelShow($day_timestamp) { - $con = Propel::getConnection(); - $timeinfo = explode(" ", $day_timestamp); CcShowDaysQuery::create() @@ -284,30 +282,23 @@ SQL; ->update(array('DbLastShow' => $timeinfo[0])); $sql = <<= :dayTimestamp::TIMESTAMP AND show_id = :showId SQL; - - Application_Common_Database::prepareAndExecute( $sql, array( + + $rows = Application_Common_Database::prepareAndExecute( $sql, array( ':dayTimestamp' => $day_timestamp, - ':showId' => $this->getId()), 'execute'); + ':showId' => $this->getId()), 'all'); - // check if we can safely delete the show - $showInstancesRow = CcShowInstancesQuery::create() - ->filterByDbShowId($this->_showId) - ->filterByDbModifiedInstance(false) - ->findOne(); - - if (is_null($showInstancesRow)) { - $sql = << $this->_showId ), "execute"); - $con->exec($sql); - } + foreach ($rows as $row) { + try { + $showInstance = new Application_Model_ShowInstance($row["id"]); + $showInstance->delete($rabbitmqPush = false); + } catch (Exception $e) { + Logging::info($e->getMessage()); + } + } Application_Model_RabbitMq::PushSchedule(); } diff --git a/airtime_mvc/application/models/ShowInstance.php b/airtime_mvc/application/models/ShowInstance.php index e6a3dcc58..f88a1d63a 100644 --- a/airtime_mvc/application/models/ShowInstance.php +++ b/airtime_mvc/application/models/ShowInstance.php @@ -518,7 +518,7 @@ SQL; return false; } - public function delete() + public function delete($rabbitmqPush = true) { // see if it was recording show $recording = $this->isRecorded(); @@ -568,7 +568,9 @@ SQL; } } - Application_Model_RabbitMq::PushSchedule(); + if ($rabbitmqPush) { + Application_Model_RabbitMq::PushSchedule(); + } } public function setRecordedFile($file_id) diff --git a/airtime_mvc/public/css/media_library.css b/airtime_mvc/public/css/media_library.css index 06120698d..ef078fd55 100644 --- a/airtime_mvc/public/css/media_library.css +++ b/airtime_mvc/public/css/media_library.css @@ -38,7 +38,7 @@ #library_content { float: left; width: 50%; - overflow: hidden; + overflow: auto; } #library_display { diff --git a/airtime_mvc/public/js/airtime/showbuilder/builder.js b/airtime_mvc/public/js/airtime/showbuilder/builder.js index 47484c2ce..26c472ec0 100644 --- a/airtime_mvc/public/js/airtime/showbuilder/builder.js +++ b/airtime_mvc/public/js/airtime/showbuilder/builder.js @@ -71,6 +71,11 @@ var AIRTIME = (function(AIRTIME){ else { AIRTIME.button.disableButton("btn-group #timeline-select", true); } + + //need to check if the 'Select' button is disabled + if ($(".btn-group #timeline-select").is(":disabled")) { + $(".btn-group #timeline-select").removeAttr("disabled"); + } }; mod.checkTrimButton = function() { @@ -967,7 +972,7 @@ var AIRTIME = (function(AIRTIME){ $('#timeline-sn').click(function(){mod.selectNone();}); //cancel current show - $toolbar.find('.icon-ban-circle') + $toolbar.find('.icon-ban-circle').parent() .click(function() { var $tr, data, @@ -1001,7 +1006,7 @@ var AIRTIME = (function(AIRTIME){ }); //jump to current - $toolbar.find('.icon-step-forward') + $toolbar.find('.icon-step-forward').parent() .click(function() { if (AIRTIME.button.isDisabled('icon-step-forward') === true) { @@ -1018,7 +1023,7 @@ var AIRTIME = (function(AIRTIME){ }); //delete overbooked tracks. - $toolbar.find('.icon-cut') + $toolbar.find('.icon-cut').parent() .click(function() { if (AIRTIME.button.isDisabled('icon-cut') === true) { @@ -1038,7 +1043,7 @@ var AIRTIME = (function(AIRTIME){ }); //delete selected tracks - $toolbar.find('.icon-trash') + $toolbar.find('.icon-trash').parent() .click(function() { if (AIRTIME.button.isDisabled('icon-trash') === true) { @@ -1082,13 +1087,6 @@ var AIRTIME = (function(AIRTIME){ $ch.removeAttr("disabled"); } }); - $sbContent.on("mouseleave", ".btn-group #timeline-select", function(ev) { - $el = $(this).parent(); - - if (!$el.hasClass("ui-state-disabled")) { - $el.removeClass("ui-state-hover"); - } - }); //begin context menu initialization. diff --git a/python_apps/pypo/liquidsoap_scripts/ls_lib.liq b/python_apps/pypo/liquidsoap_scripts/ls_lib.liq index 085d03661..17aadbb8e 100644 --- a/python_apps/pypo/liquidsoap_scripts/ls_lib.liq +++ b/python_apps/pypo/liquidsoap_scripts/ls_lib.liq @@ -399,7 +399,6 @@ dyn_out = output.icecast(%wav, def set_dynamic_source_id(id) = current_dyn_id := id - #"Done!" string_of(!current_dyn_id) end diff --git a/python_apps/pypo/liquidsoap_scripts/ls_script.liq b/python_apps/pypo/liquidsoap_scripts/ls_script.liq index 7b04210b4..87e7fbc89 100644 --- a/python_apps/pypo/liquidsoap_scripts/ls_script.liq +++ b/python_apps/pypo/liquidsoap_scripts/ls_script.liq @@ -19,7 +19,6 @@ queue = amplify(1., override="replay_gain", queue) #live stream setup set("harbor.bind_addr", "0.0.0.0") -#TODO: Need to create a randomized password for every instance current_dyn_id = ref '' pypo_data = ref '0' @@ -49,7 +48,10 @@ queue = map_metadata(update=false, append_title, queue) queue = crossfade(queue) -stream_queue = switch(id="stream_queue_switch", track_sensitive=false, transitions=[transition, transition], [({!webstream_enabled},web_stream), ({true}, queue)]) +stream_queue = switch(id="stream_queue_switch", track_sensitive=false, + transitions=[transition, transition], + [({!webstream_enabled},web_stream), + ({true}, queue)]) ignore(output.dummy(stream_queue, fallible=true)) @@ -113,31 +115,31 @@ ignore(output.dummy(default, fallible=true)) master_dj_enabled = ref false live_dj_enabled = ref false -scheduled_play_enabled = ref false +scheduled_play_enabled = ref false def make_master_dj_available() - master_dj_enabled := true + master_dj_enabled := true end def make_master_dj_unavailable() - master_dj_enabled := false + master_dj_enabled := false end def make_live_dj_available() - live_dj_enabled := true + live_dj_enabled := true end def make_live_dj_unavailable() - live_dj_enabled := false + live_dj_enabled := false end def make_scheduled_play_available() - scheduled_play_enabled := true - just_switched := true + scheduled_play_enabled := true + just_switched := true end def make_scheduled_play_unavailable() - scheduled_play_enabled := false + scheduled_play_enabled := false end def update_source_status(sourcename, status) = @@ -163,23 +165,23 @@ end #auth function for live stream def check_master_dj_client(user,password) = - log("master connected") - #get the output of the php script - ret = get_process_lines("python /usr/lib/airtime/pypo/bin/liquidsoap_scripts/liquidsoap_auth.py --master #{user} #{password}") - #ret has now the value of the live client (dj1,dj2, or djx), or "ERROR"/"unknown" ... - ret = list.hd(ret) - - #return true to let the client transmit data, or false to tell harbor to decline - ret == "True" + log("master connected") + #get the output of the php script + ret = get_process_lines("python /usr/lib/airtime/pypo/bin/liquidsoap_scripts/liquidsoap_auth.py --master #{user} #{password}") + #ret has now the value of the live client (dj1,dj2, or djx), or "ERROR"/"unknown" ... + ret = list.hd(ret) + + #return true to let the client transmit data, or false to tell harbor to decline + ret == "True" end def check_dj_client(user,password) = - log("live dj connected") - #get the output of the php script - ret = get_process_lines("python /usr/lib/airtime/pypo/bin/liquidsoap_scripts/liquidsoap_auth.py --dj #{user} #{password}") - #ret has now the value of the live client (dj1,dj2, or djx), or "ERROR"/"unknown" ... - hd = list.hd(ret) - hd == "True" + log("live dj connected") + #get the output of the php script + ret = get_process_lines("python /usr/lib/airtime/pypo/bin/liquidsoap_scripts/liquidsoap_auth.py --dj #{user} #{password}") + #ret has now the value of the live client (dj1,dj2, or djx), or "ERROR"/"unknown" ... + hd = list.hd(ret) + hd == "True" end def append_dj_inputs(master_harbor_input_port, master_harbor_input_mount_point, dj_harbor_input_port, dj_harbor_input_mount_point, s) = @@ -214,46 +216,48 @@ def append_dj_inputs(master_harbor_input_port, master_harbor_input_mount_point, end end -s = switch(id="default_switch", track_sensitive=false, transitions=[transition_default, transition], [({!scheduled_play_enabled},stream_queue),({true},default)]) -s = append_dj_inputs(master_live_stream_port, master_live_stream_mp, dj_live_stream_port, dj_live_stream_mp, s) +s = switch(id="default_switch", track_sensitive=false, + transitions=[transition_default, transition], + [({!scheduled_play_enabled}, stream_queue),({true},default)]) +s = append_dj_inputs(master_live_stream_port, master_live_stream_mp, + dj_live_stream_port, dj_live_stream_mp, s) # Attach a skip command to the source s: add_skip_command(s) server.register(namespace="streams", - description="Stop Master DJ source.", - usage="master_dj_stop", - "master_dj_stop", - fun (s) -> begin log("streams.master_dj_stop") make_master_dj_unavailable() "Done." end) + description="Stop Master DJ source.", + usage="master_dj_stop", + "master_dj_stop", + fun (s) -> begin log("streams.master_dj_stop") make_master_dj_unavailable() "Done." end) server.register(namespace="streams", - description="Start Master DJ source.", - usage="master_dj_start", - "master_dj_start", - fun (s) -> begin log("streams.master_dj_start") make_master_dj_available() "Done." end) + description="Start Master DJ source.", + usage="master_dj_start", + "master_dj_start", + fun (s) -> begin log("streams.master_dj_start") make_master_dj_available() "Done." end) server.register(namespace="streams", - description="Stop Live DJ source.", - usage="live_dj_stop", - "live_dj_stop", - fun (s) -> begin log("streams.live_dj_stop") make_live_dj_unavailable() "Done." end) + description="Stop Live DJ source.", + usage="live_dj_stop", + "live_dj_stop", + fun (s) -> begin log("streams.live_dj_stop") make_live_dj_unavailable() "Done." end) server.register(namespace="streams", - description="Start Live DJ source.", - usage="live_dj_start", - "live_dj_start", - fun (s) -> begin log("streams.live_dj_start") make_live_dj_available() "Done." end) + description="Start Live DJ source.", + usage="live_dj_start", + "live_dj_start", + fun (s) -> begin log("streams.live_dj_start") make_live_dj_available() "Done." end) server.register(namespace="streams", - description="Stop Scheduled Play source.", - usage="scheduled_play_stop", - "scheduled_play_stop", - fun (s) -> begin log("streams.scheduled_play_stop") make_scheduled_play_unavailable() "Done." end) + description="Stop Scheduled Play source.", + usage="scheduled_play_stop", + "scheduled_play_stop", + fun (s) -> begin log("streams.scheduled_play_stop") make_scheduled_play_unavailable() "Done." end) server.register(namespace="streams", - description="Start Scheduled Play source.", - usage="scheduled_play_start", - "scheduled_play_start", - fun (s) -> begin log("streams.scheduled_play_start") make_scheduled_play_available() "Done." end) + description="Start Scheduled Play source.", + usage="scheduled_play_start", + "scheduled_play_start", + fun (s) -> begin log("streams.scheduled_play_start") make_scheduled_play_available() "Done." end) if output_sound_device then - success = ref false log(output_sound_device_type) diff --git a/python_apps/pypo/pypofetch.py b/python_apps/pypo/pypofetch.py index 9cd069b44..720b1eef4 100644 --- a/python_apps/pypo/pypofetch.py +++ b/python_apps/pypo/pypofetch.py @@ -85,6 +85,8 @@ class PypoFetch(Thread): if command == 'update_schedule': self.schedule_data = m['schedule'] self.process_schedule(self.schedule_data) + elif command == 'reset_liquidsoap_bootstrap': + self.set_bootstrap_variables() elif command == 'update_stream_setting': self.logger.info("Updating stream setting...") self.regenerate_liquidsoap_conf(m['setting']) @@ -103,6 +105,8 @@ class PypoFetch(Thread): elif command == 'disconnect_source': self.logger.info("disconnect_on_source show command received...") self.disconnect_source(self.logger, self.telnet_lock, m['sourcename']) + else: + self.logger.info("Unknown command: %s" % command) # update timeout value if command == 'update_schedule': @@ -173,7 +177,7 @@ class PypoFetch(Thread): def set_bootstrap_variables(self): self.logger.debug('Getting information needed on bootstrap from Airtime') info = self.api_client.get_bootstrap_info() - if info == None: + if info is None: self.logger.error('Unable to get bootstrap info.. Exiting pypo...') sys.exit(1) else: diff --git a/python_apps/pypo/pypomessagehandler.py b/python_apps/pypo/pypomessagehandler.py index bdc9c66d9..396f13fba 100644 --- a/python_apps/pypo/pypomessagehandler.py +++ b/python_apps/pypo/pypomessagehandler.py @@ -68,6 +68,9 @@ class PypoMessageHandler(Thread): if command == 'update_schedule': self.logger.info("Updating schdule...") self.pypo_queue.put(message) + elif command == 'reset_liquidsoap_bootstrap': + self.logger.info("Resetting bootstrap vars...") + self.pypo_queue.put(message) elif command == 'update_stream_setting': self.logger.info("Updating stream setting...") self.pypo_queue.put(message) @@ -90,6 +93,8 @@ class PypoMessageHandler(Thread): self.recorder_queue.put(message) elif command == 'cancel_recording': self.recorder_queue.put(message) + else: + self.logger.info("Unknown command: %s" % command) except Exception, e: self.logger.error("Exception in handling RabbitMQ message: %s", e) diff --git a/python_apps/pypo/pypopush.py b/python_apps/pypo/pypopush.py index 1a9672872..4defee3e9 100644 --- a/python_apps/pypo/pypopush.py +++ b/python_apps/pypo/pypopush.py @@ -473,8 +473,6 @@ class PypoPush(Thread): msg = 'streams.scheduled_play_start\n' tn.write(msg) - - msg = 'dynamic_source.output_start\n' self.logger.debug(msg) tn.write(msg)