Merge branch 'saas' into saas-dev
This commit is contained in:
commit
d54eb37317
|
@ -133,6 +133,11 @@ $pages = array(
|
||||||
'action' => 'help',
|
'action' => 'help',
|
||||||
'resource' => 'dashboard'
|
'resource' => 'dashboard'
|
||||||
),
|
),
|
||||||
|
array(
|
||||||
|
'label' => _('FAQ'),
|
||||||
|
'uri' => "https://sourcefabricberlin.zendesk.com/hc/en-us/sections/200994309-Airtime-FAQ",
|
||||||
|
'target' => "_blank"
|
||||||
|
),
|
||||||
array(
|
array(
|
||||||
'label' => _('User Manual'),
|
'label' => _('User Manual'),
|
||||||
'uri' => "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters",
|
'uri' => "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters",
|
||||||
|
|
|
@ -138,8 +138,13 @@ class UserController extends Zend_Controller_Action
|
||||||
$formData['cu_last_name'] = "admin"; //ditto, avoid non-null DB constraint
|
$formData['cu_last_name'] = "admin"; //ditto, avoid non-null DB constraint
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$user->setFirstName($formData['cu_first_name']);
|
if (isset($formData['cu_first_name'])) {
|
||||||
$user->setLastName($formData['cu_last_name']);
|
$user->setFirstName($formData['cu_first_name']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($formData['cu_last_name'])) {
|
||||||
|
$user->setLastName($formData['cu_last_name']);
|
||||||
|
}
|
||||||
// We don't allow 6 x's as a password.
|
// We don't allow 6 x's as a password.
|
||||||
// The reason is because we use that as a password placeholder
|
// The reason is because we use that as a password placeholder
|
||||||
// on the client side.
|
// on the client side.
|
||||||
|
|
|
@ -157,10 +157,13 @@ class Application_Form_EditUser extends Zend_Form
|
||||||
|
|
||||||
// We need to add the password identical validator here in case
|
// We need to add the password identical validator here in case
|
||||||
// Zend version is less than 1.10.5
|
// Zend version is less than 1.10.5
|
||||||
public function isValid($data) {
|
public function isValid($data)
|
||||||
$passwordIdenticalValidator = Application_Form_Helper_ValidationTypes::overridePasswordIdenticalValidator(
|
{
|
||||||
$data['cu_password']);
|
if (isset($data['cu_password'])) {
|
||||||
$this->getElement('cu_passwordVerify')->addValidator($passwordIdenticalValidator);
|
$passwordIdenticalValidator = Application_Form_Helper_ValidationTypes::overridePasswordIdenticalValidator(
|
||||||
|
$data['cu_password']);
|
||||||
|
$this->getElement('cu_passwordVerify')->addValidator($passwordIdenticalValidator);
|
||||||
|
}
|
||||||
return parent::isValid($data);
|
return parent::isValid($data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
<link href='https://fonts.googleapis.com/css?family=Roboto:400,100,300,700' rel='stylesheet' type='text/css'>
|
<link href='https://fonts.googleapis.com/css?family=Roboto:400,100,300,700' rel='stylesheet' type='text/css'>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
var RETRY_DELAY_MSECS = 2000; //Delay before trying to reconnect to stream after an error.
|
||||||
var MAX_MOBILE_SCREEN_WIDTH = 760;
|
var MAX_MOBILE_SCREEN_WIDTH = 760;
|
||||||
|
|
||||||
// We are creating a custom player object that acts as a wrapper
|
// We are creating a custom player object that acts as a wrapper
|
||||||
|
@ -31,6 +32,7 @@
|
||||||
'title': 'test',
|
'title': 'test',
|
||||||
'bgcolor': '#FFFFFF',
|
'bgcolor': '#FFFFFF',
|
||||||
'skin': 'mcclean',
|
'skin': 'mcclean',
|
||||||
|
'reconnectTime' : 2000, //Doesn't seem to do anything
|
||||||
'width': 180,
|
'width': 180,
|
||||||
'height': 60
|
'height': 60
|
||||||
};
|
};
|
||||||
|
@ -64,21 +66,19 @@
|
||||||
if (!this.flashDetect) {
|
if (!this.flashDetect) {
|
||||||
|
|
||||||
MRP.html.audio.addEventListener('error', function failed(e) {
|
MRP.html.audio.addEventListener('error', function failed(e) {
|
||||||
|
var streamUrl = "";
|
||||||
|
if (musesPlayer.playerMode == "auto") {
|
||||||
|
var nextAvailableStream = musesPlayer.getNextAvailableStream();
|
||||||
|
streamUrl = nextAvailableStream["url"];
|
||||||
|
} else {
|
||||||
|
streamUrl = musesPlayer.settings.url;
|
||||||
|
}
|
||||||
|
|
||||||
switch (e.target.error.code) {
|
switch (e.target.error.code) {
|
||||||
case e.target.error.MEDIA_ERR_NETWORK:
|
case e.target.error.MEDIA_ERR_NETWORK:
|
||||||
// If there is a network error keep retrying to connect
|
// If there is a network error keep retrying to connect
|
||||||
// to a stream.
|
// to a stream.
|
||||||
var stream;
|
musesPlayer.deferredPlay(streamUrl, RETRY_DELAY_MSECS);
|
||||||
if (musesPlayer.playerMode == "auto") {
|
|
||||||
var nextAvailableStream = musesPlayer.getNextAvailableStream();
|
|
||||||
stream = nextAvailableStream["url"];
|
|
||||||
} else {
|
|
||||||
stream = musesPlayer.settings.url;
|
|
||||||
}
|
|
||||||
var audio = $(MRP.html.audio);
|
|
||||||
audio[0].src = stream;
|
|
||||||
audio[0].load();
|
|
||||||
audio[0].play();
|
|
||||||
break;
|
break;
|
||||||
case e.target.error.MEDIA_ERR_DECODE:
|
case e.target.error.MEDIA_ERR_DECODE:
|
||||||
// If there was a corruption error or a problem with the browser
|
// If there was a corruption error or a problem with the browser
|
||||||
|
@ -92,11 +92,7 @@
|
||||||
// or the max number of listeners has been reached
|
// or the max number of listeners has been reached
|
||||||
// retry connection with the next available stream.
|
// retry connection with the next available stream.
|
||||||
if (musesPlayer.playerMode == "auto") {
|
if (musesPlayer.playerMode == "auto") {
|
||||||
var nextAvailableStream = musesPlayer.getNextAvailableStream();
|
musesPlayer.deferredPlay(nextAvailableStream["url"], RETRY_DELAY_MSECS);
|
||||||
var audio = $(MRP.html.audio);
|
|
||||||
audio[0].src = nextAvailableStream["url"];;
|
|
||||||
audio[0].load();
|
|
||||||
audio[0].play();
|
|
||||||
} else {
|
} else {
|
||||||
// If in manual mode and the current stream format is not supported
|
// If in manual mode and the current stream format is not supported
|
||||||
// or the max number of listeners has been reached
|
// or the max number of listeners has been reached
|
||||||
|
@ -179,27 +175,44 @@
|
||||||
MRP.setUrl(url);
|
MRP.setUrl(url);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Retry playback after a few seconds (used to throttle attempts to reconnect/play). */
|
||||||
|
MusesPlayer.prototype.deferredPlay = function(streamUrl, delayMSec) {
|
||||||
|
if (!this.flashDetect) {
|
||||||
|
setTimeout(function() {
|
||||||
|
var audio = $(MRP.html.audio);
|
||||||
|
audio[0].src = streamUrl;
|
||||||
|
audio[0].load();
|
||||||
|
audio[0].play();
|
||||||
|
}, delayMSec);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
setTimeout(function() {
|
||||||
|
musesPlayer.setURL(streamUrl);
|
||||||
|
musesPlayer.play();
|
||||||
|
}, delayMSec);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// detects errors in FLASH mode
|
// detects errors in FLASH mode
|
||||||
function musesCallback(event,value) {
|
function musesCallback(event,value) {
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case "ioError":
|
case "ioError":
|
||||||
// problem connecting to stream
|
// problem connecting to stream
|
||||||
var stream;
|
var streamUrl = "";
|
||||||
if (musesPlayer.playerMode == "auto") {
|
if (musesPlayer.playerMode == "auto") {
|
||||||
stream = musesPlayer.getNextAvailableStream();
|
streamUrl = musesPlayer.getNextAvailableStream()["url"];
|
||||||
musesPlayer.setURL(stream["url"]);
|
|
||||||
} else {
|
} else {
|
||||||
stream = musesPlayer.settings.url;
|
streamUrl = musesPlayer.settings.url;
|
||||||
musesPlayer.setURL(stream);
|
|
||||||
}
|
}
|
||||||
musesPlayer.play();
|
|
||||||
|
//Retry playback but only after sleeping for a bit, to avoid spinning.
|
||||||
|
musesPlayer.deferredPlay(streamUrl, RETRY_DELAY_MSECS);
|
||||||
break;
|
break;
|
||||||
case "securityError":
|
case "securityError":
|
||||||
// max listeners reached
|
// max listeners reached
|
||||||
if (musesPlayer.playerMode == "auto") {
|
if (musesPlayer.playerMode == "auto") {
|
||||||
var stream = musesPlayer.getNextAvailableStream();
|
var stream = musesPlayer.getNextAvailableStream();
|
||||||
musesPlayer.setURL(stream["url"]);
|
musesPlayer.deferredPlay(stream["url"], RETRY_DELAY_MSECS);
|
||||||
musesPlayer.play();
|
|
||||||
} else {
|
} else {
|
||||||
// If in manual mode and there is a problem connecting to
|
// If in manual mode and there is a problem connecting to
|
||||||
// the stream display an error and stop play back.
|
// the stream display an error and stop play back.
|
||||||
|
@ -275,7 +288,14 @@
|
||||||
} else {
|
} else {
|
||||||
var artist = data.current.name.split(" - ")[0];
|
var artist = data.current.name.split(" - ")[0];
|
||||||
var track = data.current.name.split(" - ")[1];
|
var track = data.current.name.split(" - ")[1];
|
||||||
$("p.now_playing").html(artist + "<span>" + track + "</span>");
|
var nowPlayingHtml = "";
|
||||||
|
if (artist) {
|
||||||
|
nowPlayingHtml += artist;
|
||||||
|
}
|
||||||
|
if (track) {
|
||||||
|
nowPlayingHtml += "<span>" + track + "</span>";
|
||||||
|
}
|
||||||
|
$("p.now_playing").html(nowPlayingHtml);
|
||||||
|
|
||||||
var current_track_end_time = new Date(data.current.ends);
|
var current_track_end_time = new Date(data.current.ends);
|
||||||
if (current_track_end_time == "Invalid Date" || isNaN(current_track_end_time)) {
|
if (current_track_end_time == "Invalid Date" || isNaN(current_track_end_time)) {
|
||||||
|
|
|
@ -150,6 +150,7 @@ class ListenerStat(Thread):
|
||||||
self.logger.error('Exception: %s', e)
|
self.logger.error('Exception: %s', e)
|
||||||
|
|
||||||
time.sleep(120)
|
time.sleep(120)
|
||||||
|
self.logger.info('ListenerStat thread exiting')
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -5,6 +5,8 @@ from Queue import Empty
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import shutil
|
import shutil
|
||||||
|
import time
|
||||||
|
import traceback
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import stat
|
import stat
|
||||||
|
@ -203,5 +205,10 @@ class PypoFile(Thread):
|
||||||
"""
|
"""
|
||||||
Entry point of the thread
|
Entry point of the thread
|
||||||
"""
|
"""
|
||||||
self.main()
|
try: self.main()
|
||||||
|
except Exception, e:
|
||||||
|
top = traceback.format_exc()
|
||||||
|
self.logger.error('PypoFile Exception: %s', top)
|
||||||
|
time.sleep(5)
|
||||||
|
self.logger.info('PypoFile thread exiting')
|
||||||
|
|
||||||
|
|
|
@ -153,4 +153,5 @@ class PypoPush(Thread):
|
||||||
top = traceback.format_exc()
|
top = traceback.format_exc()
|
||||||
self.logger.error('Pypo Push Exception: %s', top)
|
self.logger.error('Pypo Push Exception: %s', top)
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
|
self.logger.info('PypoPush thread exiting')
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue