From 67ffd2d34a1318cedc1e0839939a6bd2c07a4338 Mon Sep 17 00:00:00 2001 From: Robb Ebright Date: Tue, 14 Mar 2017 01:15:14 +0000 Subject: [PATCH 1/9] Making show and master source ports and mount points editable. --- .../controllers/PreferenceController.php | 36 ++++++ .../forms/LiveStreamingPreferences.php | 109 ++++++++++++++---- .../application/models/StreamSetting.php | 2 +- .../scripts/form/preferences_livestream.phtml | 3 +- python_apps/pypo/pypo/pypofetch.py | 95 ++++++++++++++- 5 files changed, 216 insertions(+), 29 deletions(-) diff --git a/airtime_mvc/application/controllers/PreferenceController.php b/airtime_mvc/application/controllers/PreferenceController.php index 44c32d8fa..f4dcdd897 100644 --- a/airtime_mvc/application/controllers/PreferenceController.php +++ b/airtime_mvc/application/controllers/PreferenceController.php @@ -262,6 +262,41 @@ class PreferenceController extends Zend_Controller_Action //Application_Model_RabbitMq::PushSchedule(); } + // pulling this from the 2.5.x branch + if (!Application_Model_Preference::GetMasterDjConnectionUrlOverride()) { + $master_connection_url = "http://".$_SERVER['SERVER_NAME'].":".$values["master_source_port"].$values["master_source_mount"]; + if (empty($values["master_source_port"]) || empty($values["master_source_port"])) { + Application_Model_Preference::SetMasterDJSourceConnectionURL('N/A'); + } else { + Application_Model_Preference::SetMasterDJSourceConnectionURL($master_connection_url); + } + } else { + Application_Model_Preference::SetMasterDJSourceConnectionURL($values["master_source_host"]); + } + + if (!Application_Model_Preference::GetLiveDjConnectionUrlOverride()) { + $live_connection_url = "http://".$_SERVER['SERVER_NAME'].":".$values["show_source_port"].$values["show_source_mount"]; + if (empty($values["show_source_port"]) || empty($values["show_source_mount"])) { + Application_Model_Preference::SetLiveDJSourceConnectionURL('N/A'); + } else { + Application_Model_Preference::SetLiveDJSourceConnectionURL($live_connection_url); + } + } else { + Application_Model_Preference::SetLiveDJSourceConnectionURL($values["show_source_host"]); + } + + + Application_Model_StreamSetting::setMasterLiveStreamPort($values["master_source_port"]); + Application_Model_StreamSetting::setMasterLiveStreamMountPoint($values["master_source_mount"]); + Application_Model_StreamSetting::setDjLiveStreamPort($values["show_source_port"]); + Application_Model_StreamSetting::setDjLiveStreamMountPoint($values["show_source_mount"]); + + + + + + + Application_Model_StreamSetting::setOffAirMeta($values['offAirMeta']); // store stream update timestamp @@ -355,6 +390,7 @@ class PreferenceController extends Zend_Controller_Action Application_Model_Preference::SetDefaultTransitionFade($values["transition_fade"]); Application_Model_Preference::SetAutoTransition($values["auto_transition"]); Application_Model_Preference::SetAutoSwitch($values["auto_switch"]); + } public function serverBrowseAction() diff --git a/airtime_mvc/application/forms/LiveStreamingPreferences.php b/airtime_mvc/application/forms/LiveStreamingPreferences.php index 1637ed76f..1e44c7cc2 100644 --- a/airtime_mvc/application/forms/LiveStreamingPreferences.php +++ b/airtime_mvc/application/forms/LiveStreamingPreferences.php @@ -7,6 +7,7 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm { $CC_CONFIG = Config::getConfig(); $isDemo = isset($CC_CONFIG['demo']) && $CC_CONFIG['demo'] == 1; + $isStreamConfigable = Application_Model_Preference::GetEnableStreamConf() == "true"; $defaultFade = Application_Model_Preference::GetDefaultTransitionFade(); @@ -63,42 +64,54 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm // Master source connection url parameters $masterSourceHost = new Zend_Form_Element_Text('master_source_host'); - $masterSourceHost->setAttrib('readonly', true) - ->setLabel(_('Host:')) - ->setValue(isset($masterSourceParams["host"])?$masterSourceParams["host"]:""); + $masterSourceHost->setLabel(_('Host:')) + ->setAttrib('readonly', true) + ->setValue(Application_Model_Preference::GetMasterDJSourceConnectionURL()); $this->addElement($masterSourceHost); + //liquidsoap harbor.input port + $betweenValidator = Application_Form_Helper_ValidationTypes::overrideBetweenValidator(1024, 49151); + $m_port = Application_Model_StreamSetting::getMasterLiveStreamPort(); $masterSourcePort = new Zend_Form_Element_Text('master_source_port'); - $masterSourcePort->setAttrib('readonly', true) - ->setLabel(_('Port:')) - ->setValue(isset($masterSourceParams["port"])?$masterSourceParams["port"]:""); + $masterSourcePort->setLabel(_('Master Source Port:')) + ->setValue($m_port) + ->setValidators(array($betweenValidator)) + ->addValidator('regex', false, array('pattern'=>'/^[0-9]+$/', 'messages'=>array('regexNotMatch'=>_('Only numbers are allowed.')))); $this->addElement($masterSourcePort); + $m_mount = Application_Model_StreamSetting::getMasterLiveStreamMountPoint(); $masterSourceMount = new Zend_Form_Element_Text('master_source_mount'); - $masterSourceMount->setAttrib('readonly', true) - ->setLabel(_('Mount:')) - ->setValue(isset($masterSourceParams["path"])?$masterSourceParams["path"]:""); + $masterSourceMount->setLabel(_('Master Source Mount:')) + ->setValue($m_mount) + ->setValidators(array( + array('regex', false, array('/^[^ &<>]+$/', 'messages' => _('Invalid character entered'))))); $this->addElement($masterSourceMount); $showSourceParams = parse_url(Application_Model_Preference::GetLiveDJSourceConnectionURL()); // Show source connection url parameters $showSourceHost = new Zend_Form_Element_Text('show_source_host'); - $showSourceHost->setAttrib('readonly', true) - ->setLabel(_('Host:')) - ->setValue(isset($showSourceParams["host"])?$showSourceParams["host"]:""); + $showSourceHost->setLabel(_('Host:')) + ->setAttrib('readonly', true) + ->setValue(Application_Model_Preference::GetLiveDJSourceConnectionURL()); $this->addElement($showSourceHost); + //liquidsoap harbor.input port + $l_port = Application_Model_StreamSetting::getDjLiveStreamPort(); + $showSourcePort = new Zend_Form_Element_Text('show_source_port'); - $showSourcePort->setAttrib('readonly', true) - ->setLabel(_('Port:')) - ->setValue(isset($showSourceParams["port"])?$showSourceParams["port"]:""); + $showSourcePort->setLabel(_('Show Source Port:')) + ->setValue($l_port) + ->setValidators(array($betweenValidator)) + ->addValidator('regex', false, array('pattern'=>'/^[0-9]+$/', 'messages'=>array('regexNotMatch'=>_('Only numbers are allowed.')))); $this->addElement($showSourcePort); + $l_mount = Application_Model_StreamSetting::getDjLiveStreamMountPoint(); $showSourceMount = new Zend_Form_Element_Text('show_source_mount'); - $showSourceMount->setAttrib('readonly', true) - ->setLabel(_('Mount:')) - ->setValue(isset($showSourceParams["path"])?$showSourceParams["path"]:""); + $showSourceMount->setLabel(_('Show Source Mount:')) + ->setValue($l_mount) + ->setValidators(array( + array('regex', false, array('/^[^ &<>]+$/', 'messages' => _('Invalid character entered'))))); $this->addElement($showSourceMount); // demo only code @@ -125,12 +138,12 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm array ('ViewScript', array ( 'viewScript' => 'form/preferences_livestream.phtml', - 'master_source_host' => isset($masterSourceParams["host"])?$masterSourceParams["host"]:"", - 'master_source_port' => isset($masterSourceParams["port"])?$masterSourceParams["port"]:"", - 'master_source_mount' => isset($masterSourceParams["path"])?$masterSourceParams["path"]:"", - 'show_source_host' => isset($showSourceParams["host"])?$showSourceParams["host"]:"", - 'show_source_port' => isset($showSourceParams["port"])?$showSourceParams["port"]:"", - 'show_source_mount' => isset($showSourceParams["path"])?$showSourceParams["path"]:"", + 'master_source_host' => isset($masterSourceHost)?$masterSourceParams["host"]:"", + 'master_source_port' => isset($masterSourcePort)?$masterSourceParams["port"]:"", + 'master_source_mount' => isset($masterSourceMount)?$masterSourceParams["path"]:"", + 'show_source_host' => isset($showSourceHost)?$showSourceParams["host"]:"", + 'show_source_port' => isset($showSourcePort)?$showSourceParams["port"]:"", + 'show_source_mount' => isset($showSourceMount)?$showSourceParams["path"]:"", 'isDemo' => $isDemo, ) ) @@ -140,7 +153,53 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm public function isValid($data) { - return parent::isValid($data); + $isValid = parent::isValid($data); + $master_source_port = $data['master_source_port']; + $show_source_port = $data['show_source_port']; + + if ($master_source_port == $show_source_port && $master_source_port != "") { + $element = $this->getElement('show_source_port'); + $element->addError(_("You cannot use same port as Master DJ port.")); + $isValid = false; + } + if ($master_source_port != "") { + if (is_numeric($master_source_port)) { + if ($master_source_port != Application_Model_StreamSetting::getMasterLiveStreamPort()) { + $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); + try { + socket_bind($sock, 0, $master_source_port); + } catch (Exception $e) { + $element = $this->getElement("master_source_port"); + $element->addError(sprintf(_("Port %s is not available"), $master_source_port)); + $isValid = false; + } + + socket_close($sock); + } + } else { + $isValid = false; + } + } + if ($show_source_port != "") { + if (is_numeric($show_source_port)) { + if ($show_source_port != Application_Model_StreamSetting::getDjLiveStreamPort()) { + $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); + try { + socket_bind($sock, 0, $show_source_port); + } catch (Exception $e) { + $element = $this->getElement("show_source_port"); + $element->addError(sprintf(_("Port %s is not available"), $show_source_port)); + $isValid = false; + } + socket_close($sock); + } + } else { + $isValid = false; + } + } + + return $isValid; + } } diff --git a/airtime_mvc/application/models/StreamSetting.php b/airtime_mvc/application/models/StreamSetting.php index 34e037cd5..faf5e4f5f 100644 --- a/airtime_mvc/application/models/StreamSetting.php +++ b/airtime_mvc/application/models/StreamSetting.php @@ -464,7 +464,7 @@ class Application_Model_StreamSetting public static function getDjLiveStreamPort() { - return self::getValue("dj_live_stream_port", 8001); + return self::getValue("dj_live_stream_port", 8002); } public static function setDjLiveStreamMountPoint($value) diff --git a/airtime_mvc/application/views/scripts/form/preferences_livestream.phtml b/airtime_mvc/application/views/scripts/form/preferences_livestream.phtml index 983e9eedb..788153bd2 100644 --- a/airtime_mvc/application/views/scripts/form/preferences_livestream.phtml +++ b/airtime_mvc/application/views/scripts/form/preferences_livestream.phtml @@ -15,8 +15,8 @@ element->getElement('master_username')->render() ?> element->getElement('master_password')->render() ?> - element->getElement("master_source_host")->render() ?> + element->getElement("master_source_port")->render() ?> element->getElement("master_source_mount")->render() ?> @@ -26,6 +26,7 @@

+ element->getElement("show_source_host")->render() ?> element->getElement("show_source_port")->render() ?> element->getElement("show_source_mount")->render() ?> diff --git a/python_apps/pypo/pypo/pypofetch.py b/python_apps/pypo/pypo/pypofetch.py index d9fa34616..9c859ddbe 100644 --- a/python_apps/pypo/pypo/pypofetch.py +++ b/python_apps/pypo/pypo/pypofetch.py @@ -208,8 +208,99 @@ class PypoFetch(Thread): TODO: This function needs to be way shorter, and refactored :/ - MK """ def regenerate_liquidsoap_conf(self, setting): - self.restart_liquidsoap() - self.update_liquidsoap_connection_status() + existing = {} + + setting = sorted(setting.items()) + try: + fh = open('/etc/airtime/liquidsoap.cfg', 'r') + except IOError, e: + #file does not exist + self.restart_liquidsoap() + return + + self.logger.info("Reading existing config...") + # read existing conf file and build dict + while True: + line = fh.readline() + + # empty line means EOF + if not line: + break + + line = line.strip() + + if not len(line) or line[0] == "#": + continue + + try: + key, value = line.split('=', 1) + except ValueError: + continue + key = key.strip() + value = value.strip() + value = value.replace('"', '') + if value == '' or value == "0": + value = '' + existing[key] = value + fh.close() + + # dict flag for any change in config + change = {} + # this flag is to detect disable -> disable change + # in that case, we don't want to restart even if there are changes. + state_change_restart = {} + #restart flag + restart = False + + self.logger.info("Looking for changes...") + # look for changes + for k, s in setting: + if "output_sound_device" in s[u'keyname'] or "icecast_vorbis_metadata" in s[u'keyname']: + dump, stream = s[u'keyname'].split('_', 1) + state_change_restart[stream] = False + # This is the case where restart is required no matter what + if (existing[s[u'keyname']] != str(s[u'value'])): + self.logger.info("'Need-to-restart' state detected for %s...", s[u'keyname']) + restart = True; + elif "master_live_stream_port" in s[u'keyname'] or "master_live_stream_mp" in s[u'keyname'] or "dj_live_stream_port" in s[u'keyname'] or "dj_live_stream_mp" in s[u'keyname'] or "off_air_meta" in s[u'keyname']: + if (existing[s[u'keyname']] != s[u'value']): + self.logger.info("'Need-to-restart' state detected for %s...", s[u'keyname']) + restart = True; + else: + stream, dump = s[u'keyname'].split('_', 1) + if "_output" in s[u'keyname']: + if (existing[s[u'keyname']] != s[u'value']): + self.logger.info("'Need-to-restart' state detected for %s...", s[u'keyname']) + restart = True; + state_change_restart[stream] = True + elif (s[u'value'] != 'disabled'): + state_change_restart[stream] = True + else: + state_change_restart[stream] = False + else: + # setting inital value + if stream not in change: + change[stream] = False + if not (s[u'value'] == existing[s[u'keyname']]): + self.logger.info("Keyname: %s, Current value: %s, New Value: %s", s[u'keyname'], existing[s[u'keyname']], s[u'value']) + change[stream] = True + + # set flag change for sound_device alway True + self.logger.info("Change:%s, State_Change:%s...", change, state_change_restart) + + for k, v in state_change_restart.items(): + if k == "sound_device" and v: + restart = True + elif v and change[k]: + self.logger.info("'Need-to-restart' state detected for %s...", k) + restart = True + # rewrite + if restart: + self.restart_liquidsoap() + else: + self.logger.info("No change detected in setting...") + self.update_liquidsoap_connection_status() + @ls_timeout From 1b90dbd4ca2f46c04e18462f35f87aa813810c41 Mon Sep 17 00:00:00 2001 From: Robb Ebright Date: Tue, 14 Mar 2017 04:02:51 +0000 Subject: [PATCH 2/9] working python liquidsoap reconfigure script, might need further refinement --- python_apps/pypo/pypo/pypofetch.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/python_apps/pypo/pypo/pypofetch.py b/python_apps/pypo/pypo/pypofetch.py index 9c859ddbe..9cdaf7163 100644 --- a/python_apps/pypo/pypo/pypofetch.py +++ b/python_apps/pypo/pypo/pypofetch.py @@ -255,25 +255,25 @@ class PypoFetch(Thread): self.logger.info("Looking for changes...") # look for changes for k, s in setting: - if "output_sound_device" in s[u'keyname'] or "icecast_vorbis_metadata" in s[u'keyname']: - dump, stream = s[u'keyname'].split('_', 1) + if "output_sound_device" in k or "icecast_vorbis_metadata" in k: + dump, stream = k.split('_', 1) state_change_restart[stream] = False # This is the case where restart is required no matter what - if (existing[s[u'keyname']] != str(s[u'value'])): - self.logger.info("'Need-to-restart' state detected for %s...", s[u'keyname']) + if (existing[k] != str(s)): + self.logger.info("'Need-to-restart' state detected for %s...", s) restart = True; - elif "master_live_stream_port" in s[u'keyname'] or "master_live_stream_mp" in s[u'keyname'] or "dj_live_stream_port" in s[u'keyname'] or "dj_live_stream_mp" in s[u'keyname'] or "off_air_meta" in s[u'keyname']: - if (existing[s[u'keyname']] != s[u'value']): - self.logger.info("'Need-to-restart' state detected for %s...", s[u'keyname']) + elif "master_live_stream_port" in k or "master_live_stream_mp" in k or "dj_live_stream_port" in k or "dj_live_stream_mp" in k or "off_air_meta" in k: + if (existing[k] != s): + self.logger.info("'Need-to-restart' state detected for %s...", s) restart = True; else: - stream, dump = s[u'keyname'].split('_', 1) - if "_output" in s[u'keyname']: - if (existing[s[u'keyname']] != s[u'value']): - self.logger.info("'Need-to-restart' state detected for %s...", s[u'keyname']) + stream, dump = k.split('_', 1) + if "_output" in k: + if (existing[k] != s): + self.logger.info("'Need-to-restart' state detected for %s...", s) restart = True; state_change_restart[stream] = True - elif (s[u'value'] != 'disabled'): + elif (k != 'disabled'): state_change_restart[stream] = True else: state_change_restart[stream] = False @@ -281,8 +281,8 @@ class PypoFetch(Thread): # setting inital value if stream not in change: change[stream] = False - if not (s[u'value'] == existing[s[u'keyname']]): - self.logger.info("Keyname: %s, Current value: %s, New Value: %s", s[u'keyname'], existing[s[u'keyname']], s[u'value']) + if not (s == existing[k]): + self.logger.info("Keyname: %s, Current value: %s, New Value: %s", k, existing[k], s) change[stream] = True # set flag change for sound_device alway True From f31236fe66e363158b0b55b1070e06c54e13be37 Mon Sep 17 00:00:00 2001 From: Robb Ebright Date: Tue, 14 Mar 2017 23:03:37 -0400 Subject: [PATCH 3/9] Fixed Override Javascript and Functionality --- Vagrantfile | 4 +++- .../scripts/form/preferences_livestream.phtml | 18 +++++++++++++++--- airtime_mvc/public/css/styles.css | 11 +++++++++++ .../js/airtime/preferences/streamsetting.js | 15 +++++++-------- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/Vagrantfile b/Vagrantfile index ba74a5e3c..cf7c41192 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -9,8 +9,10 @@ Vagrant.configure("2") do |config| config.vm.network "forwarded_port", guest: 8000, host:8000 # liquidsoap input harbors for instreaming (ie. /master) config.vm.network "forwarded_port", guest: 8001, host:8001 - # mkdics documentation + config.vm.network "forwarded_port", guest: 8002, host:8002 + # mkdocs documentation config.vm.network "forwarded_port", guest: 8888, host:8888 + # make sure we are using nfs (doesn't work out of the box with debian) config.vm.synced_folder ".", "/vagrant", type: "nfs" diff --git a/airtime_mvc/application/views/scripts/form/preferences_livestream.phtml b/airtime_mvc/application/views/scripts/form/preferences_livestream.phtml index 788153bd2..ee7723f95 100644 --- a/airtime_mvc/application/views/scripts/form/preferences_livestream.phtml +++ b/airtime_mvc/application/views/scripts/form/preferences_livestream.phtml @@ -15,8 +15,13 @@ element->getElement('master_username')->render() ?> element->getElement('master_password')->render() ?> - element->getElement("master_source_host")->render() ?> - + element->getElement("master_source_host")->render() ?> +    +
+ +
element->getElement("master_source_port")->render() ?> element->getElement("master_source_mount")->render() ?> @@ -26,8 +31,15 @@

- + element->getElement("show_source_host")->render() ?> +    + +
+ +
element->getElement("show_source_port")->render() ?> element->getElement("show_source_mount")->render() ?> diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css index b11bcbf81..c616930ef 100644 --- a/airtime_mvc/public/css/styles.css +++ b/airtime_mvc/public/css/styles.css @@ -169,6 +169,17 @@ select { right:7px; line-height:16px !important; } +#connection_url_override { + position: relative; + display: inline-block; + float: left; + margin-left: 5px; +} + +#master_dj_connection_url_actions { + float:left; +} + #auto_switch_help, #auto_transition_help { right: 200px; diff --git a/airtime_mvc/public/js/airtime/preferences/streamsetting.js b/airtime_mvc/public/js/airtime/preferences/streamsetting.js index 6b9f7f07c..28c27e028 100644 --- a/airtime_mvc/public/js/airtime/preferences/streamsetting.js +++ b/airtime_mvc/public/js/airtime/preferences/streamsetting.js @@ -111,18 +111,17 @@ function checkLiquidsoapStatus(){ function setLiveSourceConnectionOverrideListener(){ $("[id=connection_url_override]").click(function(event){ - var url_input = $(this).parent().find("#stream_url").children(); + var url_input = $(this).parent().find("dd[id$='_source_host-element']").children(); url_input.removeAttr("readonly"); - $(this).parent().find("div[id$='_dj_connection_url_actions']").show(); event.preventDefault(); }); // set action for "OK" and "X" var live_dj_actions = $("#live_dj_connection_url_actions"); - var live_dj_input = live_dj_actions.parent().find("#stream_url").children(); + var live_dj_input = live_dj_actions.parent().find("dd[id$='_source_host-element']").children(); var master_dj_actions = $("#master_dj_connection_url_actions"); - var master_dj_input = master_dj_actions.parent().find("#stream_url").children(); + var master_dj_input = master_dj_actions.parent().find("dd[id$='_source_host-element']").children(); live_dj_actions.find("#ok").click(function(event){ event.preventDefault(); @@ -136,8 +135,8 @@ function setLiveSourceConnectionOverrideListener(){ live_dj_actions.find("#reset").click(function(event){ event.preventDefault(); - var port = $("#dj_harbor_input_port").val(); - var mount = $("#dj_harbor_input_mount_point").val(); + var port = $("#show_source_port").val(); + var mount = $("#show_source_mount").val(); var url = "http://"+location.hostname+":"+port+"/"+mount; if (port == '' || mount == '') { url = 'N/A'; @@ -159,8 +158,8 @@ function setLiveSourceConnectionOverrideListener(){ }); master_dj_actions.find("#reset").click(function(event){ - var port = $("#master_harbor_input_port").val(); - var mount = $("#master_harbor_input_mount_point").val(); + var port = $("#master_source_port").val(); + var mount = $("#master_source_mount").val(); var url = "http://"+location.hostname+":"+port+"/"+mount; if (port == '' || mount == '') { url = 'N/A'; From 4c8f2ad4357dd496c9b77d97eb76864fcc0d5c6a Mon Sep 17 00:00:00 2001 From: Robb Ebright Date: Thu, 16 Mar 2017 10:18:43 -0400 Subject: [PATCH 4/9] fixed default and override URL settings and removed unused validation --- .../controllers/PreferenceController.php | 1 - .../forms/LiveStreamingPreferences.php | 49 +------------------ airtime_mvc/application/models/Preference.php | 14 +++++- .../js/airtime/preferences/streamsetting.js | 12 +++-- 4 files changed, 23 insertions(+), 53 deletions(-) diff --git a/airtime_mvc/application/controllers/PreferenceController.php b/airtime_mvc/application/controllers/PreferenceController.php index f4dcdd897..29f948960 100644 --- a/airtime_mvc/application/controllers/PreferenceController.php +++ b/airtime_mvc/application/controllers/PreferenceController.php @@ -264,7 +264,6 @@ class PreferenceController extends Zend_Controller_Action // pulling this from the 2.5.x branch if (!Application_Model_Preference::GetMasterDjConnectionUrlOverride()) { - $master_connection_url = "http://".$_SERVER['SERVER_NAME'].":".$values["master_source_port"].$values["master_source_mount"]; if (empty($values["master_source_port"]) || empty($values["master_source_port"])) { Application_Model_Preference::SetMasterDJSourceConnectionURL('N/A'); } else { diff --git a/airtime_mvc/application/forms/LiveStreamingPreferences.php b/airtime_mvc/application/forms/LiveStreamingPreferences.php index 1e44c7cc2..9c857be73 100644 --- a/airtime_mvc/application/forms/LiveStreamingPreferences.php +++ b/airtime_mvc/application/forms/LiveStreamingPreferences.php @@ -77,6 +77,7 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm ->setValue($m_port) ->setValidators(array($betweenValidator)) ->addValidator('regex', false, array('pattern'=>'/^[0-9]+$/', 'messages'=>array('regexNotMatch'=>_('Only numbers are allowed.')))); + $this->addElement($masterSourcePort); $m_mount = Application_Model_StreamSetting::getMasterLiveStreamMountPoint(); @@ -153,53 +154,7 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm public function isValid($data) { - $isValid = parent::isValid($data); - $master_source_port = $data['master_source_port']; - $show_source_port = $data['show_source_port']; - - if ($master_source_port == $show_source_port && $master_source_port != "") { - $element = $this->getElement('show_source_port'); - $element->addError(_("You cannot use same port as Master DJ port.")); - $isValid = false; - } - if ($master_source_port != "") { - if (is_numeric($master_source_port)) { - if ($master_source_port != Application_Model_StreamSetting::getMasterLiveStreamPort()) { - $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); - try { - socket_bind($sock, 0, $master_source_port); - } catch (Exception $e) { - $element = $this->getElement("master_source_port"); - $element->addError(sprintf(_("Port %s is not available"), $master_source_port)); - $isValid = false; - } - - socket_close($sock); - } - } else { - $isValid = false; - } - } - if ($show_source_port != "") { - if (is_numeric($show_source_port)) { - if ($show_source_port != Application_Model_StreamSetting::getDjLiveStreamPort()) { - $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); - try { - socket_bind($sock, 0, $show_source_port); - } catch (Exception $e) { - $element = $this->getElement("show_source_port"); - $element->addError(sprintf(_("Port %s is not available"), $show_source_port)); - $isValid = false; - } - socket_close($sock); - } - } else { - $isValid = false; - } - } - - return $isValid; - + return $isValid = parent::isValid($data); } } diff --git a/airtime_mvc/application/models/Preference.php b/airtime_mvc/application/models/Preference.php index 17f6d69be..31f6c7684 100644 --- a/airtime_mvc/application/models/Preference.php +++ b/airtime_mvc/application/models/Preference.php @@ -1102,7 +1102,13 @@ class Application_Model_Preference public static function GetMasterDJSourceConnectionURL() { - return self::getValue("master_dj_source_connection_url"); + $master_connection_url = self::getValue("master_dj_source_connection_url"); + if ($master_connection_url == "") { + $master_connection_url = "http://".$_SERVER['SERVER_NAME'].":". Application_Model_StreamSetting::getMasterLiveStreamPort() . Application_Model_StreamSetting::getMasterLiveStreamMountPoint(); + } + + return $master_connection_url; + } public static function SetLiveDJSourceConnectionURL($value) @@ -1112,7 +1118,11 @@ class Application_Model_Preference public static function GetLiveDJSourceConnectionURL() { - return self::getValue("live_dj_source_connection_url"); + $livedj_connection_url = self::getValue("live_dj_source_connection_url"); + if ($livedj_connection_url == "") { + $livedj_connection_url = "http://".$_SERVER['SERVER_NAME'].":". Application_Model_StreamSetting::getDjLiveStreamPort() . Application_Model_StreamSetting::getDjLiveStreamMountPoint(); + } + return $livedj_connection_url; } /* Source Connection URL override status starts */ diff --git a/airtime_mvc/public/js/airtime/preferences/streamsetting.js b/airtime_mvc/public/js/airtime/preferences/streamsetting.js index 28c27e028..b4b6989ff 100644 --- a/airtime_mvc/public/js/airtime/preferences/streamsetting.js +++ b/airtime_mvc/public/js/airtime/preferences/streamsetting.js @@ -129,7 +129,7 @@ function setLiveSourceConnectionOverrideListener(){ live_dj_input.val(url); live_dj_input.attr("readonly", "readonly"); live_dj_actions.hide(); - $.get(baseUrl+"Preference/set-source-connection-url/", {format: "json", type: "livedj", url:encodeURIComponent(url), override: 1}); + $.get(baseUrl+"Preference/set-source-connection-url", {format: "json", type: "livedj", url:encodeURIComponent(url), override: 1}); event.preventDefault(); }); @@ -137,7 +137,10 @@ function setLiveSourceConnectionOverrideListener(){ event.preventDefault(); var port = $("#show_source_port").val(); var mount = $("#show_source_mount").val(); - var url = "http://"+location.hostname+":"+port+"/"+mount; + if (mount.charAt(0) != '/') { + mount = ('/').concat(mount); + } + var url = "http://"+location.hostname+":"+port+mount; if (port == '' || mount == '') { url = 'N/A'; } @@ -160,7 +163,10 @@ function setLiveSourceConnectionOverrideListener(){ master_dj_actions.find("#reset").click(function(event){ var port = $("#master_source_port").val(); var mount = $("#master_source_mount").val(); - var url = "http://"+location.hostname+":"+port+"/"+mount; + if (mount.charAt(0) != '/') { + mount = ('/').concat(mount); + } + var url = "http://"+location.hostname+":"+port+mount; if (port == '' || mount == '') { url = 'N/A'; } From 9fe31a5923ed48f71fbb6014d3ed50eef2cbfe4a Mon Sep 17 00:00:00 2001 From: Robb Ebright Date: Thu, 16 Mar 2017 22:30:08 -0400 Subject: [PATCH 5/9] minor code clean-up --- .../controllers/PreferenceController.php | 1 + .../forms/LiveStreamingPreferences.php | 90 +++++++++---------- 2 files changed, 44 insertions(+), 47 deletions(-) diff --git a/airtime_mvc/application/controllers/PreferenceController.php b/airtime_mvc/application/controllers/PreferenceController.php index 29f948960..f4dcdd897 100644 --- a/airtime_mvc/application/controllers/PreferenceController.php +++ b/airtime_mvc/application/controllers/PreferenceController.php @@ -264,6 +264,7 @@ class PreferenceController extends Zend_Controller_Action // pulling this from the 2.5.x branch if (!Application_Model_Preference::GetMasterDjConnectionUrlOverride()) { + $master_connection_url = "http://".$_SERVER['SERVER_NAME'].":".$values["master_source_port"].$values["master_source_mount"]; if (empty($values["master_source_port"]) || empty($values["master_source_port"])) { Application_Model_Preference::SetMasterDJSourceConnectionURL('N/A'); } else { diff --git a/airtime_mvc/application/forms/LiveStreamingPreferences.php b/airtime_mvc/application/forms/LiveStreamingPreferences.php index 9c857be73..675d6be18 100644 --- a/airtime_mvc/application/forms/LiveStreamingPreferences.php +++ b/airtime_mvc/application/forms/LiveStreamingPreferences.php @@ -12,52 +12,52 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm $defaultFade = Application_Model_Preference::GetDefaultTransitionFade(); $this->setDecorators(array( - array('ViewScript', array('viewScript' => 'form/preferences_livestream.phtml')), - )); + array('ViewScript', array('viewScript' => 'form/preferences_livestream.phtml')), + )); // automatic trasition on source disconnection $auto_transition = new Zend_Form_Element_Checkbox("auto_transition"); $auto_transition->setLabel(_("Auto Switch Off:")) - ->setValue(Application_Model_Preference::GetAutoTransition()); + ->setValue(Application_Model_Preference::GetAutoTransition()); $this->addElement($auto_transition); // automatic switch on upon source connection $auto_switch = new Zend_Form_Element_Checkbox("auto_switch"); $auto_switch->setLabel(_("Auto Switch On:")) - ->setValue(Application_Model_Preference::GetAutoSwitch()); + ->setValue(Application_Model_Preference::GetAutoSwitch()); $this->addElement($auto_switch); // Default transition fade $transition_fade = new Zend_Form_Element_Text("transition_fade"); $transition_fade->setLabel(_("Switch Transition Fade (s):")) - ->setFilters(array('StringTrim')) - ->addValidator('regex', false, array('/^\d*(\.\d+)?$/', - 'messages' => _('Please enter a time in seconds (eg. 0.5)'))) - ->setValue($defaultFade); + ->setFilters(array('StringTrim')) + ->addValidator('regex', false, array('/^\d*(\.\d+)?$/', + 'messages' => _('Please enter a time in seconds (eg. 0.5)'))) + ->setValue($defaultFade); $this->addElement($transition_fade); //Master username $master_username = new Zend_Form_Element_Text('master_username'); $master_username->setAttrib('autocomplete', 'off') - ->setAllowEmpty(true) - ->setLabel(_('Username:')) - ->setFilters(array('StringTrim')) - ->setValue(Application_Model_Preference::GetLiveStreamMasterUsername()); + ->setAllowEmpty(true) + ->setLabel(_('Username:')) + ->setFilters(array('StringTrim')) + ->setValue(Application_Model_Preference::GetLiveStreamMasterUsername()); $this->addElement($master_username); //Master password if ($isDemo) { - $master_password = new Zend_Form_Element_Text('master_password'); + $master_password = new Zend_Form_Element_Text('master_password'); } else { - $master_password = new Zend_Form_Element_Password('master_password'); - $master_password->setAttrib('renderPassword','true'); + $master_password = new Zend_Form_Element_Password('master_password'); + $master_password->setAttrib('renderPassword', 'true'); } $master_password->setAttrib('autocomplete', 'off') - ->setAttrib('renderPassword','true') - ->setAllowEmpty(true) - ->setValue(Application_Model_Preference::GetLiveStreamMasterPassword()) - ->setLabel(_('Password:')) - ->setFilters(array('StringTrim')); + ->setAttrib('renderPassword', 'true') + ->setAllowEmpty(true) + ->setValue(Application_Model_Preference::GetLiveStreamMasterPassword()) + ->setLabel(_('Password:')) + ->setFilters(array('StringTrim')); $this->addElement($master_password); $masterSourceParams = parse_url(Application_Model_Preference::GetMasterDJSourceConnectionURL()); @@ -69,16 +69,20 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm ->setValue(Application_Model_Preference::GetMasterDJSourceConnectionURL()); $this->addElement($masterSourceHost); + //liquidsoap harbor.input port $betweenValidator = Application_Form_Helper_ValidationTypes::overrideBetweenValidator(1024, 49151); + $m_port = Application_Model_StreamSetting::getMasterLiveStreamPort(); + $masterSourcePort = new Zend_Form_Element_Text('master_source_port'); $masterSourcePort->setLabel(_('Master Source Port:')) ->setValue($m_port) - ->setValidators(array($betweenValidator)) ->addValidator('regex', false, array('pattern'=>'/^[0-9]+$/', 'messages'=>array('regexNotMatch'=>_('Only numbers are allowed.')))); - $this->addElement($masterSourcePort); + $this->addElement($masterSourcePort); + + $m_mount = Application_Model_StreamSetting::getMasterLiveStreamMountPoint(); $masterSourceMount = new Zend_Form_Element_Text('master_source_mount'); @@ -104,7 +108,7 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm $showSourcePort->setLabel(_('Show Source Port:')) ->setValue($l_port) ->setValidators(array($betweenValidator)) - ->addValidator('regex', false, array('pattern'=>'/^[0-9]+$/', 'messages'=>array('regexNotMatch'=>_('Only numbers are allowed.')))); + ->addValidator('regex', false, array('pattern' => '/^[0-9]+$/', 'messages' => array('regexNotMatch' => _('Only numbers are allowed.')))); $this->addElement($showSourcePort); $l_mount = Application_Model_StreamSetting::getDjLiveStreamMountPoint(); @@ -114,16 +118,6 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm ->setValidators(array( array('regex', false, array('/^[^ &<>]+$/', 'messages' => _('Invalid character entered'))))); $this->addElement($showSourceMount); - - // demo only code - if ($isDemo) { - $elements = $this->getElements(); - foreach ($elements as $element) { - if ($element->getType() != 'Zend_Form_Element_Hidden') { - $element->setAttrib("disabled", "disabled"); - } - } - } } public function updateVariables() @@ -135,26 +129,28 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm $showSourceParams = parse_url(Application_Model_Preference::GetLiveDJSourceConnectionURL()); $this->setDecorators( - array ( - array ('ViewScript', - array ( - 'viewScript' => 'form/preferences_livestream.phtml', - 'master_source_host' => isset($masterSourceHost)?$masterSourceParams["host"]:"", - 'master_source_port' => isset($masterSourcePort)?$masterSourceParams["port"]:"", - 'master_source_mount' => isset($masterSourceMount)?$masterSourceParams["path"]:"", - 'show_source_host' => isset($showSourceHost)?$showSourceParams["host"]:"", - 'show_source_port' => isset($showSourcePort)?$showSourceParams["port"]:"", - 'show_source_mount' => isset($showSourceMount)?$showSourceParams["path"]:"", - 'isDemo' => $isDemo, + array( + array('ViewScript', + array( + 'viewScript' => 'form/preferences_livestream.phtml', + 'master_source_host' => isset($masterSourceHost) ? Application_Model_Preference::GetMasterDJSourceConnectionURL() : "", + 'master_source_port' => isset($masterSourcePort) ? Application_Model_StreamSetting::getMasterLiveStreamPort() : "", + 'master_source_mount' => isset($masterSourceMount) ? Application_Model_StreamSetting::getMasterLiveStreamMountPoint() : "", + 'show_source_host' => isset($showSourceHost) ? Application_Model_Preference::GetLiveDJSourceConnectionURL() : "", + 'show_source_port' => isset($showSourcePort) ? Application_Model_StreamSetting::getDjLiveStreamPort() : "", + 'show_source_mount' => isset($showSourceMount) ? Application_Model_StreamSetting::getDjLiveStreamMountPoint() : "", + 'isDemo' => $isDemo, ) ) ) ); } + public function isValid($data) { - return $isValid = parent::isValid($data); - } + $isValid = parent::isValid($data); -} + return $isValid; + } +} \ No newline at end of file From e1cf27664b82567d8d29d6385954932d47129090 Mon Sep 17 00:00:00 2001 From: Lucas Bickel Date: Fri, 17 Mar 2017 15:09:21 +0100 Subject: [PATCH 6/9] Cleanup dead code --- .../application/controllers/PreferenceController.php | 8 +------- .../application/forms/LiveStreamingPreferences.php | 7 +++---- .../public/js/airtime/preferences/streamsetting.js | 6 ------ 3 files changed, 4 insertions(+), 17 deletions(-) diff --git a/airtime_mvc/application/controllers/PreferenceController.php b/airtime_mvc/application/controllers/PreferenceController.php index f4dcdd897..e3ef83351 100644 --- a/airtime_mvc/application/controllers/PreferenceController.php +++ b/airtime_mvc/application/controllers/PreferenceController.php @@ -265,7 +265,7 @@ class PreferenceController extends Zend_Controller_Action // pulling this from the 2.5.x branch if (!Application_Model_Preference::GetMasterDjConnectionUrlOverride()) { $master_connection_url = "http://".$_SERVER['SERVER_NAME'].":".$values["master_source_port"].$values["master_source_mount"]; - if (empty($values["master_source_port"]) || empty($values["master_source_port"])) { + if (empty($values["master_source_port"]) || empty($values["master_source_mount"])) { Application_Model_Preference::SetMasterDJSourceConnectionURL('N/A'); } else { Application_Model_Preference::SetMasterDJSourceConnectionURL($master_connection_url); @@ -291,12 +291,6 @@ class PreferenceController extends Zend_Controller_Action Application_Model_StreamSetting::setDjLiveStreamPort($values["show_source_port"]); Application_Model_StreamSetting::setDjLiveStreamMountPoint($values["show_source_mount"]); - - - - - - Application_Model_StreamSetting::setOffAirMeta($values['offAirMeta']); // store stream update timestamp diff --git a/airtime_mvc/application/forms/LiveStreamingPreferences.php b/airtime_mvc/application/forms/LiveStreamingPreferences.php index 675d6be18..190c1f6ff 100644 --- a/airtime_mvc/application/forms/LiveStreamingPreferences.php +++ b/airtime_mvc/application/forms/LiveStreamingPreferences.php @@ -7,7 +7,6 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm { $CC_CONFIG = Config::getConfig(); $isDemo = isset($CC_CONFIG['demo']) && $CC_CONFIG['demo'] == 1; - $isStreamConfigable = Application_Model_Preference::GetEnableStreamConf() == "true"; $defaultFade = Application_Model_Preference::GetDefaultTransitionFade(); @@ -64,7 +63,7 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm // Master source connection url parameters $masterSourceHost = new Zend_Form_Element_Text('master_source_host'); - $masterSourceHost->setLabel(_('Host:')) + $masterSourceHost->setLabel(_('Master Source Host:')) ->setAttrib('readonly', true) ->setValue(Application_Model_Preference::GetMasterDJSourceConnectionURL()); $this->addElement($masterSourceHost); @@ -96,7 +95,7 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm // Show source connection url parameters $showSourceHost = new Zend_Form_Element_Text('show_source_host'); - $showSourceHost->setLabel(_('Host:')) + $showSourceHost->setLabel(_('Show Source Host:')) ->setAttrib('readonly', true) ->setValue(Application_Model_Preference::GetLiveDJSourceConnectionURL()); $this->addElement($showSourceHost); @@ -153,4 +152,4 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm return $isValid; } -} \ No newline at end of file +} diff --git a/airtime_mvc/public/js/airtime/preferences/streamsetting.js b/airtime_mvc/public/js/airtime/preferences/streamsetting.js index b4b6989ff..6c6ee0235 100644 --- a/airtime_mvc/public/js/airtime/preferences/streamsetting.js +++ b/airtime_mvc/public/js/airtime/preferences/streamsetting.js @@ -141,9 +141,6 @@ function setLiveSourceConnectionOverrideListener(){ mount = ('/').concat(mount); } var url = "http://"+location.hostname+":"+port+mount; - if (port == '' || mount == '') { - url = 'N/A'; - } live_dj_input.val(url); live_dj_input.attr("readonly", "readonly"); live_dj_actions.hide(); @@ -167,9 +164,6 @@ function setLiveSourceConnectionOverrideListener(){ mount = ('/').concat(mount); } var url = "http://"+location.hostname+":"+port+mount; - if (port == '' || mount == '') { - url = 'N/A'; - } master_dj_input.val(url); master_dj_input.attr("readonly", "readonly"); master_dj_actions.hide(); From b93a0eccc6701abecdd12149a4b5576173ccbcc3 Mon Sep 17 00:00:00 2001 From: Lucas Bickel Date: Sun, 19 Mar 2017 12:35:58 +0100 Subject: [PATCH 7/9] Build form early and reactivate ajaxy replacing This makes subform validation work for everything again. I also had to slightly unhack the corresponding js. It's still not very nice in that it still reloads even though ajax would have been enough but I could figure out why the mast source field was not getting the proper values (You can reproduce this by commenting the window.location.reload() in the js). --- .../controllers/PreferenceController.php | 87 +++++++++---------- .../forms/LiveStreamingPreferences.php | 8 -- .../js/airtime/preferences/streamsetting.js | 12 +-- 3 files changed, 50 insertions(+), 57 deletions(-) diff --git a/airtime_mvc/application/controllers/PreferenceController.php b/airtime_mvc/application/controllers/PreferenceController.php index e3ef83351..6d630aace 100644 --- a/airtime_mvc/application/controllers/PreferenceController.php +++ b/airtime_mvc/application/controllers/PreferenceController.php @@ -200,6 +200,49 @@ class PreferenceController extends Zend_Controller_Action $csrf_element->setValue($csrf_namespace->authtoken)->setRequired('true')->removeDecorator('HtmlTag')->removeDecorator('Label'); $form->addElement($csrf_element); + $live_stream_subform = new Application_Form_LiveStreamingPreferences(); + $form->addSubForm($live_stream_subform, "live_stream_subform"); + + // get predefined type and bitrate from pref table + $temp_types = Application_Model_Preference::GetStreamType(); + $stream_types = array(); + foreach ($temp_types as $type) { + $type = strtolower(trim($type)); + if (isset($name_map[$type])) { + $name = $name_map[$type]; + } else { + $name = $type; + } + $stream_types[$type] = $name; + } + + $temp_bitrate = Application_Model_Preference::GetStreamBitrate(); + $max_bitrate = intval(Application_Model_Preference::GetMaxBitrate()); + $stream_bitrates = array(); + foreach ($temp_bitrate as $type) { + if (intval($type) <= $max_bitrate) { + $stream_bitrates[trim($type)] = strtoupper(trim($type))." kbit/s"; + } + } + + // get current settings + $setting = Application_Model_StreamSetting::getStreamSetting(); + $form->setSetting($setting); + + for ($i=1; $i<=$num_of_stream; $i++) { + $subform = new Application_Form_StreamSettingSubForm(); + $subform->setPrefix($i); + $subform->setSetting($setting); + $subform->setStreamTypes($stream_types); + $subform->setStreamBitrates($stream_bitrates); + $subform->startForm(); + $subform->toggleState(); + $form->addSubForm($subform, "s".$i."_subform"); + } + + $live_stream_subform->updateVariables(); + $form->startFrom(); + if ($request->isPost()) { $params = $request->getPost(); /* Parse through post data and put in format @@ -308,50 +351,6 @@ class PreferenceController extends Zend_Controller_Action } } - // get predefined type and bitrate from pref table - $temp_types = Application_Model_Preference::GetStreamType(); - $stream_types = array(); - foreach ($temp_types as $type) { - $type = strtolower(trim($type)); - if (isset($name_map[$type])) { - $name = $name_map[$type]; - } else { - $name = $type; - } - $stream_types[$type] = $name; - } - - $temp_bitrate = Application_Model_Preference::GetStreamBitrate(); - $max_bitrate = intval(Application_Model_Preference::GetMaxBitrate()); - $stream_bitrates = array(); - foreach ($temp_bitrate as $type) { - if (intval($type) <= $max_bitrate) { - $stream_bitrates[trim($type)] = strtoupper(trim($type))." kbit/s"; - } - } - - // get current settings - $setting = Application_Model_StreamSetting::getStreamSetting(); - - $form->setSetting($setting); - $form->startFrom(); - - $live_stream_subform = new Application_Form_LiveStreamingPreferences(); - $form->addSubForm($live_stream_subform, "live_stream_subform"); - - for ($i=1; $i<=$num_of_stream; $i++) { - $subform = new Application_Form_StreamSettingSubForm(); - $subform->setPrefix($i); - $subform->setSetting($setting); - $subform->setStreamTypes($stream_types); - $subform->setStreamBitrates($stream_bitrates); - $subform->startForm(); - $subform->toggleState(); - $form->addSubForm($subform, "s".$i."_subform"); - } - - $live_stream_subform->updateVariables(); - $this->view->num_stream = $num_of_stream; $this->view->enable_stream_conf = Application_Model_Preference::GetEnableStreamConf(); $this->view->form = $form; diff --git a/airtime_mvc/application/forms/LiveStreamingPreferences.php b/airtime_mvc/application/forms/LiveStreamingPreferences.php index 190c1f6ff..f2187c67e 100644 --- a/airtime_mvc/application/forms/LiveStreamingPreferences.php +++ b/airtime_mvc/application/forms/LiveStreamingPreferences.php @@ -144,12 +144,4 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm ) ); } - - - public function isValid($data) - { - $isValid = parent::isValid($data); - - return $isValid; - } } diff --git a/airtime_mvc/public/js/airtime/preferences/streamsetting.js b/airtime_mvc/public/js/airtime/preferences/streamsetting.js index 6c6ee0235..16f6152b3 100644 --- a/airtime_mvc/public/js/airtime/preferences/streamsetting.js +++ b/airtime_mvc/public/js/airtime/preferences/streamsetting.js @@ -478,11 +478,13 @@ $(document).ready(function() { var url = baseUrl+'Preference/stream-setting'; $.post(url, {format:"json", data: data}, function(json){ - window.location.reload(); - //$('#content').empty().append(json.html); - //setupEventListeners(); - //setSliderForReplayGain(); - //setPseudoAdminPassword(json.s1_set_admin_pass, json.s2_set_admin_pass, json.s3_set_admin_pass, json.s4_set_admin_pass); + $('#content').empty().append(json.html); + if (json.valid) { + window.location.reload(); + } + setupEventListeners(); + setSliderForReplayGain(); + getAdminPasswordStatus(); }); } else { if (e.prop('checked')) { From c6225f9db563a72f2504930f7fc7fedaae1f64bf Mon Sep 17 00:00:00 2001 From: Lucas Bickel Date: Sun, 19 Mar 2017 13:15:59 +0100 Subject: [PATCH 8/9] Reverse pypo changes The TODO seems to have been wrong due to the fact that everything works as advertised w/0 the change. --- python_apps/pypo/pypo/pypofetch.py | 97 +----------------------------- 1 file changed, 3 insertions(+), 94 deletions(-) diff --git a/python_apps/pypo/pypo/pypofetch.py b/python_apps/pypo/pypo/pypofetch.py index 9cdaf7163..d39824aa7 100644 --- a/python_apps/pypo/pypo/pypofetch.py +++ b/python_apps/pypo/pypo/pypofetch.py @@ -205,102 +205,11 @@ class PypoFetch(Thread): self.telnet_lock.release() """ - TODO: This function needs to be way shorter, and refactored :/ - MK + NOTE: This function is quite short after it was refactored. """ def regenerate_liquidsoap_conf(self, setting): - existing = {} - - setting = sorted(setting.items()) - try: - fh = open('/etc/airtime/liquidsoap.cfg', 'r') - except IOError, e: - #file does not exist - self.restart_liquidsoap() - return - - self.logger.info("Reading existing config...") - # read existing conf file and build dict - while True: - line = fh.readline() - - # empty line means EOF - if not line: - break - - line = line.strip() - - if not len(line) or line[0] == "#": - continue - - try: - key, value = line.split('=', 1) - except ValueError: - continue - key = key.strip() - value = value.strip() - value = value.replace('"', '') - if value == '' or value == "0": - value = '' - existing[key] = value - fh.close() - - # dict flag for any change in config - change = {} - # this flag is to detect disable -> disable change - # in that case, we don't want to restart even if there are changes. - state_change_restart = {} - #restart flag - restart = False - - self.logger.info("Looking for changes...") - # look for changes - for k, s in setting: - if "output_sound_device" in k or "icecast_vorbis_metadata" in k: - dump, stream = k.split('_', 1) - state_change_restart[stream] = False - # This is the case where restart is required no matter what - if (existing[k] != str(s)): - self.logger.info("'Need-to-restart' state detected for %s...", s) - restart = True; - elif "master_live_stream_port" in k or "master_live_stream_mp" in k or "dj_live_stream_port" in k or "dj_live_stream_mp" in k or "off_air_meta" in k: - if (existing[k] != s): - self.logger.info("'Need-to-restart' state detected for %s...", s) - restart = True; - else: - stream, dump = k.split('_', 1) - if "_output" in k: - if (existing[k] != s): - self.logger.info("'Need-to-restart' state detected for %s...", s) - restart = True; - state_change_restart[stream] = True - elif (k != 'disabled'): - state_change_restart[stream] = True - else: - state_change_restart[stream] = False - else: - # setting inital value - if stream not in change: - change[stream] = False - if not (s == existing[k]): - self.logger.info("Keyname: %s, Current value: %s, New Value: %s", k, existing[k], s) - change[stream] = True - - # set flag change for sound_device alway True - self.logger.info("Change:%s, State_Change:%s...", change, state_change_restart) - - for k, v in state_change_restart.items(): - if k == "sound_device" and v: - restart = True - elif v and change[k]: - self.logger.info("'Need-to-restart' state detected for %s...", k) - restart = True - # rewrite - if restart: - self.restart_liquidsoap() - else: - self.logger.info("No change detected in setting...") - self.update_liquidsoap_connection_status() - + self.restart_liquidsoap() + self.update_liquidsoap_connection_status() @ls_timeout From eb3a1b1ed5c3f0fb1687626b9d2c46950e71a641 Mon Sep 17 00:00:00 2001 From: Robb Ebright Date: Sun, 19 Mar 2017 12:02:45 -0400 Subject: [PATCH 9/9] Added port number validation to livestream preferences --- airtime_mvc/application/forms/LiveStreamingPreferences.php | 1 + 1 file changed, 1 insertion(+) diff --git a/airtime_mvc/application/forms/LiveStreamingPreferences.php b/airtime_mvc/application/forms/LiveStreamingPreferences.php index 675d6be18..34e91c026 100644 --- a/airtime_mvc/application/forms/LiveStreamingPreferences.php +++ b/airtime_mvc/application/forms/LiveStreamingPreferences.php @@ -78,6 +78,7 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm $masterSourcePort = new Zend_Form_Element_Text('master_source_port'); $masterSourcePort->setLabel(_('Master Source Port:')) ->setValue($m_port) + ->setValidators(array($betweenValidator)) ->addValidator('regex', false, array('pattern'=>'/^[0-9]+$/', 'messages'=>array('regexNotMatch'=>_('Only numbers are allowed.')))); $this->addElement($masterSourcePort);