From 398fbb04dbab9577d71b7f72abc2f99dcadb033d Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Fri, 17 Aug 2012 17:29:17 -0400 Subject: [PATCH 01/12] CC-1665: Scheduled stream rebroadcasting and recording -don't show delete button until a stream has been saved --- airtime_mvc/application/controllers/WebstreamController.php | 2 ++ .../application/views/scripts/webstream/webstream.phtml | 2 +- airtime_mvc/public/js/airtime/library/spl.js | 4 +++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/controllers/WebstreamController.php b/airtime_mvc/application/controllers/WebstreamController.php index e3e9e8246..73ad7fc59 100644 --- a/airtime_mvc/application/controllers/WebstreamController.php +++ b/airtime_mvc/application/controllers/WebstreamController.php @@ -27,6 +27,7 @@ class WebstreamController extends Zend_Controller_Action $webstream->setDbName("Untitled Webstream"); $this->view->ws = new Application_Model_Webstream($webstream); + $this->view->action = "new"; $this->view->html = $this->view->render('webstream/webstream.phtml'); } @@ -41,6 +42,7 @@ class WebstreamController extends Zend_Controller_Action $webstream = CcWebstreamQuery::create()->findPK($id); $this->view->ws = new Application_Model_Webstream($webstream); + $this->view->action = "edit"; $this->view->html = $this->view->render('webstream/webstream.phtml'); } diff --git a/airtime_mvc/application/views/scripts/webstream/webstream.phtml b/airtime_mvc/application/views/scripts/webstream/webstream.phtml index 6f5653cdc..d3660bfc4 100644 --- a/airtime_mvc/application/views/scripts/webstream/webstream.phtml +++ b/airtime_mvc/application/views/scripts/webstream/webstream.phtml @@ -1,6 +1,6 @@ ws)) : ?> - + ws)) : ?> diff --git a/airtime_mvc/public/js/airtime/library/spl.js b/airtime_mvc/public/js/airtime/library/spl.js index dedd7c2b1..92bf939c9 100644 --- a/airtime_mvc/public/js/airtime/library/spl.js +++ b/airtime_mvc/public/js/airtime/library/spl.js @@ -360,7 +360,6 @@ var AIRTIME = (function(AIRTIME){ appendAddButton(); appendModAddButton(); removeButtonCheck(); - } //sets events dynamically for playlist entries (each row in the playlist) @@ -600,6 +599,9 @@ var AIRTIME = (function(AIRTIME){ var $ws_id = $("#ws_id"); $ws_id.attr("value", json.streamId); + var $ws_id = $("#ws_delete"); + $ws_id.show(); + //redraw the library to show the new webstream redrawLib(); } From a6d10d8378a8526ad050405b082542c114ece0fa Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Sat, 18 Aug 2012 21:48:57 -0400 Subject: [PATCH 02/12] CC-1665: Scheduled stream rebroadcasting and recording -fix syntax error --- python_apps/pypo/pypopush.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/pypo/pypopush.py b/python_apps/pypo/pypopush.py index dccaefd1b..87e651fab 100644 --- a/python_apps/pypo/pypopush.py +++ b/python_apps/pypo/pypopush.py @@ -390,7 +390,7 @@ class PypoPush(Thread): elif media_item['type'] == 'stream_buffer_start': self.start_web_stream_buffer(media_item) elif media_item['type'] == "stream": - if media_item['row_id'] != self.current_prebuffering_stream_id + if media_item['row_id'] != self.current_prebuffering_stream_id: #this is called if the stream wasn't scheduled sufficiently ahead of time #so that the prebuffering stage could take effect. Let's do the prebuffering now. self.start_web_stream_buffer(media_item) From 1dd1ba4420eea3fab453845684f1bee17e218cba Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Sat, 18 Aug 2012 21:52:06 -0400 Subject: [PATCH 03/12] CC-4114: use liquidsoap shutdown() command to restart liquidsoap -moved liquidsoap into its own init.d script. Still need to do some testing. --- python_apps/pypo/airtime-liquidsoap-init-d | 70 ++++++++++++++ python_apps/pypo/airtime-playout-init-d | 96 ++----------------- python_apps/pypo/install/pypo-copy-files.py | 1 + python_apps/pypo/install/pypo-initialize.py | 1 + .../pypo/liquidsoap_scripts/ls_script.liq | 5 +- python_apps/pypo/monit-airtime-liquidsoap.cfg | 2 +- python_apps/pypo/pypofetch.py | 27 ++++-- 7 files changed, 107 insertions(+), 95 deletions(-) create mode 100755 python_apps/pypo/airtime-liquidsoap-init-d diff --git a/python_apps/pypo/airtime-liquidsoap-init-d b/python_apps/pypo/airtime-liquidsoap-init-d new file mode 100755 index 000000000..b78f30bef --- /dev/null +++ b/python_apps/pypo/airtime-liquidsoap-init-d @@ -0,0 +1,70 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: airtime-playout +# Required-Start: $local_fs $remote_fs $network $syslog +# Required-Stop: $local_fs $remote_fs $network $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Liquidsoap daemon +### END INIT INFO + +USERID=pypo +GROUPID=pypo +NAME="Liquidsoap Playout Engine" + +DAEMON=/usr/lib/airtime/pypo/bin/airtime-liquidsoap +PIDFILE=/var/run/airtime-liquidsoap.pid + +start () { + start-stop-daemon --start --background --quiet --chuid $USERID:$GROUPID \ + --nicelevel -15 --make-pidfile --pidfile $PIDFILE --startas $DAEMON + + monit monitor airtime-liquidsoap >/dev/null 2>&1 +} + +stop () { + monit unmonitor airtime-liquidsoap >/dev/null 2>&1 + /usr/lib/airtime/airtime_virtualenv/bin/python /usr/lib/airtime/pypo/bin/liquidsoap_scripts/liquidsoap_prepare_terminate.py + + # Send TERM after 5 seconds, wait at most 30 seconds. + start-stop-daemon --stop --oknodo --retry TERM/5/0/30 --quiet --pidfile $PIDFILE + rm -f $PIDFILE +} + +start_no_monit() { + start-stop-daemon --start --background --quiet --chuid $USERID:$USERID --make-pidfile --pidfile $PIDFILE --startas $DAEMON +} + + +case "${1:-''}" in + 'stop') + echo -n "Stopping Liquidsoap: " + stop + echo "Done." + ;; + 'start') + echo -n "Starting Liquidsoap: " + start + echo "Done." + ;; + 'restart') + # restart commands here + echo -n "Restarting Liquidsoap: " + stop + start + echo "Done." + ;; + 'start-no-monit') + # restart commands here + echo -n "Starting $NAME: " + start_no_monit + echo "Done." + ;; + + *) # no parameter specified + echo "Usage: $SELF start|stop|restart" + exit 1 + ;; + +esac diff --git a/python_apps/pypo/airtime-playout-init-d b/python_apps/pypo/airtime-playout-init-d index c2e27f320..499f6e1d7 100755 --- a/python_apps/pypo/airtime-playout-init-d +++ b/python_apps/pypo/airtime-playout-init-d @@ -9,80 +9,30 @@ # Short-Description: Manage airtime-playout daemon ### END INIT INFO -USERID=pypo -ROOTUSERID=root -GROUPID=pypo -NAME=Airtime\ Playout +USERID=root +NAME="Airtime Scheduler Engine" -DAEMON0=/usr/lib/airtime/pypo/bin/airtime-playout -PIDFILE0=/var/run/airtime-playout.pid - -DAEMON1=/usr/lib/airtime/pypo/bin/airtime-liquidsoap -PIDFILE1=/var/run/airtime-liquidsoap.pid - -liquidsoap_start () { - start-stop-daemon --start --background --quiet --chuid $USERID:$GROUPID \ - --nicelevel -15 --make-pidfile --pidfile $PIDFILE1 --startas $DAEMON1 - - monit monitor airtime-liquidsoap >/dev/null 2>&1 -} - -liquidsoap_stop () { - monit unmonitor airtime-liquidsoap >/dev/null 2>&1 - /usr/lib/airtime/airtime_virtualenv/bin/python /usr/lib/airtime/pypo/bin/liquidsoap_scripts/liquidsoap_prepare_terminate.py - - # Send TERM after 5 seconds, wait at most 30 seconds. - start-stop-daemon --stop --oknodo --retry TERM/5/0/30 --quiet --pidfile $PIDFILE1 - rm -f $PIDFILE1 -} - -stop_pypo () { - monit unmonitor airtime-playout >/dev/null 2>&1 - - # Send TERM after 5 seconds, wait at most 30 seconds. - start-stop-daemon --stop --oknodo --retry TERM/5/0/30 --quiet --pidfile $PIDFILE0 - rm -f $PIDFILE0 -} +DAEMON=/usr/lib/airtime/pypo/bin/airtime-playout +PIDFILE=/var/run/airtime-playout.pid start () { chown pypo:pypo /etc/airtime chown pypo:pypo /etc/airtime/liquidsoap.cfg - start-stop-daemon --start --background --quiet --chuid $ROOTUSERID:$ROOTUSERID --make-pidfile --pidfile $PIDFILE0 --startas $DAEMON0 + start-stop-daemon --start --background --quiet --chuid $USERID:$USERID --make-pidfile --pidfile $PIDFILE --startas $DAEMON monit monitor airtime-playout >/dev/null 2>&1 - - liquidsoap_start } stop () { # Send TERM after 5 seconds, wait at most 30 seconds. monit unmonitor airtime-playout >/dev/null 2>&1 - start-stop-daemon --stop --oknodo --retry TERM/5/0/30 --quiet --pidfile $PIDFILE0 - rm -f $PIDFILE0 - - liquidsoap_stop -} - -monit_restart() { - - start-stop-daemon --stop --oknodo --retry TERM/5/0/30 --quiet --pidfile $PIDFILE0 - rm -f $PIDFILE0 - - /usr/lib/airtime/airtime_virtualenv/bin/python /usr/lib/airtime/pypo/bin/liquidsoap_scripts/liquidsoap_prepare_terminate.py - start-stop-daemon --stop --oknodo --retry TERM/5/0/30 --quiet --pidfile $PIDFILE1 - rm -f $PIDFILE1 - - start-stop-daemon --start --background --quiet --chuid $ROOTUSERID:$ROOTUSERID --make-pidfile --pidfile $PIDFILE0 --startas $DAEMON0 - - start-stop-daemon --start --background --quiet --chuid $USERID:$GROUPID \ - --nicelevel -15 --make-pidfile --pidfile $PIDFILE1 --startas $DAEMON1 - + start-stop-daemon --stop --oknodo --retry TERM/5/0/30 --quiet --pidfile $PIDFILE + rm -f $PIDFILE } start_no_monit() { - start-stop-daemon --start --background --quiet --chuid $ROOTUSERID:$ROOTUSERID --make-pidfile --pidfile $PIDFILE0 --startas $DAEMON0 - liquidsoap_start + start-stop-daemon --start --background --quiet --chuid $USERID:$USERID --make-pidfile --pidfile $PIDFILE --startas $DAEMON } case "${1:-''}" in @@ -111,41 +61,13 @@ case "${1:-''}" in start_no_monit echo "Done." ;; - 'monit-restart') - # restart commands here - echo -n "Monit Restarting $NAME: " - monit_restart - echo "Done." - ;; 'status') # status commands here /usr/bin/airtime-check-system ;; - 'stop-liquidsoap') - echo -n "Stopping Liquidsoap: " - liquidsoap_stop - echo "Done." - ;; - 'start-liquidsoap') - echo -n "Starting Liquidsoap: " - liquidsoap_start - echo "Done." - ;; - 'restart-liquidsoap') - # restart commands here - echo -n "Restarting Liquidsoap: " - liquidsoap_stop - liquidsoap_start - echo "Done." - ;; - 'pypo-stop') - # restart commands here - echo -n "Restarting Pypo: " - stop_pypo - echo "Done." - ;; *) # no parameter specified echo "Usage: $SELF start|stop|restart|status" exit 1 ;; + esac diff --git a/python_apps/pypo/install/pypo-copy-files.py b/python_apps/pypo/install/pypo-copy-files.py index 5d58890b1..31c4199cc 100644 --- a/python_apps/pypo/install/pypo-copy-files.py +++ b/python_apps/pypo/install/pypo-copy-files.py @@ -98,6 +98,7 @@ try: #copy init.d script shutil.copy(config["bin_dir"]+"/bin/airtime-playout-init-d", "/etc/init.d/airtime-playout") + shutil.copy(config["bin_dir"]+"/bin/airtime-liquidsoap-init-d", "/etc/init.d/airtime-liquidsoap") #copy log rotate script shutil.copy(config["bin_dir"]+"/bin/liquidsoap_scripts/airtime-liquidsoap.logrotate", "/etc/logrotate.d/airtime-liquidsoap") diff --git a/python_apps/pypo/install/pypo-initialize.py b/python_apps/pypo/install/pypo-initialize.py index b82d045f4..579fc7b1c 100644 --- a/python_apps/pypo/install/pypo-initialize.py +++ b/python_apps/pypo/install/pypo-initialize.py @@ -109,6 +109,7 @@ try: if "airtime_service_start" in os.environ and os.environ["airtime_service_start"] == "t": print "* Waiting for pypo processes to start..." + subprocess.call("invoke-rc.d airtime-liquidsoap start-no-monit > /dev/null 2>&1", shell=True) subprocess.call("invoke-rc.d airtime-playout start-no-monit > /dev/null 2>&1", shell=True) except Exception, e: diff --git a/python_apps/pypo/liquidsoap_scripts/ls_script.liq b/python_apps/pypo/liquidsoap_scripts/ls_script.liq index 04f05c8ce..e9a59263f 100644 --- a/python_apps/pypo/liquidsoap_scripts/ls_script.liq +++ b/python_apps/pypo/liquidsoap_scripts/ls_script.liq @@ -76,6 +76,9 @@ server.register(namespace="streams", server.register(namespace="vars", "default_dj_fade", fun (s) -> begin default_dj_fade := float_of_string(s) s end) +server.register(namespace="system", + "shutdown", + fun (s) -> begin shutdown() "Shutting Down" end) server.register(namespace="dynamic_source", description="Enable webstream output", @@ -105,7 +108,7 @@ server.register(namespace="dynamic_source", destroy_dynamic_source) default = amplify(id="silence_src", 0.00001, noise()) -default = rewrite_metadata([("artist","Airtime"), ("title", "offline")],default) +default = rewrite_metadata([("artist","Airtime"), ("title", "offline")], default) ignore(output.dummy(default, fallible=true)) master_dj_enabled = ref false diff --git a/python_apps/pypo/monit-airtime-liquidsoap.cfg b/python_apps/pypo/monit-airtime-liquidsoap.cfg index aececd388..963f73800 100644 --- a/python_apps/pypo/monit-airtime-liquidsoap.cfg +++ b/python_apps/pypo/monit-airtime-liquidsoap.cfg @@ -5,5 +5,5 @@ check process airtime-liquidsoap with pidfile "/var/run/airtime-liquidsoap.pid" - start program = "/etc/init.d/airtime-playout monit-restart" with timeout 5 seconds + start program = "/etc/init.d/airtime-liquidsoap start" with timeout 5 seconds stop program = "/etc/init.d/airtime-playout stop" diff --git a/python_apps/pypo/pypofetch.py b/python_apps/pypo/pypofetch.py index e1b6771b7..bb02ec580 100644 --- a/python_apps/pypo/pypofetch.py +++ b/python_apps/pypo/pypofetch.py @@ -86,7 +86,7 @@ class PypoFetch(Thread): self.process_schedule(self.schedule_data) elif command == 'update_stream_setting': self.logger.info("Updating stream setting...") - self.regenerateLiquidsoapConf(m['setting']) + self.regenerate_liquidsoap_conf(m['setting']) elif command == 'update_stream_format': self.logger.info("Updating stream format...") self.update_liquidsoap_stream_format(m['stream_format']) @@ -204,12 +204,25 @@ class PypoFetch(Thread): fh.write(api_client.encode_to(buffer_str)) fh.write("log_file = \"/var/log/airtime/pypo-liquidsoap/