Merge remote-tracking branch 'stash/saas-four-streams' into saas-embed-player

This commit is contained in:
drigato 2015-03-23 15:54:04 -04:00
commit e2ca218ac2
12 changed files with 190 additions and 225 deletions

View File

@ -1309,7 +1309,7 @@ class ApiController extends Zend_Controller_Action
}
public function getStreamParametersAction() {
$streams = array("s1", "s2", "s3");
$streams = array("s1", "s2", "s3", "s4");
$stream_params = array();
foreach ($streams as $s) {
$stream_params[$s] =

View File

@ -141,11 +141,7 @@ class PreferenceController extends Zend_Controller_Action
$this->view->headScript()->appendFile($baseUrl.'js/airtime/preferences/streamsetting.js?'.$CC_CONFIG['airtime_version'],'text/javascript');
// get current settings
$temp = Application_Model_StreamSetting::getStreamSetting();
$setting = array();
foreach ($temp as $t) {
$setting[$t['keyname']] = $t['value'];
}
$setting = Application_Model_StreamSetting::getStreamSetting();
$name_map = array(
'ogg' => 'Ogg Vorbis',
@ -208,6 +204,7 @@ class PreferenceController extends Zend_Controller_Action
$s1_data = array();
$s2_data = array();
$s3_data = array();
$s4_data = array();
$values = array();
foreach($postData as $k=>$v) {
$v = explode('=', urldecode($v));
@ -223,6 +220,9 @@ class PreferenceController extends Zend_Controller_Action
} elseif (strpos($v[0], "s3_data") !== false) {
preg_match('/\[(.*)\]/', $v[0], $matches);
$s3_data[$matches[1]] = $v[1];
} elseif (strpos($v[0], "s4_data") !== false) {
preg_match('/\[(.*)\]/', $v[0], $matches);
$s4_data[$matches[1]] = $v[1];
} else {
$values[$v[0]] = $v[1];
}
@ -230,6 +230,7 @@ class PreferenceController extends Zend_Controller_Action
$values["s1_data"] = $s1_data;
$values["s2_data"] = $s2_data;
$values["s3_data"] = $s3_data;
$values["s4_data"] = $s4_data;
$error = false;
if ($form->isValid($values)) {
@ -245,6 +246,7 @@ class PreferenceController extends Zend_Controller_Action
$s1_set_admin_pass = !empty($values["s1_data"]["admin_pass"]);
$s2_set_admin_pass = !empty($values["s2_data"]["admin_pass"]);
$s3_set_admin_pass = !empty($values["s3_data"]["admin_pass"]);
$s4_set_admin_pass = !empty($values["s4_data"]["admin_pass"]);
// this goes into cc_pref table
Application_Model_Preference::SetStreamLabelFormat($values['streamFormat']);
@ -290,6 +292,7 @@ class PreferenceController extends Zend_Controller_Action
"s1_set_admin_pass"=>$s1_set_admin_pass,
"s2_set_admin_pass"=>$s2_set_admin_pass,
"s3_set_admin_pass"=>$s3_set_admin_pass,
"s4_set_admin_pass"=>$s4_set_admin_pass,
));
} else {
$live_stream_subform->updateVariables();
@ -441,7 +444,8 @@ class PreferenceController extends Zend_Controller_Action
public function getAdminPasswordStatusAction()
{
$out = array();
for ($i=1; $i<=3; $i++) {
$num_of_stream = intval(Application_Model_Preference::GetNumOfStreams());
for ($i=1; $i<=$num_of_stream; $i++) {
if (Application_Model_StreamSetting::getAdminPass('s'.$i)=='') {
$out["s".$i] = false;
} else {

View File

@ -1,4 +1,7 @@
<?php
define("MAX_NUM_STREAMS", 4);
class Application_Model_StreamSetting
{
public static function setValue($key, $value, $type)
@ -41,7 +44,7 @@ class Application_Model_StreamSetting
}
}
public static function getValue($key)
public static function getValue($key, $default="")
{
$con = Propel::getConnection();
@ -59,7 +62,7 @@ class Application_Model_StreamSetting
throw new Exception("Error: $msg");
}
return $result ? $result : "";
return $result ? $result : $default;
}
public static function getEnabledStreamUrls()
@ -118,50 +121,62 @@ class Application_Model_StreamSetting
return $ids;
}
/* Returns only global data as array*/
public static function getGlobalData()
{
$con = Propel::getConnection();
$sql = "SELECT * "
."FROM cc_stream_setting "
."WHERE keyname IN ('output_sound_device', 'icecast_vorbis_metadata')";
$rows = Application_Common_Database::prepareAndExecute($sql, array(), 'all');
$data = array();
foreach ($rows as $row) {
$data[$row["keyname"]] = $row["value"];
}
return $data;
}
/* Returns all information related to a specific stream. An example
* of a stream id is 's1' or 's2'. */
public static function getStreamData($p_streamId)
{
$con = Propel::getConnection();
$streamId = pg_escape_string($p_streamId);
$sql = "SELECT * "
."FROM cc_stream_setting "
."WHERE keyname LIKE '{$streamId}_%'";
$stmt = $con->prepare($sql);
if ($stmt->execute()) {
$rows = $stmt->fetchAll();
} else {
$msg = implode(',', $stmt->errorInfo());
throw new Exception("Error: $msg");
}
$rows = CcStreamSettingQuery::create()
->filterByDbKeyName("${p_streamId}_%")
->find();
//This is way too much code because someone made only stupid decisions about how
//the layout of this table worked. The git history doesn't lie.
$data = array();
foreach ($rows as $row) {
$data[$row["keyname"]] = $row["value"];
$key = $row->getDbKeyName();
$value = $row->getDbValue();
$type = $row->getDbType();
//Fix stupid defaults so we end up with proper typing in our JSON
if ($row->getDbType() == "boolean") {
if (empty($value)) {
//In Python, there is no way to tell the difference between ints and booleans,
//which we need to differentiate between for when we're generating the Liquidsoap
//config file. Returning booleans as a string is a workaround that lets us do that.
$value = "false";
}
$data[$key] = $value;
}
elseif ($row->getDbType() == "integer") {
if (empty($value)) {
$value = 0;
}
$data[$key] = intval($value);
}
else {
$data[$key] = $value;
}
}
//Add in defaults in case they don't exist in the database.
$keyPrefix = $p_streamId . '_';
self::ensureKeyExists($keyPrefix . 'admin_pass', $data);
self::ensureKeyExists($keyPrefix . 'admin_user', $data);
self::ensureKeyExists($keyPrefix . 'bitrate', $data, 128);
self::ensureKeyExists($keyPrefix . 'channels', $data, "stereo");
self::ensureKeyExists($keyPrefix . 'description', $data);
self::ensureKeyExists($keyPrefix . 'enable', $data, "false");
self::ensureKeyExists($keyPrefix . 'genre', $data);
self::ensureKeyExists($keyPrefix . 'host', $data);
self::ensureKeyExists($keyPrefix . 'liquidsoap_error', $data, "waiting");
self::ensureKeyExists($keyPrefix . 'mount', $data);
self::ensureKeyExists($keyPrefix . 'name', $data);
self::ensureKeyExists($keyPrefix . 'output', $data);
self::ensureKeyExists($keyPrefix . 'pass', $data);
self::ensureKeyExists($keyPrefix . 'port', $data, 8000);
self::ensureKeyExists($keyPrefix . 'type', $data);
self::ensureKeyExists($keyPrefix . 'url', $data);
self::ensureKeyExists($keyPrefix . 'user', $data);
return $data;
}
@ -169,76 +184,41 @@ class Application_Model_StreamSetting
* make data easier to iterate over */
public static function getStreamDataNormalized($p_streamId)
{
$con = Propel::getConnection();
$streamId = pg_escape_string($p_streamId);
$sql = "SELECT * "
."FROM cc_stream_setting "
."WHERE keyname LIKE '{$streamId}_%'";
$stmt = $con->prepare($sql);
if ($stmt->execute()) {
$rows = $stmt->fetchAll();
} else {
$msg = implode(',', $stmt->errorInfo());
throw new Exception("Error: $msg");
$settings = self::getStreamData($p_streamId);
foreach ($settings as $key => $value)
{
unset($settings[$key]);
$newKey = substr($key, strlen($p_streamId)+1); //$p_streamId is assumed to be the key prefix.
$settings[$newKey] = $value;
}
return $settings;
}
$data = array();
foreach ($rows as $row) {
list($id, $key) = explode("_", $row["keyname"], 2);
$data[$key] = $row["value"];
private static function ensureKeyExists($key, &$array, $default='')
{
if (!array_key_exists($key, $array)) {
$array[$key] = $default;
}
return $data;
return $array;
}
public static function getStreamSetting()
{
$con = Propel::getConnection();
$sql = "SELECT *"
." FROM cc_stream_setting"
." WHERE keyname not like '%_error' AND keyname not like '%_admin_%'";
$rows = Application_Common_Database::prepareAndExecute($sql, array(), 'all');
$exists = array();
foreach ($rows as $r) {
if ($r['keyname'] == 'master_live_stream_port') {
$exists['master_live_stream_port'] = true;
} elseif ($r['keyname'] == 'master_live_stream_mp') {
$exists['master_live_stream_mp'] = true;
} elseif ($r['keyname'] == 'dj_live_stream_port') {
$exists['dj_live_stream_port'] = true;
} elseif ($r['keyname'] == 'dj_live_stream_mp') {
$exists['dj_live_stream_mp'] = true;
}
$settings = array();
$numStreams = MAX_NUM_STREAMS;
for ($streamIdx = 1; $streamIdx <= $numStreams; $streamIdx++)
{
$settings = array_merge($settings, self::getStreamData("s" . $streamIdx));
}
if (!isset($exists["master_live_stream_port"])) {
$rows[] = array("keyname" =>"master_live_stream_port",
"value"=>self::getMasterLiveStreamPort(),
"type"=>"integer");
}
if (!isset($exists["master_live_stream_mp"])) {
$rows[] = array("keyname" =>"master_live_stream_mp",
"value"=>self::getMasterLiveStreamMountPoint(),
"type"=>"string");
}
if (!isset($exists["dj_live_stream_port"])) {
$rows[] = array("keyname" =>"dj_live_stream_port",
"value"=>self::getDjLiveStreamPort(),
"type"=>"integer");
}
if (!isset($exists["dj_live_stream_mp"])) {
$rows[] = array("keyname" =>"dj_live_stream_mp",
"value"=>self::getDjLiveStreamMountPoint(),
"type"=>"string");
}
return $rows;
$settings["master_live_stream_port"] = self::getMasterLiveStreamPort();
$settings["master_live_stream_mp"] = self::getMasterLiveStreamMountPoint();
$settings["dj_live_stream_port"] = self::getDjLiveStreamPort();
$settings["dj_live_stream_mp"] = self::getDjLiveStreamMountPoint();
$settings["off_air_meta"] = self::getOffAirMeta();
$settings["icecast_vorbis_metadata"] = self::getIcecastVorbisMetadata();
$settings["output_sound_device"] = self::getOutputSoundDevice();
$settings["output_sound_device_type"] = self::getOutputSoundDeviceType();
return $settings;
}
@ -246,7 +226,10 @@ class Application_Model_StreamSetting
{
$stream_setting = CcStreamSettingQuery::create()->filterByDbKeyName($key)->findOne();
if (is_null($stream_setting)) {
throw new Exception("Keyname $key does not exist!");
//throw new Exception("Keyname $key does not exist!");
$stream_setting = new CcStreamSetting();
$stream_setting->setDbKeyName($key);
$stream_setting->setDbType("");
}
$stream_setting->setDbValue($value);
@ -446,7 +429,7 @@ class Application_Model_StreamSetting
public static function getMasterLiveStreamPort()
{
return self::getValue("master_live_stream_port");
return self::getValue("master_live_stream_port", 8001);
}
public static function setMasterLiveStreamMountPoint($value)
@ -456,7 +439,7 @@ class Application_Model_StreamSetting
public static function getMasterLiveStreamMountPoint()
{
return self::getValue("master_live_stream_mp");
return self::getValue("master_live_stream_mp", "/master");
}
public static function setDjLiveStreamPort($value)
@ -466,7 +449,7 @@ class Application_Model_StreamSetting
public static function getDjLiveStreamPort()
{
return self::getValue("dj_live_stream_port");
return self::getValue("dj_live_stream_port", 8001);
}
public static function setDjLiveStreamMountPoint($value)
@ -476,7 +459,7 @@ class Application_Model_StreamSetting
public static function getDjLiveStreamMountPoint()
{
return self::getValue("dj_live_stream_mp");
return self::getValue("dj_live_stream_mp", "/show");
}
public static function getAdminUser($stream){
@ -523,4 +506,16 @@ class Application_Model_StreamSetting
public static function SetListenerStatError($key, $v) {
self::setValue($key, $v, 'string');
}
public static function getIcecastVorbisMetadata() {
return self::getValue("icecast_vorbis_metadata", "");
}
public static function getOutputSoundDevice() {
return self::getValue("output_sound_device", "false");
}
public static function getOutputSoundDeviceType() {
return self::getValue("output_sound_device_type", "");
}
}

View File

@ -358,3 +358,21 @@ INSERT INTO cc_pref (subjid, keystr, valstr) VALUES (1, 'user_timezone', 'UTC');
INSERT INTO cc_pref (keystr, valstr) VALUES ('import_timestamp', '0');
--end added in 2.5.2
INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s4_enable', 'false', 'boolean');
INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s4_output', 'icecast', 'string');
INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s4_name', '', 'string');
INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s4_type', '', 'string');
INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s4_bitrate', '', 'integer');
INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s4_host', '', 'string');
INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s4_port', '', 'integer');
INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s4_user', '', 'string');
INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s4_pass', '', 'string');
INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s4_admin_user', '', 'string');
INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s4_admin_pass', '', 'string');
INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s4_mount', '', 'string');
INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s4_url', '', 'string');
INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s4_description', '', 'string');
INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s4_genre', '', 'string');
INSERT INTO cc_stream_setting (keyname, value, type) VALUES ('s4_channels', 'stereo', 'string');

View File

@ -443,7 +443,7 @@ function setSliderForReplayGain(){
$( "#replayGainModifier" ).val( $( "#slider-range-max" ).slider( "value" ) );
}
function setPseudoAdminPassword(s1, s2, s3) {
function setPseudoAdminPassword(s1, s2, s3, s4) {
if (s1) {
$('#s1_data-admin_pass').val('xxxxxx');
}
@ -453,11 +453,14 @@ function setPseudoAdminPassword(s1, s2, s3) {
if (s3) {
$('#s3_data-admin_pass').val('xxxxxx');
}
if (s4) {
$('#s4_data-admin_pass').val('xxxxxx');
}
}
function getAdminPasswordStatus() {
$.ajax({ url: baseUrl+'Preference/get-admin-password-status/format/json', dataType:"json", success:function(data){
setPseudoAdminPassword(data.s1, data.s2, data.s3);
setPseudoAdminPassword(data.s1, data.s2, data.s3, data.s4);
}});
}
@ -476,7 +479,7 @@ $(document).ready(function() {
$('#content').empty().append(json.html);
setupEventListeners();
setSliderForReplayGain();
setPseudoAdminPassword(json.s1_set_admin_pass, json.s2_set_admin_pass, json.s3_set_admin_pass);
setPseudoAdminPassword(json.s1_set_admin_pass, json.s2_set_admin_pass, json.s3_set_admin_pass, json.s4_set_admin_pass);
});
}
});

View File

@ -10,18 +10,23 @@ def generate_liquidsoap_config(ss):
fh.write("################################################\n")
fh.write("# THIS FILE IS AUTO GENERATED. DO NOT CHANGE!! #\n")
fh.write("################################################\n")
fh.write("# The ignore() lines are to squash unused variable warnings\n")
for d in data:
key = d['keyname']
for key, value in data.iteritems():
try:
str_buffer = "%s = %s\n" % (key, int(value))
except ValueError:
try: # Is it a boolean?
if "true" in value or "false" in value:
str_buffer = "%s = %s\n" % (key, value.lower())
else:
raise ValueError() # Just drop into the except below
except: #Everything else is a string
str_buffer = "%s = \"%s\"\n" % (key, value)
str_buffer = d[u'keyname'] + " = "
if d[u'type'] == 'string':
val = '"%s"' % d['value']
else:
val = d[u'value']
val = val if len(val) > 0 else "0"
str_buffer = "%s = %s\n" % (key, val)
fh.write(str_buffer.encode('utf-8'))
# ignore squashes unused variable errors from Liquidsoap
fh.write(("ignore(%s)\n" % key).encode('utf-8'))
fh.write('log_file = "/var/log/airtime/pypo-liquidsoap/<script>.log"\n')
fh.close()

View File

@ -10,18 +10,22 @@ output_sound_device_type = "ALSA"
s1_output = "icecast"
s2_output = "icecast"
s3_output = "icecast"
s4_output = "icecast"
s1_enable = true
s2_enable = false
s3_enable = false
s4_enable = false
s1_type = "ogg"
s2_type = "ogg"
s3_type = "mp3"
s4_type = "mp3"
s1_bitrate = 128
s2_bitrate = 128
s3_bitrate = 160
s4_bitrate = 160
###########################################
# Logging settings #
@ -35,31 +39,39 @@ log_file = "/var/log/airtime/pypo-liquidsoap/<script>.log"
s1_host = "127.0.0.1"
s2_host = "127.0.0.1"
s3_host = "127.0.0.1"
s4_host = "127.0.0.1"
s1_port = 8000
s2_port = 8000
s3_port = 8000
s4_port = 8000
s1_user = ""
s2_user = ""
s3_user = ""
s4_user = ""
s1_pass = "hackme"
s2_pass = "hackme"
s3_pass = "hackme"
s4_pass = "hackme"
# Icecast mountpoint names
s1_mount = "airtime_128.ogg"
s2_mount = "airtime_128.ogg"
s3_mount = "airtime_160.mp3"
s4_mount = "airtime_160.mp3"
# Webstream metadata settings
s1_url = "http://airtime.sourcefabric.org"
s2_url = "http://airtime.sourcefabric.org"
s3_url = "http://airtime.sourcefabric.org"
s1_description = "Airtime Radio! stream1"
s2_description = "Airtime Radio! stream2"
s3_description = "Airtime Radio! stream3"
s4_url = "http://airtime.sourcefabric.org"
s1_description = "Airtime Radio! Stream 1"
s2_description = "Airtime Radio! Stream 2"
s3_description = "Airtime Radio! Stream 3"
s4_description = "Airtime Radio! Stream 4"
s1_genre = "genre"
s2_genre = "genre"
s3_genre = "genre"
s4_genre = "genre"
# Audio stream metadata for vorbis/ogg is disabled by default
# due to a number of client media players that disconnect

View File

@ -29,6 +29,7 @@ dynamic_metadata_callback = ref fun (s) -> begin () end
s1_connected = ref ''
s2_connected = ref ''
s3_connected = ref ''
s4_connected = ref ''
s1_namespace = ref ''
s2_namespace = ref ''
s3_namespace = ref ''
@ -103,7 +104,7 @@ server.register(namespace="vars",
fun (s) -> begin log("vars.bootup_time") time := s s end)
server.register(namespace="streams",
"connection_status",
fun (s) -> begin log("streams.connection_status") "1:#{!s1_connected},2:#{!s2_connected},3:#{!s3_connected}" end)
fun (s) -> begin log("streams.connection_status") "1:#{!s1_connected},2:#{!s2_connected},3:#{!s3_connected},4:#{!s4_connected}" end)
server.register(namespace="vars",
"default_dj_fade",
fun (s) -> begin log("vars.default_dj_fade") default_dj_fade := float_of_string(s) s end)
@ -399,6 +400,21 @@ if s3_enable == true then
s3_connected, s3_description, s3_channels)
end
s4_namespace = ref ''
if s4_enable == true then
log("Stream 4 Enabled")
if s4_output == 'shoutcast' then
s4_namespace := "shoutcast_stream_4"
else
s4_namespace := s4_mount
end
server.register(namespace=!s4_namespace, "connected", fun (s) -> begin log("#{!s4_namespace}.connected") !s4_connected end)
output_to(s4_output, s4_type, s4_bitrate, s4_host, s4_port, s4_pass,
s4_mount, s4_url, s4_name, s4_genre, s4_user, s, "4",
s4_connected, s4_description, s4_channels)
end
command = "/usr/lib/airtime/pypo/bin/liquidsoap_scripts/notify.sh --liquidsoap-started &"
log(command)
system(command)

View File

@ -118,10 +118,10 @@ class ListenerStat(Thread):
else:
stats.append(self.get_shoutcast_stats(v))
self.update_listener_stat_error(v["mount"], 'OK')
except Exception, e:
except Exception as e:
try:
self.update_listener_stat_error(v["mount"], str(e))
except Exception, e:
except Exception as e:
self.logger.error('Exception: %s', e)
return stats

View File

@ -216,98 +216,9 @@ class PypoFetch(Thread):
TODO: This function needs to be way shorter, and refactored :/ - MK
"""
def regenerate_liquidsoap_conf(self, setting):
existing = {}
self.restart_liquidsoap()
self.update_liquidsoap_connection_status()
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
def update_liquidsoap_connection_status(self):

View File

@ -15,6 +15,7 @@ class PypoLiquidsoap():
"s1": None,
"s2": None,
"s3": None,
"s4": None,
}
self.telnet_liquidsoap = TelnetLiquidsoap(telnet_lock, \

View File

@ -83,12 +83,12 @@ class Notify:
# @pram time: time that LS started
def notify_liquidsoap_status(self, msg, stream_id, time):
logger.debug('#################################################')
logger.debug('# Calling server to update liquidsoap status #')
logger.debug('#################################################')
logger.debug('msg = ' + str(msg))
logger.info('#################################################')
logger.info('# Calling server to update liquidsoap status #')
logger.info('#################################################')
logger.info('msg = ' + str(msg))
response = self.api_client.notify_liquidsoap_status(msg, stream_id, time)
logger.debug("Response: " + json.dumps(response))
logger.info("Response: " + json.dumps(response))
def notify_source_status(self, source_name, status):
logger.debug('#################################################')