Merge branch 'saas' of https://github.com/sourcefabric/Airtime into saas
This commit is contained in:
commit
1c8ccbf0cd
|
@ -28,6 +28,10 @@ require_once "SecurityHelper.php";
|
|||
require_once "GoogleAnalytics.php";
|
||||
require_once "Timezone.php";
|
||||
require_once "Auth.php";
|
||||
require_once "interface/OAuth2.php";
|
||||
require_once "TaskManager.php";
|
||||
require_once __DIR__.'/services/CeleryService.php';
|
||||
require_once __DIR__.'/services/SoundcloudService.php';
|
||||
require_once __DIR__.'/forms/helpers/ValidationTypes.php';
|
||||
require_once __DIR__.'/forms/helpers/CustomDecorators.php';
|
||||
require_once __DIR__.'/controllers/plugins/RabbitMqPlugin.php';
|
||||
|
@ -123,11 +127,12 @@ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
|
|||
$view->headScript()->appendScript("var COMPANY_NAME = '" . COMPANY_NAME . "';");
|
||||
}
|
||||
|
||||
protected function _initUpgrade() {
|
||||
protected function _initTasks() {
|
||||
/* We need to wrap this here so that we aren't checking when we're running the unit test suite
|
||||
*/
|
||||
if (getenv("AIRTIME_UNIT_TEST") != 1) {
|
||||
UpgradeManager::checkIfUpgradeIsNeeded(); //This will do the upgrade too if it's needed...
|
||||
//This will do the upgrade too if it's needed...
|
||||
TaskManager::getInstance()->runTasks();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -139,13 +144,16 @@ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
|
|||
|
||||
$baseUrl = Application_Common_OsPath::getBaseDir();
|
||||
|
||||
$view->headLink()->appendStylesheet($baseUrl . 'css/bootstrap.css?' . $CC_CONFIG['airtime_version']);
|
||||
$view->headLink()->appendStylesheet($baseUrl . 'css/redmond/jquery-ui-1.8.8.custom.css?' . $CC_CONFIG['airtime_version']);
|
||||
$view->headLink()->appendStylesheet($baseUrl . 'css/pro_dropdown_3.css?' . $CC_CONFIG['airtime_version']);
|
||||
$view->headLink()->appendStylesheet($baseUrl . 'css/qtip/jquery.qtip.min.css?' . $CC_CONFIG['airtime_version']);
|
||||
$view->headLink()->appendStylesheet($baseUrl . 'css/styles.css?' . $CC_CONFIG['airtime_version']);
|
||||
$view->headLink()->appendStylesheet($baseUrl . 'css/masterpanel.css?' . $CC_CONFIG['airtime_version']);
|
||||
$view->headLink()->appendStylesheet($baseUrl . 'css/tipsy/jquery.tipsy.css?' . $CC_CONFIG['airtime_version']);
|
||||
$view->headLink(array('rel' => 'icon',
|
||||
'href' => $baseUrl . 'favicon.ico?' . $CC_CONFIG['airtime_version'],
|
||||
'type' => 'image/x-icon'), 'PREPEND')
|
||||
->appendStylesheet($baseUrl . 'css/bootstrap.css?' . $CC_CONFIG['airtime_version'])
|
||||
->appendStylesheet($baseUrl . 'css/redmond/jquery-ui-1.8.8.custom.css?' . $CC_CONFIG['airtime_version'])
|
||||
->appendStylesheet($baseUrl . 'css/pro_dropdown_3.css?' . $CC_CONFIG['airtime_version'])
|
||||
->appendStylesheet($baseUrl . 'css/qtip/jquery.qtip.min.css?' . $CC_CONFIG['airtime_version'])
|
||||
->appendStylesheet($baseUrl . 'css/styles.css?' . $CC_CONFIG['airtime_version'])
|
||||
->appendStylesheet($baseUrl . 'css/masterpanel.css?' . $CC_CONFIG['airtime_version'])
|
||||
->appendStylesheet($baseUrl . 'css/tipsy/jquery.tipsy.css?' . $CC_CONFIG['airtime_version']);
|
||||
}
|
||||
|
||||
protected function _initHeadScript()
|
||||
|
@ -156,22 +164,22 @@ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
|
|||
|
||||
$baseUrl = Application_Common_OsPath::getBaseDir();
|
||||
|
||||
$view->headScript()->appendFile($baseUrl . 'js/libs/jquery-1.8.3.min.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendFile($baseUrl . 'js/libs/jquery-ui-1.8.24.min.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendFile($baseUrl . 'js/bootstrap/bootstrap.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendFile($baseUrl . 'js/libs/jquery-1.8.3.min.js?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
->appendFile($baseUrl . 'js/libs/jquery-ui-1.8.24.min.js?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
->appendFile($baseUrl . 'js/bootstrap/bootstrap.js?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
->appendFile($baseUrl . 'js/libs/underscore-min.js?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
|
||||
$view->headScript()->appendFile($baseUrl . 'js/libs/underscore-min.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
// ->appendFile($baseUrl . 'js/libs/jquery.stickyPanel.js?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
->appendFile($baseUrl . 'js/qtip/jquery.qtip.js?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
->appendFile($baseUrl . 'js/jplayer/jquery.jplayer.min.js?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
->appendFile($baseUrl . 'js/sprintf/sprintf-0.7-beta1.js?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
->appendFile($baseUrl . 'js/cookie/jquery.cookie.js?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
->appendFile($baseUrl . 'js/i18n/jquery.i18n.js?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
->appendFile($baseUrl . 'locale/general-translation-table?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
->appendFile($baseUrl . 'locale/datatables-translation-table?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
|
||||
// $view->headScript()->appendFile($baseUrl . 'js/libs/jquery.stickyPanel.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendFile($baseUrl . 'js/qtip/jquery.qtip.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendFile($baseUrl . 'js/jplayer/jquery.jplayer.min.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendFile($baseUrl . 'js/sprintf/sprintf-0.7-beta1.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendFile($baseUrl . 'js/cookie/jquery.cookie.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendFile($baseUrl . 'js/i18n/jquery.i18n.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendFile($baseUrl . 'locale/general-translation-table?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendFile($baseUrl . 'locale/datatables-translation-table?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendScript("$.i18n.setDictionary(general_dict)");
|
||||
$view->headScript()->appendScript("var baseUrl='$baseUrl'");
|
||||
->appendScript("$.i18n.setDictionary(general_dict)")
|
||||
->appendScript("var baseUrl='$baseUrl'");
|
||||
|
||||
//These timezones are needed to adjust javascript Date objects on the client to make sense to the user's set timezone
|
||||
//or the server's set timezone.
|
||||
|
@ -188,14 +196,14 @@ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
|
|||
}
|
||||
|
||||
//scripts for now playing bar
|
||||
$view->headScript()->appendFile($baseUrl . 'js/airtime/airtime_bootstrap.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendFile($baseUrl . 'js/airtime/dashboard/helperfunctions.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendFile($baseUrl . 'js/airtime/dashboard/dashboard.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendFile($baseUrl . 'js/airtime/dashboard/versiontooltip.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendFile($baseUrl . 'js/tipsy/jquery.tipsy.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendFile($baseUrl . 'js/airtime/airtime_bootstrap.js?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
->appendFile($baseUrl . 'js/airtime/dashboard/helperfunctions.js?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
->appendFile($baseUrl . 'js/airtime/dashboard/dashboard.js?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
->appendFile($baseUrl . 'js/airtime/dashboard/versiontooltip.js?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
->appendFile($baseUrl . 'js/tipsy/jquery.tipsy.js?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
|
||||
$view->headScript()->appendFile($baseUrl . 'js/airtime/common/common.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
$view->headScript()->appendFile($baseUrl . 'js/airtime/common/audioplaytest.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
->appendFile($baseUrl . 'js/airtime/common/common.js?' . $CC_CONFIG['airtime_version'], 'text/javascript')
|
||||
->appendFile($baseUrl . 'js/airtime/common/audioplaytest.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
|
||||
$user = Application_Model_User::getCurrentUser();
|
||||
if (!is_null($user)) {
|
||||
|
@ -205,23 +213,19 @@ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
|
|||
}
|
||||
|
||||
$view->headScript()->appendScript("var userType = '$userType';");
|
||||
if (array_key_exists('REQUEST_URI', $_SERVER)) { //Doesn't exist for unit tests
|
||||
if (strpos($_SERVER['REQUEST_URI'], $baseUrl . 'Dashboard/stream-player') === false
|
||||
&& strpos($_SERVER['REQUEST_URI'], $baseUrl . 'audiopreview/audio-preview') === false
|
||||
&& strpos($_SERVER['REQUEST_URI'], $baseUrl . 'audiopreview/playlist-preview') === false
|
||||
&& strpos($_SERVER['REQUEST_URI'], $baseUrl . 'audiopreview/block-preview') === false
|
||||
&& $_SERVER['REQUEST_URI'] != "/"
|
||||
) {
|
||||
$plan_level = strval(Application_Model_Preference::GetPlanLevel());
|
||||
// Since the Hobbyist plan doesn't come with Live Chat support, don't enable it
|
||||
if (Application_Model_Preference::GetLiveChatEnabled() && $plan_level !== 'hobbyist') {
|
||||
$client_id = strval(Application_Model_Preference::GetClientId());
|
||||
$station_url = $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
|
||||
$view->headScript()->appendScript("var livechat_client_id = '$client_id';\n" .
|
||||
"var livechat_plan_type = '$plan_level';\n" .
|
||||
"var livechat_station_url = 'http://$station_url';");
|
||||
$view->headScript()->appendFile($baseUrl . 'js/airtime/common/livechat.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
}
|
||||
if (array_key_exists('REQUEST_URI', $_SERVER) //Doesn't exist for unit tests
|
||||
&& strpos($_SERVER['REQUEST_URI'], 'Dashboard/stream-player') === false
|
||||
&& strpos($_SERVER['REQUEST_URI'], 'audiopreview') === false
|
||||
&& $_SERVER['REQUEST_URI'] != "/") {
|
||||
$plan_level = strval(Application_Model_Preference::GetPlanLevel());
|
||||
// Since the Hobbyist plan doesn't come with Live Chat support, don't enable it
|
||||
if (Application_Model_Preference::GetLiveChatEnabled() && $plan_level !== 'hobbyist') {
|
||||
$client_id = strval(Application_Model_Preference::GetClientId());
|
||||
$station_url = $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
|
||||
$view->headScript()->appendScript("var livechat_client_id = '$client_id';\n" .
|
||||
"var livechat_plan_type = '$plan_level';\n" .
|
||||
"var livechat_station_url = 'http://$station_url';");
|
||||
$view->headScript()->appendFile($baseUrl . 'js/airtime/common/livechat.js?' . $CC_CONFIG['airtime_version'], 'text/javascript');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@ class Application_Common_DateHelper
|
|||
*/
|
||||
function getTimestamp()
|
||||
{
|
||||
return date("Y-m-d H:i:s", $this->_dateTime);
|
||||
return date(DEFAULT_TIMESTAMP_FORMAT, $this->_dateTime);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -24,7 +24,7 @@ class Application_Common_DateHelper
|
|||
*/
|
||||
function getUtcTimestamp()
|
||||
{
|
||||
return gmdate("Y-m-d H:i:s", $this->_dateTime);
|
||||
return gmdate(DEFAULT_TIMESTAMP_FORMAT, $this->_dateTime);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -249,7 +249,7 @@ class Application_Common_DateHelper
|
|||
*
|
||||
* @return string in $format default Y-m-d H:i:s in station timezone
|
||||
*/
|
||||
public static function UTCStringToStationTimezoneString($datetime, $format="Y-m-d H:i:s") {
|
||||
public static function UTCStringToStationTimezoneString($datetime, $format=DEFAULT_TIMESTAMP_FORMAT) {
|
||||
$stationTimezone = new DateTimeZone(Application_Model_Preference::GetDefaultTimezone());
|
||||
$utcTimezone = new DateTimeZone("UTC");
|
||||
|
||||
|
@ -264,7 +264,7 @@ class Application_Common_DateHelper
|
|||
*
|
||||
* @return string Y-m-d H:i:s in user's timezone
|
||||
*/
|
||||
public static function UTCStringToUserTimezoneString($datetime, $format="Y-m-d H:i:s") {
|
||||
public static function UTCStringToUserTimezoneString($datetime, $format=DEFAULT_TIMESTAMP_FORMAT) {
|
||||
$userTimezone = new DateTimeZone(Application_Model_Preference::GetUserTimezone());
|
||||
$utcTimezone = new DateTimeZone("UTC");
|
||||
|
||||
|
@ -279,7 +279,7 @@ class Application_Common_DateHelper
|
|||
*
|
||||
* @return string Y-m-d H:i:s in UTC timezone
|
||||
*/
|
||||
public static function UserTimezoneStringToUTCString($datetime, $format="Y-m-d H:i:s") {
|
||||
public static function UserTimezoneStringToUTCString($datetime, $format=DEFAULT_TIMESTAMP_FORMAT) {
|
||||
$userTimezone = new DateTimeZone(Application_Model_Preference::GetUserTimezone());
|
||||
$utcTimezone = new DateTimeZone("UTC");
|
||||
|
||||
|
@ -321,7 +321,7 @@ class Application_Common_DateHelper
|
|||
* @param string $timezone convert to the given timezone.
|
||||
* @param string $format time format to convert to
|
||||
*/
|
||||
public static function convertTimestampsToTimezone(&$rows, $columnsToConvert, $timezone, $format="Y-m-d H:i:s")
|
||||
public static function convertTimestampsToTimezone(&$rows, $columnsToConvert, $timezone, $format=DEFAULT_TIMESTAMP_FORMAT)
|
||||
{
|
||||
$timezone = strtolower($timezone);
|
||||
// Check that the timezone is valid and rows is an array
|
||||
|
@ -370,7 +370,7 @@ class Application_Common_DateHelper
|
|||
* @param unknown $timezone the timezone to convert to
|
||||
* @param string $format the formatted string
|
||||
*/
|
||||
public static function UTCStringToTimezoneString($datetime, $timezone, $format="Y-m-d H:i:s") {
|
||||
public static function UTCStringToTimezoneString($datetime, $timezone, $format=DEFAULT_TIMESTAMP_FORMAT) {
|
||||
$d = new DateTime($datetime, new DateTimeZone("UTC"));
|
||||
$timezone = strtolower($timezone);
|
||||
$newTimezone = new DateTimeZone($timezone);
|
||||
|
|
|
@ -0,0 +1,232 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Class TaskManager
|
||||
*/
|
||||
final class TaskManager {
|
||||
|
||||
/**
|
||||
* @var array tasks to be run
|
||||
*/
|
||||
protected $_taskList = [
|
||||
AirtimeTask::UPGRADE, // Always run the upgrade first
|
||||
AirtimeTask::CELERY
|
||||
];
|
||||
|
||||
/**
|
||||
* @var TaskManager singleton instance object
|
||||
*/
|
||||
protected static $_instance;
|
||||
|
||||
/**
|
||||
* @var int TASK_INTERVAL_SECONDS how often, in seconds, to run the TaskManager tasks,
|
||||
* if they need to be run
|
||||
*/
|
||||
const TASK_INTERVAL_SECONDS = 30;
|
||||
|
||||
/**
|
||||
* @var $con PDO Propel connection object
|
||||
*/
|
||||
private $_con;
|
||||
|
||||
/**
|
||||
* Private constructor so class is uninstantiable
|
||||
*/
|
||||
private function __construct() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the singleton instance of this class
|
||||
*
|
||||
* @return TaskManager the TaskManager instance
|
||||
*/
|
||||
public static function getInstance() {
|
||||
if (!self::$_instance) {
|
||||
self::$_instance = new TaskManager();
|
||||
}
|
||||
return self::$_instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run all tasks that need to be run.
|
||||
*
|
||||
* To prevent blocking and making too many requests to the database,
|
||||
* we implement a row-level, non-blocking, read-protected lock on a
|
||||
* timestamp that we check each time the application is bootstrapped,
|
||||
* which, assuming enough time has passed, is updated before running
|
||||
* the tasks.
|
||||
*/
|
||||
public function runTasks() {
|
||||
// If there is data in auth storage, this could be a user request
|
||||
// so we should lock the TaskManager to avoid blocking
|
||||
if ($this->_isUserSessionRequest()) {
|
||||
return;
|
||||
}
|
||||
$this->_con = Propel::getConnection(CcPrefPeer::DATABASE_NAME);
|
||||
$this->_con->beginTransaction();
|
||||
try {
|
||||
$lock = $this->_getLock();
|
||||
if ($lock && microtime(true) < $lock['valstr'] + self::TASK_INTERVAL_SECONDS) {
|
||||
// Propel caches the database connection and uses it persistently, so if we don't
|
||||
// use commit() here, we end up blocking other queries made within this request
|
||||
$this->_con->commit();
|
||||
return;
|
||||
}
|
||||
$this->_updateLock($lock);
|
||||
$this->_con->commit();
|
||||
} catch (Exception $e) {
|
||||
// We get here if there are simultaneous requests trying to fetch the lock row
|
||||
$this->_con->rollBack();
|
||||
// Logging::info($e->getMessage()); // We actually get here a lot, so it's
|
||||
// better to be silent here to avoid log bloat
|
||||
return;
|
||||
}
|
||||
foreach ($this->_taskList as $task) {
|
||||
$task = TaskFactory::getTask($task);
|
||||
if ($task && $task->shouldBeRun()) {
|
||||
$task->run();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the current session is a user request
|
||||
*
|
||||
* @return bool true if there is a Zend_Auth object in the current session,
|
||||
* otherwise false
|
||||
*/
|
||||
private function _isUserSessionRequest() {
|
||||
$auth = Zend_Auth::getInstance();
|
||||
$data = $auth->getStorage()->read();
|
||||
return !empty($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the task_manager_lock from cc_pref with a row-level lock for atomicity
|
||||
*
|
||||
* The lock is exclusive (prevent reads) and will only last for the duration
|
||||
* of the transaction. We add NOWAIT so reads on the row during the transaction
|
||||
* won't block
|
||||
*
|
||||
* @return array|bool an array containing the row values, or false on failure
|
||||
*/
|
||||
private function _getLock() {
|
||||
$sql = "SELECT * FROM cc_pref WHERE keystr='task_manager_lock' LIMIT 1 FOR UPDATE NOWAIT";
|
||||
$st = $this->_con->prepare($sql);
|
||||
$st->execute();
|
||||
return $st->fetch();
|
||||
}
|
||||
|
||||
/**
|
||||
* Update and commit the new lock value, or insert it if it doesn't exist
|
||||
*
|
||||
* @param $lock array cc_pref lock row values
|
||||
*/
|
||||
private function _updateLock($lock) {
|
||||
$sql = empty($lock) ? "INSERT INTO cc_pref (keystr, valstr) VALUES ('task_manager_lock', :value)"
|
||||
: "UPDATE cc_pref SET valstr=:value WHERE keystr='task_manager_lock'";
|
||||
$st = $this->_con->prepare($sql);
|
||||
$st->execute(array(":value" => microtime(true)));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Interface AirtimeTask Interface for task operations - also acts as task type ENUM
|
||||
*/
|
||||
interface AirtimeTask {
|
||||
|
||||
/**
|
||||
* PHP doesn't have ENUMs so declare them as interface constants
|
||||
* Task types - values don't really matter as long as they're unique
|
||||
*/
|
||||
|
||||
const UPGRADE = "upgrade";
|
||||
const CELERY = "celery";
|
||||
|
||||
/**
|
||||
* Check whether the task should be run
|
||||
*
|
||||
* @return bool true if the task needs to be run, otherwise false
|
||||
*/
|
||||
public function shouldBeRun();
|
||||
|
||||
/**
|
||||
* Run the task
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function run();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Class TaskFactory Factory class to abstract task instantiation
|
||||
*/
|
||||
class TaskFactory {
|
||||
|
||||
/**
|
||||
* Get an AirtimeTask based on a task type
|
||||
*
|
||||
* @param $task string the task type; uses AirtimeTask constants as an ENUM
|
||||
*
|
||||
* @return AirtimeTask|null return a task of the given type or null if no corresponding
|
||||
* task exists or is implemented
|
||||
*/
|
||||
public static function getTask($task) {
|
||||
switch($task) {
|
||||
case AirtimeTask::UPGRADE:
|
||||
return new UpgradeTask();
|
||||
case AirtimeTask::CELERY:
|
||||
return new CeleryTask();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Class UpgradeTask
|
||||
*/
|
||||
class UpgradeTask implements AirtimeTask {
|
||||
|
||||
/**
|
||||
* Check the current Airtime schema version to see if an upgrade should be run
|
||||
*
|
||||
* @return bool true if an upgrade is needed
|
||||
*/
|
||||
public function shouldBeRun() {
|
||||
return UpgradeManager::checkIfUpgradeIsNeeded();
|
||||
}
|
||||
|
||||
/**
|
||||
* Run all upgrades above the current schema version
|
||||
*/
|
||||
public function run() {
|
||||
UpgradeManager::doUpgrade();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Class CeleryTask
|
||||
*/
|
||||
class CeleryTask implements AirtimeTask {
|
||||
|
||||
/**
|
||||
* Check the ThirdPartyTrackReferences table to see if there are any pending tasks
|
||||
*
|
||||
* @return bool true if there are pending tasks in ThirdPartyTrackReferences
|
||||
*/
|
||||
public function shouldBeRun() {
|
||||
return !CeleryService::isBrokerTaskQueueEmpty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Poll the task queue for any completed Celery tasks
|
||||
*/
|
||||
public function run() {
|
||||
CeleryService::pollBrokerTaskQueue();
|
||||
}
|
||||
|
||||
}
|
|
@ -25,7 +25,7 @@ class WidgetHelper
|
|||
$utcTimezone = new DateTimeZone("UTC");
|
||||
|
||||
$weekStartDateTime->setTimezone($utcTimezone);
|
||||
$utcDayStart = $weekStartDateTime->format("Y-m-d H:i:s");
|
||||
$utcDayStart = $weekStartDateTime->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
for ($i = 0; $i < 14; $i++) {
|
||||
//have to be in station timezone when adding 1 day for daylight savings.
|
||||
$weekStartDateTime->setTimezone(new DateTimeZone($timezone));
|
||||
|
@ -34,7 +34,7 @@ class WidgetHelper
|
|||
//convert back to UTC to get the actual timestamp used for search.
|
||||
$weekStartDateTime->setTimezone($utcTimezone);
|
||||
|
||||
$utcDayEnd = $weekStartDateTime->format("Y-m-d H:i:s");
|
||||
$utcDayEnd = $weekStartDateTime->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$shows = Application_Model_Show::getNextShows($utcDayStart, "ALL", $utcDayEnd);
|
||||
$utcDayStart = $utcDayEnd;
|
||||
|
||||
|
@ -84,11 +84,11 @@ class WidgetHelper
|
|||
// a time of "00:00". $utcDayStart is used below when querying for shows.
|
||||
$utcDayStartDT = clone $weekStartDateTime;
|
||||
$utcDayStartDT->setTime(0, 0, 0);
|
||||
$utcDayStart = $utcDayStartDT->format("Y-m-d H:i:s");
|
||||
$utcDayStart = $utcDayStartDT->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$weekCounter = 0;
|
||||
while ($weekCounter < $maxNumOFWeeks) {
|
||||
for ($dayOfWeekCounter = 0; $dayOfWeekCounter < DAYS_PER_WEEK; $dayOfWeekCounter++) {
|
||||
$dateParse = date_parse($weekStartDateTime->format("Y-m-d H:i:s"));
|
||||
$dateParse = date_parse($weekStartDateTime->format(DEFAULT_TIMESTAMP_FORMAT));
|
||||
|
||||
$result[$weekCounter][$dayOfWeekCounter]["dayOfMonth"] = $dateParse["day"];
|
||||
$result[$weekCounter][$dayOfWeekCounter]["dayOfWeek"] = strtoupper(date("D", $weekStartDateTime->getTimestamp()));
|
||||
|
@ -104,7 +104,7 @@ class WidgetHelper
|
|||
// a time of "00:00".
|
||||
$utcDayEndDT = clone $weekStartDateTime;
|
||||
$utcDayEndDT->setTime(0, 0, 0);
|
||||
$utcDayEnd = $utcDayEndDT->format("Y-m-d H:i:s");
|
||||
$utcDayEnd = $utcDayEndDT->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$shows = Application_Model_Show::getNextShows($utcDayStart, "ALL", $utcDayEnd);
|
||||
$utcDayStart = $utcDayEnd;
|
||||
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
|
||||
interface OAuth2 {
|
||||
|
||||
/**
|
||||
* Check whether an OAuth access token exists
|
||||
*
|
||||
* @return bool true if an access token exists, otherwise false
|
||||
*/
|
||||
public function hasAccessToken();
|
||||
|
||||
/**
|
||||
* Get the OAuth authorization URL
|
||||
*
|
||||
* @return string the authorization URL
|
||||
*/
|
||||
public function getAuthorizeUrl();
|
||||
|
||||
/**
|
||||
* Request a new OAuth access token and store it in CcPref
|
||||
*
|
||||
* @param $code string exchange authorization code for access token
|
||||
*/
|
||||
public function requestNewAccessToken($code);
|
||||
|
||||
/**
|
||||
* Regenerate the OAuth access token
|
||||
*/
|
||||
public function accessTokenRefresh();
|
||||
|
||||
}
|
|
@ -38,6 +38,8 @@ $ccAcl->add(new Zend_Acl_Resource('library'))
|
|||
->add(new Zend_Acl_Resource('billing'))
|
||||
->add(new Zend_Acl_Resource('thank-you'))
|
||||
->add(new Zend_Acl_Resource('provisioning'))
|
||||
->add(new Zend_Acl_Resource('player'))
|
||||
->add(new Zend_Acl_Resource('soundcloud'))
|
||||
->add(new Zend_Acl_Resource('embeddablewidgets'));
|
||||
|
||||
/** Creating permissions */
|
||||
|
@ -57,8 +59,9 @@ $ccAcl->allow('G', 'index')
|
|||
->allow('G', 'provisioning')
|
||||
->allow('G', 'downgrade')
|
||||
->allow('G', 'rest:show-image', 'get')
|
||||
->allow('H', 'rest:show-image')
|
||||
->allow('G', 'rest:media', 'get')
|
||||
->allow('H', 'soundcloud')
|
||||
->allow('H', 'rest:show-image')
|
||||
->allow('H', 'rest:media')
|
||||
->allow('H', 'preference', 'is-import-in-progress')
|
||||
->allow('H', 'usersettings')
|
||||
|
@ -71,6 +74,7 @@ $ccAcl->allow('G', 'index')
|
|||
->allow('A', 'user')
|
||||
->allow('A', 'systemstatus')
|
||||
->allow('A', 'preference')
|
||||
->allow('A', 'player')
|
||||
->allow('A', 'embeddablewidgets')
|
||||
->allow('S', 'thank-you')
|
||||
->allow('S', 'billing');
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
// This file generated by Propel 1.7.0 convert-conf target
|
||||
// from XML runtime conf file /home/ubuntu/airtime/airtime_mvc/build/runtime-conf.xml
|
||||
// from XML runtime conf file /home/sourcefabric/dev/Airtime/airtime_mvc/build/runtime-conf.xml
|
||||
$conf = array (
|
||||
'datasources' =>
|
||||
array (
|
||||
|
|
|
@ -100,9 +100,15 @@ return array (
|
|||
'BaseCcWebstreamMetadataQuery' => 'airtime/om/BaseCcWebstreamMetadataQuery.php',
|
||||
'BaseCcWebstreamPeer' => 'airtime/om/BaseCcWebstreamPeer.php',
|
||||
'BaseCcWebstreamQuery' => 'airtime/om/BaseCcWebstreamQuery.php',
|
||||
'BaseCeleryTasks' => 'airtime/om/BaseCeleryTasks.php',
|
||||
'BaseCeleryTasksPeer' => 'airtime/om/BaseCeleryTasksPeer.php',
|
||||
'BaseCeleryTasksQuery' => 'airtime/om/BaseCeleryTasksQuery.php',
|
||||
'BaseCloudFile' => 'airtime/om/BaseCloudFile.php',
|
||||
'BaseCloudFilePeer' => 'airtime/om/BaseCloudFilePeer.php',
|
||||
'BaseCloudFileQuery' => 'airtime/om/BaseCloudFileQuery.php',
|
||||
'BaseThirdPartyTrackReferences' => 'airtime/om/BaseThirdPartyTrackReferences.php',
|
||||
'BaseThirdPartyTrackReferencesPeer' => 'airtime/om/BaseThirdPartyTrackReferencesPeer.php',
|
||||
'BaseThirdPartyTrackReferencesQuery' => 'airtime/om/BaseThirdPartyTrackReferencesQuery.php',
|
||||
'CcBlock' => 'airtime/CcBlock.php',
|
||||
'CcBlockPeer' => 'airtime/CcBlockPeer.php',
|
||||
'CcBlockQuery' => 'airtime/CcBlockQuery.php',
|
||||
|
@ -235,8 +241,16 @@ return array (
|
|||
'CcWebstreamPeer' => 'airtime/CcWebstreamPeer.php',
|
||||
'CcWebstreamQuery' => 'airtime/CcWebstreamQuery.php',
|
||||
'CcWebstreamTableMap' => 'airtime/map/CcWebstreamTableMap.php',
|
||||
'CeleryTasks' => 'airtime/CeleryTasks.php',
|
||||
'CeleryTasksPeer' => 'airtime/CeleryTasksPeer.php',
|
||||
'CeleryTasksQuery' => 'airtime/CeleryTasksQuery.php',
|
||||
'CeleryTasksTableMap' => 'airtime/map/CeleryTasksTableMap.php',
|
||||
'CloudFile' => 'airtime/CloudFile.php',
|
||||
'CloudFilePeer' => 'airtime/CloudFilePeer.php',
|
||||
'CloudFileQuery' => 'airtime/CloudFileQuery.php',
|
||||
'CloudFileTableMap' => 'airtime/map/CloudFileTableMap.php',
|
||||
'ThirdPartyTrackReferences' => 'airtime/ThirdPartyTrackReferences.php',
|
||||
'ThirdPartyTrackReferencesPeer' => 'airtime/ThirdPartyTrackReferencesPeer.php',
|
||||
'ThirdPartyTrackReferencesQuery' => 'airtime/ThirdPartyTrackReferencesQuery.php',
|
||||
'ThirdPartyTrackReferencesTableMap' => 'airtime/map/ThirdPartyTrackReferencesTableMap.php',
|
||||
);
|
|
@ -35,6 +35,8 @@ class Config {
|
|||
$CC_CONFIG['baseDir'] = $values['general']['base_dir'];
|
||||
$CC_CONFIG['baseUrl'] = $values['general']['base_url'];
|
||||
$CC_CONFIG['basePort'] = $values['general']['base_port'];
|
||||
$CC_CONFIG['stationId'] = $values['general']['station_id'];
|
||||
$CC_CONFIG['phpDir'] = $values['general']['airtime_dir'];
|
||||
if (isset($values['general']['dev_env'])) {
|
||||
$CC_CONFIG['dev_env'] = $values['general']['dev_env'];
|
||||
} else {
|
||||
|
@ -83,7 +85,18 @@ class Config {
|
|||
|
||||
$CC_CONFIG['soundcloud-connection-retries'] = $values['soundcloud']['connection_retries'];
|
||||
$CC_CONFIG['soundcloud-connection-wait'] = $values['soundcloud']['time_between_retries'];
|
||||
|
||||
|
||||
$globalAirtimeConfig = "/etc/airtime-saas/".$CC_CONFIG['dev_env']."/airtime.conf";
|
||||
if (!file_exists($globalAirtimeConfig)) {
|
||||
// If the dev env specific airtime.conf doesn't exist default
|
||||
// to the production airtime.conf
|
||||
$globalAirtimeConfig = "/etc/airtime-saas/production/airtime.conf";
|
||||
}
|
||||
$globalAirtimeConfigValues = parse_ini_file($globalAirtimeConfig, true);
|
||||
$CC_CONFIG['soundcloud-client-id'] = $globalAirtimeConfigValues['soundcloud']['soundcloud_client_id'];
|
||||
$CC_CONFIG['soundcloud-client-secret'] = $globalAirtimeConfigValues['soundcloud']['soundcloud_client_secret'];
|
||||
$CC_CONFIG['soundcloud-redirect-uri'] = $globalAirtimeConfigValues['soundcloud']['soundcloud_redirect_uri'];
|
||||
|
||||
if(isset($values['demo']['demo'])){
|
||||
$CC_CONFIG['demo'] = $values['demo']['demo'];
|
||||
}
|
||||
|
|
|
@ -7,17 +7,17 @@
|
|||
* along with steps to fix them if they're not found or misconfigured.
|
||||
*/
|
||||
|
||||
$phpDependencies = checkPhpDependencies();
|
||||
$externalServices = checkExternalServices();
|
||||
$zend = $phpDependencies["zend"];
|
||||
$postgres = $phpDependencies["postgres"];
|
||||
$phpDependencies = checkPhpDependencies();
|
||||
$externalServices = checkExternalServices();
|
||||
$zend = $phpDependencies["zend"];
|
||||
$postgres = $phpDependencies["postgres"];
|
||||
|
||||
$database = $externalServices["database"];
|
||||
$rabbitmq = $externalServices["rabbitmq"];
|
||||
$database = $externalServices["database"];
|
||||
$rabbitmq = $externalServices["rabbitmq"];
|
||||
|
||||
$pypo = $externalServices["pypo"];
|
||||
$liquidsoap = $externalServices["liquidsoap"];
|
||||
$mediamonitor = $externalServices["media-monitor"];
|
||||
$pypo = $externalServices["pypo"];
|
||||
$liquidsoap = $externalServices["liquidsoap"];
|
||||
$analyzer = $externalServices["analyzer"];
|
||||
|
||||
$r1 = array_reduce($phpDependencies, "booleanReduce", true);
|
||||
$r2 = array_reduce($externalServices, "booleanReduce", true);
|
||||
|
@ -174,28 +174,27 @@ $result = $r1 && $r2;
|
|||
Make sure RabbitMQ is installed correctly, and that your settings in /etc/airtime/airtime.conf
|
||||
are correct. Try using <code>sudo rabbitmqctl list_users</code> and <code>sudo rabbitmqctl list_vhosts</code>
|
||||
to see if the airtime user (or your custom RabbitMQ user) exists, then checking that
|
||||
<code>sudo rabbitmqctl list_exchanges</code> contains entries for airtime-media-monitor, airtime-pypo,
|
||||
and airtime-uploads.
|
||||
<code>sudo rabbitmqctl list_exchanges</code> contains entries for airtime-pypo and airtime-uploads.
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class="<?=$mediamonitor ? 'success' : 'danger';?>">
|
||||
<tr class="<?=$analyzer ? 'success' : 'danger';?>">
|
||||
<td class="component">
|
||||
Media Monitor
|
||||
Airtime Analyzer
|
||||
</td>
|
||||
<td class="description">
|
||||
Airtime media-monitor service
|
||||
Airtime Upload and File Analysis service
|
||||
</td>
|
||||
<td class="solution <?php if ($mediamonitor) {echo 'check';?>">
|
||||
<td class="solution <?php if ($analyzer) {echo 'check';?>">
|
||||
<?php
|
||||
} else {
|
||||
?>">
|
||||
Check that the airtime-media-monitor service is installed correctly in <code>/etc/init</code>,
|
||||
Check that the airtime_analyzer service is installed correctly in <code>/etc/init.d</code>,
|
||||
and ensure that it's running with
|
||||
<br/><code>initctl list | grep airtime-media-monitor</code><br/>
|
||||
If not, try running <code>sudo service airtime-media-monitor start</code>
|
||||
<br/><code>initctl list | grep airtime_analyzer</code><br/>
|
||||
If not, try running <code>sudo service airtime_analyzer start</code>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
|
@ -212,7 +211,7 @@ $result = $r1 && $r2;
|
|||
<?php
|
||||
} else {
|
||||
?>">
|
||||
Check that the airtime-playout service is installed correctly in <code>/etc/init</code>,
|
||||
Check that the airtime-playout service is installed correctly in <code>/etc/init.d</code>,
|
||||
and ensure that it's running with
|
||||
<br/><code>initctl list | grep airtime-playout</code><br/>
|
||||
If not, try running <code>sudo service airtime-playout restart</code>
|
||||
|
@ -232,7 +231,7 @@ $result = $r1 && $r2;
|
|||
<?php
|
||||
} else {
|
||||
?>">
|
||||
Check that the airtime-liquidsoap service is installed correctly in <code>/etc/init</code>,
|
||||
Check that the airtime-liquidsoap service is installed correctly in <code>/etc/init.d</code>,
|
||||
and ensure that it's running with
|
||||
<br/><code>initctl list | grep airtime-liquidsoap</code><br/>
|
||||
If not, try running <code>sudo service airtime-liquidsoap restart</code>
|
||||
|
|
|
@ -10,21 +10,27 @@ define('COMPANY_SUFFIX' , 'z.ú.');
|
|||
define('COMPANY_SITE' , 'Sourcefabric.org');
|
||||
define('COMPANY_SITE_URL' , 'http://sourcefabric.org/');
|
||||
|
||||
define('HELP_URL' , 'http://help.sourcefabric.org/');
|
||||
define('FAQ_URL' , 'https://sourcefabricberlin.zendesk.com/hc/en-us/sections/200994309-Airtime-FAQ');
|
||||
define('WHOS_USING_URL' , 'http://sourcefabric.org/en/airtime/whosusing');
|
||||
define('TERMS_AND_CONDITIONS_URL' , 'http://www.sourcefabric.org/en/about/policy/');
|
||||
define('PRIVACY_POLICY_URL' , 'http://www.sourcefabric.org/en/about/policy/');
|
||||
define('USER_MANUAL_URL' , 'http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters');
|
||||
define('AIRTIME_TRANSIFEX_URL' , 'https://www.transifex.com/projects/p/airtime/');
|
||||
|
||||
define('LICENSE_VERSION' , 'GNU AGPL v.3');
|
||||
define('LICENSE_URL' , 'http://www.gnu.org/licenses/agpl-3.0-standalone.html');
|
||||
|
||||
define('AIRTIME_COPYRIGHT_DATE' , '2010-2012');
|
||||
define('AIRTIME_COPYRIGHT_DATE' , '2010-2015');
|
||||
define('AIRTIME_REST_VERSION' , '1.1');
|
||||
define('AIRTIME_API_VERSION' , '1.1');
|
||||
define('AIRTIME_CODE_VERSION' , '2.5.2');
|
||||
define('AIRTIME_CODE_VERSION' , '2.5.13');
|
||||
|
||||
// Defaults
|
||||
define('DEFAULT_LOGO_PLACEHOLDER', 1);
|
||||
define('DEFAULT_LOGO_FILE', 'images/airtime_logo.png');
|
||||
define('DEFAULT_TIMESTAMP_FORMAT', 'Y-m-d H:i:s');
|
||||
define('DEFAULT_MICROTIME_FORMAT', 'Y-m-d H:i:s.u');
|
||||
|
||||
// Metadata Keys for files
|
||||
define('MDATA_KEY_FILEPATH' , 'filepath');
|
||||
|
@ -81,13 +87,6 @@ define('UI_PLAYLISTCONTROLLER_OBJ_SESSNAME', 'PLAYLISTCONTROLLER_OBJ');
|
|||
/*define('UI_PLAYLIST_SESSNAME', 'PLAYLIST');
|
||||
define('UI_BLOCK_SESSNAME', 'BLOCK');*/
|
||||
|
||||
|
||||
// Soundcloud contants
|
||||
define('SOUNDCLOUD_NOT_UPLOADED_YET' , -1);
|
||||
define('SOUNDCLOUD_PROGRESS' , -2);
|
||||
define('SOUNDCLOUD_ERROR' , -3);
|
||||
|
||||
|
||||
//WHMCS integration
|
||||
define("WHMCS_API_URL", "https://account.sourcefabric.com/includes/api.php");
|
||||
define("SUBDOMAIN_WHMCS_CUSTOM_FIELD_NAME", "Choose your domain");
|
||||
|
@ -102,3 +101,14 @@ define('PROVISIONING_STATUS_ACTIVE' , 'Active');
|
|||
//TuneIn integration
|
||||
define("TUNEIN_API_URL", "http://air.radiotime.com/Playing.ashx");
|
||||
|
||||
// SoundCloud
|
||||
define('DEFAULT_SOUNDCLOUD_LICENSE_TYPE', 'all-rights-reserved');
|
||||
define('DEFAULT_SOUNDCLOUD_SHARING_TYPE', 'public');
|
||||
|
||||
// Celery
|
||||
define('CELERY_PENDING_STATUS', 'PENDING');
|
||||
define('CELERY_SUCCESS_STATUS', 'SUCCESS');
|
||||
define('CELERY_FAILED_STATUS', 'FAILED');
|
||||
|
||||
// Celery Services
|
||||
define('SOUNDCLOUD_SERVICE_NAME', 'soundcloud');
|
||||
|
|
|
@ -123,7 +123,7 @@ $pages = array(
|
|||
'pages' => array(
|
||||
array(
|
||||
'label' => _('Help Center'),
|
||||
'uri' => "http://help.sourcefabric.org/",
|
||||
'uri' => HELP_URL,
|
||||
'target' => "_blank"
|
||||
),
|
||||
array(
|
||||
|
@ -135,12 +135,12 @@ $pages = array(
|
|||
),
|
||||
array(
|
||||
'label' => _('FAQ'),
|
||||
'uri' => "https://sourcefabricberlin.zendesk.com/hc/en-us/sections/200994309-Airtime-FAQ",
|
||||
'uri' => FAQ_URL,
|
||||
'target' => "_blank"
|
||||
),
|
||||
array(
|
||||
'label' => _('User Manual'),
|
||||
'uri' => "http://sourcefabric.booktype.pro/airtime-pro-for-broadcasters",
|
||||
'uri' => USER_MANUAL_URL,
|
||||
'target' => "_blank"
|
||||
),
|
||||
array(
|
||||
|
@ -149,6 +149,11 @@ $pages = array(
|
|||
'controller' => 'dashboard',
|
||||
'action' => 'about',
|
||||
'resource' => 'dashboard'
|
||||
),
|
||||
array(
|
||||
'label' => _(sprintf("Help Translate %s", PRODUCT_NAME)),
|
||||
'uri' => AIRTIME_TRANSIFEX_URL,
|
||||
'target' => "_blank"
|
||||
)
|
||||
)
|
||||
),
|
||||
|
|
|
@ -5,6 +5,10 @@ require_once('TuneIn.php');
|
|||
class ApiController extends Zend_Controller_Action
|
||||
{
|
||||
|
||||
const DEFAULT_SHOWS_TO_RETRIEVE = "5";
|
||||
|
||||
const DEFAULT_DAYS_TO_RETRIEVE = "2";
|
||||
|
||||
public function init()
|
||||
{
|
||||
$ignoreAuth = array("live-info",
|
||||
|
@ -166,14 +170,14 @@ class ApiController extends Zend_Controller_Action
|
|||
|
||||
$request = $this->getRequest();
|
||||
|
||||
$utcTimeNow = gmdate("Y-m-d H:i:s");
|
||||
$utcTimeNow = gmdate(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$utcTimeEnd = ""; // if empty, getNextShows will use interval instead of end of day
|
||||
|
||||
// default to the station timezone
|
||||
$timezone = Application_Model_Preference::GetDefaultTimezone();
|
||||
$userDefinedTimezone = strtolower($request->getParam('timezone'));
|
||||
$upcase = false; // only upcase the timezone abbreviations
|
||||
$this->checkTimezone($userDefinedTimezone, $timezone, $upcase);
|
||||
$this->updateTimezone($userDefinedTimezone, $timezone, $upcase);
|
||||
|
||||
$type = $request->getParam('type');
|
||||
$limit = $request->getParam('limit');
|
||||
|
@ -188,7 +192,7 @@ class ApiController extends Zend_Controller_Action
|
|||
// make getNextShows use end of day
|
||||
$end = Application_Common_DateHelper::getTodayStationEndDateTime();
|
||||
$end->setTimezone(new DateTimeZone("UTC"));
|
||||
$utcTimeEnd = $end->format("Y-m-d H:i:s");
|
||||
$utcTimeEnd = $end->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
$result = array(
|
||||
"env" => APPLICATION_ENV,
|
||||
|
@ -263,22 +267,19 @@ class ApiController extends Zend_Controller_Action
|
|||
|
||||
$request = $this->getRequest();
|
||||
|
||||
$utcTimeNow = gmdate("Y-m-d H:i:s");
|
||||
$utcTimeEnd = ""; // if empty, getNextShows will use interval instead of end of day
|
||||
|
||||
// default to the station timezone
|
||||
$timezone = Application_Model_Preference::GetDefaultTimezone();
|
||||
$userDefinedTimezone = strtolower($request->getParam('timezone'));
|
||||
$upcase = false; // only upcase the timezone abbreviations
|
||||
$this->checkTimezone($userDefinedTimezone, $timezone, $upcase);
|
||||
$this->updateTimezone($userDefinedTimezone, $timezone, $upcase);
|
||||
|
||||
$daysToRetrieve = $request->getParam('days');
|
||||
$showsToRetrieve = $request->getParam('shows');
|
||||
if ($daysToRetrieve == "" || !is_numeric($daysToRetrieve)) {
|
||||
$daysToRetrieve = "2";
|
||||
$daysToRetrieve = self::DEFAULT_DAYS_TO_RETRIEVE;
|
||||
}
|
||||
if ($showsToRetrieve == "" || !is_numeric($showsToRetrieve)) {
|
||||
$showsToRetrieve = "5";
|
||||
$showsToRetrieve = self::DEFAULT_SHOWS_TO_RETRIEVE;
|
||||
}
|
||||
|
||||
// set the end time to the day's start n days from now.
|
||||
|
@ -286,7 +287,7 @@ class ApiController extends Zend_Controller_Action
|
|||
// days=2 will return shows until the end of tomorrow, etc.
|
||||
$end = Application_Common_DateHelper::getEndDateTime($timezone, $daysToRetrieve);
|
||||
$end->setTimezone(new DateTimeZone("UTC"));
|
||||
$utcTimeEnd = $end->format("Y-m-d H:i:s");
|
||||
$utcTimeEnd = $end->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
$result = Application_Model_Schedule::GetPlayOrderRange($utcTimeEnd, $showsToRetrieve);
|
||||
|
||||
|
@ -326,7 +327,7 @@ class ApiController extends Zend_Controller_Action
|
|||
* @param string $timezone the default timezone
|
||||
* @param boolean $upcase whether the timezone output should be upcased
|
||||
*/
|
||||
private function checkTimezone($userDefinedTimezone, &$timezone, &$upcase)
|
||||
private function updateTimezone($userDefinedTimezone, &$timezone, &$upcase)
|
||||
{
|
||||
$delimiter = "/";
|
||||
// if the user passes in a timezone in standard form ("Continent/City")
|
||||
|
@ -347,7 +348,7 @@ class ApiController extends Zend_Controller_Action
|
|||
* If the user passed in a timezone parameter, adjust timezone-dependent
|
||||
* variables in the result to reflect the given timezone.
|
||||
*
|
||||
* @param object $result reference to the object to send back to the user
|
||||
* @param array $result reference to the object to send back to the user
|
||||
* @param string $timezone the user's timezone parameter value
|
||||
* @param boolean $upcase whether the timezone output should be upcased
|
||||
*/
|
||||
|
@ -359,9 +360,9 @@ class ApiController extends Zend_Controller_Action
|
|||
$timezone
|
||||
);
|
||||
|
||||
//Convert the UTC scheduler time ("now") to the user-defined timezone.
|
||||
$result["station"]["schedulerTime"] = Application_Common_DateHelper::UTCStringToTimezoneString($result["station"]["schedulerTime"], $timezone);
|
||||
$result["station"]["timezone"] = $upcase ? strtoupper($timezone) : $timezone;
|
||||
//Convert the UTC scheduler time ("now") to the user-defined timezone.
|
||||
$result["station"]["schedulerTime"] = Application_Common_DateHelper::UTCStringToTimezoneString($result["station"]["schedulerTime"], $timezone);
|
||||
$result["station"]["timezone"] = $upcase ? strtoupper($timezone) : $timezone;
|
||||
}
|
||||
|
||||
public function weekInfoAction()
|
||||
|
@ -647,11 +648,6 @@ class ApiController extends Zend_Controller_Action
|
|||
// fields
|
||||
$file->setMetadataValue('MDATA_KEY_CREATOR', "Airtime Show Recorder");
|
||||
$file->setMetadataValue('MDATA_KEY_TRACKNUMBER', $show_instance_id);
|
||||
|
||||
if (!$showCanceled && Application_Model_Preference::GetAutoUploadRecordedShowToSoundcloud()) {
|
||||
$id = $file->getId();
|
||||
Application_Model_Soundcloud::uploadSoundcloud($id);
|
||||
}
|
||||
}
|
||||
|
||||
public function mediaMonitorSetupAction()
|
||||
|
|
|
@ -265,29 +265,38 @@ class LibraryController extends Zend_Controller_Action
|
|||
}
|
||||
}
|
||||
|
||||
//SOUNDCLOUD MENU OPTIONS
|
||||
if ($type === "audioclip" && Application_Model_Preference::GetUploadToSoundcloudOption()) {
|
||||
// SOUNDCLOUD MENU OPTION
|
||||
$ownerId = empty($obj) ? $file->getFileOwnerId() : $obj->getCreatorId();
|
||||
if ($isAdminOrPM || $ownerId == $user->getId()) {
|
||||
$soundcloudService = new SoundcloudService();
|
||||
if ($type === "audioclip" && $soundcloudService->hasAccessToken()) {
|
||||
|
||||
//create a menu separator
|
||||
$menu["sep1"] = "-----------";
|
||||
//create a menu separator
|
||||
$menu["sep1"] = "-----------";
|
||||
|
||||
//create a sub menu for Soundcloud actions.
|
||||
$menu["soundcloud"] = array("name" => _("Soundcloud"), "icon" => "soundcloud", "items" => array());
|
||||
//create a sub menu for Soundcloud actions.
|
||||
$menu["soundcloud"] = array("name" => _("Soundcloud"), "icon" => "soundcloud", "items" => array());
|
||||
|
||||
$scid = $file->getSoundCloudId();
|
||||
|
||||
if ($scid > 0) {
|
||||
$url = $file->getSoundCloudLinkToFile();
|
||||
$menu["soundcloud"]["items"]["view"] = array("name" => _("View on Soundcloud"), "icon" => "soundcloud", "url" => $url);
|
||||
$serviceId = $soundcloudService->getServiceId($id);
|
||||
if (!is_null($file) && $serviceId != 0) {
|
||||
$menu["soundcloud"]["items"]["view"] = array("name" => _("View track"), "icon" => "soundcloud", "url" => $baseUrl . "soundcloud/view-on-sound-cloud/id/{$id}");
|
||||
$menu["soundcloud"]["items"]["remove"] = array("name" => _("Remove track"), "icon" => "soundcloud", "url" => $baseUrl . "soundcloud/delete/id/{$id}");
|
||||
} else {
|
||||
// If a reference exists for this file ID, that means the user has uploaded the track
|
||||
// but we haven't yet gotten a response from Celery, so disable the menu item
|
||||
if ($soundcloudService->referenceExists($id)) {
|
||||
$menu["soundcloud"]["items"]["upload"] = array(
|
||||
"name" => _("Upload track"), "icon" => "soundcloud",
|
||||
"url" => $baseUrl . "soundcloud/upload/id/{$id}", "disabled" => true
|
||||
);
|
||||
} else {
|
||||
$menu["soundcloud"]["items"]["upload"] = array(
|
||||
"name" => _("Upload track"), "icon" => "soundcloud",
|
||||
"url" => $baseUrl . "soundcloud/upload/id/{$id}"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_null($scid)) {
|
||||
$text = _("Re-upload to SoundCloud");
|
||||
} else {
|
||||
$text = _("Upload to SoundCloud");
|
||||
}
|
||||
|
||||
$menu["soundcloud"]["items"]["upload"] = array("name" => $text, "icon" => "soundcloud", "url" => $baseUrl."library/upload-file-soundcloud/id/{$id}");
|
||||
}
|
||||
|
||||
if (empty($menu)) {
|
||||
|
@ -525,33 +534,4 @@ class LibraryController extends Zend_Controller_Action
|
|||
Logging::info($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public function uploadFileSoundcloudAction()
|
||||
{
|
||||
$id = $this->_getParam('id');
|
||||
Application_Model_Soundcloud::uploadSoundcloud($id);
|
||||
// we should die with ui info
|
||||
$this->_helper->json->sendJson(null);
|
||||
}
|
||||
|
||||
public function getUploadToSoundcloudStatusAction()
|
||||
{
|
||||
$id = $this->_getParam('id');
|
||||
$type = $this->_getParam('type');
|
||||
|
||||
if ($type == "show") {
|
||||
$show_instance = new Application_Model_ShowInstance($id);
|
||||
$this->view->sc_id = $show_instance->getSoundCloudFileId();
|
||||
$file = $show_instance->getRecordedFile();
|
||||
$this->view->error_code = $file->getSoundCloudErrorCode();
|
||||
$this->view->error_msg = $file->getSoundCloudErrorMsg();
|
||||
} elseif ($type == "file") {
|
||||
$file = Application_Model_StoredFile::RecallById($id);
|
||||
$this->view->sc_id = $file->getSoundCloudId();
|
||||
$this->view->error_code = $file->getSoundCloudErrorCode();
|
||||
$this->view->error_msg = $file->getSoundCloudErrorMsg();
|
||||
} else {
|
||||
Logging::warn("Trying to upload unknown type: $type with id: $id");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,7 +57,8 @@ class ListenerstatController extends Zend_Controller_Action
|
|||
public function getDataAction(){
|
||||
list($startsDT, $endsDT) = Application_Common_HTTPHelper::getStartEndFromRequest($this->getRequest());
|
||||
|
||||
$data = Application_Model_ListenerStat::getDataPointsWithinRange($startsDT->format("Y-m-d H:i:s"), $endsDT->format("Y-m-d H:i:s"));
|
||||
$data = Application_Model_ListenerStat::getDataPointsWithinRange($startsDT->format(DEFAULT_TIMESTAMP_FORMAT),
|
||||
$endsDT->format(DEFAULT_TIMESTAMP_FORMAT));
|
||||
$this->_helper->json->sendJson($data);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -103,7 +103,7 @@ class PluploadController extends Zend_Controller_Action
|
|||
//TODO: $this->sanitizeResponse($upload));
|
||||
$upload['utime'] = new DateTime($upload['utime'], $utcTimezone);
|
||||
$upload['utime']->setTimeZone($displayTimezone);
|
||||
$upload['utime'] = $upload['utime']->format('Y-m-d H:i:s');
|
||||
$upload['utime'] = $upload['utime']->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
//TODO: Invoke sanitization here (MediaController's removeBlacklist stuff)
|
||||
array_push($uploadsArray, $upload);
|
||||
|
|
|
@ -62,14 +62,9 @@ class PreferenceController extends Zend_Controller_Action
|
|||
Application_Model_Preference::setTuneinPartnerKey($values["tunein_partner_key"]);
|
||||
Application_Model_Preference::setTuneinPartnerId($values["tunein_partner_id"]);
|
||||
|
||||
/*Application_Model_Preference::SetUploadToSoundcloudOption($values["UploadToSoundcloudOption"]);
|
||||
Application_Model_Preference::SetSoundCloudDownloadbleOption($values["SoundCloudDownloadbleOption"]);
|
||||
Application_Model_Preference::SetSoundCloudUser($values["SoundCloudUser"]);
|
||||
Application_Model_Preference::SetSoundCloudPassword($values["SoundCloudPassword"]);
|
||||
Application_Model_Preference::SetSoundCloudTags($values["SoundCloudTags"]);
|
||||
Application_Model_Preference::SetSoundCloudGenre($values["SoundCloudGenre"]);
|
||||
Application_Model_Preference::SetSoundCloudTrackType($values["SoundCloudTrackType"]);
|
||||
Application_Model_Preference::SetSoundCloudLicense($values["SoundCloudLicense"]);*/
|
||||
// SoundCloud Preferences
|
||||
Application_Model_Preference::setDefaultSoundCloudLicenseType($values["SoundCloudLicense"]);
|
||||
Application_Model_Preference::setDefaultSoundCloudSharingType($values["SoundCloudSharing"]);
|
||||
|
||||
$this->view->statusMsg = "<div class='success'>". _("Preferences updated.")."</div>";
|
||||
$form = new Application_Form_Preferences();
|
||||
|
@ -505,7 +500,7 @@ class PreferenceController extends Zend_Controller_Action
|
|||
$utcTimezone = new DateTimeZone("UTC");
|
||||
$nowDateTime = new DateTime("now", $utcTimezone);
|
||||
$scheduleItems = CcScheduleQuery::create()
|
||||
->filterByDbEnds($nowDateTime->format("Y-m-d H:i:s"), Criteria::GREATER_THAN)
|
||||
->filterByDbEnds($nowDateTime->format(DEFAULT_TIMESTAMP_FORMAT), Criteria::GREATER_THAN)
|
||||
->find();
|
||||
|
||||
// Delete all the schedule items
|
||||
|
|
|
@ -253,25 +253,6 @@ class ScheduleController extends Zend_Controller_Action
|
|||
$this->view->show_id = $showId;
|
||||
}
|
||||
|
||||
public function uploadToSoundCloudAction()
|
||||
{
|
||||
$show_instance = $this->_getParam('id');
|
||||
|
||||
try {
|
||||
$show_inst = new Application_Model_ShowInstance($show_instance);
|
||||
} catch (Exception $e) {
|
||||
$this->view->show_error = true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
$file = $show_inst->getRecordedFile();
|
||||
$id = $file->getId();
|
||||
Application_Model_Soundcloud::uploadSoundcloud($id);
|
||||
// we should die with ui info
|
||||
$this->_helper->json->sendJson(null);
|
||||
}
|
||||
|
||||
public function makeContextMenuAction()
|
||||
{
|
||||
$instanceId = $this->_getParam('instanceId');
|
||||
|
|
|
@ -236,8 +236,8 @@ class ShowbuilderController extends Zend_Controller_Action
|
|||
$end->setTimezone($displayTimeZone);
|
||||
|
||||
$show_name = $instance->getCcShow()->getDbName();
|
||||
$start_time = $start->format("Y-m-d H:i:s");
|
||||
$end_time = $end->format("Y-m-d H:i:s");
|
||||
$start_time = $start->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$end_time = $end->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
$this->view->title = "{$show_name}: {$start_time} - {$end_time}";
|
||||
$this->view->start = $start_time;
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
require_once "ThirdPartyController.php";
|
||||
require_once "ise/php-soundcloud/src/Soundcloud/Service.php";
|
||||
|
||||
class SoundcloudController extends ThirdPartyController {
|
||||
|
||||
/**
|
||||
* @var SoundcloudService
|
||||
*/
|
||||
protected $_service;
|
||||
|
||||
/**
|
||||
* @var string Application_Model_Preference service request token accessor function name
|
||||
*/
|
||||
protected $_SERVICE_TOKEN_ACCESSOR = 'setSoundCloudRequestToken';
|
||||
|
||||
/**
|
||||
* Set up SoundCloud access variables.
|
||||
*/
|
||||
public function init() {
|
||||
parent::init();
|
||||
$this->_service = new SoundcloudService();
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch the permalink to a file on SoundCloud and redirect to it.
|
||||
*/
|
||||
public function viewOnSoundCloudAction() {
|
||||
$request = $this->getRequest();
|
||||
$id = $request->getParam('id');
|
||||
try {
|
||||
$soundcloudLink = $this->_service->getLinkToFile($id);
|
||||
header('Location: ' . $soundcloudLink);
|
||||
} catch (Soundcloud\Exception\InvalidHttpResponseCodeException $e) {
|
||||
// Redirect to a 404 so the user knows something went wrong
|
||||
header('Location: ' . $this->_baseUrl . 'error/error-404');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Class ThirdPartyController abstract superclass for third-party service authorization
|
||||
*/
|
||||
abstract class ThirdPartyController extends Zend_Controller_Action {
|
||||
|
||||
/**
|
||||
* @var string base url and port for redirection
|
||||
*/
|
||||
protected $_baseUrl;
|
||||
|
||||
/**
|
||||
* @var ThirdPartyService third party service object
|
||||
*/
|
||||
protected $_service;
|
||||
|
||||
/**
|
||||
* @var string Application_Model_Preference service request token accessor function name
|
||||
*/
|
||||
protected $_SERVICE_TOKEN_ACCESSOR;
|
||||
|
||||
/**
|
||||
* Disable controller rendering and initialize
|
||||
*/
|
||||
public function init() {
|
||||
$CC_CONFIG = Config::getConfig();
|
||||
$this->_baseUrl = 'http://' . $CC_CONFIG['baseUrl'] . ":" . $CC_CONFIG['basePort'] . "/";
|
||||
|
||||
$this->view->layout()->disableLayout(); // Don't inject the standard Now Playing header.
|
||||
$this->_helper->viewRenderer->setNoRender(true); // Don't use (phtml) templates
|
||||
}
|
||||
|
||||
/**
|
||||
* Send user to a third-party service to authorize before being redirected
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function authorizeAction() {
|
||||
$auth_url = $this->_service->getAuthorizeUrl();
|
||||
header('Location: ' . $auth_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear the previously saved request token from the preferences
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function deauthorizeAction() {
|
||||
$function = $this->_SERVICE_TOKEN_ACCESSOR;
|
||||
Application_Model_Preference::$function("");
|
||||
header('Location: ' . $this->_baseUrl . 'Preference'); // Redirect back to the Preference page
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when user successfully completes third-party authorization
|
||||
* Store the returned request token for future requests
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function redirectAction() {
|
||||
$code = $_GET['code'];
|
||||
$this->_service->requestNewAccessToken($code);
|
||||
header('Location: ' . $this->_baseUrl . 'Preference'); // Redirect back to the Preference page
|
||||
}
|
||||
|
||||
/**
|
||||
* Upload the file with the given id to a third-party service
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @throws Zend_Controller_Response_Exception thrown if upload fails for any reason
|
||||
*/
|
||||
public function uploadAction() {
|
||||
$request = $this->getRequest();
|
||||
$id = $request->getParam('id');
|
||||
$this->_service->upload($id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the file with the given id from a third-party service
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @throws Zend_Controller_Response_Exception thrown if deletion fails for any reason
|
||||
*/
|
||||
public function deleteAction() {
|
||||
$request = $this->getRequest();
|
||||
$id = $request->getParam('id');
|
||||
$this->_service->delete($id);
|
||||
}
|
||||
|
||||
}
|
|
@ -9,14 +9,13 @@ class UpgradeController extends Zend_Controller_Action
|
|||
$this->view->layout()->disableLayout();
|
||||
$this->_helper->viewRenderer->setNoRender(true);
|
||||
|
||||
if (!$this->verifyAuth()) {
|
||||
if (!RestAuth::verifyAuth(true, false, $this)) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
$upgradeManager = new UpgradeManager();
|
||||
$didWePerformAnUpgrade = $upgradeManager->doUpgrade();
|
||||
|
||||
$didWePerformAnUpgrade = UpgradeManager::doUpgrade();
|
||||
|
||||
if (!$didWePerformAnUpgrade) {
|
||||
$this->getResponse()
|
||||
->setHttpResponseCode(200)
|
||||
|
@ -35,27 +34,34 @@ class UpgradeController extends Zend_Controller_Action
|
|||
}
|
||||
}
|
||||
|
||||
private function verifyAuth()
|
||||
{
|
||||
//The API key is passed in via HTTP "basic authentication":
|
||||
//http://en.wikipedia.org/wiki/Basic_access_authentication
|
||||
|
||||
$CC_CONFIG = Config::getConfig();
|
||||
|
||||
//Decode the API key that was passed to us in the HTTP request.
|
||||
$authHeader = $this->getRequest()->getHeader("Authorization");
|
||||
public function downgradeAction() {
|
||||
$this->view->layout()->disableLayout();
|
||||
$this->_helper->viewRenderer->setNoRender(true);
|
||||
|
||||
$encodedRequestApiKey = substr($authHeader, strlen("Basic "));
|
||||
$encodedStoredApiKey = base64_encode($CC_CONFIG["apiKey"][0] . ":");
|
||||
|
||||
if ($encodedRequestApiKey !== $encodedStoredApiKey)
|
||||
{
|
||||
$this->getResponse()
|
||||
->setHttpResponseCode(401)
|
||||
->appendBody("Error: Incorrect API key.<br>");
|
||||
return false;
|
||||
if (!RestAuth::verifyAuth(true, false, $this)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$request = $this->getRequest();
|
||||
$toVersion = $request->getParam("version");
|
||||
|
||||
try {
|
||||
$downgradePerformed = UpgradeManager::doDowngrade($toVersion);
|
||||
|
||||
if (!$downgradePerformed) {
|
||||
$this->getResponse()
|
||||
->setHttpResponseCode(200)
|
||||
->appendBody("No downgrade was performed. The current schema version is " . Application_Model_Preference::GetSchemaVersion() . ".<br>");
|
||||
} else {
|
||||
$this->getResponse()
|
||||
->setHttpResponseCode(200)
|
||||
->appendBody("Downgrade to Airtime schema version " . Application_Model_Preference::GetSchemaVersion() . " OK<br>");
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$this->getResponse()
|
||||
->setHttpResponseCode(400)
|
||||
->appendBody($e->getMessage());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
-----------------------------------------------------------------------
|
||||
-- third_party_track_references
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
DROP TABLE IF EXISTS "third_party_track_references" CASCADE;
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
-- celery_tasks
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
DROP TABLE IF EXISTS "celery_tasks" CASCADE;
|
|
@ -0,0 +1,42 @@
|
|||
-----------------------------------------------------------------------
|
||||
-- third_party_track_references
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "third_party_track_references"
|
||||
(
|
||||
"id" serial NOT NULL,
|
||||
"service" VARCHAR(256) NOT NULL,
|
||||
"foreign_id" VARCHAR(256),
|
||||
"file_id" INTEGER NOT NULL,
|
||||
"upload_time" TIMESTAMP,
|
||||
"status" VARCHAR(256),
|
||||
PRIMARY KEY ("id"),
|
||||
CONSTRAINT "foreign_id_unique" UNIQUE ("foreign_id")
|
||||
);
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
-- celery_tasks
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "celery_tasks"
|
||||
(
|
||||
"id" serial NOT NULL,
|
||||
"task_id" VARCHAR(256) NOT NULL,
|
||||
"track_reference" INTEGER NOT NULL,
|
||||
"name" VARCHAR(256),
|
||||
"dispatch_time" TIMESTAMP,
|
||||
"status" VARCHAR(256) NOT NULL,
|
||||
PRIMARY KEY ("id"),
|
||||
CONSTRAINT "id_unique" UNIQUE ("id")
|
||||
);
|
||||
|
||||
|
||||
ALTER TABLE "third_party_track_references" ADD CONSTRAINT "track_reference_fkey"
|
||||
FOREIGN KEY ("file_id")
|
||||
REFERENCES "cc_files" ("id")
|
||||
ON DELETE CASCADE;
|
||||
|
||||
ALTER TABLE "celery_tasks" ADD CONSTRAINT "celery_service_fkey"
|
||||
FOREIGN KEY ("track_reference")
|
||||
REFERENCES "third_party_track_references" ("id")
|
||||
ON DELETE CASCADE;
|
|
@ -107,10 +107,17 @@ class Application_Form_AddShowStyle extends Zend_Form_SubForm
|
|||
{
|
||||
$elements = $this->getElements();
|
||||
foreach ($elements as $element) {
|
||||
if ($element->getType() != 'Zend_Form_Element_Hidden') {
|
||||
if ($element->getType() != 'Zend_Form_Element_Hidden'
|
||||
// We should still be able to remove the show logo
|
||||
&& $element->getName() != 'add_show_logo_current_remove') {
|
||||
$element->setAttrib('disabled','disabled');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function hideShowLogo() {
|
||||
$this->removeElement('add_show_logo');
|
||||
$this->removeElement('add_show_logo_preview');
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -23,9 +23,10 @@ class Application_Form_EditUser extends Zend_Form
|
|||
array('ViewScript', array('viewScript' => 'form/edit-user.phtml', "currentUser" => $currentUser->getLogin()))));
|
||||
$this->setAttrib('id', 'current-user-form');
|
||||
|
||||
$this->addElement('hash', 'csrf', array(
|
||||
'salt' => 'unique'
|
||||
));
|
||||
$csrf_namespace = new Zend_Session_Namespace('csrf_namespace');
|
||||
$csrf_element = new Zend_Form_Element_Hidden('csrf');
|
||||
$csrf_element->setValue($csrf_namespace->authtoken)->setRequired('true')->removeDecorator('HtmlTag')->removeDecorator('Label');
|
||||
$this->addElement($csrf_element);
|
||||
|
||||
$hidden = new Zend_Form_Element_Hidden('cu_user_id');
|
||||
$hidden->setDecorators(array('ViewHelper'));
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
<?php
|
||||
require_once 'customvalidators/ConditionalNotEmpty.php';
|
||||
require_once 'customvalidators/PasswordNotEmpty.php';
|
||||
|
||||
class Application_Form_EmailServerPreferences extends Zend_Form_SubForm
|
||||
{
|
||||
|
|
|
@ -117,16 +117,6 @@ class Application_Form_GeneralPreferences extends Zend_Form_SubForm
|
|||
));
|
||||
$this->addElement($third_party_api);
|
||||
|
||||
// Add the description element
|
||||
$this->addElement('textarea', 'widgetCode', array(
|
||||
'label' => 'Javascript Code:',
|
||||
'required' => false,
|
||||
'readonly' => true,
|
||||
'style' => 'font-family: Consolas, "Liberation Mono", Courier,
|
||||
monospace;',
|
||||
'value' => self::getWidgetCode(),
|
||||
));
|
||||
|
||||
$locale = new Zend_Form_Element_Select("locale");
|
||||
$locale->setLabel(_("Default Language"));
|
||||
$locale->setMultiOptions(Application_Model_Locale::getLocales());
|
||||
|
@ -148,48 +138,6 @@ class Application_Form_GeneralPreferences extends Zend_Form_SubForm
|
|||
$this->addElement($week_start_day);
|
||||
}
|
||||
|
||||
private static function getWidgetCode() {
|
||||
|
||||
$host = $_SERVER['SERVER_NAME'];
|
||||
$code = <<<CODE
|
||||
<!-- READ THESE INSTRUCTIONS CAREFULLY:
|
||||
Step 1 of 2: Paste these next 4 lines in the <head> section of your HTML page -->
|
||||
<script src="https://$host/widgets/js/jquery-1.6.1.min.js" type="text/javascript"></script>
|
||||
<script src="https://$host/widgets/js/jquery-ui-1.8.10.custom.min.js" type="text/javascript"></script>
|
||||
<script src="https://$host/widgets/js/jquery.showinfo.js" type="text/javascript"></script>
|
||||
<link rel="stylesheet" href="https://$host/widgets/css/airtime-widgets.css"></link>
|
||||
|
||||
<!-- Step 2 of 2: Paste these remaining lines in the <body> section of your HTML page -->
|
||||
<div id="headerLiveHolder" style="border: 1px solid #999999; padding: 10px;"></div>
|
||||
<div id="onAirToday"></div>
|
||||
<div id="scheduleTabs"></div>
|
||||
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
$("#headerLiveHolder").airtimeLiveInfo({
|
||||
sourceDomain: "http://$host",
|
||||
updatePeriod: 20 //seconds
|
||||
});
|
||||
|
||||
$("#onAirToday").airtimeShowSchedule({
|
||||
sourceDomain: "http://$host",
|
||||
updatePeriod: 5, //seconds
|
||||
showLimit: 10
|
||||
});
|
||||
|
||||
$("#scheduleTabs").airtimeWeekSchedule({
|
||||
sourceDomain:"http://$host",
|
||||
updatePeriod: 600 //seconds
|
||||
});
|
||||
var d = new Date().getDay();
|
||||
$('#scheduleTabs').tabs({selected: d === 0 ? 6 : d-1, fx: { opacity: 'toggle' }});
|
||||
});
|
||||
</script>
|
||||
CODE;
|
||||
|
||||
return $code;
|
||||
}
|
||||
|
||||
private function getWeekStartDays()
|
||||
{
|
||||
$days = array(
|
||||
|
|
|
@ -30,7 +30,7 @@ class Application_Form_Preferences extends Zend_Form
|
|||
$tuneinPreferences = new Application_Form_TuneInPreferences();
|
||||
$this->addSubForm($tuneinPreferences, 'preferences_tunein');
|
||||
|
||||
$soundcloud_pref = new Application_Form_SoundcloudPreferences();
|
||||
$soundcloud_pref = new Application_Form_SoundCloudPreferences();
|
||||
$this->addSubForm($soundcloud_pref, 'preferences_soundcloud');
|
||||
|
||||
$danger_pref = new Application_Form_DangerousPreferences();
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
require_once 'customvalidators/ConditionalNotEmpty.php';
|
||||
|
||||
class Application_Form_SoundcloudPreferences extends Zend_Form_SubForm
|
||||
{
|
||||
|
||||
public function init()
|
||||
{
|
||||
$this->setDecorators(array(
|
||||
array('ViewScript', array('viewScript' => 'form/preferences_soundcloud.phtml'))
|
||||
));
|
||||
|
||||
$select = new Zend_Form_Element_Select('SoundCloudLicense');
|
||||
$select->setLabel(_('Default License:'));
|
||||
$select->setAttrib('class', 'input_select');
|
||||
$select->setMultiOptions(array(
|
||||
"all-rights-reserved" => _("All rights are reserved"),
|
||||
"no-rights-reserved" => _("The work is in the public domain"),
|
||||
"cc-by" => _("Creative Commons Attribution"),
|
||||
"cc-by-nc" => _("Creative Commons Attribution Noncommercial"),
|
||||
"cc-by-nd" => _("Creative Commons Attribution No Derivative Works"),
|
||||
"cc-by-sa" => _("Creative Commons Attribution Share Alike"),
|
||||
"cc-by-nc-nd" => _("Creative Commons Attribution Noncommercial Non Derivate Works"),
|
||||
"cc-by-nc-sa" => _("Creative Commons Attribution Noncommercial Share Alike")
|
||||
));
|
||||
$select->setRequired(false);
|
||||
$select->setValue(Application_Model_Preference::getDefaultSoundCloudLicenseType());
|
||||
$this->addElement($select);
|
||||
|
||||
$select = new Zend_Form_Element_Select('SoundCloudSharing');
|
||||
$select->setLabel(_('Default Sharing Type:'));
|
||||
$select->setAttrib('class', 'input_select');
|
||||
$select->setMultiOptions(array(
|
||||
"public" => _("Public"),
|
||||
"private" => _("Private"),
|
||||
));
|
||||
$select->setRequired(false);
|
||||
$select->setValue(Application_Model_Preference::getDefaultSoundCloudSharingType());
|
||||
$this->addElement($select);
|
||||
|
||||
$this->addElement('image', 'SoundCloudConnect', array(
|
||||
'src' => 'http://connect.soundcloud.com/2/btn-connect-sc-l.png',
|
||||
'decorators' => array(
|
||||
'ViewHelper'
|
||||
)
|
||||
));
|
||||
|
||||
$this->addElement('image', 'SoundCloudDisconnect', array(
|
||||
'src' => 'http://connect.soundcloud.com/2/btn-disconnect-l.png',
|
||||
'decorators' => array(
|
||||
'ViewHelper'
|
||||
)
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -1,142 +0,0 @@
|
|||
<?php
|
||||
require_once 'customvalidators/ConditionalNotEmpty.php';
|
||||
require_once 'customvalidators/PasswordNotEmpty.php';
|
||||
|
||||
class Application_Form_SoundcloudPreferences extends Zend_Form_SubForm
|
||||
{
|
||||
|
||||
public function init()
|
||||
{
|
||||
$this->setDecorators(array(
|
||||
array('ViewScript', array('viewScript' => 'form/preferences_soundcloud.phtml'))
|
||||
));
|
||||
|
||||
//enable soundcloud uploads option
|
||||
$this->addElement('checkbox', 'UploadToSoundcloudOption', array(
|
||||
'label' => _('Enable SoundCloud Upload'),
|
||||
'required' => false,
|
||||
'value' => Application_Model_Preference::GetUploadToSoundcloudOption(),
|
||||
'decorators' => array(
|
||||
'ViewHelper'
|
||||
)
|
||||
));
|
||||
|
||||
//enable downloadable for soundcloud
|
||||
$this->addElement('checkbox', 'SoundCloudDownloadbleOption', array(
|
||||
'label' => _('Automatically Mark Files "Downloadable" on SoundCloud'),
|
||||
'required' => false,
|
||||
'value' => Application_Model_Preference::GetSoundCloudDownloadbleOption(),
|
||||
'decorators' => array(
|
||||
'ViewHelper'
|
||||
)
|
||||
));
|
||||
|
||||
//SoundCloud Username
|
||||
$this->addElement('text', 'SoundCloudUser', array(
|
||||
'class' => 'input_text',
|
||||
'label' => _('SoundCloud Email'),
|
||||
'filters' => array('StringTrim'),
|
||||
'autocomplete' => 'off',
|
||||
'value' => Application_Model_Preference::GetSoundCloudUser(),
|
||||
'decorators' => array(
|
||||
'ViewHelper'
|
||||
),
|
||||
|
||||
// By default, 'allowEmpty' is true. This means that our custom
|
||||
// validators are going to be skipped if this field is empty,
|
||||
// which is something we don't want
|
||||
'allowEmpty' => false,
|
||||
'validators' => array(
|
||||
new ConditionalNotEmpty(array('UploadToSoundcloudOption'=>'1'))
|
||||
)
|
||||
));
|
||||
|
||||
//SoundCloud Password
|
||||
$this->addElement('password', 'SoundCloudPassword', array(
|
||||
'class' => 'input_text',
|
||||
'label' => _('SoundCloud Password'),
|
||||
'filters' => array('StringTrim'),
|
||||
'autocomplete' => 'off',
|
||||
'value' => Application_Model_Preference::GetSoundCloudPassword(),
|
||||
'decorators' => array(
|
||||
'ViewHelper'
|
||||
),
|
||||
|
||||
// By default, 'allowEmpty' is true. This means that our custom
|
||||
// validators are going to be skipped if this field is empty,
|
||||
// which is something we don't want
|
||||
'allowEmpty' => false,
|
||||
'validators' => array(
|
||||
new ConditionalNotEmpty(array('UploadToSoundcloudOption'=>'1'))
|
||||
),
|
||||
'renderPassword' => true
|
||||
));
|
||||
|
||||
// Add the description element
|
||||
$this->addElement('textarea', 'SoundCloudTags', array(
|
||||
'label' => _('SoundCloud Tags: (separate tags with spaces)'),
|
||||
'required' => false,
|
||||
'class' => 'input_text_area',
|
||||
'value' => Application_Model_Preference::GetSoundCloudTags(),
|
||||
'decorators' => array(
|
||||
'ViewHelper'
|
||||
)
|
||||
));
|
||||
|
||||
//SoundCloud default genre
|
||||
$this->addElement('text', 'SoundCloudGenre', array(
|
||||
'class' => 'input_text',
|
||||
'label' => _('Default Genre:'),
|
||||
'required' => false,
|
||||
'filters' => array('StringTrim'),
|
||||
'value' => Application_Model_Preference::GetSoundCloudGenre(),
|
||||
'decorators' => array(
|
||||
'ViewHelper'
|
||||
)
|
||||
));
|
||||
|
||||
$select = new Zend_Form_Element_Select('SoundCloudTrackType');
|
||||
$select->setLabel(_('Default Track Type:'));
|
||||
$select->setAttrib('class', 'input_select');
|
||||
$select->setMultiOptions(array(
|
||||
"" => "",
|
||||
"original" => _("Original"),
|
||||
"remix" => _("Remix"),
|
||||
"live" => _("Live"),
|
||||
"recording" => _("Recording"),
|
||||
"spoken" => _("Spoken"),
|
||||
"podcast" => _("Podcast"),
|
||||
"demo" => _("Demo"),
|
||||
"in progress" => _("Work in progress"),
|
||||
"stem" => _("Stem"),
|
||||
"loop" => _("Loop"),
|
||||
"sound effect" => _("Sound Effect"),
|
||||
"sample" => _("One Shot Sample"),
|
||||
"other" => _("Other")
|
||||
));
|
||||
$select->setRequired(false);
|
||||
$select->setValue(Application_Model_Preference::GetSoundCloudTrackType());
|
||||
$select->setDecorators(array('ViewHelper'));
|
||||
$this->addElement($select);
|
||||
|
||||
$select = new Zend_Form_Element_Select('SoundCloudLicense');
|
||||
$select->setLabel(_('Default License:'));
|
||||
$select->setAttrib('class', 'input_select');
|
||||
$select->setMultiOptions(array(
|
||||
"" => "",
|
||||
"no-rights-reserved" => _("The work is in the public domain"),
|
||||
"all-rights-reserved" => _("All rights are reserved"),
|
||||
"cc-by" => _("Creative Commons Attribution"),
|
||||
"cc-by-nc" => _("Creative Commons Attribution Noncommercial"),
|
||||
"cc-by-nd" => _("Creative Commons Attribution No Derivative Works"),
|
||||
"cc-by-sa" => _("Creative Commons Attribution Share Alike"),
|
||||
"cc-by-nc-nd" => _("Creative Commons Attribution Noncommercial Non Derivate Works"),
|
||||
"cc-by-nc-sa" => _("Creative Commons Attribution Noncommercial Share Alike")
|
||||
));
|
||||
$select->setRequired(false);
|
||||
$select->setValue(Application_Model_Preference::GetSoundCloudLicense());
|
||||
$select->setDecorators(array('ViewHelper'));
|
||||
$this->addElement($select);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
<?php
|
||||
|
||||
class PasswordNotEmpty extends ConditionalNotEmpty
|
||||
{
|
||||
public function isValid($value, $context = null)
|
||||
{
|
||||
$result = parent::isValid($value, $context);
|
||||
if (!$result) {
|
||||
// allow empty if username/email was set before and didn't change
|
||||
$storedUser = Application_Model_Preference::GetSoundCloudUser();
|
||||
if ($storedUser != '' && $storedUser == $context['SoundCloudUser']) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
|
@ -2,7 +2,7 @@
|
|||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<?php echo $this->headTitle() ?>
|
||||
<?php echo $this->headTitle() ?>
|
||||
<?php echo $this->headLink() ?>
|
||||
<?php echo $this->headScript() ?>
|
||||
<?php echo isset($this->google_analytics)?$this->google_analytics:"" ?>
|
||||
|
|
|
@ -13,7 +13,7 @@ class Application_Model_Auth
|
|||
$info->setDbUserId($user_id);
|
||||
$info->setDbAction($action);
|
||||
$info->setDbToken(sha1($token.$salt));
|
||||
$info->setDbCreated(gmdate('Y-m-d H:i:s'));
|
||||
$info->setDbCreated(gmdate(DEFAULT_TIMESTAMP_FORMAT));
|
||||
$info->save();
|
||||
|
||||
Logging::debug("generated token {$token}");
|
||||
|
|
|
@ -44,7 +44,7 @@ SQL;
|
|||
$t = new DateTime($r['timestamp'], $utcTimezone);
|
||||
$t->setTimezone($displayTimezone);
|
||||
// tricking javascript so it thinks the server timezone is in UTC
|
||||
$dt = new DateTime($t->format("Y-m-d H:i:s"), $utcTimezone);
|
||||
$dt = new DateTime($t->format(DEFAULT_TIMESTAMP_FORMAT), $utcTimezone);
|
||||
|
||||
$r['timestamp'] = $dt->format("U");
|
||||
$out[$r['mount_name']][] = $r;
|
||||
|
|
|
@ -275,7 +275,7 @@ class Application_Model_LiveLog
|
|||
if ($log['end_time'] == null) {
|
||||
$current_time = new DateTime("now", new DateTimeZone('UTC'));
|
||||
$log['end_time'] = $current_time;
|
||||
$log['end_time'] = $log['end_time']->format("Y-m-d H:i:s");
|
||||
$log['end_time'] = $log['end_time']->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
self::SetEndTime($log['state'], $current_time, true);
|
||||
self::SetNewLogTime($log['state'], $current_time);
|
||||
}
|
||||
|
@ -309,7 +309,7 @@ class Application_Model_LiveLog
|
|||
." VALUES (:state, :start)";
|
||||
$params = array(
|
||||
':state'=>$state,
|
||||
':start'=>$dateTime->format("Y-m-d H:i:s")
|
||||
':start'=>$dateTime->format(DEFAULT_TIMESTAMP_FORMAT)
|
||||
);
|
||||
Application_Common_Database::prepareAndExecute($sql_insert, $params,
|
||||
Application_Common_Database::EXECUTE);
|
||||
|
@ -346,7 +346,7 @@ class Application_Model_LiveLog
|
|||
." SET end_time = :end"
|
||||
." WHERE id = :id";
|
||||
$params = array(
|
||||
':end'=>$dateTime->format("Y-m-d H:i:s"),
|
||||
':end'=>$dateTime->format(DEFAULT_TIMESTAMP_FORMAT),
|
||||
':id'=>$row['id']
|
||||
);
|
||||
Application_Common_Database::prepareAndExecute($update_sql, $params,
|
||||
|
|
|
@ -211,7 +211,7 @@ class Application_Model_Preference
|
|||
public static function SetShowsPopulatedUntil($dateTime)
|
||||
{
|
||||
$dateTime->setTimezone(new DateTimeZone("UTC"));
|
||||
self::setValue("shows_populated_until", $dateTime->format("Y-m-d H:i:s"));
|
||||
self::setValue("shows_populated_until", $dateTime->format(DEFAULT_TIMESTAMP_FORMAT));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -330,77 +330,6 @@ class Application_Model_Preference
|
|||
self::setValue("station_name", $station_name);
|
||||
}
|
||||
|
||||
public static function SetAutoUploadRecordedShowToSoundcloud($upload)
|
||||
{
|
||||
self::setValue("soundcloud_auto_upload_recorded_show", $upload);
|
||||
}
|
||||
|
||||
public static function GetAutoUploadRecordedShowToSoundcloud()
|
||||
{
|
||||
return self::getValue("soundcloud_auto_upload_recorded_show");
|
||||
}
|
||||
|
||||
public static function SetSoundCloudUser($user)
|
||||
{
|
||||
self::setValue("soundcloud_user", $user);
|
||||
}
|
||||
|
||||
public static function GetSoundCloudUser()
|
||||
{
|
||||
return self::getValue("soundcloud_user");
|
||||
}
|
||||
|
||||
public static function SetSoundCloudPassword($password)
|
||||
{
|
||||
if (strlen($password) > 0)
|
||||
self::setValue("soundcloud_password", $password);
|
||||
}
|
||||
|
||||
public static function GetSoundCloudPassword()
|
||||
{
|
||||
return self::getValue("soundcloud_password");
|
||||
}
|
||||
|
||||
public static function SetSoundCloudTags($tags)
|
||||
{
|
||||
self::setValue("soundcloud_tags", $tags);
|
||||
}
|
||||
|
||||
public static function GetSoundCloudTags()
|
||||
{
|
||||
return self::getValue("soundcloud_tags");
|
||||
}
|
||||
|
||||
public static function SetSoundCloudGenre($genre)
|
||||
{
|
||||
self::setValue("soundcloud_genre", $genre);
|
||||
}
|
||||
|
||||
public static function GetSoundCloudGenre()
|
||||
{
|
||||
return self::getValue("soundcloud_genre");
|
||||
}
|
||||
|
||||
public static function SetSoundCloudTrackType($track_type)
|
||||
{
|
||||
self::setValue("soundcloud_tracktype", $track_type);
|
||||
}
|
||||
|
||||
public static function GetSoundCloudTrackType()
|
||||
{
|
||||
return self::getValue("soundcloud_tracktype");
|
||||
}
|
||||
|
||||
public static function SetSoundCloudLicense($license)
|
||||
{
|
||||
self::setValue("soundcloud_license", $license);
|
||||
}
|
||||
|
||||
public static function GetSoundCloudLicense()
|
||||
{
|
||||
return self::getValue("soundcloud_license");
|
||||
}
|
||||
|
||||
public static function SetAllow3rdPartyApi($bool)
|
||||
{
|
||||
self::setValue("third_party_api", $bool);
|
||||
|
@ -673,12 +602,6 @@ class Application_Model_Preference
|
|||
|
||||
$outputArray['LIVE_DURATION'] = Application_Model_LiveLog::GetLiveShowDuration($p_testing);
|
||||
$outputArray['SCHEDULED_DURATION'] = Application_Model_LiveLog::GetScheduledDuration($p_testing);
|
||||
$outputArray['SOUNDCLOUD_ENABLED'] = self::GetUploadToSoundcloudOption();
|
||||
if ($outputArray['SOUNDCLOUD_ENABLED']) {
|
||||
$outputArray['NUM_SOUNDCLOUD_TRACKS_UPLOADED'] = Application_Model_StoredFile::getSoundCloudUploads();
|
||||
} else {
|
||||
$outputArray['NUM_SOUNDCLOUD_TRACKS_UPLOADED'] = NULL;
|
||||
}
|
||||
|
||||
$outputArray['STATION_NAME'] = self::GetStationName();
|
||||
$outputArray['PHONE'] = self::GetPhone();
|
||||
|
@ -702,7 +625,7 @@ class Application_Model_Preference
|
|||
$outputArray['NUM_OF_SONGS'] = Application_Model_StoredFile::getFileCount();
|
||||
$outputArray['NUM_OF_PLAYLISTS'] = Application_Model_Playlist::getPlaylistCount();
|
||||
$outputArray['NUM_OF_SCHEDULED_PLAYLISTS'] = Application_Model_Schedule::getSchduledPlaylistCount();
|
||||
$outputArray['NUM_OF_PAST_SHOWS'] = Application_Model_ShowInstance::GetShowInstanceCount(gmdate("Y-m-d H:i:s"));
|
||||
$outputArray['NUM_OF_PAST_SHOWS'] = Application_Model_ShowInstance::GetShowInstanceCount(gmdate(DEFAULT_TIMESTAMP_FORMAT));
|
||||
$outputArray['UNIQUE_ID'] = self::GetUniqueId();
|
||||
$outputArray['SAAS'] = self::GetPlanLevel();
|
||||
$outputArray['TRIAL_END_DATE'] = self::GetTrialEndingDate();
|
||||
|
@ -724,12 +647,6 @@ class Application_Model_Preference
|
|||
$outputString .= "\t".strtoupper($k)." : ".$v."\n";
|
||||
}
|
||||
}
|
||||
} elseif ($key == "SOUNDCLOUD_ENABLED") {
|
||||
if ($out) {
|
||||
$outputString .= $key." : TRUE\n";
|
||||
} elseif (!$out) {
|
||||
$outputString .= $key." : FALSE\n";
|
||||
}
|
||||
} elseif ($key == "SAAS") {
|
||||
$outputString .= $key.' : '.$out."\n";
|
||||
} else {
|
||||
|
@ -976,26 +893,6 @@ class Application_Model_Preference
|
|||
}
|
||||
}
|
||||
|
||||
public static function SetUploadToSoundcloudOption($upload)
|
||||
{
|
||||
self::setValue("soundcloud_upload_option", $upload);
|
||||
}
|
||||
|
||||
public static function GetUploadToSoundcloudOption()
|
||||
{
|
||||
return self::getValue("soundcloud_upload_option");
|
||||
}
|
||||
|
||||
public static function SetSoundCloudDownloadbleOption($upload)
|
||||
{
|
||||
self::setValue("soundcloud_downloadable", $upload);
|
||||
}
|
||||
|
||||
public static function GetSoundCloudDownloadbleOption()
|
||||
{
|
||||
return self::getValue("soundcloud_downloadable");
|
||||
}
|
||||
|
||||
public static function SetWeekStartDay($day)
|
||||
{
|
||||
self::setValue("week_start_day", $day);
|
||||
|
@ -1135,7 +1032,7 @@ class Application_Model_Preference
|
|||
public static function GetDiskQuota()
|
||||
{
|
||||
$val = self::getValue("disk_quota");
|
||||
return (strlen($val) == 0) ? 0 : $val;
|
||||
return empty($val) ? 2147483648 : $val; # If there is no value for disk quota, return 2GB
|
||||
}
|
||||
|
||||
public static function SetLiveStreamMasterUsername($value)
|
||||
|
@ -1549,4 +1446,47 @@ class Application_Model_Preference
|
|||
{
|
||||
self::setValue("last_tunein_metadata_update", $value);
|
||||
}
|
||||
|
||||
/* Third Party */
|
||||
|
||||
// SoundCloud
|
||||
|
||||
public static function getDefaultSoundCloudLicenseType() {
|
||||
$val = self::getValue("soundcloud_license_type");
|
||||
// If we don't have a value set, return all-rights-reserved by default
|
||||
return empty($val) ? DEFAULT_SOUNDCLOUD_LICENSE_TYPE : $val;
|
||||
}
|
||||
|
||||
public static function setDefaultSoundCloudLicenseType($value) {
|
||||
self::setValue("soundcloud_license_type", $value);
|
||||
}
|
||||
|
||||
public static function getDefaultSoundCloudSharingType() {
|
||||
$val = self::getValue("soundcloud_sharing_type");
|
||||
// If we don't have a value set, return public by default
|
||||
return empty($val) ? DEFAULT_SOUNDCLOUD_SHARING_TYPE : $val;
|
||||
}
|
||||
|
||||
public static function setDefaultSoundCloudSharingType($value) {
|
||||
self::setValue("soundcloud_sharing_type", $value);
|
||||
}
|
||||
|
||||
public static function getSoundCloudRequestToken() {
|
||||
return self::getValue("soundcloud_request_token");
|
||||
}
|
||||
|
||||
public static function setSoundCloudRequestToken($value) {
|
||||
self::setValue("soundcloud_request_token", $value);
|
||||
}
|
||||
|
||||
// TaskManager Lock Timestamp
|
||||
|
||||
public static function getTaskManagerLock() {
|
||||
return self::getValue("task_manager_lock");
|
||||
}
|
||||
|
||||
public static function setTaskManagerLock($value) {
|
||||
self::setValue("task_manager_lock", $value);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
<?php
|
||||
require_once 'php-amqplib/amqp.inc';
|
||||
require_once 'massivescale/celery-php/celery.php';
|
||||
|
||||
class Application_Model_RabbitMq
|
||||
{
|
||||
|
@ -79,12 +80,10 @@ class Application_Model_RabbitMq
|
|||
self::sendMessage($exchange, 'direct', true, $data);
|
||||
}
|
||||
|
||||
public static function SendMessageToAnalyzer($tmpFilePath, $importedStorageDirectory, $originalFilename,
|
||||
$callbackUrl, $apiKey, $storageBackend, $filePrefix)
|
||||
{
|
||||
public static function getRmqConfigPath() {
|
||||
//Hack for Airtime Pro. The RabbitMQ settings for communicating with airtime_analyzer are global
|
||||
//and shared between all instances on Airtime Pro.
|
||||
$CC_CONFIG = Config::getConfig();
|
||||
$CC_CONFIG = Config::getConfig();
|
||||
$devEnv = "production"; //Default
|
||||
if (array_key_exists("dev_env", $CC_CONFIG)) {
|
||||
$devEnv = $CC_CONFIG["dev_env"];
|
||||
|
@ -95,7 +94,13 @@ class Application_Model_RabbitMq
|
|||
// to the production rabbitmq-analyzer.ini
|
||||
$rmq_config_path = "/etc/airtime-saas/production/rabbitmq-analyzer.ini";
|
||||
}
|
||||
$config = parse_ini_file($rmq_config_path, true);
|
||||
return $rmq_config_path;
|
||||
}
|
||||
|
||||
public static function SendMessageToAnalyzer($tmpFilePath, $importedStorageDirectory, $originalFilename,
|
||||
$callbackUrl, $apiKey, $storageBackend, $filePrefix)
|
||||
{
|
||||
$config = parse_ini_file(self::getRmqConfigPath(), true);
|
||||
$conn = new AMQPConnection($config["rabbitmq"]["host"],
|
||||
$config["rabbitmq"]["port"],
|
||||
$config["rabbitmq"]["user"],
|
||||
|
@ -146,5 +151,6 @@ class Application_Model_RabbitMq
|
|||
|
||||
public static function SendMessageToHaproxyConfigDaemon($md){
|
||||
//XXX: This function has been deprecated and is no longer needed
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -2,6 +2,12 @@
|
|||
|
||||
class Application_Model_Schedule
|
||||
{
|
||||
|
||||
const MASTER_SOURCE_NAME = "Master";
|
||||
const SHOW_SOURCE_NAME = "Live";
|
||||
const SCHEDULED_SOURCE_NAME = "Scheduled";
|
||||
const LIVE_STREAM = "Live Stream";
|
||||
|
||||
/**
|
||||
* Return TRUE if file is going to be played in the future.
|
||||
*
|
||||
|
@ -92,19 +98,21 @@ SQL;
|
|||
$end = new DateTime();
|
||||
$end->add(new DateInterval("P2D")); // Add 2 days
|
||||
$end->setTimezone(new DateTimeZone("UTC"));
|
||||
$utcTimeEnd = $end->format("Y-m-d H:i:s");
|
||||
$utcTimeEnd = $end->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
}
|
||||
|
||||
$utcNow = new DateTime("now", new DateTimeZone("UTC"));
|
||||
|
||||
$shows = Application_Model_Show::getPrevCurrentNext($utcNow, $utcTimeEnd, $showsToRetrieve);
|
||||
$currentShowID = count($shows['currentShow'])>0?$shows['currentShow']['instance_id']:null;
|
||||
$results = Application_Model_Schedule::getPreviousCurrentNextMedia($utcNow, $currentShowID);
|
||||
$source = self::_getSource();
|
||||
$results = Application_Model_Schedule::getPreviousCurrentNextMedia($utcNow, $currentShowID, self::_getSource());
|
||||
|
||||
$range = array(
|
||||
"station" => array (
|
||||
"env" => APPLICATION_ENV,
|
||||
"schedulerTime" => $utcNow->format("Y-m-d H:i:s")
|
||||
"schedulerTime" => $utcNow->format(DEFAULT_TIMESTAMP_FORMAT),
|
||||
"source_enabled" => $source
|
||||
),
|
||||
//Previous, current, next songs!
|
||||
"tracks" => array(
|
||||
|
@ -135,18 +143,20 @@ SQL;
|
|||
|
||||
$shows = Application_Model_Show::getPrevCurrentNextOld($utcNow);
|
||||
$currentShowID = count($shows['currentShow'])>0?$shows['currentShow'][0]['instance_id']:null;
|
||||
$results = Application_Model_Schedule::getPreviousCurrentNextMedia($utcNow, $currentShowID);
|
||||
|
||||
$source = self::_getSource();
|
||||
$results = Application_Model_Schedule::getPreviousCurrentNextMedia($utcNow, $currentShowID, $source);
|
||||
|
||||
$range = array(
|
||||
"env" => APPLICATION_ENV,
|
||||
"schedulerTime" => $utcNow->format("Y-m-d H:i:s"),
|
||||
"schedulerTime" => $utcNow->format(DEFAULT_TIMESTAMP_FORMAT),
|
||||
//Previous, current, next songs!
|
||||
"previous"=>$results['previous'] !=null?$results['previous']:(count($shows['previousShow'])>0?$shows['previousShow'][0]:null),
|
||||
"current"=>$results['current'] !=null?$results['current']:((count($shows['currentShow'])>0 && $shows['currentShow'][0]['record'] == 1)?$shows['currentShow'][0]:null),
|
||||
"next"=> $results['next'] !=null?$results['next']:(count($shows['nextShow'])>0?$shows['nextShow'][0]:null),
|
||||
//Current and next shows
|
||||
"currentShow"=>$shows['currentShow'],
|
||||
"nextShow"=>$shows['nextShow']
|
||||
"nextShow"=>$shows['nextShow'],
|
||||
"source_enabled" => $source
|
||||
);
|
||||
|
||||
return $range;
|
||||
|
@ -157,12 +167,13 @@ SQL;
|
|||
* If a current media item is currently playing, this function then attempts to
|
||||
* find an item that played previously and is scheduled to play next.
|
||||
*
|
||||
* @param $utcNow DateTime current time in UTC
|
||||
* @param $currentShowInstanceId cc_show_instance id of the show instance currently playing
|
||||
* @param $utcNow DateTime current time in UTC
|
||||
* @param $currentShowInstanceId int id of the show instance currently playing
|
||||
* @param $source string the current prioritized source
|
||||
* @return array with data about the previous, current, and next media items playing.
|
||||
* Returns an empty arrays if there is no media item currently playing
|
||||
*/
|
||||
public static function getPreviousCurrentNextMedia($utcNow, $currentShowInstanceId)
|
||||
public static function getPreviousCurrentNextMedia($utcNow, $currentShowInstanceId, $source)
|
||||
{
|
||||
$timeZone = new DateTimeZone("UTC"); //This function works entirely in UTC.
|
||||
assert(get_class($utcNow) === "DateTime");
|
||||
|
@ -178,63 +189,69 @@ SQL;
|
|||
and s.ends >= :p2 and s.instance_id = :p3 order by starts desc limit 1";
|
||||
|
||||
$params = array(
|
||||
":p1" => $utcNow->format("Y-m-d H:i:s"),
|
||||
":p2" => $utcNow->format("Y-m-d H:i:s"),
|
||||
":p1" => $utcNow->format(DEFAULT_TIMESTAMP_FORMAT),
|
||||
":p2" => $utcNow->format(DEFAULT_TIMESTAMP_FORMAT),
|
||||
":p3" => $currentShowInstanceId
|
||||
);
|
||||
|
||||
$rows = Application_Common_Database::prepareAndExecute($sql, $params);
|
||||
|
||||
if (count($rows) < 1) {
|
||||
return $results;
|
||||
}
|
||||
// If live streaming (master or show source) is enabled, set the current
|
||||
// track information to the current show values
|
||||
if ($source != self::SCHEDULED_SOURCE_NAME) {
|
||||
$show = Application_Model_Show::getCurrentShow();
|
||||
$results["current"] = isset($show[0]) ? array(
|
||||
"starts" => $show[0]["starts"],
|
||||
"ends" => $show[0]["ends"],
|
||||
"type" => _("livestream"),
|
||||
"name" => $show[0]["name"] . " - " . _(self::LIVE_STREAM),
|
||||
"media_item_played" => false,
|
||||
"record" => "0"
|
||||
) : null;
|
||||
} else if (count($rows) >= 1) {
|
||||
$currentMedia = $rows[0];
|
||||
|
||||
if ($rows[0]["show_ends"] < $utcNow->format("Y-m-d H:i:s")) {
|
||||
return $results;
|
||||
}
|
||||
|
||||
$currentMedia = $rows[0];
|
||||
|
||||
if ($currentMedia["ends"] > $currentMedia["show_ends"]) {
|
||||
$currentMedia["ends"] = $currentMedia["show_ends"];
|
||||
}
|
||||
|
||||
$currentMediaFileId = $currentMedia["file_id"];
|
||||
$currentMediaStreamId = $currentMedia["stream_id"];
|
||||
if (isset($currentMediaFileId)) {
|
||||
$currentMediaType = "track";
|
||||
$currentFile = CcFilesQuery::create()
|
||||
->filterByDbId($currentMediaFileId)
|
||||
->findOne();
|
||||
$currentMediaName = $currentFile->getDbArtistName() . " - " . $currentFile->getDbTrackTitle();
|
||||
} else if (isset($currentMediaStreamId)) {
|
||||
$currentMediaType = "webstream";
|
||||
$currentWebstream = CcWebstreamQuery::create()
|
||||
->filterByDbId($currentMediaStreamId)
|
||||
->findOne();
|
||||
$currentWebstreamMetadata = CcWebstreamMetadataQuery::create()
|
||||
->filterByDbInstanceId($currentMedia["instance_id"])
|
||||
->orderByDbStartTime(Criteria::DESC)
|
||||
->findOne();
|
||||
$currentMediaName = $currentWebstream->getDbName();
|
||||
if (isset($currentWebstreamMetadata)) {
|
||||
$currentMediaName .= " - " . $currentWebstreamMetadata->getDbLiquidsoapData();
|
||||
if ($currentMedia["ends"] > $currentMedia["show_ends"]) {
|
||||
$currentMedia["ends"] = $currentMedia["show_ends"];
|
||||
}
|
||||
} else {
|
||||
$currentMediaType = null;
|
||||
|
||||
$currentMediaFileId = $currentMedia["file_id"];
|
||||
$currentMediaStreamId = $currentMedia["stream_id"];
|
||||
if (isset($currentMediaFileId)) {
|
||||
$currentMediaType = "track";
|
||||
$currentFile = CcFilesQuery::create()
|
||||
->filterByDbId($currentMediaFileId)
|
||||
->findOne();
|
||||
$currentMediaName = $currentFile->getDbArtistName() . " - " . $currentFile->getDbTrackTitle();
|
||||
} else if (isset($currentMediaStreamId)) {
|
||||
$currentMediaType = "webstream";
|
||||
$currentWebstream = CcWebstreamQuery::create()
|
||||
->filterByDbId($currentMediaStreamId)
|
||||
->findOne();
|
||||
$currentWebstreamMetadata = CcWebstreamMetadataQuery::create()
|
||||
->filterByDbInstanceId($currentMedia["instance_id"])
|
||||
->orderByDbStartTime(Criteria::DESC)
|
||||
->findOne();
|
||||
$currentMediaName = $currentWebstream->getDbName();
|
||||
if (isset($currentWebstreamMetadata)) {
|
||||
$currentMediaName .= " - " . $currentWebstreamMetadata->getDbLiquidsoapData();
|
||||
}
|
||||
} else {
|
||||
$currentMediaType = null;
|
||||
}
|
||||
|
||||
$results["current"] = array(
|
||||
"starts" => $currentMedia["starts"],
|
||||
"ends" => $currentMedia["ends"],
|
||||
"type" => $currentMediaType,
|
||||
"name" => $currentMediaName,
|
||||
"media_item_played" => $currentMedia["media_item_played"],
|
||||
"record" => "0"
|
||||
);
|
||||
}
|
||||
$results["current"] = array(
|
||||
"starts" => $currentMedia["starts"],
|
||||
"ends" => $currentMedia["ends"],
|
||||
"type" => $currentMediaType,
|
||||
"name" => $currentMediaName,
|
||||
"media_item_played" => $currentMedia["media_item_played"],
|
||||
"record" => "0"
|
||||
);
|
||||
|
||||
$previousMedia = CcScheduleQuery::create()
|
||||
->filterByDbStarts($currentMedia["starts"], Criteria::LESS_THAN)
|
||||
->filterByDbId($currentMedia["id"], Criteria::NOT_EQUAL)
|
||||
->filterByDbEnds($utcNow, Criteria::LESS_THAN)
|
||||
->filterByDbPlayoutStatus(0, Criteria::GREATER_THAN)
|
||||
->orderByDbStarts(Criteria::DESC)
|
||||
->findOne();
|
||||
|
@ -266,8 +283,7 @@ SQL;
|
|||
}
|
||||
|
||||
$nextMedia = CcScheduleQuery::create()
|
||||
->filterByDbStarts($currentMedia["starts"], Criteria::GREATER_THAN)
|
||||
->filterByDbId($currentMedia["id"], Criteria::NOT_EQUAL)
|
||||
->filterByDbStarts($utcNow, Criteria::GREATER_THAN)
|
||||
->filterByDbPlayoutStatus(0, Criteria::GREATER_THAN)
|
||||
->orderByDbStarts(Criteria::ASC)
|
||||
->findOne();
|
||||
|
@ -301,6 +317,21 @@ SQL;
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current prioritized source
|
||||
*
|
||||
* Priority order is Master->Live/Show->Scheduled.
|
||||
*
|
||||
* @return string the source name
|
||||
*/
|
||||
private static function _getSource() {
|
||||
$live_dj = Application_Model_Preference::GetSourceStatus("live_dj");
|
||||
$master_dj = Application_Model_Preference::GetSourceStatus("master_dj");
|
||||
$source = ($master_dj ? self::MASTER_SOURCE_NAME
|
||||
: ($live_dj ? self::SHOW_SOURCE_NAME : self::SCHEDULED_SOURCE_NAME));
|
||||
return $source;
|
||||
}
|
||||
|
||||
public static function GetLastScheduleItem($p_timeNow)
|
||||
{
|
||||
$sql = <<<SQL
|
||||
|
@ -379,13 +410,13 @@ SQL;
|
|||
*/
|
||||
public static function GetScheduleDetailItems($p_start, $p_end, $p_shows, $p_show_instances)
|
||||
{
|
||||
$p_start_str = $p_start->format("Y-m-d H:i:s");
|
||||
$p_end_str = $p_end->format("Y-m-d H:i:s");
|
||||
$p_start_str = $p_start->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$p_end_str = $p_end->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
//We need to search 48 hours before and after the show times so that that we
|
||||
//capture all of the show's contents.
|
||||
$p_track_start= $p_start->sub(new DateInterval("PT48H"))->format("Y-m-d H:i:s");
|
||||
$p_track_end = $p_end->add(new DateInterval("PT48H"))->format("Y-m-d H:i:s");
|
||||
$p_track_start= $p_start->sub(new DateInterval("PT48H"))->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$p_track_end = $p_end->add(new DateInterval("PT48H"))->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
$templateSql = <<<SQL
|
||||
SELECT DISTINCT sched.starts AS sched_starts,
|
||||
|
@ -569,7 +600,7 @@ SQL;
|
|||
|
||||
public static function UpdateBrodcastedStatus($dateTime, $value)
|
||||
{
|
||||
$now = $dateTime->format("Y-m-d H:i:s");
|
||||
$now = $dateTime->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
$sql = <<<SQL
|
||||
UPDATE cc_schedule
|
||||
|
@ -731,7 +762,7 @@ SQL;
|
|||
if (count($rows) < 3) {
|
||||
$dt = new DateTime("@".time());
|
||||
$dt->add(new DateInterval("PT24H"));
|
||||
$range_end = $dt->format("Y-m-d H:i:s");
|
||||
$range_end = $dt->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
$predicates = <<<SQL
|
||||
WHERE st.ends > :startTime1
|
||||
|
@ -783,7 +814,7 @@ SQL;
|
|||
$transition_time = intval($temp[0]);
|
||||
$switchOffDataTime = new DateTime($kick_time, $utcTimeZone);
|
||||
$switch_off_time = $switchOffDataTime->sub(new DateInterval('PT'.$transition_time.'S'));
|
||||
$switch_off_time = $switch_off_time->format("Y-m-d H:i:s");
|
||||
$switch_off_time = $switch_off_time->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
$kick_start = self::AirtimeTimeToPypoTime($kick_time);
|
||||
$data["media"][$kick_start]['start'] = $kick_start;
|
||||
|
@ -869,7 +900,7 @@ SQL;
|
|||
$buffer_start = new DateTime($item["start"], new DateTimeZone('UTC'));
|
||||
$buffer_start->sub(new DateInterval("PT5S"));
|
||||
|
||||
$stream_buffer_start = self::AirtimeTimeToPypoTime($buffer_start->format("Y-m-d H:i:s"));
|
||||
$stream_buffer_start = self::AirtimeTimeToPypoTime($buffer_start->format(DEFAULT_TIMESTAMP_FORMAT));
|
||||
|
||||
$schedule_item = array(
|
||||
'start' => $stream_buffer_start,
|
||||
|
@ -899,7 +930,7 @@ SQL;
|
|||
$dt = new DateTime($item["end"], new DateTimeZone('UTC'));
|
||||
$dt->sub(new DateInterval("PT1S"));
|
||||
|
||||
$stream_end = self::AirtimeTimeToPypoTime($dt->format("Y-m-d H:i:s"));
|
||||
$stream_end = self::AirtimeTimeToPypoTime($dt->format(DEFAULT_TIMESTAMP_FORMAT));
|
||||
|
||||
$schedule_item = array(
|
||||
'start' => $stream_end,
|
||||
|
@ -931,7 +962,7 @@ SQL;
|
|||
then set range * from "now" to "now + 24 hours". */
|
||||
if (is_null($p_fromDateTime)) {
|
||||
$t1 = new DateTime("@".time(), $utcTimeZone);
|
||||
$range_start = $t1->format("Y-m-d H:i:s");
|
||||
$range_start = $t1->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
} else {
|
||||
$range_start = Application_Model_Schedule::PypoTimeToAirtimeTime($p_fromDateTime);
|
||||
}
|
||||
|
@ -948,7 +979,7 @@ SQL;
|
|||
}
|
||||
|
||||
$t2->add(new DateInterval("PT".$cache_ahead_hours."H"));
|
||||
$range_end = $t2->format("Y-m-d H:i:s");
|
||||
$range_end = $t2->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
} else {
|
||||
$range_end = Application_Model_Schedule::PypoTimeToAirtimeTime($p_toDateTime);
|
||||
}
|
||||
|
@ -977,7 +1008,7 @@ SQL;
|
|||
$di = $trackStartDateTime->diff($showEndDateTime);
|
||||
|
||||
$item["cue_out"] = $di->format("%H:%i:%s").".000";
|
||||
$item["end"] = $showEndDateTime->format("Y-m-d H:i:s");
|
||||
$item["end"] = $showEndDateTime->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
}
|
||||
|
||||
if (!is_null($item['file_id'])) {
|
||||
|
@ -1107,7 +1138,7 @@ SQL;
|
|||
if (!is_null($showId)) {
|
||||
$ccShowInstance = CcShowInstancesQuery::create()
|
||||
->filterByDbShowId($showId)
|
||||
->filterByDbStarts($show_start->format("Y-m-d H:i:s"))
|
||||
->filterByDbStarts($show_start->format(DEFAULT_TIMESTAMP_FORMAT))
|
||||
->findOne();
|
||||
} elseif (!is_null($instanceId)) {
|
||||
$ccShowInstance = CcShowInstancesQuery::create()
|
||||
|
@ -1121,9 +1152,9 @@ SQL;
|
|||
$overlapping = false;
|
||||
|
||||
$params = array(
|
||||
':show_end1' => $show_end->format('Y-m-d H:i:s'),
|
||||
':show_end2' => $show_end->format('Y-m-d H:i:s'),
|
||||
':show_end3' => $show_end->format('Y-m-d H:i:s')
|
||||
':show_end1' => $show_end->format(DEFAULT_TIMESTAMP_FORMAT),
|
||||
':show_end2' => $show_end->format(DEFAULT_TIMESTAMP_FORMAT),
|
||||
':show_end3' => $show_end->format(DEFAULT_TIMESTAMP_FORMAT)
|
||||
);
|
||||
|
||||
|
||||
|
@ -1170,9 +1201,9 @@ ORDER BY ends
|
|||
SQL;
|
||||
|
||||
$rows = Application_Common_Database::prepareAndExecute($sql, array(
|
||||
':show_end1' => $show_end->format('Y-m-d H:i:s'),
|
||||
':show_end2' => $show_end->format('Y-m-d H:i:s'),
|
||||
':show_end3' => $show_end->format('Y-m-d H:i:s')), 'all');
|
||||
':show_end1' => $show_end->format(DEFAULT_TIMESTAMP_FORMAT),
|
||||
':show_end2' => $show_end->format(DEFAULT_TIMESTAMP_FORMAT),
|
||||
':show_end3' => $show_end->format(DEFAULT_TIMESTAMP_FORMAT)), 'all');
|
||||
}
|
||||
|
||||
foreach ($rows as $row) {
|
||||
|
|
|
@ -170,7 +170,7 @@ class Application_Model_Scheduler
|
|||
//get all the linked shows instances and check if
|
||||
//any of them are currently playing
|
||||
$ccShowInstances = $ccShow->getCcShowInstancess();
|
||||
$timeNowUTC = gmdate("Y-m-d H:i:s");
|
||||
$timeNowUTC = gmdate(DEFAULT_TIMESTAMP_FORMAT);
|
||||
foreach ($ccShowInstances as $ccShowInstance) {
|
||||
|
||||
if ($ccShowInstance->getDbStarts() <= $timeNowUTC &&
|
||||
|
@ -472,8 +472,8 @@ class Application_Model_Scheduler
|
|||
$itemEndDT = $this->findEndTime($itemStartDT, $item["clip_length"]);
|
||||
|
||||
$update_sql = "UPDATE cc_schedule SET ".
|
||||
"starts = '{$itemStartDT->format("Y-m-d H:i:s.u")}', ".
|
||||
"ends = '{$itemEndDT->format("Y-m-d H:i:s.u")}' ".
|
||||
"starts = '{$itemStartDT->format(DEFAULT_MICROTIME_FORMAT)}', ".
|
||||
"ends = '{$itemEndDT->format(DEFAULT_MICROTIME_FORMAT)}' ".
|
||||
"WHERE id = {$item["id"]}";
|
||||
Application_Common_Database::prepareAndExecute(
|
||||
$update_sql, array(), Application_Common_Database::EXECUTE);
|
||||
|
@ -608,7 +608,7 @@ class Application_Model_Scheduler
|
|||
if ($linked) {
|
||||
$instances = CcShowInstancesQuery::create()
|
||||
->filterByDbShowId($ccShow["id"])
|
||||
->filterByDbStarts(gmdate("Y-m-d H:i:s"), Criteria::GREATER_THAN)
|
||||
->filterByDbStarts(gmdate(DEFAULT_TIMESTAMP_FORMAT), Criteria::GREATER_THAN)
|
||||
->find();
|
||||
} else {
|
||||
$instances = CcShowInstancesQuery::create()
|
||||
|
@ -807,8 +807,8 @@ class Application_Model_Scheduler
|
|||
$endTimeDT = $this->findEndTime($nextStartDT, $file['cliplength']);
|
||||
if ($doInsert) {
|
||||
$values[] = "(".
|
||||
"'{$nextStartDT->format("Y-m-d H:i:s.u")}', ".
|
||||
"'{$endTimeDT->format("Y-m-d H:i:s.u")}', ".
|
||||
"'{$nextStartDT->format(DEFAULT_MICROTIME_FORMAT)}', ".
|
||||
"'{$endTimeDT->format(DEFAULT_MICROTIME_FORMAT)}', ".
|
||||
"'{$file["cuein"]}', ".
|
||||
"'{$file["cueout"]}', ".
|
||||
"'{$file["fadein"]}', ".
|
||||
|
@ -821,8 +821,8 @@ class Application_Model_Scheduler
|
|||
|
||||
} elseif ($doUpdate) {
|
||||
$update_sql = "UPDATE cc_schedule SET ".
|
||||
"starts = '{$nextStartDT->format("Y-m-d H:i:s.u")}', ".
|
||||
"ends = '{$endTimeDT->format("Y-m-d H:i:s.u")}', ".
|
||||
"starts = '{$nextStartDT->format(DEFAULT_MICROTIME_FORMAT)}', ".
|
||||
"ends = '{$endTimeDT->format(DEFAULT_MICROTIME_FORMAT)}', ".
|
||||
"cue_in = '{$file["cuein"]}', ".
|
||||
"cue_out = '{$file["cueout"]}', ".
|
||||
"fade_in = '{$file["fadein"]}', ".
|
||||
|
@ -871,7 +871,7 @@ class Application_Model_Scheduler
|
|||
if ($adjustSched === true) {
|
||||
|
||||
$followingItems_sql = "SELECT * FROM cc_schedule ".
|
||||
"WHERE starts >= '{$initalStartDT->format("Y-m-d H:i:s.u")}' ".
|
||||
"WHERE starts >= '{$initalStartDT->format(DEFAULT_MICROTIME_FORMAT)}' ".
|
||||
"AND instance_id = {$instanceId} ";
|
||||
if (count($excludeIds) > 0) {
|
||||
$followingItems_sql .= "AND id NOT IN (". implode($excludeIds, ",").") ";
|
||||
|
@ -887,8 +887,8 @@ class Application_Model_Scheduler
|
|||
$endTimeDT = $this->findEndTime($nextStartDT, $item["clip_length"]);
|
||||
$endTimeDT = $this->findTimeDifference($endTimeDT, $this->crossfadeDuration);
|
||||
$update_sql = "UPDATE cc_schedule SET ".
|
||||
"starts = '{$nextStartDT->format("Y-m-d H:i:s.u")}', ".
|
||||
"ends = '{$endTimeDT->format("Y-m-d H:i:s.u")}', ".
|
||||
"starts = '{$nextStartDT->format(DEFAULT_MICROTIME_FORMAT)}', ".
|
||||
"ends = '{$endTimeDT->format(DEFAULT_MICROTIME_FORMAT)}', ".
|
||||
"position = {$pos} ".
|
||||
"WHERE id = {$item["id"]}";
|
||||
Application_Common_Database::prepareAndExecute(
|
||||
|
|
|
@ -305,7 +305,7 @@ SQL;
|
|||
array(
|
||||
':deltaDay1' => "$deltaDay days",
|
||||
':interval1' => "$hours:$mins",
|
||||
':current_timestamp1' => $nowDateTime->format("Y-m-d H:i:s"),
|
||||
':current_timestamp1' => $nowDateTime->format(DEFAULT_TIMESTAMP_FORMAT),
|
||||
':deltaDay2' => "$deltaDay days",
|
||||
':interval2' => "$hours:$mins"
|
||||
), "execute");
|
||||
|
@ -336,7 +336,7 @@ SQL;
|
|||
CcShowInstancesPeer::clearInstancePool();
|
||||
|
||||
$instances = CcShowInstancesQuery::create()
|
||||
->filterByDbEnds($nowDateTime->format("Y-m-d H:i:s"), Criteria::GREATER_THAN)
|
||||
->filterByDbEnds($nowDateTime->format(DEFAULT_TIMESTAMP_FORMAT), Criteria::GREATER_THAN)
|
||||
->filterByDbId($instanceIds, Criteria::IN)
|
||||
->find($con);
|
||||
|
||||
|
@ -525,7 +525,7 @@ WHERE starts > :timestamp::TIMESTAMP
|
|||
AND show_id = :showId
|
||||
SQL;
|
||||
Application_Common_Database::prepareAndExecute( $sql,
|
||||
array( ':timestamp' => gmdate("Y-m-d H:i:s"),
|
||||
array( ':timestamp' => gmdate(DEFAULT_TIMESTAMP_FORMAT),
|
||||
':showId' => $this->getId()), 'execute');
|
||||
}
|
||||
|
||||
|
@ -544,7 +544,7 @@ WHERE starts > :timestamp::TIMESTAMP
|
|||
SQL;
|
||||
Application_Common_Database::prepareAndExecute( $sql,
|
||||
array( ':showId' => $this->getId(),
|
||||
':timestamp' => gmdate("Y-m-d H:i:s")), 'execute');
|
||||
':timestamp' => gmdate(DEFAULT_TIMESTAMP_FORMAT)), 'execute');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -658,7 +658,7 @@ SQL;
|
|||
*/
|
||||
public function isStartDateTimeInPast()
|
||||
{
|
||||
return (gmdate("Y-m-d H:i:s") > ($this->getStartDate()." ".$this->getStartTime()));
|
||||
return (gmdate(DEFAULT_TIMESTAMP_FORMAT) > ($this->getStartDate()." ".$this->getStartTime()));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -679,7 +679,7 @@ WHERE show_id = :showId
|
|||
SQL;
|
||||
$rows = Application_Common_Database::prepareAndExecute($sql,
|
||||
array( ':showId' => $this->getId(),
|
||||
':timestamp' => gmdate("Y-m-d H:i:s")), "all");
|
||||
':timestamp' => gmdate(DEFAULT_TIMESTAMP_FORMAT)), "all");
|
||||
|
||||
$res = array();
|
||||
foreach ($rows as $r) {
|
||||
|
@ -699,7 +699,7 @@ SQL;
|
|||
{
|
||||
//need to update cc_show_instances, cc_show_days
|
||||
$con = Propel::getConnection();
|
||||
$timestamp = gmdate("Y-m-d H:i:s");
|
||||
$timestamp = gmdate(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
$stmt = $con->prepare("UPDATE cc_show_days "
|
||||
."SET duration = :add_show_duration "
|
||||
|
@ -811,7 +811,7 @@ SQL;
|
|||
* row in the cc_show_instances table. */
|
||||
public function getInstanceOnDate($p_dateTime)
|
||||
{
|
||||
$timestamp = $p_dateTime->format("Y-m-d H:i:s");
|
||||
$timestamp = $p_dateTime->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$sql = <<<SQL
|
||||
SELECT id
|
||||
FROM cc_show_instances
|
||||
|
@ -898,8 +898,8 @@ LEFT JOIN cc_files AS f ON f.id = si1.file_id
|
|||
WHERE si1.modified_instance = FALSE
|
||||
SQL;
|
||||
//only want shows that are starting at the time or later.
|
||||
$start_string = $start_timestamp->format("Y-m-d H:i:s");
|
||||
$end_string = $end_timestamp->format("Y-m-d H:i:s");
|
||||
$start_string = $start_timestamp->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$end_string = $end_timestamp->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
$params = array();
|
||||
|
||||
|
@ -1012,8 +1012,8 @@ SQL;
|
|||
|
||||
$event["id"] = intval($show["instance_id"]);
|
||||
$event["title"] = $show["name"];
|
||||
$event["start"] = $startsDT->format("Y-m-d H:i:s");
|
||||
$event["end"] = $endsDT->format("Y-m-d H:i:s");
|
||||
$event["start"] = $startsDT->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$event["end"] = $endsDT->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$event["allDay"] = false;
|
||||
$event["showId"] = intval($show["show_id"]);
|
||||
$event["linked"] = intval($show["linked"]);
|
||||
|
@ -1080,7 +1080,7 @@ SQL;
|
|||
{
|
||||
$con = Propel::getConnection();
|
||||
if ($timeNow == null) {
|
||||
$timeNow = gmdate("Y-m-d H:i:s");
|
||||
$timeNow = gmdate(DEFAULT_TIMESTAMP_FORMAT);
|
||||
}
|
||||
//TODO, returning starts + ends twice (once with an alias). Unify this after the 2.0 release. --Martin
|
||||
$sql = <<<SQL
|
||||
|
@ -1169,7 +1169,7 @@ SQL;
|
|||
|
||||
$stmt = $con->prepare($sql);
|
||||
|
||||
$utcNowStr = $utcNow->format("Y-m-d H:i:s");
|
||||
$utcNowStr = $utcNow->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$stmt->bindValue(':timeNow', $utcNowStr);
|
||||
$stmt->bindValue(':timeEnd', $utcEndStr);
|
||||
$stmt->bindValue(':lim', $showsToRetrieve);
|
||||
|
@ -1250,7 +1250,7 @@ SQL;
|
|||
|
||||
$stmt = $con->prepare($sql);
|
||||
|
||||
$utcNowStr = $utcNow->format("Y-m-d H:i:s");
|
||||
$utcNowStr = $utcNow->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$stmt->bindValue(':timeNow1', $utcNowStr);
|
||||
$stmt->bindValue(':timeNow2', $utcNowStr);
|
||||
|
||||
|
|
|
@ -212,16 +212,6 @@ class Application_Model_ShowBuilder
|
|||
$row["rebroadcast_title"] = sprintf(_("Rebroadcast of %s from %s"), $name, $time);
|
||||
} elseif (intval($p_item["si_record"]) === 1) {
|
||||
$row["record"] = true;
|
||||
|
||||
// at the time of creating on show, the recorded file is not in the DB yet.
|
||||
// therefore, 'si_file_id' is null. So we need to check it.
|
||||
if (Application_Model_Preference::GetUploadToSoundcloudOption() && isset($p_item['si_file_id'])) {
|
||||
$file = Application_Model_StoredFile::RecallById($p_item['si_file_id']);
|
||||
if (isset($file)) {
|
||||
$sid = $file->getSoundCloudId();
|
||||
$row['soundcloud_id'] = $sid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($startsEpoch < $this->epoch_now && $endsEpoch > $this->epoch_now) {
|
||||
|
|
|
@ -36,7 +36,7 @@ class Application_Model_ShowInstance
|
|||
|
||||
public function deleteRebroadcasts()
|
||||
{
|
||||
$timestamp = gmdate("Y-m-d H:i:s");
|
||||
$timestamp = gmdate(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$instance_id = $this->getShowInstanceId();
|
||||
$sql = <<<SQL
|
||||
DELETE FROM cc_show_instances
|
||||
|
@ -86,18 +86,18 @@ SQL;
|
|||
|
||||
/**
|
||||
* Return the start time of the Show (UTC time)
|
||||
* @return string in format "Y-m-d H:i:s" (PHP time notation)
|
||||
* @return string in format DEFAULT_TIMESTAMP_FORMAT (PHP time notation)
|
||||
*/
|
||||
public function getShowInstanceStart($format="Y-m-d H:i:s")
|
||||
public function getShowInstanceStart($format=DEFAULT_TIMESTAMP_FORMAT)
|
||||
{
|
||||
return $this->_showInstance->getDbStarts($format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the end time of the Show (UTC time)
|
||||
* @return string in format "Y-m-d H:i:s" (PHP time notation)
|
||||
* @return string in format DEFAULT_TIMESTAMP_FORMAT (PHP time notation)
|
||||
*/
|
||||
public function getShowInstanceEnd($format="Y-m-d H:i:s")
|
||||
public function getShowInstanceEnd($format=DEFAULT_TIMESTAMP_FORMAT)
|
||||
{
|
||||
return $this->_showInstance->getDbEnds($format);
|
||||
}
|
||||
|
@ -118,19 +118,6 @@ SQL;
|
|||
return $showStartExplode[1];
|
||||
}
|
||||
|
||||
public function setSoundCloudFileId($p_soundcloud_id)
|
||||
{
|
||||
$file = Application_Model_StoredFile::RecallById($this->_showInstance->getDbRecordedFile());
|
||||
$file->setSoundCloudFileId($p_soundcloud_id);
|
||||
}
|
||||
|
||||
public function getSoundCloudFileId()
|
||||
{
|
||||
$file = Application_Model_StoredFile::RecallById($this->_showInstance->getDbRecordedFile());
|
||||
|
||||
return $file->getSoundCloudId();
|
||||
}
|
||||
|
||||
public function getRecordedFile()
|
||||
{
|
||||
$file_id = $this->_showInstance->getDbRecordedFile();
|
||||
|
@ -354,7 +341,7 @@ SQL;
|
|||
|
||||
$show = $this->getShow();
|
||||
|
||||
$current_timestamp = gmdate("Y-m-d H:i:s");
|
||||
$current_timestamp = gmdate(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
if ($current_timestamp <= $this->getShowInstanceEnd()) {
|
||||
if ($show->isRepeating()) {
|
||||
|
@ -623,7 +610,7 @@ SQL;
|
|||
|
||||
$dt = new DateTime($row["starts"], $utcTimezone);
|
||||
$dt->setTimezone($displayTimezone);
|
||||
$row["starts"] = $dt->format("Y-m-d H:i:s");
|
||||
$row["starts"] = $dt->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
if (isset($row['length'])) {
|
||||
$formatter = new LengthFormatter($row["length"]);
|
||||
|
|
|
@ -1,99 +0,0 @@
|
|||
<?php
|
||||
require_once 'soundcloud-api/Services/Soundcloud.php';
|
||||
|
||||
class Application_Model_Soundcloud
|
||||
{
|
||||
private $_soundcloud;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$CC_CONFIG = Config::getConfig();
|
||||
$this->_soundcloud = new Services_Soundcloud(
|
||||
$CC_CONFIG['soundcloud-client-id'],
|
||||
$CC_CONFIG['soundcloud-client-secret']);
|
||||
}
|
||||
|
||||
private function getToken()
|
||||
{
|
||||
$username = Application_Model_Preference::GetSoundCloudUser();
|
||||
$password = Application_Model_Preference::GetSoundCloudPassword();
|
||||
|
||||
$token = $this->_soundcloud->accessTokenResourceOwner($username, $password);
|
||||
|
||||
return $token;
|
||||
}
|
||||
|
||||
public function uploadTrack($filepath, $filename, $description,
|
||||
$tags=array(), $release=null, $genre=null)
|
||||
{
|
||||
|
||||
if (!$this->getToken()) {
|
||||
throw new NoSoundCloundToken();
|
||||
}
|
||||
if (count($tags)) {
|
||||
$tags = join(" ", $tags);
|
||||
$tags = $tags." ".Application_Model_Preference::GetSoundCloudTags();
|
||||
} else {
|
||||
$tags = Application_Model_Preference::GetSoundCloudTags();
|
||||
}
|
||||
|
||||
$downloadable = Application_Model_Preference::GetSoundCloudDownloadbleOption() == '1';
|
||||
|
||||
$track_data = array(
|
||||
'track[sharing]' => 'private',
|
||||
'track[title]' => $filename,
|
||||
'track[asset_data]' => '@' . $filepath,
|
||||
'track[tag_list]' => $tags,
|
||||
'track[description]' => $description,
|
||||
'track[downloadable]' => $downloadable,
|
||||
|
||||
);
|
||||
|
||||
if (isset($release)) {
|
||||
$release = str_replace(" ", "-", $release);
|
||||
$release = str_replace(":", "-", $release);
|
||||
|
||||
//YYYY-MM-DD-HH-mm-SS
|
||||
$release = explode("-", $release);
|
||||
$track_data['track[release_year]'] = $release[0];
|
||||
$track_data['track[release_month]'] = $release[1];
|
||||
$track_data['track[release_day]'] = $release[2];
|
||||
}
|
||||
|
||||
if (isset($genre) && $genre != "") {
|
||||
$track_data['track[genre]'] = $genre;
|
||||
} else {
|
||||
$default_genre = Application_Model_Preference::GetSoundCloudGenre();
|
||||
if ($default_genre != "") {
|
||||
$track_data['track[genre]'] = $default_genre;
|
||||
}
|
||||
}
|
||||
|
||||
$track_type = Application_Model_Preference::GetSoundCloudTrackType();
|
||||
if ($track_type != "") {
|
||||
$track_data['track[track_type]'] = $track_type;
|
||||
}
|
||||
|
||||
$license = Application_Model_Preference::GetSoundCloudLicense();
|
||||
if ($license != "") {
|
||||
$track_data['track[license]'] = $license;
|
||||
}
|
||||
|
||||
$response = json_decode(
|
||||
$this->_soundcloud->post('tracks', $track_data),
|
||||
true
|
||||
);
|
||||
|
||||
return $response;
|
||||
|
||||
}
|
||||
|
||||
public static function uploadSoundcloud($id)
|
||||
{
|
||||
$cmd = "/usr/lib/airtime/utils/soundcloud-uploader $id > /dev/null &";
|
||||
Logging::info("Uploading soundcloud with command: $cmd");
|
||||
exec($cmd);
|
||||
}
|
||||
}
|
||||
|
||||
class NoSoundCloundToken extends Exception {}
|
|
@ -73,6 +73,9 @@ class Application_Model_StoredFile
|
|||
return $this->_file->getDbFtype();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return CcFiles
|
||||
*/
|
||||
public function getPropelOrm()
|
||||
{
|
||||
return $this->_file;
|
||||
|
@ -616,6 +619,13 @@ SQL;
|
|||
|
||||
/* TODO: Callers of this function should use a Propel transaction. Start
|
||||
* by creating $con outside the function with beingTransaction() */
|
||||
/**
|
||||
* @param int $p_id
|
||||
* @param \Doctrine\DBAL\Driver\PDOConnection $con
|
||||
*
|
||||
* @return Application_Model_StoredFile
|
||||
* @throws Exception
|
||||
*/
|
||||
public static function RecallById($p_id=null, $con=null) {
|
||||
//TODO
|
||||
if (is_null($con)) {
|
||||
|
@ -898,10 +908,6 @@ SQL;
|
|||
$formatter = new BitrateFormatter($row['bit_rate']);
|
||||
$row['bit_rate'] = $formatter->format();
|
||||
|
||||
//soundcloud status
|
||||
$file = Application_Model_StoredFile::RecallById($row['id']);
|
||||
$row['soundcloud_id'] = $file->getSoundCloudId();
|
||||
|
||||
// for audio preview
|
||||
$row['audioFile'] = $row['id'].".".pathinfo($row['filepath'], PATHINFO_EXTENSION);
|
||||
|
||||
|
@ -918,16 +924,16 @@ SQL;
|
|||
//convert mtime and utime to localtime
|
||||
$row['mtime'] = new DateTime($row['mtime'], $utcTimezone);
|
||||
$row['mtime']->setTimeZone($displayTimezone);
|
||||
$row['mtime'] = $row['mtime']->format('Y-m-d H:i:s');
|
||||
$row['mtime'] = $row['mtime']->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$row['utime'] = new DateTime($row['utime'], $utcTimezone);
|
||||
$row['utime']->setTimeZone($displayTimezone);
|
||||
$row['utime'] = $row['utime']->format('Y-m-d H:i:s');
|
||||
$row['utime'] = $row['utime']->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
//need to convert last played to localtime if it exists.
|
||||
if (isset($row['lptime'])) {
|
||||
$row['lptime'] = new DateTime($row['lptime'], $utcTimezone);
|
||||
$row['lptime']->setTimeZone($displayTimezone);
|
||||
$row['lptime'] = $row['lptime']->format('Y-m-d H:i:s');
|
||||
$row['lptime'] = $row['lptime']->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
}
|
||||
|
||||
// we need to initalize the checkbox and image row because we do not retrieve
|
||||
|
@ -1133,77 +1139,6 @@ SQL;
|
|||
return $rows;
|
||||
}
|
||||
|
||||
/* Gets number of tracks uploaded to
|
||||
* Soundcloud in the last 24 hours
|
||||
*/
|
||||
public static function getSoundCloudUploads()
|
||||
{
|
||||
try {
|
||||
|
||||
$sql = <<<SQL
|
||||
SELECT soundcloud_id AS id,
|
||||
soundcloud_upload_time
|
||||
FROM CC_FILES
|
||||
WHERE (id != -2
|
||||
AND id != -3)
|
||||
AND (soundcloud_upload_time >= (now() - (INTERVAL '1 day')))
|
||||
SQL;
|
||||
|
||||
$rows = Application_Common_Database::prepareAndExecute($sql);
|
||||
|
||||
return count($rows);
|
||||
} catch (Exception $e) {
|
||||
header('HTTP/1.0 503 Service Unavailable');
|
||||
Logging::info("Could not connect to database.");
|
||||
exit;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public function setSoundCloudLinkToFile($link_to_file)
|
||||
{
|
||||
$this->_file->setDbSoundCloudLinkToFile($link_to_file)
|
||||
->save();
|
||||
}
|
||||
|
||||
public function getSoundCloudLinkToFile()
|
||||
{
|
||||
return $this->_file->getDbSoundCloudLinkToFile();
|
||||
}
|
||||
|
||||
public function setSoundCloudFileId($p_soundcloud_id)
|
||||
{
|
||||
$this->_file->setDbSoundCloudId($p_soundcloud_id)
|
||||
->save();
|
||||
}
|
||||
|
||||
public function getSoundCloudId()
|
||||
{
|
||||
return $this->_file->getDbSoundCloudId();
|
||||
}
|
||||
|
||||
public function setSoundCloudErrorCode($code)
|
||||
{
|
||||
$this->_file->setDbSoundCloudErrorCode($code)
|
||||
->save();
|
||||
}
|
||||
|
||||
public function getSoundCloudErrorCode()
|
||||
{
|
||||
return $this->_file->getDbSoundCloudErrorCode();
|
||||
}
|
||||
|
||||
public function setSoundCloudErrorMsg($msg)
|
||||
{
|
||||
$this->_file->setDbSoundCloudErrorMsg($msg)
|
||||
->save();
|
||||
}
|
||||
|
||||
public function getSoundCloudErrorMsg()
|
||||
{
|
||||
return $this->_file->getDbSoundCloudErrorMsg();
|
||||
}
|
||||
|
||||
public function getDirectory()
|
||||
{
|
||||
return $this->_file->getDbDirectory();
|
||||
|
@ -1219,12 +1154,6 @@ SQL;
|
|||
$this->_file->setDbHidden($flag)
|
||||
->save();
|
||||
}
|
||||
public function setSoundCloudUploadTime($time)
|
||||
{
|
||||
$this->_file->setDbSoundCloundUploadTime($time)
|
||||
->save();
|
||||
}
|
||||
|
||||
|
||||
// This method seems to be unsued everywhere so I've commented it out
|
||||
// If it's absence does not have any effect then it will be completely
|
||||
|
@ -1239,51 +1168,6 @@ SQL;
|
|||
return $this->_file->getDbOwnerId();
|
||||
}
|
||||
|
||||
// note: never call this method from controllers because it does a sleep
|
||||
public function uploadToSoundCloud()
|
||||
{
|
||||
$CC_CONFIG = Config::getConfig();
|
||||
|
||||
$file = $this->_file;
|
||||
if (is_null($file)) {
|
||||
return "File does not exist";
|
||||
}
|
||||
if (Application_Model_Preference::GetUploadToSoundcloudOption()) {
|
||||
for ($i=0; $i<$CC_CONFIG['soundcloud-connection-retries']; $i++) {
|
||||
$description = $file->getDbTrackTitle();
|
||||
$tag = array();
|
||||
$genre = $file->getDbGenre();
|
||||
$release = $file->getDbUtime();
|
||||
try {
|
||||
$filePaths = $this->getFilePaths();
|
||||
$filePath = $filePaths[0];
|
||||
$soundcloud = new Application_Model_Soundcloud();
|
||||
$soundcloud_res = $soundcloud->uploadTrack(
|
||||
$filePath, $this->getName(), $description,
|
||||
$tag, $release, $genre);
|
||||
$this->setSoundCloudFileId($soundcloud_res['id']);
|
||||
$this->setSoundCloudLinkToFile($soundcloud_res['permalink_url']);
|
||||
$this->setSoundCloudUploadTime(new DateTime("now"), new DateTimeZone("UTC"));
|
||||
break;
|
||||
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
|
||||
$code = $e->getHttpCode();
|
||||
$msg = $e->getHttpBody();
|
||||
// TODO : Do not parse JSON by hand
|
||||
$temp = explode('"error":',$msg);
|
||||
$msg = trim($temp[1], '"}');
|
||||
$this->setSoundCloudErrorCode($code);
|
||||
$this->setSoundCloudErrorMsg($msg);
|
||||
// setting sc id to -3 which indicates error
|
||||
$this->setSoundCloudFileId(SOUNDCLOUD_ERROR);
|
||||
if (!in_array($code, array(0, 100))) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
sleep($CC_CONFIG['soundcloud-connection-wait']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function setIsPlaylist($p_playlistItems, $p_type, $p_status) {
|
||||
foreach ($p_playlistItems as $item) {
|
||||
|
@ -1329,7 +1213,7 @@ SQL;
|
|||
$futureScheduledFilesSelectCriteria = new Criteria();
|
||||
$futureScheduledFilesSelectCriteria->addSelectColumn(CcSchedulePeer::FILE_ID);
|
||||
$futureScheduledFilesSelectCriteria->setDistinct();
|
||||
$futureScheduledFilesSelectCriteria->add(CcSchedulePeer::ENDS, gmdate("Y-m-d H:i:s"), Criteria::GREATER_THAN);
|
||||
$futureScheduledFilesSelectCriteria->add(CcSchedulePeer::ENDS, gmdate(DEFAULT_TIMESTAMP_FORMAT), Criteria::GREATER_THAN);
|
||||
$stmt = CcSchedulePeer::doSelectStmt($futureScheduledFilesSelectCriteria);
|
||||
$filesScheduledInFuture = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
|
||||
|
||||
|
|
|
@ -74,6 +74,8 @@ class CcFiles extends BaseCcFiles {
|
|||
/** Used to create a CcFiles object from an array containing metadata and a file uploaded by POST.
|
||||
* This is used by our Media REST API!
|
||||
* @param $fileArray An array containing metadata for a CcFiles object.
|
||||
*
|
||||
* @return object the sanitized response
|
||||
* @throws Exception
|
||||
*/
|
||||
public static function createFromUpload($fileArray)
|
||||
|
@ -94,7 +96,7 @@ class CcFiles extends BaseCcFiles {
|
|||
$tempFilePath = $_FILES['file']['tmp_name'];
|
||||
|
||||
try {
|
||||
self::createAndImport($fileArray, $tempFilePath, $originalFilename);
|
||||
return self::createAndImport($fileArray, $tempFilePath, $originalFilename);
|
||||
} catch (Exception $e) {
|
||||
if (file_exists($tempFilePath)) {
|
||||
unlink($tempFilePath);
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for representing a row from the 'celery_tasks' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* You should add additional methods to this class to meet the
|
||||
* application requirements. This class will only be generated as
|
||||
* long as it does not already exist in the output directory.
|
||||
*
|
||||
* @package propel.generator.airtime
|
||||
*/
|
||||
class CeleryTasks extends BaseCeleryTasks
|
||||
{
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'celery_tasks' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* You should add additional methods to this class to meet the
|
||||
* application requirements. This class will only be generated as
|
||||
* long as it does not already exist in the output directory.
|
||||
*
|
||||
* @package propel.generator.airtime
|
||||
*/
|
||||
class CeleryTasksPeer extends BaseCeleryTasksPeer
|
||||
{
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'celery_tasks' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* You should add additional methods to this class to meet the
|
||||
* application requirements. This class will only be generated as
|
||||
* long as it does not already exist in the output directory.
|
||||
*
|
||||
* @package propel.generator.airtime
|
||||
*/
|
||||
class CeleryTasksQuery extends BaseCeleryTasksQuery
|
||||
{
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for representing a row from the 'third_party_track_references' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* You should add additional methods to this class to meet the
|
||||
* application requirements. This class will only be generated as
|
||||
* long as it does not already exist in the output directory.
|
||||
*
|
||||
* @package propel.generator.airtime
|
||||
*/
|
||||
class ThirdPartyTrackReferences extends BaseThirdPartyTrackReferences
|
||||
{
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'third_party_track_references' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* You should add additional methods to this class to meet the
|
||||
* application requirements. This class will only be generated as
|
||||
* long as it does not already exist in the output directory.
|
||||
*
|
||||
* @package propel.generator.airtime
|
||||
*/
|
||||
class ThirdPartyTrackReferencesPeer extends BaseThirdPartyTrackReferencesPeer
|
||||
{
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'third_party_track_references' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* You should add additional methods to this class to meet the
|
||||
* application requirements. This class will only be generated as
|
||||
* long as it does not already exist in the output directory.
|
||||
*
|
||||
* @package propel.generator.airtime
|
||||
*/
|
||||
class ThirdPartyTrackReferencesQuery extends BaseThirdPartyTrackReferencesQuery
|
||||
{
|
||||
}
|
|
@ -127,6 +127,7 @@ class CcFilesTableMap extends TableMap
|
|||
$this->addRelation('CcBlockcontents', 'CcBlockcontents', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null, 'CcBlockcontentss');
|
||||
$this->addRelation('CcSchedule', 'CcSchedule', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null, 'CcSchedules');
|
||||
$this->addRelation('CcPlayoutHistory', 'CcPlayoutHistory', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null, 'CcPlayoutHistorys');
|
||||
$this->addRelation('ThirdPartyTrackReferences', 'ThirdPartyTrackReferences', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null, 'ThirdPartyTrackReferencess');
|
||||
} // buildRelations()
|
||||
|
||||
} // CcFilesTableMap
|
||||
|
|
|
@ -40,7 +40,7 @@ class CcShowInstancesTableMap extends TableMap
|
|||
$this->setPrimaryKeyMethodInfo('cc_show_instances_id_seq');
|
||||
// columns
|
||||
$this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null);
|
||||
$this->addColumn('description', 'DbDescription', 'VARCHAR', false, 512, '');
|
||||
$this->addColumn('description', 'DbDescription', 'VARCHAR', false, 8192, '');
|
||||
$this->addColumn('starts', 'DbStarts', 'TIMESTAMP', true, null, null);
|
||||
$this->addColumn('ends', 'DbEnds', 'TIMESTAMP', true, null, null);
|
||||
$this->addForeignKey('show_id', 'DbShowId', 'INTEGER', 'cc_show', 'id', true, null, null);
|
||||
|
|
|
@ -43,7 +43,7 @@ class CcShowTableMap extends TableMap
|
|||
$this->addColumn('name', 'DbName', 'VARCHAR', true, 255, '');
|
||||
$this->addColumn('url', 'DbUrl', 'VARCHAR', false, 255, '');
|
||||
$this->addColumn('genre', 'DbGenre', 'VARCHAR', false, 255, '');
|
||||
$this->addColumn('description', 'DbDescription', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('description', 'DbDescription', 'VARCHAR', false, 8192, null);
|
||||
$this->addColumn('color', 'DbColor', 'VARCHAR', false, 6, null);
|
||||
$this->addColumn('background_color', 'DbBackgroundColor', 'VARCHAR', false, 6, null);
|
||||
$this->addColumn('live_stream_using_airtime_auth', 'DbLiveStreamUsingAirtimeAuth', 'BOOLEAN', false, null, false);
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class defines the structure of the 'celery_tasks' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* This map class is used by Propel to do runtime db structure discovery.
|
||||
* For example, the createSelectSql() method checks the type of a given column used in an
|
||||
* ORDER BY clause to know whether it needs to apply SQL to make the ORDER BY case-insensitive
|
||||
* (i.e. if it's a text column type).
|
||||
*
|
||||
* @package propel.generator.airtime.map
|
||||
*/
|
||||
class CeleryTasksTableMap extends TableMap
|
||||
{
|
||||
|
||||
/**
|
||||
* The (dot-path) name of this class
|
||||
*/
|
||||
const CLASS_NAME = 'airtime.map.CeleryTasksTableMap';
|
||||
|
||||
/**
|
||||
* Initialize the table attributes, columns and validators
|
||||
* Relations are not initialized by this method since they are lazy loaded
|
||||
*
|
||||
* @return void
|
||||
* @throws PropelException
|
||||
*/
|
||||
public function initialize()
|
||||
{
|
||||
// attributes
|
||||
$this->setName('celery_tasks');
|
||||
$this->setPhpName('CeleryTasks');
|
||||
$this->setClassname('CeleryTasks');
|
||||
$this->setPackage('airtime');
|
||||
$this->setUseIdGenerator(true);
|
||||
$this->setPrimaryKeyMethodInfo('celery_tasks_id_seq');
|
||||
// columns
|
||||
$this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null);
|
||||
$this->addColumn('task_id', 'DbTaskId', 'VARCHAR', true, 256, null);
|
||||
$this->addForeignKey('track_reference', 'DbTrackReference', 'INTEGER', 'third_party_track_references', 'id', true, null, null);
|
||||
$this->addColumn('name', 'DbName', 'VARCHAR', false, 256, null);
|
||||
$this->addColumn('dispatch_time', 'DbDispatchTime', 'TIMESTAMP', false, null, null);
|
||||
$this->addColumn('status', 'DbStatus', 'VARCHAR', true, 256, null);
|
||||
// validators
|
||||
} // initialize()
|
||||
|
||||
/**
|
||||
* Build the RelationMap objects for this table relationships
|
||||
*/
|
||||
public function buildRelations()
|
||||
{
|
||||
$this->addRelation('ThirdPartyTrackReferences', 'ThirdPartyTrackReferences', RelationMap::MANY_TO_ONE, array('track_reference' => 'id', ), 'CASCADE', null);
|
||||
} // buildRelations()
|
||||
|
||||
} // CeleryTasksTableMap
|
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class defines the structure of the 'third_party_track_references' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* This map class is used by Propel to do runtime db structure discovery.
|
||||
* For example, the createSelectSql() method checks the type of a given column used in an
|
||||
* ORDER BY clause to know whether it needs to apply SQL to make the ORDER BY case-insensitive
|
||||
* (i.e. if it's a text column type).
|
||||
*
|
||||
* @package propel.generator.airtime.map
|
||||
*/
|
||||
class ThirdPartyTrackReferencesTableMap extends TableMap
|
||||
{
|
||||
|
||||
/**
|
||||
* The (dot-path) name of this class
|
||||
*/
|
||||
const CLASS_NAME = 'airtime.map.ThirdPartyTrackReferencesTableMap';
|
||||
|
||||
/**
|
||||
* Initialize the table attributes, columns and validators
|
||||
* Relations are not initialized by this method since they are lazy loaded
|
||||
*
|
||||
* @return void
|
||||
* @throws PropelException
|
||||
*/
|
||||
public function initialize()
|
||||
{
|
||||
// attributes
|
||||
$this->setName('third_party_track_references');
|
||||
$this->setPhpName('ThirdPartyTrackReferences');
|
||||
$this->setClassname('ThirdPartyTrackReferences');
|
||||
$this->setPackage('airtime');
|
||||
$this->setUseIdGenerator(true);
|
||||
$this->setPrimaryKeyMethodInfo('third_party_track_references_id_seq');
|
||||
// columns
|
||||
$this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null);
|
||||
$this->addColumn('service', 'DbService', 'VARCHAR', true, 256, null);
|
||||
$this->addColumn('foreign_id', 'DbForeignId', 'VARCHAR', false, 256, null);
|
||||
$this->addForeignKey('file_id', 'DbFileId', 'INTEGER', 'cc_files', 'id', true, null, null);
|
||||
$this->addColumn('upload_time', 'DbUploadTime', 'TIMESTAMP', false, null, null);
|
||||
$this->addColumn('status', 'DbStatus', 'VARCHAR', false, 256, null);
|
||||
// validators
|
||||
} // initialize()
|
||||
|
||||
/**
|
||||
* Build the RelationMap objects for this table relationships
|
||||
*/
|
||||
public function buildRelations()
|
||||
{
|
||||
$this->addRelation('CcFiles', 'CcFiles', RelationMap::MANY_TO_ONE, array('file_id' => 'id', ), 'CASCADE', null);
|
||||
$this->addRelation('CeleryTasks', 'CeleryTasks', RelationMap::ONE_TO_MANY, array('id' => 'track_reference', ), 'CASCADE', null, 'CeleryTaskss');
|
||||
} // buildRelations()
|
||||
|
||||
} // ThirdPartyTrackReferencesTableMap
|
|
@ -521,6 +521,12 @@ abstract class BaseCcFiles extends BaseObject implements Persistent
|
|||
protected $collCcPlayoutHistorys;
|
||||
protected $collCcPlayoutHistorysPartial;
|
||||
|
||||
/**
|
||||
* @var PropelObjectCollection|ThirdPartyTrackReferences[] Collection to store aggregation of ThirdPartyTrackReferences objects.
|
||||
*/
|
||||
protected $collThirdPartyTrackReferencess;
|
||||
protected $collThirdPartyTrackReferencessPartial;
|
||||
|
||||
/**
|
||||
* Flag to prevent endless save loop, if this object is referenced
|
||||
* by another object which falls in this transaction.
|
||||
|
@ -577,6 +583,12 @@ abstract class BaseCcFiles extends BaseObject implements Persistent
|
|||
*/
|
||||
protected $ccPlayoutHistorysScheduledForDeletion = null;
|
||||
|
||||
/**
|
||||
* An array of objects scheduled for deletion.
|
||||
* @var PropelObjectCollection
|
||||
*/
|
||||
protected $thirdPartyTrackReferencessScheduledForDeletion = null;
|
||||
|
||||
/**
|
||||
* Applies default values to this object.
|
||||
* This method should be called from the object's constructor (or
|
||||
|
@ -3298,6 +3310,8 @@ abstract class BaseCcFiles extends BaseObject implements Persistent
|
|||
|
||||
$this->collCcPlayoutHistorys = null;
|
||||
|
||||
$this->collThirdPartyTrackReferencess = null;
|
||||
|
||||
} // if (deep)
|
||||
}
|
||||
|
||||
|
@ -3550,6 +3564,23 @@ abstract class BaseCcFiles extends BaseObject implements Persistent
|
|||
}
|
||||
}
|
||||
|
||||
if ($this->thirdPartyTrackReferencessScheduledForDeletion !== null) {
|
||||
if (!$this->thirdPartyTrackReferencessScheduledForDeletion->isEmpty()) {
|
||||
ThirdPartyTrackReferencesQuery::create()
|
||||
->filterByPrimaryKeys($this->thirdPartyTrackReferencessScheduledForDeletion->getPrimaryKeys(false))
|
||||
->delete($con);
|
||||
$this->thirdPartyTrackReferencessScheduledForDeletion = null;
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->collThirdPartyTrackReferencess !== null) {
|
||||
foreach ($this->collThirdPartyTrackReferencess as $referrerFK) {
|
||||
if (!$referrerFK->isDeleted() && ($referrerFK->isNew() || $referrerFK->isModified())) {
|
||||
$affectedRows += $referrerFK->save($con);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->alreadyInSave = false;
|
||||
|
||||
}
|
||||
|
@ -4187,6 +4218,14 @@ abstract class BaseCcFiles extends BaseObject implements Persistent
|
|||
}
|
||||
}
|
||||
|
||||
if ($this->collThirdPartyTrackReferencess !== null) {
|
||||
foreach ($this->collThirdPartyTrackReferencess as $referrerFK) {
|
||||
if (!$referrerFK->validate($columns)) {
|
||||
$failureMap = array_merge($failureMap, $referrerFK->getValidationFailures());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$this->alreadyInValidation = false;
|
||||
}
|
||||
|
@ -4569,6 +4608,9 @@ abstract class BaseCcFiles extends BaseObject implements Persistent
|
|||
if (null !== $this->collCcPlayoutHistorys) {
|
||||
$result['CcPlayoutHistorys'] = $this->collCcPlayoutHistorys->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects);
|
||||
}
|
||||
if (null !== $this->collThirdPartyTrackReferencess) {
|
||||
$result['ThirdPartyTrackReferencess'] = $this->collThirdPartyTrackReferencess->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects);
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
|
@ -5170,6 +5212,12 @@ abstract class BaseCcFiles extends BaseObject implements Persistent
|
|||
}
|
||||
}
|
||||
|
||||
foreach ($this->getThirdPartyTrackReferencess() as $relObj) {
|
||||
if ($relObj !== $this) { // ensure that we don't try to copy a reference to ourselves
|
||||
$copyObj->addThirdPartyTrackReferences($relObj->copy($deepCopy));
|
||||
}
|
||||
}
|
||||
|
||||
//unflag object copy
|
||||
$this->startCopy = false;
|
||||
} // if ($deepCopy)
|
||||
|
@ -5405,6 +5453,9 @@ abstract class BaseCcFiles extends BaseObject implements Persistent
|
|||
if ('CcPlayoutHistory' == $relationName) {
|
||||
$this->initCcPlayoutHistorys();
|
||||
}
|
||||
if ('ThirdPartyTrackReferences' == $relationName) {
|
||||
$this->initThirdPartyTrackReferencess();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -6957,6 +7008,231 @@ abstract class BaseCcFiles extends BaseObject implements Persistent
|
|||
return $this->getCcPlayoutHistorys($query, $con);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears out the collThirdPartyTrackReferencess collection
|
||||
*
|
||||
* This does not modify the database; however, it will remove any associated objects, causing
|
||||
* them to be refetched by subsequent calls to accessor method.
|
||||
*
|
||||
* @return CcFiles The current object (for fluent API support)
|
||||
* @see addThirdPartyTrackReferencess()
|
||||
*/
|
||||
public function clearThirdPartyTrackReferencess()
|
||||
{
|
||||
$this->collThirdPartyTrackReferencess = null; // important to set this to null since that means it is uninitialized
|
||||
$this->collThirdPartyTrackReferencessPartial = null;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* reset is the collThirdPartyTrackReferencess collection loaded partially
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function resetPartialThirdPartyTrackReferencess($v = true)
|
||||
{
|
||||
$this->collThirdPartyTrackReferencessPartial = $v;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the collThirdPartyTrackReferencess collection.
|
||||
*
|
||||
* By default this just sets the collThirdPartyTrackReferencess collection to an empty array (like clearcollThirdPartyTrackReferencess());
|
||||
* however, you may wish to override this method in your stub class to provide setting appropriate
|
||||
* to your application -- for example, setting the initial array to the values stored in database.
|
||||
*
|
||||
* @param boolean $overrideExisting If set to true, the method call initializes
|
||||
* the collection even if it is not empty
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function initThirdPartyTrackReferencess($overrideExisting = true)
|
||||
{
|
||||
if (null !== $this->collThirdPartyTrackReferencess && !$overrideExisting) {
|
||||
return;
|
||||
}
|
||||
$this->collThirdPartyTrackReferencess = new PropelObjectCollection();
|
||||
$this->collThirdPartyTrackReferencess->setModel('ThirdPartyTrackReferences');
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an array of ThirdPartyTrackReferences objects which contain a foreign key that references this object.
|
||||
*
|
||||
* If the $criteria is not null, it is used to always fetch the results from the database.
|
||||
* Otherwise the results are fetched from the database the first time, then cached.
|
||||
* Next time the same method is called without $criteria, the cached collection is returned.
|
||||
* If this CcFiles is new, it will return
|
||||
* an empty collection or the current collection; the criteria is ignored on a new object.
|
||||
*
|
||||
* @param Criteria $criteria optional Criteria object to narrow the query
|
||||
* @param PropelPDO $con optional connection object
|
||||
* @return PropelObjectCollection|ThirdPartyTrackReferences[] List of ThirdPartyTrackReferences objects
|
||||
* @throws PropelException
|
||||
*/
|
||||
public function getThirdPartyTrackReferencess($criteria = null, PropelPDO $con = null)
|
||||
{
|
||||
$partial = $this->collThirdPartyTrackReferencessPartial && !$this->isNew();
|
||||
if (null === $this->collThirdPartyTrackReferencess || null !== $criteria || $partial) {
|
||||
if ($this->isNew() && null === $this->collThirdPartyTrackReferencess) {
|
||||
// return empty collection
|
||||
$this->initThirdPartyTrackReferencess();
|
||||
} else {
|
||||
$collThirdPartyTrackReferencess = ThirdPartyTrackReferencesQuery::create(null, $criteria)
|
||||
->filterByCcFiles($this)
|
||||
->find($con);
|
||||
if (null !== $criteria) {
|
||||
if (false !== $this->collThirdPartyTrackReferencessPartial && count($collThirdPartyTrackReferencess)) {
|
||||
$this->initThirdPartyTrackReferencess(false);
|
||||
|
||||
foreach ($collThirdPartyTrackReferencess as $obj) {
|
||||
if (false == $this->collThirdPartyTrackReferencess->contains($obj)) {
|
||||
$this->collThirdPartyTrackReferencess->append($obj);
|
||||
}
|
||||
}
|
||||
|
||||
$this->collThirdPartyTrackReferencessPartial = true;
|
||||
}
|
||||
|
||||
$collThirdPartyTrackReferencess->getInternalIterator()->rewind();
|
||||
|
||||
return $collThirdPartyTrackReferencess;
|
||||
}
|
||||
|
||||
if ($partial && $this->collThirdPartyTrackReferencess) {
|
||||
foreach ($this->collThirdPartyTrackReferencess as $obj) {
|
||||
if ($obj->isNew()) {
|
||||
$collThirdPartyTrackReferencess[] = $obj;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->collThirdPartyTrackReferencess = $collThirdPartyTrackReferencess;
|
||||
$this->collThirdPartyTrackReferencessPartial = false;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->collThirdPartyTrackReferencess;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a collection of ThirdPartyTrackReferences objects related by a one-to-many relationship
|
||||
* to the current object.
|
||||
* It will also schedule objects for deletion based on a diff between old objects (aka persisted)
|
||||
* and new objects from the given Propel collection.
|
||||
*
|
||||
* @param PropelCollection $thirdPartyTrackReferencess A Propel collection.
|
||||
* @param PropelPDO $con Optional connection object
|
||||
* @return CcFiles The current object (for fluent API support)
|
||||
*/
|
||||
public function setThirdPartyTrackReferencess(PropelCollection $thirdPartyTrackReferencess, PropelPDO $con = null)
|
||||
{
|
||||
$thirdPartyTrackReferencessToDelete = $this->getThirdPartyTrackReferencess(new Criteria(), $con)->diff($thirdPartyTrackReferencess);
|
||||
|
||||
|
||||
$this->thirdPartyTrackReferencessScheduledForDeletion = $thirdPartyTrackReferencessToDelete;
|
||||
|
||||
foreach ($thirdPartyTrackReferencessToDelete as $thirdPartyTrackReferencesRemoved) {
|
||||
$thirdPartyTrackReferencesRemoved->setCcFiles(null);
|
||||
}
|
||||
|
||||
$this->collThirdPartyTrackReferencess = null;
|
||||
foreach ($thirdPartyTrackReferencess as $thirdPartyTrackReferences) {
|
||||
$this->addThirdPartyTrackReferences($thirdPartyTrackReferences);
|
||||
}
|
||||
|
||||
$this->collThirdPartyTrackReferencess = $thirdPartyTrackReferencess;
|
||||
$this->collThirdPartyTrackReferencessPartial = false;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of related ThirdPartyTrackReferences objects.
|
||||
*
|
||||
* @param Criteria $criteria
|
||||
* @param boolean $distinct
|
||||
* @param PropelPDO $con
|
||||
* @return int Count of related ThirdPartyTrackReferences objects.
|
||||
* @throws PropelException
|
||||
*/
|
||||
public function countThirdPartyTrackReferencess(Criteria $criteria = null, $distinct = false, PropelPDO $con = null)
|
||||
{
|
||||
$partial = $this->collThirdPartyTrackReferencessPartial && !$this->isNew();
|
||||
if (null === $this->collThirdPartyTrackReferencess || null !== $criteria || $partial) {
|
||||
if ($this->isNew() && null === $this->collThirdPartyTrackReferencess) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ($partial && !$criteria) {
|
||||
return count($this->getThirdPartyTrackReferencess());
|
||||
}
|
||||
$query = ThirdPartyTrackReferencesQuery::create(null, $criteria);
|
||||
if ($distinct) {
|
||||
$query->distinct();
|
||||
}
|
||||
|
||||
return $query
|
||||
->filterByCcFiles($this)
|
||||
->count($con);
|
||||
}
|
||||
|
||||
return count($this->collThirdPartyTrackReferencess);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method called to associate a ThirdPartyTrackReferences object to this object
|
||||
* through the ThirdPartyTrackReferences foreign key attribute.
|
||||
*
|
||||
* @param ThirdPartyTrackReferences $l ThirdPartyTrackReferences
|
||||
* @return CcFiles The current object (for fluent API support)
|
||||
*/
|
||||
public function addThirdPartyTrackReferences(ThirdPartyTrackReferences $l)
|
||||
{
|
||||
if ($this->collThirdPartyTrackReferencess === null) {
|
||||
$this->initThirdPartyTrackReferencess();
|
||||
$this->collThirdPartyTrackReferencessPartial = true;
|
||||
}
|
||||
|
||||
if (!in_array($l, $this->collThirdPartyTrackReferencess->getArrayCopy(), true)) { // only add it if the **same** object is not already associated
|
||||
$this->doAddThirdPartyTrackReferences($l);
|
||||
|
||||
if ($this->thirdPartyTrackReferencessScheduledForDeletion and $this->thirdPartyTrackReferencessScheduledForDeletion->contains($l)) {
|
||||
$this->thirdPartyTrackReferencessScheduledForDeletion->remove($this->thirdPartyTrackReferencessScheduledForDeletion->search($l));
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ThirdPartyTrackReferences $thirdPartyTrackReferences The thirdPartyTrackReferences object to add.
|
||||
*/
|
||||
protected function doAddThirdPartyTrackReferences($thirdPartyTrackReferences)
|
||||
{
|
||||
$this->collThirdPartyTrackReferencess[]= $thirdPartyTrackReferences;
|
||||
$thirdPartyTrackReferences->setCcFiles($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ThirdPartyTrackReferences $thirdPartyTrackReferences The thirdPartyTrackReferences object to remove.
|
||||
* @return CcFiles The current object (for fluent API support)
|
||||
*/
|
||||
public function removeThirdPartyTrackReferences($thirdPartyTrackReferences)
|
||||
{
|
||||
if ($this->getThirdPartyTrackReferencess()->contains($thirdPartyTrackReferences)) {
|
||||
$this->collThirdPartyTrackReferencess->remove($this->collThirdPartyTrackReferencess->search($thirdPartyTrackReferences));
|
||||
if (null === $this->thirdPartyTrackReferencessScheduledForDeletion) {
|
||||
$this->thirdPartyTrackReferencessScheduledForDeletion = clone $this->collThirdPartyTrackReferencess;
|
||||
$this->thirdPartyTrackReferencessScheduledForDeletion->clear();
|
||||
}
|
||||
$this->thirdPartyTrackReferencessScheduledForDeletion[]= clone $thirdPartyTrackReferences;
|
||||
$thirdPartyTrackReferences->setCcFiles(null);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears the current object and sets all attributes to their default values
|
||||
*/
|
||||
|
@ -7086,6 +7362,11 @@ abstract class BaseCcFiles extends BaseObject implements Persistent
|
|||
$o->clearAllReferences($deep);
|
||||
}
|
||||
}
|
||||
if ($this->collThirdPartyTrackReferencess) {
|
||||
foreach ($this->collThirdPartyTrackReferencess as $o) {
|
||||
$o->clearAllReferences($deep);
|
||||
}
|
||||
}
|
||||
if ($this->aFkOwner instanceof Persistent) {
|
||||
$this->aFkOwner->clearAllReferences($deep);
|
||||
}
|
||||
|
@ -7123,6 +7404,10 @@ abstract class BaseCcFiles extends BaseObject implements Persistent
|
|||
$this->collCcPlayoutHistorys->clearIterator();
|
||||
}
|
||||
$this->collCcPlayoutHistorys = null;
|
||||
if ($this->collThirdPartyTrackReferencess instanceof PropelCollection) {
|
||||
$this->collThirdPartyTrackReferencess->clearIterator();
|
||||
}
|
||||
$this->collThirdPartyTrackReferencess = null;
|
||||
$this->aFkOwner = null;
|
||||
$this->aCcSubjsRelatedByDbEditedby = null;
|
||||
$this->aCcMusicDirs = null;
|
||||
|
|
|
@ -723,6 +723,9 @@ abstract class BaseCcFilesPeer
|
|||
// Invalidate objects in CcPlayoutHistoryPeer instance pool,
|
||||
// since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule.
|
||||
CcPlayoutHistoryPeer::clearInstancePool();
|
||||
// Invalidate objects in ThirdPartyTrackReferencesPeer instance pool,
|
||||
// since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule.
|
||||
ThirdPartyTrackReferencesPeer::clearInstancePool();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -190,6 +190,10 @@
|
|||
* @method CcFilesQuery rightJoinCcPlayoutHistory($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcPlayoutHistory relation
|
||||
* @method CcFilesQuery innerJoinCcPlayoutHistory($relationAlias = null) Adds a INNER JOIN clause to the query using the CcPlayoutHistory relation
|
||||
*
|
||||
* @method CcFilesQuery leftJoinThirdPartyTrackReferences($relationAlias = null) Adds a LEFT JOIN clause to the query using the ThirdPartyTrackReferences relation
|
||||
* @method CcFilesQuery rightJoinThirdPartyTrackReferences($relationAlias = null) Adds a RIGHT JOIN clause to the query using the ThirdPartyTrackReferences relation
|
||||
* @method CcFilesQuery innerJoinThirdPartyTrackReferences($relationAlias = null) Adds a INNER JOIN clause to the query using the ThirdPartyTrackReferences relation
|
||||
*
|
||||
* @method CcFiles findOne(PropelPDO $con = null) Return the first CcFiles matching the query
|
||||
* @method CcFiles findOneOrCreate(PropelPDO $con = null) Return the first CcFiles matching the query, or a new CcFiles object populated from the query conditions when no match is found
|
||||
*
|
||||
|
@ -3509,6 +3513,80 @@ abstract class BaseCcFilesQuery extends ModelCriteria
|
|||
->useQuery($relationAlias ? $relationAlias : 'CcPlayoutHistory', 'CcPlayoutHistoryQuery');
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query by a related ThirdPartyTrackReferences object
|
||||
*
|
||||
* @param ThirdPartyTrackReferences|PropelObjectCollection $thirdPartyTrackReferences the related object to use as filter
|
||||
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
|
||||
*
|
||||
* @return CcFilesQuery The current query, for fluid interface
|
||||
* @throws PropelException - if the provided filter is invalid.
|
||||
*/
|
||||
public function filterByThirdPartyTrackReferences($thirdPartyTrackReferences, $comparison = null)
|
||||
{
|
||||
if ($thirdPartyTrackReferences instanceof ThirdPartyTrackReferences) {
|
||||
return $this
|
||||
->addUsingAlias(CcFilesPeer::ID, $thirdPartyTrackReferences->getDbFileId(), $comparison);
|
||||
} elseif ($thirdPartyTrackReferences instanceof PropelObjectCollection) {
|
||||
return $this
|
||||
->useThirdPartyTrackReferencesQuery()
|
||||
->filterByPrimaryKeys($thirdPartyTrackReferences->getPrimaryKeys())
|
||||
->endUse();
|
||||
} else {
|
||||
throw new PropelException('filterByThirdPartyTrackReferences() only accepts arguments of type ThirdPartyTrackReferences or PropelCollection');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a JOIN clause to the query using the ThirdPartyTrackReferences relation
|
||||
*
|
||||
* @param string $relationAlias optional alias for the relation
|
||||
* @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join'
|
||||
*
|
||||
* @return CcFilesQuery The current query, for fluid interface
|
||||
*/
|
||||
public function joinThirdPartyTrackReferences($relationAlias = null, $joinType = Criteria::INNER_JOIN)
|
||||
{
|
||||
$tableMap = $this->getTableMap();
|
||||
$relationMap = $tableMap->getRelation('ThirdPartyTrackReferences');
|
||||
|
||||
// create a ModelJoin object for this join
|
||||
$join = new ModelJoin();
|
||||
$join->setJoinType($joinType);
|
||||
$join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias);
|
||||
if ($previousJoin = $this->getPreviousJoin()) {
|
||||
$join->setPreviousJoin($previousJoin);
|
||||
}
|
||||
|
||||
// add the ModelJoin to the current object
|
||||
if ($relationAlias) {
|
||||
$this->addAlias($relationAlias, $relationMap->getRightTable()->getName());
|
||||
$this->addJoinObject($join, $relationAlias);
|
||||
} else {
|
||||
$this->addJoinObject($join, 'ThirdPartyTrackReferences');
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use the ThirdPartyTrackReferences relation ThirdPartyTrackReferences object
|
||||
*
|
||||
* @see useQuery()
|
||||
*
|
||||
* @param string $relationAlias optional alias for the relation,
|
||||
* to be used as main alias in the secondary query
|
||||
* @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join'
|
||||
*
|
||||
* @return ThirdPartyTrackReferencesQuery A secondary query class using the current class as primary query
|
||||
*/
|
||||
public function useThirdPartyTrackReferencesQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN)
|
||||
{
|
||||
return $this
|
||||
->joinThirdPartyTrackReferences($relationAlias, $joinType)
|
||||
->useQuery($relationAlias ? $relationAlias : 'ThirdPartyTrackReferences', 'ThirdPartyTrackReferencesQuery');
|
||||
}
|
||||
|
||||
/**
|
||||
* Exclude object from result
|
||||
*
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,550 @@
|
|||
<?php
|
||||
|
||||
|
||||
/**
|
||||
* Base class that represents a query for the 'celery_tasks' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* @method CeleryTasksQuery orderByDbId($order = Criteria::ASC) Order by the id column
|
||||
* @method CeleryTasksQuery orderByDbTaskId($order = Criteria::ASC) Order by the task_id column
|
||||
* @method CeleryTasksQuery orderByDbTrackReference($order = Criteria::ASC) Order by the track_reference column
|
||||
* @method CeleryTasksQuery orderByDbName($order = Criteria::ASC) Order by the name column
|
||||
* @method CeleryTasksQuery orderByDbDispatchTime($order = Criteria::ASC) Order by the dispatch_time column
|
||||
* @method CeleryTasksQuery orderByDbStatus($order = Criteria::ASC) Order by the status column
|
||||
*
|
||||
* @method CeleryTasksQuery groupByDbId() Group by the id column
|
||||
* @method CeleryTasksQuery groupByDbTaskId() Group by the task_id column
|
||||
* @method CeleryTasksQuery groupByDbTrackReference() Group by the track_reference column
|
||||
* @method CeleryTasksQuery groupByDbName() Group by the name column
|
||||
* @method CeleryTasksQuery groupByDbDispatchTime() Group by the dispatch_time column
|
||||
* @method CeleryTasksQuery groupByDbStatus() Group by the status column
|
||||
*
|
||||
* @method CeleryTasksQuery leftJoin($relation) Adds a LEFT JOIN clause to the query
|
||||
* @method CeleryTasksQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query
|
||||
* @method CeleryTasksQuery innerJoin($relation) Adds a INNER JOIN clause to the query
|
||||
*
|
||||
* @method CeleryTasksQuery leftJoinThirdPartyTrackReferences($relationAlias = null) Adds a LEFT JOIN clause to the query using the ThirdPartyTrackReferences relation
|
||||
* @method CeleryTasksQuery rightJoinThirdPartyTrackReferences($relationAlias = null) Adds a RIGHT JOIN clause to the query using the ThirdPartyTrackReferences relation
|
||||
* @method CeleryTasksQuery innerJoinThirdPartyTrackReferences($relationAlias = null) Adds a INNER JOIN clause to the query using the ThirdPartyTrackReferences relation
|
||||
*
|
||||
* @method CeleryTasks findOne(PropelPDO $con = null) Return the first CeleryTasks matching the query
|
||||
* @method CeleryTasks findOneOrCreate(PropelPDO $con = null) Return the first CeleryTasks matching the query, or a new CeleryTasks object populated from the query conditions when no match is found
|
||||
*
|
||||
* @method CeleryTasks findOneByDbTaskId(string $task_id) Return the first CeleryTasks filtered by the task_id column
|
||||
* @method CeleryTasks findOneByDbTrackReference(int $track_reference) Return the first CeleryTasks filtered by the track_reference column
|
||||
* @method CeleryTasks findOneByDbName(string $name) Return the first CeleryTasks filtered by the name column
|
||||
* @method CeleryTasks findOneByDbDispatchTime(string $dispatch_time) Return the first CeleryTasks filtered by the dispatch_time column
|
||||
* @method CeleryTasks findOneByDbStatus(string $status) Return the first CeleryTasks filtered by the status column
|
||||
*
|
||||
* @method array findByDbId(int $id) Return CeleryTasks objects filtered by the id column
|
||||
* @method array findByDbTaskId(string $task_id) Return CeleryTasks objects filtered by the task_id column
|
||||
* @method array findByDbTrackReference(int $track_reference) Return CeleryTasks objects filtered by the track_reference column
|
||||
* @method array findByDbName(string $name) Return CeleryTasks objects filtered by the name column
|
||||
* @method array findByDbDispatchTime(string $dispatch_time) Return CeleryTasks objects filtered by the dispatch_time column
|
||||
* @method array findByDbStatus(string $status) Return CeleryTasks objects filtered by the status column
|
||||
*
|
||||
* @package propel.generator.airtime.om
|
||||
*/
|
||||
abstract class BaseCeleryTasksQuery extends ModelCriteria
|
||||
{
|
||||
/**
|
||||
* Initializes internal state of BaseCeleryTasksQuery object.
|
||||
*
|
||||
* @param string $dbName The dabase name
|
||||
* @param string $modelName The phpName of a model, e.g. 'Book'
|
||||
* @param string $modelAlias The alias for the model in this query, e.g. 'b'
|
||||
*/
|
||||
public function __construct($dbName = null, $modelName = null, $modelAlias = null)
|
||||
{
|
||||
if (null === $dbName) {
|
||||
$dbName = 'airtime';
|
||||
}
|
||||
if (null === $modelName) {
|
||||
$modelName = 'CeleryTasks';
|
||||
}
|
||||
parent::__construct($dbName, $modelName, $modelAlias);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a new CeleryTasksQuery object.
|
||||
*
|
||||
* @param string $modelAlias The alias of a model in the query
|
||||
* @param CeleryTasksQuery|Criteria $criteria Optional Criteria to build the query from
|
||||
*
|
||||
* @return CeleryTasksQuery
|
||||
*/
|
||||
public static function create($modelAlias = null, $criteria = null)
|
||||
{
|
||||
if ($criteria instanceof CeleryTasksQuery) {
|
||||
return $criteria;
|
||||
}
|
||||
$query = new CeleryTasksQuery(null, null, $modelAlias);
|
||||
|
||||
if ($criteria instanceof Criteria) {
|
||||
$query->mergeWith($criteria);
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find object by primary key.
|
||||
* Propel uses the instance pool to skip the database if the object exists.
|
||||
* Go fast if the query is untouched.
|
||||
*
|
||||
* <code>
|
||||
* $obj = $c->findPk(12, $con);
|
||||
* </code>
|
||||
*
|
||||
* @param mixed $key Primary key to use for the query
|
||||
* @param PropelPDO $con an optional connection object
|
||||
*
|
||||
* @return CeleryTasks|CeleryTasks[]|mixed the result, formatted by the current formatter
|
||||
*/
|
||||
public function findPk($key, $con = null)
|
||||
{
|
||||
if ($key === null) {
|
||||
return null;
|
||||
}
|
||||
if ((null !== ($obj = CeleryTasksPeer::getInstanceFromPool((string) $key))) && !$this->formatter) {
|
||||
// the object is already in the instance pool
|
||||
return $obj;
|
||||
}
|
||||
if ($con === null) {
|
||||
$con = Propel::getConnection(CeleryTasksPeer::DATABASE_NAME, Propel::CONNECTION_READ);
|
||||
}
|
||||
$this->basePreSelect($con);
|
||||
if ($this->formatter || $this->modelAlias || $this->with || $this->select
|
||||
|| $this->selectColumns || $this->asColumns || $this->selectModifiers
|
||||
|| $this->map || $this->having || $this->joins) {
|
||||
return $this->findPkComplex($key, $con);
|
||||
} else {
|
||||
return $this->findPkSimple($key, $con);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias of findPk to use instance pooling
|
||||
*
|
||||
* @param mixed $key Primary key to use for the query
|
||||
* @param PropelPDO $con A connection object
|
||||
*
|
||||
* @return CeleryTasks A model object, or null if the key is not found
|
||||
* @throws PropelException
|
||||
*/
|
||||
public function findOneByDbId($key, $con = null)
|
||||
{
|
||||
return $this->findPk($key, $con);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find object by primary key using raw SQL to go fast.
|
||||
* Bypass doSelect() and the object formatter by using generated code.
|
||||
*
|
||||
* @param mixed $key Primary key to use for the query
|
||||
* @param PropelPDO $con A connection object
|
||||
*
|
||||
* @return CeleryTasks A model object, or null if the key is not found
|
||||
* @throws PropelException
|
||||
*/
|
||||
protected function findPkSimple($key, $con)
|
||||
{
|
||||
$sql = 'SELECT "id", "task_id", "track_reference", "name", "dispatch_time", "status" FROM "celery_tasks" WHERE "id" = :p0';
|
||||
try {
|
||||
$stmt = $con->prepare($sql);
|
||||
$stmt->bindValue(':p0', $key, PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
} catch (Exception $e) {
|
||||
Propel::log($e->getMessage(), Propel::LOG_ERR);
|
||||
throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e);
|
||||
}
|
||||
$obj = null;
|
||||
if ($row = $stmt->fetch(PDO::FETCH_NUM)) {
|
||||
$obj = new CeleryTasks();
|
||||
$obj->hydrate($row);
|
||||
CeleryTasksPeer::addInstanceToPool($obj, (string) $key);
|
||||
}
|
||||
$stmt->closeCursor();
|
||||
|
||||
return $obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find object by primary key.
|
||||
*
|
||||
* @param mixed $key Primary key to use for the query
|
||||
* @param PropelPDO $con A connection object
|
||||
*
|
||||
* @return CeleryTasks|CeleryTasks[]|mixed the result, formatted by the current formatter
|
||||
*/
|
||||
protected function findPkComplex($key, $con)
|
||||
{
|
||||
// As the query uses a PK condition, no limit(1) is necessary.
|
||||
$criteria = $this->isKeepQuery() ? clone $this : $this;
|
||||
$stmt = $criteria
|
||||
->filterByPrimaryKey($key)
|
||||
->doSelect($con);
|
||||
|
||||
return $criteria->getFormatter()->init($criteria)->formatOne($stmt);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find objects by primary key
|
||||
* <code>
|
||||
* $objs = $c->findPks(array(12, 56, 832), $con);
|
||||
* </code>
|
||||
* @param array $keys Primary keys to use for the query
|
||||
* @param PropelPDO $con an optional connection object
|
||||
*
|
||||
* @return PropelObjectCollection|CeleryTasks[]|mixed the list of results, formatted by the current formatter
|
||||
*/
|
||||
public function findPks($keys, $con = null)
|
||||
{
|
||||
if ($con === null) {
|
||||
$con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ);
|
||||
}
|
||||
$this->basePreSelect($con);
|
||||
$criteria = $this->isKeepQuery() ? clone $this : $this;
|
||||
$stmt = $criteria
|
||||
->filterByPrimaryKeys($keys)
|
||||
->doSelect($con);
|
||||
|
||||
return $criteria->getFormatter()->init($criteria)->format($stmt);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query by primary key
|
||||
*
|
||||
* @param mixed $key Primary key to use for the query
|
||||
*
|
||||
* @return CeleryTasksQuery The current query, for fluid interface
|
||||
*/
|
||||
public function filterByPrimaryKey($key)
|
||||
{
|
||||
|
||||
return $this->addUsingAlias(CeleryTasksPeer::ID, $key, Criteria::EQUAL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query by a list of primary keys
|
||||
*
|
||||
* @param array $keys The list of primary key to use for the query
|
||||
*
|
||||
* @return CeleryTasksQuery The current query, for fluid interface
|
||||
*/
|
||||
public function filterByPrimaryKeys($keys)
|
||||
{
|
||||
|
||||
return $this->addUsingAlias(CeleryTasksPeer::ID, $keys, Criteria::IN);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query on the id column
|
||||
*
|
||||
* Example usage:
|
||||
* <code>
|
||||
* $query->filterByDbId(1234); // WHERE id = 1234
|
||||
* $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34)
|
||||
* $query->filterByDbId(array('min' => 12)); // WHERE id >= 12
|
||||
* $query->filterByDbId(array('max' => 12)); // WHERE id <= 12
|
||||
* </code>
|
||||
*
|
||||
* @param mixed $dbId The value to use as filter.
|
||||
* Use scalar values for equality.
|
||||
* Use array values for in_array() equivalent.
|
||||
* Use associative array('min' => $minValue, 'max' => $maxValue) for intervals.
|
||||
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
|
||||
*
|
||||
* @return CeleryTasksQuery The current query, for fluid interface
|
||||
*/
|
||||
public function filterByDbId($dbId = null, $comparison = null)
|
||||
{
|
||||
if (is_array($dbId)) {
|
||||
$useMinMax = false;
|
||||
if (isset($dbId['min'])) {
|
||||
$this->addUsingAlias(CeleryTasksPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL);
|
||||
$useMinMax = true;
|
||||
}
|
||||
if (isset($dbId['max'])) {
|
||||
$this->addUsingAlias(CeleryTasksPeer::ID, $dbId['max'], Criteria::LESS_EQUAL);
|
||||
$useMinMax = true;
|
||||
}
|
||||
if ($useMinMax) {
|
||||
return $this;
|
||||
}
|
||||
if (null === $comparison) {
|
||||
$comparison = Criteria::IN;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->addUsingAlias(CeleryTasksPeer::ID, $dbId, $comparison);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query on the task_id column
|
||||
*
|
||||
* Example usage:
|
||||
* <code>
|
||||
* $query->filterByDbTaskId('fooValue'); // WHERE task_id = 'fooValue'
|
||||
* $query->filterByDbTaskId('%fooValue%'); // WHERE task_id LIKE '%fooValue%'
|
||||
* </code>
|
||||
*
|
||||
* @param string $dbTaskId The value to use as filter.
|
||||
* Accepts wildcards (* and % trigger a LIKE)
|
||||
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
|
||||
*
|
||||
* @return CeleryTasksQuery The current query, for fluid interface
|
||||
*/
|
||||
public function filterByDbTaskId($dbTaskId = null, $comparison = null)
|
||||
{
|
||||
if (null === $comparison) {
|
||||
if (is_array($dbTaskId)) {
|
||||
$comparison = Criteria::IN;
|
||||
} elseif (preg_match('/[\%\*]/', $dbTaskId)) {
|
||||
$dbTaskId = str_replace('*', '%', $dbTaskId);
|
||||
$comparison = Criteria::LIKE;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->addUsingAlias(CeleryTasksPeer::TASK_ID, $dbTaskId, $comparison);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query on the track_reference column
|
||||
*
|
||||
* Example usage:
|
||||
* <code>
|
||||
* $query->filterByDbTrackReference(1234); // WHERE track_reference = 1234
|
||||
* $query->filterByDbTrackReference(array(12, 34)); // WHERE track_reference IN (12, 34)
|
||||
* $query->filterByDbTrackReference(array('min' => 12)); // WHERE track_reference >= 12
|
||||
* $query->filterByDbTrackReference(array('max' => 12)); // WHERE track_reference <= 12
|
||||
* </code>
|
||||
*
|
||||
* @see filterByThirdPartyTrackReferences()
|
||||
*
|
||||
* @param mixed $dbTrackReference The value to use as filter.
|
||||
* Use scalar values for equality.
|
||||
* Use array values for in_array() equivalent.
|
||||
* Use associative array('min' => $minValue, 'max' => $maxValue) for intervals.
|
||||
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
|
||||
*
|
||||
* @return CeleryTasksQuery The current query, for fluid interface
|
||||
*/
|
||||
public function filterByDbTrackReference($dbTrackReference = null, $comparison = null)
|
||||
{
|
||||
if (is_array($dbTrackReference)) {
|
||||
$useMinMax = false;
|
||||
if (isset($dbTrackReference['min'])) {
|
||||
$this->addUsingAlias(CeleryTasksPeer::TRACK_REFERENCE, $dbTrackReference['min'], Criteria::GREATER_EQUAL);
|
||||
$useMinMax = true;
|
||||
}
|
||||
if (isset($dbTrackReference['max'])) {
|
||||
$this->addUsingAlias(CeleryTasksPeer::TRACK_REFERENCE, $dbTrackReference['max'], Criteria::LESS_EQUAL);
|
||||
$useMinMax = true;
|
||||
}
|
||||
if ($useMinMax) {
|
||||
return $this;
|
||||
}
|
||||
if (null === $comparison) {
|
||||
$comparison = Criteria::IN;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->addUsingAlias(CeleryTasksPeer::TRACK_REFERENCE, $dbTrackReference, $comparison);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query on the name column
|
||||
*
|
||||
* Example usage:
|
||||
* <code>
|
||||
* $query->filterByDbName('fooValue'); // WHERE name = 'fooValue'
|
||||
* $query->filterByDbName('%fooValue%'); // WHERE name LIKE '%fooValue%'
|
||||
* </code>
|
||||
*
|
||||
* @param string $dbName The value to use as filter.
|
||||
* Accepts wildcards (* and % trigger a LIKE)
|
||||
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
|
||||
*
|
||||
* @return CeleryTasksQuery The current query, for fluid interface
|
||||
*/
|
||||
public function filterByDbName($dbName = null, $comparison = null)
|
||||
{
|
||||
if (null === $comparison) {
|
||||
if (is_array($dbName)) {
|
||||
$comparison = Criteria::IN;
|
||||
} elseif (preg_match('/[\%\*]/', $dbName)) {
|
||||
$dbName = str_replace('*', '%', $dbName);
|
||||
$comparison = Criteria::LIKE;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->addUsingAlias(CeleryTasksPeer::NAME, $dbName, $comparison);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query on the dispatch_time column
|
||||
*
|
||||
* Example usage:
|
||||
* <code>
|
||||
* $query->filterByDbDispatchTime('2011-03-14'); // WHERE dispatch_time = '2011-03-14'
|
||||
* $query->filterByDbDispatchTime('now'); // WHERE dispatch_time = '2011-03-14'
|
||||
* $query->filterByDbDispatchTime(array('max' => 'yesterday')); // WHERE dispatch_time < '2011-03-13'
|
||||
* </code>
|
||||
*
|
||||
* @param mixed $dbDispatchTime The value to use as filter.
|
||||
* Values can be integers (unix timestamps), DateTime objects, or strings.
|
||||
* Empty strings are treated as NULL.
|
||||
* Use scalar values for equality.
|
||||
* Use array values for in_array() equivalent.
|
||||
* Use associative array('min' => $minValue, 'max' => $maxValue) for intervals.
|
||||
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
|
||||
*
|
||||
* @return CeleryTasksQuery The current query, for fluid interface
|
||||
*/
|
||||
public function filterByDbDispatchTime($dbDispatchTime = null, $comparison = null)
|
||||
{
|
||||
if (is_array($dbDispatchTime)) {
|
||||
$useMinMax = false;
|
||||
if (isset($dbDispatchTime['min'])) {
|
||||
$this->addUsingAlias(CeleryTasksPeer::DISPATCH_TIME, $dbDispatchTime['min'], Criteria::GREATER_EQUAL);
|
||||
$useMinMax = true;
|
||||
}
|
||||
if (isset($dbDispatchTime['max'])) {
|
||||
$this->addUsingAlias(CeleryTasksPeer::DISPATCH_TIME, $dbDispatchTime['max'], Criteria::LESS_EQUAL);
|
||||
$useMinMax = true;
|
||||
}
|
||||
if ($useMinMax) {
|
||||
return $this;
|
||||
}
|
||||
if (null === $comparison) {
|
||||
$comparison = Criteria::IN;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->addUsingAlias(CeleryTasksPeer::DISPATCH_TIME, $dbDispatchTime, $comparison);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query on the status column
|
||||
*
|
||||
* Example usage:
|
||||
* <code>
|
||||
* $query->filterByDbStatus('fooValue'); // WHERE status = 'fooValue'
|
||||
* $query->filterByDbStatus('%fooValue%'); // WHERE status LIKE '%fooValue%'
|
||||
* </code>
|
||||
*
|
||||
* @param string $dbStatus The value to use as filter.
|
||||
* Accepts wildcards (* and % trigger a LIKE)
|
||||
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
|
||||
*
|
||||
* @return CeleryTasksQuery The current query, for fluid interface
|
||||
*/
|
||||
public function filterByDbStatus($dbStatus = null, $comparison = null)
|
||||
{
|
||||
if (null === $comparison) {
|
||||
if (is_array($dbStatus)) {
|
||||
$comparison = Criteria::IN;
|
||||
} elseif (preg_match('/[\%\*]/', $dbStatus)) {
|
||||
$dbStatus = str_replace('*', '%', $dbStatus);
|
||||
$comparison = Criteria::LIKE;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->addUsingAlias(CeleryTasksPeer::STATUS, $dbStatus, $comparison);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query by a related ThirdPartyTrackReferences object
|
||||
*
|
||||
* @param ThirdPartyTrackReferences|PropelObjectCollection $thirdPartyTrackReferences The related object(s) to use as filter
|
||||
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
|
||||
*
|
||||
* @return CeleryTasksQuery The current query, for fluid interface
|
||||
* @throws PropelException - if the provided filter is invalid.
|
||||
*/
|
||||
public function filterByThirdPartyTrackReferences($thirdPartyTrackReferences, $comparison = null)
|
||||
{
|
||||
if ($thirdPartyTrackReferences instanceof ThirdPartyTrackReferences) {
|
||||
return $this
|
||||
->addUsingAlias(CeleryTasksPeer::TRACK_REFERENCE, $thirdPartyTrackReferences->getDbId(), $comparison);
|
||||
} elseif ($thirdPartyTrackReferences instanceof PropelObjectCollection) {
|
||||
if (null === $comparison) {
|
||||
$comparison = Criteria::IN;
|
||||
}
|
||||
|
||||
return $this
|
||||
->addUsingAlias(CeleryTasksPeer::TRACK_REFERENCE, $thirdPartyTrackReferences->toKeyValue('PrimaryKey', 'DbId'), $comparison);
|
||||
} else {
|
||||
throw new PropelException('filterByThirdPartyTrackReferences() only accepts arguments of type ThirdPartyTrackReferences or PropelCollection');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a JOIN clause to the query using the ThirdPartyTrackReferences relation
|
||||
*
|
||||
* @param string $relationAlias optional alias for the relation
|
||||
* @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join'
|
||||
*
|
||||
* @return CeleryTasksQuery The current query, for fluid interface
|
||||
*/
|
||||
public function joinThirdPartyTrackReferences($relationAlias = null, $joinType = Criteria::INNER_JOIN)
|
||||
{
|
||||
$tableMap = $this->getTableMap();
|
||||
$relationMap = $tableMap->getRelation('ThirdPartyTrackReferences');
|
||||
|
||||
// create a ModelJoin object for this join
|
||||
$join = new ModelJoin();
|
||||
$join->setJoinType($joinType);
|
||||
$join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias);
|
||||
if ($previousJoin = $this->getPreviousJoin()) {
|
||||
$join->setPreviousJoin($previousJoin);
|
||||
}
|
||||
|
||||
// add the ModelJoin to the current object
|
||||
if ($relationAlias) {
|
||||
$this->addAlias($relationAlias, $relationMap->getRightTable()->getName());
|
||||
$this->addJoinObject($join, $relationAlias);
|
||||
} else {
|
||||
$this->addJoinObject($join, 'ThirdPartyTrackReferences');
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use the ThirdPartyTrackReferences relation ThirdPartyTrackReferences object
|
||||
*
|
||||
* @see useQuery()
|
||||
*
|
||||
* @param string $relationAlias optional alias for the relation,
|
||||
* to be used as main alias in the secondary query
|
||||
* @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join'
|
||||
*
|
||||
* @return ThirdPartyTrackReferencesQuery A secondary query class using the current class as primary query
|
||||
*/
|
||||
public function useThirdPartyTrackReferencesQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN)
|
||||
{
|
||||
return $this
|
||||
->joinThirdPartyTrackReferences($relationAlias, $joinType)
|
||||
->useQuery($relationAlias ? $relationAlias : 'ThirdPartyTrackReferences', 'ThirdPartyTrackReferencesQuery');
|
||||
}
|
||||
|
||||
/**
|
||||
* Exclude object from result
|
||||
*
|
||||
* @param CeleryTasks $celeryTasks Object to remove from the list of results
|
||||
*
|
||||
* @return CeleryTasksQuery The current query, for fluid interface
|
||||
*/
|
||||
public function prune($celeryTasks = null)
|
||||
{
|
||||
if ($celeryTasks) {
|
||||
$this->addUsingAlias(CeleryTasksPeer::ID, $celeryTasks->getDbId(), Criteria::NOT_EQUAL);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,628 @@
|
|||
<?php
|
||||
|
||||
|
||||
/**
|
||||
* Base class that represents a query for the 'third_party_track_references' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* @method ThirdPartyTrackReferencesQuery orderByDbId($order = Criteria::ASC) Order by the id column
|
||||
* @method ThirdPartyTrackReferencesQuery orderByDbService($order = Criteria::ASC) Order by the service column
|
||||
* @method ThirdPartyTrackReferencesQuery orderByDbForeignId($order = Criteria::ASC) Order by the foreign_id column
|
||||
* @method ThirdPartyTrackReferencesQuery orderByDbFileId($order = Criteria::ASC) Order by the file_id column
|
||||
* @method ThirdPartyTrackReferencesQuery orderByDbUploadTime($order = Criteria::ASC) Order by the upload_time column
|
||||
* @method ThirdPartyTrackReferencesQuery orderByDbStatus($order = Criteria::ASC) Order by the status column
|
||||
*
|
||||
* @method ThirdPartyTrackReferencesQuery groupByDbId() Group by the id column
|
||||
* @method ThirdPartyTrackReferencesQuery groupByDbService() Group by the service column
|
||||
* @method ThirdPartyTrackReferencesQuery groupByDbForeignId() Group by the foreign_id column
|
||||
* @method ThirdPartyTrackReferencesQuery groupByDbFileId() Group by the file_id column
|
||||
* @method ThirdPartyTrackReferencesQuery groupByDbUploadTime() Group by the upload_time column
|
||||
* @method ThirdPartyTrackReferencesQuery groupByDbStatus() Group by the status column
|
||||
*
|
||||
* @method ThirdPartyTrackReferencesQuery leftJoin($relation) Adds a LEFT JOIN clause to the query
|
||||
* @method ThirdPartyTrackReferencesQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query
|
||||
* @method ThirdPartyTrackReferencesQuery innerJoin($relation) Adds a INNER JOIN clause to the query
|
||||
*
|
||||
* @method ThirdPartyTrackReferencesQuery leftJoinCcFiles($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcFiles relation
|
||||
* @method ThirdPartyTrackReferencesQuery rightJoinCcFiles($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcFiles relation
|
||||
* @method ThirdPartyTrackReferencesQuery innerJoinCcFiles($relationAlias = null) Adds a INNER JOIN clause to the query using the CcFiles relation
|
||||
*
|
||||
* @method ThirdPartyTrackReferencesQuery leftJoinCeleryTasks($relationAlias = null) Adds a LEFT JOIN clause to the query using the CeleryTasks relation
|
||||
* @method ThirdPartyTrackReferencesQuery rightJoinCeleryTasks($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CeleryTasks relation
|
||||
* @method ThirdPartyTrackReferencesQuery innerJoinCeleryTasks($relationAlias = null) Adds a INNER JOIN clause to the query using the CeleryTasks relation
|
||||
*
|
||||
* @method ThirdPartyTrackReferences findOne(PropelPDO $con = null) Return the first ThirdPartyTrackReferences matching the query
|
||||
* @method ThirdPartyTrackReferences findOneOrCreate(PropelPDO $con = null) Return the first ThirdPartyTrackReferences matching the query, or a new ThirdPartyTrackReferences object populated from the query conditions when no match is found
|
||||
*
|
||||
* @method ThirdPartyTrackReferences findOneByDbService(string $service) Return the first ThirdPartyTrackReferences filtered by the service column
|
||||
* @method ThirdPartyTrackReferences findOneByDbForeignId(string $foreign_id) Return the first ThirdPartyTrackReferences filtered by the foreign_id column
|
||||
* @method ThirdPartyTrackReferences findOneByDbFileId(int $file_id) Return the first ThirdPartyTrackReferences filtered by the file_id column
|
||||
* @method ThirdPartyTrackReferences findOneByDbUploadTime(string $upload_time) Return the first ThirdPartyTrackReferences filtered by the upload_time column
|
||||
* @method ThirdPartyTrackReferences findOneByDbStatus(string $status) Return the first ThirdPartyTrackReferences filtered by the status column
|
||||
*
|
||||
* @method array findByDbId(int $id) Return ThirdPartyTrackReferences objects filtered by the id column
|
||||
* @method array findByDbService(string $service) Return ThirdPartyTrackReferences objects filtered by the service column
|
||||
* @method array findByDbForeignId(string $foreign_id) Return ThirdPartyTrackReferences objects filtered by the foreign_id column
|
||||
* @method array findByDbFileId(int $file_id) Return ThirdPartyTrackReferences objects filtered by the file_id column
|
||||
* @method array findByDbUploadTime(string $upload_time) Return ThirdPartyTrackReferences objects filtered by the upload_time column
|
||||
* @method array findByDbStatus(string $status) Return ThirdPartyTrackReferences objects filtered by the status column
|
||||
*
|
||||
* @package propel.generator.airtime.om
|
||||
*/
|
||||
abstract class BaseThirdPartyTrackReferencesQuery extends ModelCriteria
|
||||
{
|
||||
/**
|
||||
* Initializes internal state of BaseThirdPartyTrackReferencesQuery object.
|
||||
*
|
||||
* @param string $dbName The dabase name
|
||||
* @param string $modelName The phpName of a model, e.g. 'Book'
|
||||
* @param string $modelAlias The alias for the model in this query, e.g. 'b'
|
||||
*/
|
||||
public function __construct($dbName = null, $modelName = null, $modelAlias = null)
|
||||
{
|
||||
if (null === $dbName) {
|
||||
$dbName = 'airtime';
|
||||
}
|
||||
if (null === $modelName) {
|
||||
$modelName = 'ThirdPartyTrackReferences';
|
||||
}
|
||||
parent::__construct($dbName, $modelName, $modelAlias);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a new ThirdPartyTrackReferencesQuery object.
|
||||
*
|
||||
* @param string $modelAlias The alias of a model in the query
|
||||
* @param ThirdPartyTrackReferencesQuery|Criteria $criteria Optional Criteria to build the query from
|
||||
*
|
||||
* @return ThirdPartyTrackReferencesQuery
|
||||
*/
|
||||
public static function create($modelAlias = null, $criteria = null)
|
||||
{
|
||||
if ($criteria instanceof ThirdPartyTrackReferencesQuery) {
|
||||
return $criteria;
|
||||
}
|
||||
$query = new ThirdPartyTrackReferencesQuery(null, null, $modelAlias);
|
||||
|
||||
if ($criteria instanceof Criteria) {
|
||||
$query->mergeWith($criteria);
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find object by primary key.
|
||||
* Propel uses the instance pool to skip the database if the object exists.
|
||||
* Go fast if the query is untouched.
|
||||
*
|
||||
* <code>
|
||||
* $obj = $c->findPk(12, $con);
|
||||
* </code>
|
||||
*
|
||||
* @param mixed $key Primary key to use for the query
|
||||
* @param PropelPDO $con an optional connection object
|
||||
*
|
||||
* @return ThirdPartyTrackReferences|ThirdPartyTrackReferences[]|mixed the result, formatted by the current formatter
|
||||
*/
|
||||
public function findPk($key, $con = null)
|
||||
{
|
||||
if ($key === null) {
|
||||
return null;
|
||||
}
|
||||
if ((null !== ($obj = ThirdPartyTrackReferencesPeer::getInstanceFromPool((string) $key))) && !$this->formatter) {
|
||||
// the object is already in the instance pool
|
||||
return $obj;
|
||||
}
|
||||
if ($con === null) {
|
||||
$con = Propel::getConnection(ThirdPartyTrackReferencesPeer::DATABASE_NAME, Propel::CONNECTION_READ);
|
||||
}
|
||||
$this->basePreSelect($con);
|
||||
if ($this->formatter || $this->modelAlias || $this->with || $this->select
|
||||
|| $this->selectColumns || $this->asColumns || $this->selectModifiers
|
||||
|| $this->map || $this->having || $this->joins) {
|
||||
return $this->findPkComplex($key, $con);
|
||||
} else {
|
||||
return $this->findPkSimple($key, $con);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Alias of findPk to use instance pooling
|
||||
*
|
||||
* @param mixed $key Primary key to use for the query
|
||||
* @param PropelPDO $con A connection object
|
||||
*
|
||||
* @return ThirdPartyTrackReferences A model object, or null if the key is not found
|
||||
* @throws PropelException
|
||||
*/
|
||||
public function findOneByDbId($key, $con = null)
|
||||
{
|
||||
return $this->findPk($key, $con);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find object by primary key using raw SQL to go fast.
|
||||
* Bypass doSelect() and the object formatter by using generated code.
|
||||
*
|
||||
* @param mixed $key Primary key to use for the query
|
||||
* @param PropelPDO $con A connection object
|
||||
*
|
||||
* @return ThirdPartyTrackReferences A model object, or null if the key is not found
|
||||
* @throws PropelException
|
||||
*/
|
||||
protected function findPkSimple($key, $con)
|
||||
{
|
||||
$sql = 'SELECT "id", "service", "foreign_id", "file_id", "upload_time", "status" FROM "third_party_track_references" WHERE "id" = :p0';
|
||||
try {
|
||||
$stmt = $con->prepare($sql);
|
||||
$stmt->bindValue(':p0', $key, PDO::PARAM_INT);
|
||||
$stmt->execute();
|
||||
} catch (Exception $e) {
|
||||
Propel::log($e->getMessage(), Propel::LOG_ERR);
|
||||
throw new PropelException(sprintf('Unable to execute SELECT statement [%s]', $sql), $e);
|
||||
}
|
||||
$obj = null;
|
||||
if ($row = $stmt->fetch(PDO::FETCH_NUM)) {
|
||||
$obj = new ThirdPartyTrackReferences();
|
||||
$obj->hydrate($row);
|
||||
ThirdPartyTrackReferencesPeer::addInstanceToPool($obj, (string) $key);
|
||||
}
|
||||
$stmt->closeCursor();
|
||||
|
||||
return $obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find object by primary key.
|
||||
*
|
||||
* @param mixed $key Primary key to use for the query
|
||||
* @param PropelPDO $con A connection object
|
||||
*
|
||||
* @return ThirdPartyTrackReferences|ThirdPartyTrackReferences[]|mixed the result, formatted by the current formatter
|
||||
*/
|
||||
protected function findPkComplex($key, $con)
|
||||
{
|
||||
// As the query uses a PK condition, no limit(1) is necessary.
|
||||
$criteria = $this->isKeepQuery() ? clone $this : $this;
|
||||
$stmt = $criteria
|
||||
->filterByPrimaryKey($key)
|
||||
->doSelect($con);
|
||||
|
||||
return $criteria->getFormatter()->init($criteria)->formatOne($stmt);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find objects by primary key
|
||||
* <code>
|
||||
* $objs = $c->findPks(array(12, 56, 832), $con);
|
||||
* </code>
|
||||
* @param array $keys Primary keys to use for the query
|
||||
* @param PropelPDO $con an optional connection object
|
||||
*
|
||||
* @return PropelObjectCollection|ThirdPartyTrackReferences[]|mixed the list of results, formatted by the current formatter
|
||||
*/
|
||||
public function findPks($keys, $con = null)
|
||||
{
|
||||
if ($con === null) {
|
||||
$con = Propel::getConnection($this->getDbName(), Propel::CONNECTION_READ);
|
||||
}
|
||||
$this->basePreSelect($con);
|
||||
$criteria = $this->isKeepQuery() ? clone $this : $this;
|
||||
$stmt = $criteria
|
||||
->filterByPrimaryKeys($keys)
|
||||
->doSelect($con);
|
||||
|
||||
return $criteria->getFormatter()->init($criteria)->format($stmt);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query by primary key
|
||||
*
|
||||
* @param mixed $key Primary key to use for the query
|
||||
*
|
||||
* @return ThirdPartyTrackReferencesQuery The current query, for fluid interface
|
||||
*/
|
||||
public function filterByPrimaryKey($key)
|
||||
{
|
||||
|
||||
return $this->addUsingAlias(ThirdPartyTrackReferencesPeer::ID, $key, Criteria::EQUAL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query by a list of primary keys
|
||||
*
|
||||
* @param array $keys The list of primary key to use for the query
|
||||
*
|
||||
* @return ThirdPartyTrackReferencesQuery The current query, for fluid interface
|
||||
*/
|
||||
public function filterByPrimaryKeys($keys)
|
||||
{
|
||||
|
||||
return $this->addUsingAlias(ThirdPartyTrackReferencesPeer::ID, $keys, Criteria::IN);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query on the id column
|
||||
*
|
||||
* Example usage:
|
||||
* <code>
|
||||
* $query->filterByDbId(1234); // WHERE id = 1234
|
||||
* $query->filterByDbId(array(12, 34)); // WHERE id IN (12, 34)
|
||||
* $query->filterByDbId(array('min' => 12)); // WHERE id >= 12
|
||||
* $query->filterByDbId(array('max' => 12)); // WHERE id <= 12
|
||||
* </code>
|
||||
*
|
||||
* @param mixed $dbId The value to use as filter.
|
||||
* Use scalar values for equality.
|
||||
* Use array values for in_array() equivalent.
|
||||
* Use associative array('min' => $minValue, 'max' => $maxValue) for intervals.
|
||||
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
|
||||
*
|
||||
* @return ThirdPartyTrackReferencesQuery The current query, for fluid interface
|
||||
*/
|
||||
public function filterByDbId($dbId = null, $comparison = null)
|
||||
{
|
||||
if (is_array($dbId)) {
|
||||
$useMinMax = false;
|
||||
if (isset($dbId['min'])) {
|
||||
$this->addUsingAlias(ThirdPartyTrackReferencesPeer::ID, $dbId['min'], Criteria::GREATER_EQUAL);
|
||||
$useMinMax = true;
|
||||
}
|
||||
if (isset($dbId['max'])) {
|
||||
$this->addUsingAlias(ThirdPartyTrackReferencesPeer::ID, $dbId['max'], Criteria::LESS_EQUAL);
|
||||
$useMinMax = true;
|
||||
}
|
||||
if ($useMinMax) {
|
||||
return $this;
|
||||
}
|
||||
if (null === $comparison) {
|
||||
$comparison = Criteria::IN;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->addUsingAlias(ThirdPartyTrackReferencesPeer::ID, $dbId, $comparison);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query on the service column
|
||||
*
|
||||
* Example usage:
|
||||
* <code>
|
||||
* $query->filterByDbService('fooValue'); // WHERE service = 'fooValue'
|
||||
* $query->filterByDbService('%fooValue%'); // WHERE service LIKE '%fooValue%'
|
||||
* </code>
|
||||
*
|
||||
* @param string $dbService The value to use as filter.
|
||||
* Accepts wildcards (* and % trigger a LIKE)
|
||||
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
|
||||
*
|
||||
* @return ThirdPartyTrackReferencesQuery The current query, for fluid interface
|
||||
*/
|
||||
public function filterByDbService($dbService = null, $comparison = null)
|
||||
{
|
||||
if (null === $comparison) {
|
||||
if (is_array($dbService)) {
|
||||
$comparison = Criteria::IN;
|
||||
} elseif (preg_match('/[\%\*]/', $dbService)) {
|
||||
$dbService = str_replace('*', '%', $dbService);
|
||||
$comparison = Criteria::LIKE;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->addUsingAlias(ThirdPartyTrackReferencesPeer::SERVICE, $dbService, $comparison);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query on the foreign_id column
|
||||
*
|
||||
* Example usage:
|
||||
* <code>
|
||||
* $query->filterByDbForeignId('fooValue'); // WHERE foreign_id = 'fooValue'
|
||||
* $query->filterByDbForeignId('%fooValue%'); // WHERE foreign_id LIKE '%fooValue%'
|
||||
* </code>
|
||||
*
|
||||
* @param string $dbForeignId The value to use as filter.
|
||||
* Accepts wildcards (* and % trigger a LIKE)
|
||||
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
|
||||
*
|
||||
* @return ThirdPartyTrackReferencesQuery The current query, for fluid interface
|
||||
*/
|
||||
public function filterByDbForeignId($dbForeignId = null, $comparison = null)
|
||||
{
|
||||
if (null === $comparison) {
|
||||
if (is_array($dbForeignId)) {
|
||||
$comparison = Criteria::IN;
|
||||
} elseif (preg_match('/[\%\*]/', $dbForeignId)) {
|
||||
$dbForeignId = str_replace('*', '%', $dbForeignId);
|
||||
$comparison = Criteria::LIKE;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->addUsingAlias(ThirdPartyTrackReferencesPeer::FOREIGN_ID, $dbForeignId, $comparison);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query on the file_id column
|
||||
*
|
||||
* Example usage:
|
||||
* <code>
|
||||
* $query->filterByDbFileId(1234); // WHERE file_id = 1234
|
||||
* $query->filterByDbFileId(array(12, 34)); // WHERE file_id IN (12, 34)
|
||||
* $query->filterByDbFileId(array('min' => 12)); // WHERE file_id >= 12
|
||||
* $query->filterByDbFileId(array('max' => 12)); // WHERE file_id <= 12
|
||||
* </code>
|
||||
*
|
||||
* @see filterByCcFiles()
|
||||
*
|
||||
* @param mixed $dbFileId The value to use as filter.
|
||||
* Use scalar values for equality.
|
||||
* Use array values for in_array() equivalent.
|
||||
* Use associative array('min' => $minValue, 'max' => $maxValue) for intervals.
|
||||
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
|
||||
*
|
||||
* @return ThirdPartyTrackReferencesQuery The current query, for fluid interface
|
||||
*/
|
||||
public function filterByDbFileId($dbFileId = null, $comparison = null)
|
||||
{
|
||||
if (is_array($dbFileId)) {
|
||||
$useMinMax = false;
|
||||
if (isset($dbFileId['min'])) {
|
||||
$this->addUsingAlias(ThirdPartyTrackReferencesPeer::FILE_ID, $dbFileId['min'], Criteria::GREATER_EQUAL);
|
||||
$useMinMax = true;
|
||||
}
|
||||
if (isset($dbFileId['max'])) {
|
||||
$this->addUsingAlias(ThirdPartyTrackReferencesPeer::FILE_ID, $dbFileId['max'], Criteria::LESS_EQUAL);
|
||||
$useMinMax = true;
|
||||
}
|
||||
if ($useMinMax) {
|
||||
return $this;
|
||||
}
|
||||
if (null === $comparison) {
|
||||
$comparison = Criteria::IN;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->addUsingAlias(ThirdPartyTrackReferencesPeer::FILE_ID, $dbFileId, $comparison);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query on the upload_time column
|
||||
*
|
||||
* Example usage:
|
||||
* <code>
|
||||
* $query->filterByDbUploadTime('2011-03-14'); // WHERE upload_time = '2011-03-14'
|
||||
* $query->filterByDbUploadTime('now'); // WHERE upload_time = '2011-03-14'
|
||||
* $query->filterByDbUploadTime(array('max' => 'yesterday')); // WHERE upload_time < '2011-03-13'
|
||||
* </code>
|
||||
*
|
||||
* @param mixed $dbUploadTime The value to use as filter.
|
||||
* Values can be integers (unix timestamps), DateTime objects, or strings.
|
||||
* Empty strings are treated as NULL.
|
||||
* Use scalar values for equality.
|
||||
* Use array values for in_array() equivalent.
|
||||
* Use associative array('min' => $minValue, 'max' => $maxValue) for intervals.
|
||||
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
|
||||
*
|
||||
* @return ThirdPartyTrackReferencesQuery The current query, for fluid interface
|
||||
*/
|
||||
public function filterByDbUploadTime($dbUploadTime = null, $comparison = null)
|
||||
{
|
||||
if (is_array($dbUploadTime)) {
|
||||
$useMinMax = false;
|
||||
if (isset($dbUploadTime['min'])) {
|
||||
$this->addUsingAlias(ThirdPartyTrackReferencesPeer::UPLOAD_TIME, $dbUploadTime['min'], Criteria::GREATER_EQUAL);
|
||||
$useMinMax = true;
|
||||
}
|
||||
if (isset($dbUploadTime['max'])) {
|
||||
$this->addUsingAlias(ThirdPartyTrackReferencesPeer::UPLOAD_TIME, $dbUploadTime['max'], Criteria::LESS_EQUAL);
|
||||
$useMinMax = true;
|
||||
}
|
||||
if ($useMinMax) {
|
||||
return $this;
|
||||
}
|
||||
if (null === $comparison) {
|
||||
$comparison = Criteria::IN;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->addUsingAlias(ThirdPartyTrackReferencesPeer::UPLOAD_TIME, $dbUploadTime, $comparison);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query on the status column
|
||||
*
|
||||
* Example usage:
|
||||
* <code>
|
||||
* $query->filterByDbStatus('fooValue'); // WHERE status = 'fooValue'
|
||||
* $query->filterByDbStatus('%fooValue%'); // WHERE status LIKE '%fooValue%'
|
||||
* </code>
|
||||
*
|
||||
* @param string $dbStatus The value to use as filter.
|
||||
* Accepts wildcards (* and % trigger a LIKE)
|
||||
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
|
||||
*
|
||||
* @return ThirdPartyTrackReferencesQuery The current query, for fluid interface
|
||||
*/
|
||||
public function filterByDbStatus($dbStatus = null, $comparison = null)
|
||||
{
|
||||
if (null === $comparison) {
|
||||
if (is_array($dbStatus)) {
|
||||
$comparison = Criteria::IN;
|
||||
} elseif (preg_match('/[\%\*]/', $dbStatus)) {
|
||||
$dbStatus = str_replace('*', '%', $dbStatus);
|
||||
$comparison = Criteria::LIKE;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->addUsingAlias(ThirdPartyTrackReferencesPeer::STATUS, $dbStatus, $comparison);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query by a related CcFiles object
|
||||
*
|
||||
* @param CcFiles|PropelObjectCollection $ccFiles The related object(s) to use as filter
|
||||
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
|
||||
*
|
||||
* @return ThirdPartyTrackReferencesQuery The current query, for fluid interface
|
||||
* @throws PropelException - if the provided filter is invalid.
|
||||
*/
|
||||
public function filterByCcFiles($ccFiles, $comparison = null)
|
||||
{
|
||||
if ($ccFiles instanceof CcFiles) {
|
||||
return $this
|
||||
->addUsingAlias(ThirdPartyTrackReferencesPeer::FILE_ID, $ccFiles->getDbId(), $comparison);
|
||||
} elseif ($ccFiles instanceof PropelObjectCollection) {
|
||||
if (null === $comparison) {
|
||||
$comparison = Criteria::IN;
|
||||
}
|
||||
|
||||
return $this
|
||||
->addUsingAlias(ThirdPartyTrackReferencesPeer::FILE_ID, $ccFiles->toKeyValue('PrimaryKey', 'DbId'), $comparison);
|
||||
} else {
|
||||
throw new PropelException('filterByCcFiles() only accepts arguments of type CcFiles or PropelCollection');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a JOIN clause to the query using the CcFiles relation
|
||||
*
|
||||
* @param string $relationAlias optional alias for the relation
|
||||
* @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join'
|
||||
*
|
||||
* @return ThirdPartyTrackReferencesQuery The current query, for fluid interface
|
||||
*/
|
||||
public function joinCcFiles($relationAlias = null, $joinType = Criteria::INNER_JOIN)
|
||||
{
|
||||
$tableMap = $this->getTableMap();
|
||||
$relationMap = $tableMap->getRelation('CcFiles');
|
||||
|
||||
// create a ModelJoin object for this join
|
||||
$join = new ModelJoin();
|
||||
$join->setJoinType($joinType);
|
||||
$join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias);
|
||||
if ($previousJoin = $this->getPreviousJoin()) {
|
||||
$join->setPreviousJoin($previousJoin);
|
||||
}
|
||||
|
||||
// add the ModelJoin to the current object
|
||||
if ($relationAlias) {
|
||||
$this->addAlias($relationAlias, $relationMap->getRightTable()->getName());
|
||||
$this->addJoinObject($join, $relationAlias);
|
||||
} else {
|
||||
$this->addJoinObject($join, 'CcFiles');
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use the CcFiles relation CcFiles object
|
||||
*
|
||||
* @see useQuery()
|
||||
*
|
||||
* @param string $relationAlias optional alias for the relation,
|
||||
* to be used as main alias in the secondary query
|
||||
* @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join'
|
||||
*
|
||||
* @return CcFilesQuery A secondary query class using the current class as primary query
|
||||
*/
|
||||
public function useCcFilesQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN)
|
||||
{
|
||||
return $this
|
||||
->joinCcFiles($relationAlias, $joinType)
|
||||
->useQuery($relationAlias ? $relationAlias : 'CcFiles', 'CcFilesQuery');
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the query by a related CeleryTasks object
|
||||
*
|
||||
* @param CeleryTasks|PropelObjectCollection $celeryTasks the related object to use as filter
|
||||
* @param string $comparison Operator to use for the column comparison, defaults to Criteria::EQUAL
|
||||
*
|
||||
* @return ThirdPartyTrackReferencesQuery The current query, for fluid interface
|
||||
* @throws PropelException - if the provided filter is invalid.
|
||||
*/
|
||||
public function filterByCeleryTasks($celeryTasks, $comparison = null)
|
||||
{
|
||||
if ($celeryTasks instanceof CeleryTasks) {
|
||||
return $this
|
||||
->addUsingAlias(ThirdPartyTrackReferencesPeer::ID, $celeryTasks->getDbTrackReference(), $comparison);
|
||||
} elseif ($celeryTasks instanceof PropelObjectCollection) {
|
||||
return $this
|
||||
->useCeleryTasksQuery()
|
||||
->filterByPrimaryKeys($celeryTasks->getPrimaryKeys())
|
||||
->endUse();
|
||||
} else {
|
||||
throw new PropelException('filterByCeleryTasks() only accepts arguments of type CeleryTasks or PropelCollection');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a JOIN clause to the query using the CeleryTasks relation
|
||||
*
|
||||
* @param string $relationAlias optional alias for the relation
|
||||
* @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join'
|
||||
*
|
||||
* @return ThirdPartyTrackReferencesQuery The current query, for fluid interface
|
||||
*/
|
||||
public function joinCeleryTasks($relationAlias = null, $joinType = Criteria::INNER_JOIN)
|
||||
{
|
||||
$tableMap = $this->getTableMap();
|
||||
$relationMap = $tableMap->getRelation('CeleryTasks');
|
||||
|
||||
// create a ModelJoin object for this join
|
||||
$join = new ModelJoin();
|
||||
$join->setJoinType($joinType);
|
||||
$join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias);
|
||||
if ($previousJoin = $this->getPreviousJoin()) {
|
||||
$join->setPreviousJoin($previousJoin);
|
||||
}
|
||||
|
||||
// add the ModelJoin to the current object
|
||||
if ($relationAlias) {
|
||||
$this->addAlias($relationAlias, $relationMap->getRightTable()->getName());
|
||||
$this->addJoinObject($join, $relationAlias);
|
||||
} else {
|
||||
$this->addJoinObject($join, 'CeleryTasks');
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use the CeleryTasks relation CeleryTasks object
|
||||
*
|
||||
* @see useQuery()
|
||||
*
|
||||
* @param string $relationAlias optional alias for the relation,
|
||||
* to be used as main alias in the secondary query
|
||||
* @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join'
|
||||
*
|
||||
* @return CeleryTasksQuery A secondary query class using the current class as primary query
|
||||
*/
|
||||
public function useCeleryTasksQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN)
|
||||
{
|
||||
return $this
|
||||
->joinCeleryTasks($relationAlias, $joinType)
|
||||
->useQuery($relationAlias ? $relationAlias : 'CeleryTasks', 'CeleryTasksQuery');
|
||||
}
|
||||
|
||||
/**
|
||||
* Exclude object from result
|
||||
*
|
||||
* @param ThirdPartyTrackReferences $thirdPartyTrackReferences Object to remove from the list of results
|
||||
*
|
||||
* @return ThirdPartyTrackReferencesQuery The current query, for fluid interface
|
||||
*/
|
||||
public function prune($thirdPartyTrackReferences = null)
|
||||
{
|
||||
if ($thirdPartyTrackReferences) {
|
||||
$this->addUsingAlias(ThirdPartyTrackReferencesPeer::ID, $thirdPartyTrackReferences->getDbId(), Criteria::NOT_EQUAL);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
}
|
|
@ -55,23 +55,6 @@ class Application_Service_CalendarService
|
|||
"icon" => "overview",
|
||||
"url" => $baseUrl."library/edit-file-md/id/".$ccFile->getDbId());
|
||||
}
|
||||
|
||||
//recorded show can be uploaded to soundcloud
|
||||
if (Application_Model_Preference::GetUploadToSoundcloudOption()) {
|
||||
$scid = $ccFile->getDbSoundcloudId();
|
||||
|
||||
if ($scid > 0) {
|
||||
$menu["soundcloud_view"] = array(
|
||||
"name" => _("View on Soundcloud"),
|
||||
"icon" => "soundcloud",
|
||||
"url" => $ccFile->getDbSoundcloudLinkToFile());
|
||||
}
|
||||
|
||||
$text = is_null($scid) ? _('Upload to SoundCloud') : _('Re-upload to SoundCloud');
|
||||
$menu["soundcloud_upload"] = array(
|
||||
"name"=> $text,
|
||||
"icon" => "soundcloud");
|
||||
}
|
||||
} else {
|
||||
$menu["content"] = array(
|
||||
"name"=> _("Show Content"),
|
||||
|
@ -314,7 +297,7 @@ class Application_Service_CalendarService
|
|||
//check if we are moving a recorded show less than 1 hour before any of its own rebroadcasts.
|
||||
$rebroadcasts = CcShowInstancesQuery::create()
|
||||
->filterByDbOriginalShow($this->ccShow->getDbId())
|
||||
->filterByDbStarts($minRebroadcastStart->format('Y-m-d H:i:s'), Criteria::LESS_THAN)
|
||||
->filterByDbStarts($minRebroadcastStart->format(DEFAULT_TIMESTAMP_FORMAT), Criteria::LESS_THAN)
|
||||
->find();
|
||||
|
||||
if (count($rebroadcasts) > 0) {
|
||||
|
|
|
@ -0,0 +1,211 @@
|
|||
<?php
|
||||
|
||||
require_once "CeleryServiceFactory.php";
|
||||
|
||||
class CeleryService {
|
||||
|
||||
/**
|
||||
* @var int milliseconds (for compatibility with celery) until we consider a message to have timed out
|
||||
*/
|
||||
private static $_CELERY_MESSAGE_TIMEOUT = 600000; // 10 minutes
|
||||
|
||||
/**
|
||||
* We have to use celeryresults (the default results exchange) because php-celery
|
||||
* doesn't support named results exchanges.
|
||||
*
|
||||
* @var string exchange for celery task results
|
||||
*/
|
||||
private static $_CELERY_RESULTS_EXCHANGE = 'celeryresults';
|
||||
|
||||
/**
|
||||
* Connect to the Celery daemon via amqp
|
||||
*
|
||||
* @param $config array the airtime configuration array
|
||||
* @param $exchange string the amqp exchange name
|
||||
* @param $queue string the amqp queue name
|
||||
*
|
||||
* @return Celery the Celery connection object
|
||||
*
|
||||
* @throws Exception when a connection error occurs
|
||||
*/
|
||||
private static function _setupCeleryExchange($config, $exchange, $queue) {
|
||||
return new Celery($config["rabbitmq"]["host"],
|
||||
$config["rabbitmq"]["user"],
|
||||
$config["rabbitmq"]["password"],
|
||||
$config["rabbitmq"]["vhost"],
|
||||
$exchange, // Exchange name
|
||||
$queue, // Binding/queue
|
||||
$config["rabbitmq"]["port"],
|
||||
false,
|
||||
true, // Persistent messages
|
||||
self::$_CELERY_MESSAGE_TIMEOUT); // Result expiration
|
||||
}
|
||||
|
||||
/**
|
||||
* Send an amqp message to Celery the airtime-celery daemon to perform a task
|
||||
*
|
||||
* @param $task string the Celery task name
|
||||
* @param $exchange string the amqp exchange name
|
||||
* @param $data array an associative array containing arguments for the Celery task
|
||||
*
|
||||
* @return string the task identifier for the started Celery task so we can fetch the
|
||||
* results asynchronously later
|
||||
*/
|
||||
public static function sendCeleryMessage($task, $exchange, $data) {
|
||||
$config = parse_ini_file(Application_Model_RabbitMq::getRmqConfigPath(), true);
|
||||
$queue = $routingKey = $exchange;
|
||||
$c = self::_setupCeleryExchange($config, $exchange, $queue); // Use the exchange name for the queue
|
||||
$result = $c->PostTask($task, $data, true, $routingKey); // and routing key
|
||||
return $result->getId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a task name and identifier, check the Celery results queue for any
|
||||
* corresponding messages
|
||||
*
|
||||
* @param $task CeleryTasks the Celery task object
|
||||
*
|
||||
* @return array the message response array
|
||||
*
|
||||
* @throws CeleryException when no message is found
|
||||
* @throws CeleryTimeoutException when no message is found and more than
|
||||
* $_CELERY_MESSAGE_TIMEOUT milliseconds have passed
|
||||
*/
|
||||
private static function getAsyncResultMessage($task) {
|
||||
$config = parse_ini_file(Application_Model_RabbitMq::getRmqConfigPath(), true);
|
||||
$queue = self::$_CELERY_RESULTS_EXCHANGE . "." . $task;
|
||||
$c = self::_setupCeleryExchange($config, self::$_CELERY_RESULTS_EXCHANGE, $queue);
|
||||
$message = $c->getAsyncResultMessage($task->getDbName(), $task->getDbTaskId());
|
||||
|
||||
// If the message isn't ready yet (Celery hasn't finished the task),
|
||||
// only throw an exception if the message has timed out.
|
||||
if ($message == FALSE) {
|
||||
if (self::_checkMessageTimeout($task)) {
|
||||
// If the task times out, mark it as failed. We don't want to remove the
|
||||
// track reference here in case it was a deletion that failed, for example.
|
||||
$task->setDbStatus(CELERY_FAILED_STATUS)->save();
|
||||
throw new CeleryTimeoutException("Celery task " . $task->getDbName()
|
||||
. " with ID " . $task->getDbTaskId() . " timed out");
|
||||
} else {
|
||||
// The message hasn't timed out, but it's still false, which means it hasn't been
|
||||
// sent back from Celery yet.
|
||||
throw new CeleryException("Waiting on Celery task " . $task->getDbName()
|
||||
. " with ID " . $task->getDbTaskId());
|
||||
}
|
||||
}
|
||||
return $message;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check to see if there are any pending tasks for this service
|
||||
*
|
||||
* @param string $taskName the name of the task to poll for
|
||||
* @param string $serviceName the name of the service to poll for
|
||||
*
|
||||
* @return bool true if there are any pending tasks, otherwise false
|
||||
*/
|
||||
public static function isBrokerTaskQueueEmpty($taskName="", $serviceName = "") {
|
||||
$pendingTasks = self::_getPendingTasks($taskName, $serviceName);
|
||||
return empty($pendingTasks);
|
||||
}
|
||||
|
||||
/**
|
||||
* Poll the message queue for this service to see if any tasks with the given name have completed
|
||||
*
|
||||
* If we find any completed tasks, adjust the ThirdPartyTrackReferences table accordingly
|
||||
*
|
||||
* If no task name is passed, we poll all tasks for this service
|
||||
*
|
||||
* @param string $taskName the name of the task to poll for
|
||||
* @param string $serviceName the name of the service to poll for
|
||||
*/
|
||||
public static function pollBrokerTaskQueue($taskName = "", $serviceName = "") {
|
||||
$pendingTasks = self::_getPendingTasks($taskName, $serviceName);
|
||||
foreach ($pendingTasks as $task) {
|
||||
try {
|
||||
$message = self::_getTaskMessage($task);
|
||||
self::_processTaskMessage($task, $message);
|
||||
} catch (CeleryTimeoutException $e) {
|
||||
Logging::warn($e->getMessage());
|
||||
} catch (Exception $e) {
|
||||
// Because $message->result can be either an object or a string, sometimes
|
||||
// we get a json_decode error and end up here
|
||||
Logging::info($e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a collection of all pending CeleryTasks for this service or task
|
||||
*
|
||||
* @param string $taskName the name of the task to find
|
||||
* @param string $serviceName the name of the service to find
|
||||
*
|
||||
* @return PropelCollection any pending CeleryTasks results for this service
|
||||
* or task if taskName is provided
|
||||
*/
|
||||
protected static function _getPendingTasks($taskName, $serviceName) {
|
||||
$query = CeleryTasksQuery::create()
|
||||
->filterByDbStatus(CELERY_PENDING_STATUS)
|
||||
->filterByDbTaskId('', Criteria::NOT_EQUAL);
|
||||
if (!empty($taskName)) {
|
||||
$query->filterByDbName($taskName);
|
||||
}
|
||||
if (!empty($serviceName)) {
|
||||
$query->useThirdPartyTrackReferencesQuery()
|
||||
->filterByDbService($serviceName)->endUse();
|
||||
}
|
||||
return $query->joinThirdPartyTrackReferences()
|
||||
->with('ThirdPartyTrackReferences')->find();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a Celery task message from the results queue
|
||||
*
|
||||
* @param $task CeleryTasks the Celery task object
|
||||
*
|
||||
* @return object the task message object
|
||||
*
|
||||
* @throws CeleryException when the result message for this task is still pending
|
||||
* @throws CeleryTimeoutException when the result message for this task no longer exists
|
||||
*/
|
||||
protected static function _getTaskMessage($task) {
|
||||
$message = self::getAsyncResultMessage($task);
|
||||
return json_decode($message['body']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Process a message from the results queue
|
||||
*
|
||||
* @param $task CeleryTasks Celery task object
|
||||
* @param $message mixed async message object from php-celery
|
||||
*/
|
||||
protected static function _processTaskMessage($task, $message) {
|
||||
$ref = $task->getThirdPartyTrackReferences(); // ThirdPartyTrackReferences join
|
||||
$service = CeleryServiceFactory::getService($ref->getDbService());
|
||||
if ($message->status == CELERY_SUCCESS_STATUS
|
||||
&& $task->getDbName() == $service->getCeleryDeleteTaskName()) {
|
||||
$service->removeTrackReference($ref->getDbFileId());
|
||||
} else {
|
||||
$service->updateTrackReference($ref->getDbId(), json_decode($message->result), $message->status);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a task message has been unreachable for more our timeout time
|
||||
*
|
||||
* @param $task CeleryTasks the Celery task object
|
||||
*
|
||||
* @return bool true if the dispatch time is empty or it's been more than our timeout time
|
||||
* since the message was dispatched, otherwise false
|
||||
*/
|
||||
protected static function _checkMessageTimeout($task) {
|
||||
$utc = new DateTimeZone("UTC");
|
||||
$dispatchTime = new DateTime($task->getDbDispatchTime(), $utc);
|
||||
$now = new DateTime("now", $utc);
|
||||
$timeoutSeconds = self::$_CELERY_MESSAGE_TIMEOUT / 1000; // Convert from milliseconds
|
||||
$timeoutInterval = new DateInterval("PT" . $timeoutSeconds . "S");
|
||||
return (empty($dispatchTime) || $dispatchTime->add($timeoutInterval) <= $now);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
class CeleryServiceFactory {
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param $serviceName string the name of the service to create
|
||||
*
|
||||
* @return ThirdPartyCeleryService|null
|
||||
*/
|
||||
public static function getService($serviceName) {
|
||||
switch($serviceName) {
|
||||
case SOUNDCLOUD_SERVICE_NAME:
|
||||
return new SoundcloudService();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
|
@ -28,8 +28,8 @@ class Application_Service_HistoryService
|
|||
$paramMap = array();
|
||||
$sqlTypes = $this->getSqlTypes();
|
||||
|
||||
$start = $startDT->format("Y-m-d H:i:s");
|
||||
$end = $endDT->format("Y-m-d H:i:s");
|
||||
$start = $startDT->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$end = $endDT->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
$template = $this->getConfiguredItemTemplate();
|
||||
$fields = $template["fields"];
|
||||
|
@ -292,13 +292,13 @@ class Application_Service_HistoryService
|
|||
//need to display the results in the station's timezone.
|
||||
$dateTime = new DateTime($result["starts"], $timezoneUTC);
|
||||
$dateTime->setTimezone($timezoneLocal);
|
||||
$result["starts"] = $dateTime->format("Y-m-d H:i:s");
|
||||
$result["starts"] = $dateTime->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
//if ends is null we don't want it to default to "now"
|
||||
if (isset($result["ends"])) {
|
||||
$dateTime = new DateTime($result["ends"], $timezoneUTC);
|
||||
$dateTime->setTimezone($timezoneLocal);
|
||||
$result["ends"] = $dateTime->format("Y-m-d H:i:s");
|
||||
$result["ends"] = $dateTime->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
}
|
||||
|
||||
if (isset($result[MDATA_KEY_DURATION])) {
|
||||
|
@ -334,8 +334,8 @@ class Application_Service_HistoryService
|
|||
|
||||
$mainSqlQuery = "";
|
||||
$paramMap = array();
|
||||
$start = $startDT->format("Y-m-d H:i:s");
|
||||
$end = $endDT->format("Y-m-d H:i:s");
|
||||
$start = $startDT->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$end = $endDT->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
$paramMap["starts"] = $start;
|
||||
$paramMap["ends"] = $end;
|
||||
|
@ -458,8 +458,8 @@ class Application_Service_HistoryService
|
|||
}
|
||||
$shows = Application_Model_Show::getShows($startDT, $endDT);
|
||||
|
||||
Logging::info($startDT->format("Y-m-d H:i:s"));
|
||||
Logging::info($endDT->format("Y-m-d H:i:s"));
|
||||
Logging::info($startDT->format(DEFAULT_TIMESTAMP_FORMAT));
|
||||
Logging::info($endDT->format(DEFAULT_TIMESTAMP_FORMAT));
|
||||
|
||||
Logging::info($shows);
|
||||
|
||||
|
@ -508,11 +508,11 @@ class Application_Service_HistoryService
|
|||
//need to display the results in the station's timezone.
|
||||
$dateTime = new DateTime($result["starts"], $timezoneUTC);
|
||||
$dateTime->setTimezone($timezoneLocal);
|
||||
$result["starts"] = $dateTime->format("Y-m-d H:i:s");
|
||||
$result["starts"] = $dateTime->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
$dateTime = new DateTime($result["ends"], $timezoneUTC);
|
||||
$dateTime->setTimezone($timezoneLocal);
|
||||
$result["ends"] = $dateTime->format("Y-m-d H:i:s");
|
||||
$result["ends"] = $dateTime->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
|
||||
}
|
||||
|
||||
|
@ -687,7 +687,7 @@ class Application_Service_HistoryService
|
|||
|
||||
$dateTime = new DateTime($value, $timezoneUTC);
|
||||
$dateTime->setTimezone($timezoneLocal);
|
||||
$value = $dateTime->format("Y-m-d H:i:s");
|
||||
$value = $dateTime->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
}
|
||||
|
||||
$formValues["$prefix{$key}"] = $value;
|
||||
|
@ -795,11 +795,11 @@ class Application_Service_HistoryService
|
|||
|
||||
$dateTime = new DateTime($values[$prefix."starts"], $timezoneLocal);
|
||||
$dateTime->setTimezone($timezoneUTC);
|
||||
$historyRecord->setDbStarts($dateTime->format("Y-m-d H:i:s"));
|
||||
$historyRecord->setDbStarts($dateTime->format(DEFAULT_TIMESTAMP_FORMAT));
|
||||
|
||||
$dateTime = new DateTime($values[$prefix."ends"], $timezoneLocal);
|
||||
$dateTime->setTimezone($timezoneUTC);
|
||||
$historyRecord->setDbEnds($dateTime->format("Y-m-d H:i:s"));
|
||||
$historyRecord->setDbEnds($dateTime->format(DEFAULT_TIMESTAMP_FORMAT));
|
||||
|
||||
$templateValues = $values[$prefix."template"];
|
||||
|
||||
|
@ -1157,7 +1157,7 @@ class Application_Service_HistoryService
|
|||
$fields[] = array("name" => MDATA_KEY_TITLE, "label"=> _("Title"), "type" => TEMPLATE_STRING, "isFileMd" => true); //these fields can be populated from an associated file.
|
||||
$fields[] = array("name" => MDATA_KEY_CREATOR, "label"=> _("Creator"), "type" => TEMPLATE_STRING, "isFileMd" => true);
|
||||
|
||||
$template["name"] = "Log Sheet ".date("Y-m-d H:i:s")." Template";
|
||||
$template["name"] = "Log Sheet ".date(DEFAULT_TIMESTAMP_FORMAT)." Template";
|
||||
$template["fields"] = $fields;
|
||||
|
||||
return $template;
|
||||
|
@ -1178,7 +1178,7 @@ class Application_Service_HistoryService
|
|||
$fields[] = array("name" => MDATA_KEY_COMPOSER, "label"=> _("Composer"), "type" => TEMPLATE_STRING, "isFileMd" => true);
|
||||
$fields[] = array("name" => MDATA_KEY_COPYRIGHT, "label"=> _("Copyright"), "type" => TEMPLATE_STRING, "isFileMd" => true);
|
||||
|
||||
$template["name"] = "File Summary ".date("Y-m-d H:i:s")." Template";
|
||||
$template["name"] = "File Summary ".date(DEFAULT_TIMESTAMP_FORMAT)." Template";
|
||||
$template["fields"] = $fields;
|
||||
|
||||
return $template;
|
||||
|
|
|
@ -177,7 +177,7 @@ class Application_Service_SchedulerService
|
|||
|
||||
$showInstanceWithMostRecentSchedule = CcShowInstancesQuery::create()
|
||||
->filterByDbShowId($showId)
|
||||
->filterByDbStarts($showsPopulatedUntil->format("Y-m-d H:i:s"), Criteria::LESS_THAN)
|
||||
->filterByDbStarts($showsPopulatedUntil->format(DEFAULT_TIMESTAMP_FORMAT), Criteria::LESS_THAN)
|
||||
->filterByDbId($instancsIdsToFill, Criteria::NOT_IN)
|
||||
->orderByDbStarts(Criteria::DESC)
|
||||
->limit(1)
|
||||
|
@ -266,8 +266,8 @@ class Application_Service_SchedulerService
|
|||
$item["stream_id"] = "null";
|
||||
}
|
||||
|
||||
$values[] = "(" . "'{$nextStartDT->format("Y-m-d H:i:s")}', " .
|
||||
"'{$endTimeDT->format("Y-m-d H:i:s")}', " .
|
||||
$values[] = "(" . "'{$nextStartDT->format(DEFAULT_TIMESTAMP_FORMAT)}', " .
|
||||
"'{$endTimeDT->format(DEFAULT_TIMESTAMP_FORMAT)}', " .
|
||||
"'{$item["clip_length"]}', " .
|
||||
"'{$item["fade_in"]}', " . "'{$item["fade_out"]}', " .
|
||||
"'{$item["cue_in"]}', " . "'{$item["cue_out"]}', " .
|
||||
|
@ -293,7 +293,7 @@ class Application_Service_SchedulerService
|
|||
} //foreach linked instance
|
||||
|
||||
//update time_filled and last_scheduled in cc_show_instances
|
||||
$now = gmdate("Y-m-d H:i:s");
|
||||
$now = gmdate(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$whereClause = new Criteria();
|
||||
$whereClause->add(CcShowInstancesPeer::ID, $instanceIdsToFill, Criteria::IN);
|
||||
|
||||
|
@ -350,7 +350,7 @@ class Application_Service_SchedulerService
|
|||
|
||||
$ccShowInstance
|
||||
->setDbTimeFilled($timeFilled)
|
||||
->setDbLastScheduled(gmdate("Y-m-d H:i:s"))
|
||||
->setDbLastScheduled(gmdate(DEFAULT_TIMESTAMP_FORMAT))
|
||||
->save();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -96,6 +96,8 @@ class Application_Service_ShowFormService
|
|||
$forms["repeats"]->disable();
|
||||
$forms["who"]->disable();
|
||||
$forms["style"]->disable();
|
||||
// Hide the show logo fields when users are editing a single instance
|
||||
$forms["style"]->hideShowLogo();
|
||||
$forms["live"]->disable();
|
||||
$forms["record"]->disable();
|
||||
$forms["rebroadcast"]->disable();
|
||||
|
@ -208,7 +210,7 @@ class Application_Service_ShowFormService
|
|||
'add_show_end_date_no_repeat' => $showEnd->format("Y-m-d"),
|
||||
'add_show_end_time' => $showEnd->format("H:i"),
|
||||
'add_show_duration' => $this->calculateDuration(
|
||||
$showStart->format("Y-m-d H:i:s"), $showEnd->format("Y-m-d H:i:s"), $timezone),
|
||||
$showStart->format(DEFAULT_TIMESTAMP_FORMAT), $showEnd->format(DEFAULT_TIMESTAMP_FORMAT), $timezone),
|
||||
'add_show_timezone' => $timezone,
|
||||
'add_show_repeats' => 0));
|
||||
|
||||
|
|
|
@ -405,12 +405,12 @@ class Application_Service_ShowService
|
|||
|
||||
private function getShowDaysInRange($start, $end)
|
||||
{
|
||||
$endTimeString = $end->format("Y-m-d H:i:s");
|
||||
$endTimeString = $end->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
if (!is_null($start)) {
|
||||
$startTimeString = $start->format("Y-m-d H:i:s");
|
||||
$startTimeString = $start->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
} else {
|
||||
$today_timestamp = new DateTime("now", new DateTimeZone("UTC"));
|
||||
$startTimeString = $today_timestamp->format("Y-m-d H:i:s");
|
||||
$startTimeString = $today_timestamp->format(DEFAULT_TIMESTAMP_FORMAT);
|
||||
}
|
||||
|
||||
$c = new Criteria();
|
||||
|
@ -462,7 +462,7 @@ AND rebroadcast = 1;
|
|||
SQL;
|
||||
Application_Common_Database::prepareAndExecute( $sql, array(
|
||||
':showId' => $this->ccShow->getDbId(),
|
||||
':timestamp' => gmdate("Y-m-d H:i:s")), 'execute');
|
||||
':timestamp' => gmdate(DEFAULT_TIMESTAMP_FORMAT)), 'execute');
|
||||
}
|
||||
|
||||
private function deleteAllShowDays($showId)
|
||||
|
@ -678,7 +678,7 @@ WHERE date(starts) >= :endDate::DATE
|
|||
AND show_id = :showId
|
||||
SQL;
|
||||
Application_Common_Database::prepareAndExecute($sql, array(
|
||||
':endDate' => $endDate, ':timestamp' => gmdate("Y-m-d H:i:s"),
|
||||
':endDate' => $endDate, ':timestamp' => gmdate(DEFAULT_TIMESTAMP_FORMAT),
|
||||
':showId' => $showId), 'execute');
|
||||
}
|
||||
|
||||
|
@ -693,7 +693,7 @@ WHERE date(starts) < :newStartDate::DATE
|
|||
SQL;
|
||||
|
||||
Application_Common_Database::prepareAndExecute($sql, array(
|
||||
":newStartDate" => $newStartDate, ":timestamp" => gmdate("Y-m-d H:i:s"),
|
||||
":newStartDate" => $newStartDate, ":timestamp" => gmdate(DEFAULT_TIMESTAMP_FORMAT),
|
||||
":showId" => $showId), "execute");
|
||||
}
|
||||
|
||||
|
@ -738,7 +738,7 @@ WHERE EXTRACT(DOW FROM starts) IN ($uncheckedDays)
|
|||
SQL;
|
||||
|
||||
Application_Common_Database::prepareAndExecute( $sql, array(
|
||||
":timestamp" => gmdate("Y-m-d H:i:s"), ":showId" => $showId),
|
||||
":timestamp" => gmdate(DEFAULT_TIMESTAMP_FORMAT), ":showId" => $showId),
|
||||
"execute");
|
||||
|
||||
}
|
||||
|
@ -777,7 +777,7 @@ SQL;
|
|||
->find();
|
||||
}
|
||||
|
||||
if (gmdate("Y-m-d H:i:s") <= $ccShowInstance->getDbEnds()) {
|
||||
if (gmdate(DEFAULT_TIMESTAMP_FORMAT) <= $ccShowInstance->getDbEnds()) {
|
||||
$this->deleteShowInstances($ccShowInstances, $showId);
|
||||
} else {
|
||||
throw new Exception("Cannot delete a show instance in the past");
|
||||
|
@ -925,7 +925,7 @@ WHERE starts > :timestamp::TIMESTAMP
|
|||
AND show_id = :showId
|
||||
SQL;
|
||||
Application_Common_Database::prepareAndExecute( $sql,
|
||||
array( ':timestamp' => gmdate("Y-m-d H:i:s"),
|
||||
array( ':timestamp' => gmdate(DEFAULT_TIMESTAMP_FORMAT),
|
||||
':showId' => $showId), 'execute');
|
||||
}
|
||||
|
||||
|
@ -941,9 +941,9 @@ WHERE starts > :timestamp::TIMESTAMP
|
|||
AND starts != :firstShow
|
||||
SQL;
|
||||
Application_Common_Database::prepareAndExecute( $sql,
|
||||
array( ':timestamp' => gmdate("Y-m-d H:i:s"),
|
||||
array( ':timestamp' => gmdate(DEFAULT_TIMESTAMP_FORMAT),
|
||||
':showId' => $showId,
|
||||
':firstShow' => $firstShow->format("Y-m-d H:i:s")), 'execute');
|
||||
':firstShow' => $firstShow->format(DEFAULT_TIMESTAMP_FORMAT)), 'execute');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1027,7 +1027,7 @@ SQL;
|
|||
|
||||
Application_Common_Database::prepareAndExecute($sql,
|
||||
array(':diff1' => $diff, ':diff2' => $diff,
|
||||
':showId' => $this->ccShow->getDbId(), ':timestamp' => gmdate("Y-m-d H:i:s")),
|
||||
':showId' => $this->ccShow->getDbId(), ':timestamp' => gmdate(DEFAULT_TIMESTAMP_FORMAT)),
|
||||
'execute');
|
||||
}
|
||||
|
||||
|
@ -1040,7 +1040,7 @@ SQL;
|
|||
*/
|
||||
private function createRebroadcastInstances($showDay, $showStartDate, $instanceId)
|
||||
{
|
||||
$currentUtcTimestamp = gmdate("Y-m-d H:i:s");
|
||||
$currentUtcTimestamp = gmdate(DEFAULT_TIMESTAMP_FORMAT);
|
||||
$showId = $this->ccShow->getDbId();
|
||||
|
||||
$sql = "SELECT * FROM cc_show_rebroadcast WHERE show_id=:show_id";
|
||||
|
@ -1055,7 +1055,7 @@ SQL;
|
|||
list($utcStartDateTime, $utcEndDateTime) = $this->createUTCStartEndDateTime(
|
||||
$showStartDate, $showDay->getDbDuration(), $offset);
|
||||
|
||||
if ($utcStartDateTime->format("Y-m-d H:i:s") > $currentUtcTimestamp) {
|
||||
if ($utcStartDateTime->format(DEFAULT_TIMESTAMP_FORMAT) > $currentUtcTimestamp) {
|
||||
$ccShowInstance = new CcShowInstances();
|
||||
$ccShowInstance->setDbShowId($showId);
|
||||
$ccShowInstance->setDbStarts($utcStartDateTime);
|
||||
|
@ -1093,7 +1093,7 @@ SQL;
|
|||
$origStartDateTime->setTimezone(new DateTimeZone("UTC"));
|
||||
$ccShowInstance = $this->getInstance($origStartDateTime);
|
||||
if (!$ccShowInstance) {
|
||||
throw new Exception("Could not find show instance with start time: ".$origStartDateTime->format("Y-m-d H:i:s"));
|
||||
throw new Exception("Could not find show instance with start time: ".$origStartDateTime->format(DEFAULT_TIMESTAMP_FORMAT));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1182,7 +1182,7 @@ SQL;
|
|||
/* When editing the start/end time of a repeating show, we don't want to
|
||||
* change shows that are in the past so we check the end time.
|
||||
*/
|
||||
if ($newInstance || $ccShowInstance->getDbEnds() > gmdate("Y-m-d H:i:s")) {
|
||||
if ($newInstance || $ccShowInstance->getDbEnds() > gmdate(DEFAULT_TIMESTAMP_FORMAT)) {
|
||||
$ccShowInstance->setDbShowId($show_id);
|
||||
$ccShowInstance->setDbStarts($utcStartDateTime);
|
||||
$ccShowInstance->setDbEnds($utcEndDateTime);
|
||||
|
@ -1277,7 +1277,7 @@ SQL;
|
|||
/* When editing the start/end time of a repeating show, we don't want to
|
||||
* change shows that started in the past. So check the start time.
|
||||
*/
|
||||
if ($newInstance || $ccShowInstance->getDbStarts() > gmdate("Y-m-d H:i:s")) {
|
||||
if ($newInstance || $ccShowInstance->getDbStarts() > gmdate(DEFAULT_TIMESTAMP_FORMAT)) {
|
||||
$ccShowInstance->setDbShowId($show_id);
|
||||
$ccShowInstance->setDbStarts($utcStartDateTime);
|
||||
$ccShowInstance->setDbEnds($utcEndDateTime);
|
||||
|
@ -1481,7 +1481,7 @@ SQL;
|
|||
$temp->setTimezone(new DateTimeZone("UTC"));
|
||||
|
||||
$ccShowInstance = CcShowInstancesQuery::create()
|
||||
->filterByDbStarts($temp->format("Y-m-d H:i:s"), Criteria::EQUAL)
|
||||
->filterByDbStarts($temp->format(DEFAULT_TIMESTAMP_FORMAT), Criteria::EQUAL)
|
||||
->filterByDbShowId($this->ccShow->getDbId(), Criteria::EQUAL)
|
||||
//->filterByDbModifiedInstance(false, Criteria::EQUAL)
|
||||
->filterByDbRebroadcast(0, Criteria::EQUAL)
|
||||
|
|
|
@ -0,0 +1,223 @@
|
|||
<?php
|
||||
|
||||
require_once "ThirdPartyCeleryService.php";
|
||||
|
||||
class SoundcloudService extends ThirdPartyCeleryService implements OAuth2 {
|
||||
|
||||
/**
|
||||
* @var string service access token for accessing remote API
|
||||
*/
|
||||
protected $_accessToken;
|
||||
|
||||
/**
|
||||
* @var Soundcloud\Service SoundCloud API wrapper object
|
||||
*/
|
||||
private $_client;
|
||||
|
||||
/**
|
||||
* @var string service name to store in ThirdPartyTrackReferences database
|
||||
*/
|
||||
protected static $_SERVICE_NAME = SOUNDCLOUD_SERVICE_NAME; // SoundCloud service name constant from constants.php
|
||||
|
||||
/**
|
||||
* @var string exchange name for SoundCloud tasks
|
||||
*/
|
||||
protected static $_CELERY_EXCHANGE_NAME = 'soundcloud';
|
||||
|
||||
/**
|
||||
* @var string celery task name for third party uploads
|
||||
*/
|
||||
protected static $_CELERY_UPLOAD_TASK_NAME = 'soundcloud-upload';
|
||||
|
||||
/**
|
||||
* @var string celery task name for third party deletions
|
||||
*/
|
||||
protected static $_CELERY_DELETE_TASK_NAME = 'soundcloud-delete';
|
||||
|
||||
/**
|
||||
* @var array Application_Model_Preference functions for SoundCloud and their
|
||||
* associated API parameter keys so that we can call them dynamically
|
||||
*/
|
||||
private static $_SOUNDCLOUD_PREF_FUNCTIONS = array(
|
||||
"getDefaultSoundCloudLicenseType" => "license",
|
||||
"getDefaultSoundCloudSharingType" => "sharing"
|
||||
);
|
||||
|
||||
/**
|
||||
* Initialize the service
|
||||
*/
|
||||
public function __construct() {
|
||||
$CC_CONFIG = Config::getConfig();
|
||||
$clientId = $CC_CONFIG['soundcloud-client-id'];
|
||||
$clientSecret = $CC_CONFIG['soundcloud-client-secret'];
|
||||
$redirectUri = $CC_CONFIG['soundcloud-redirect-uri'];
|
||||
|
||||
$this->_client = new Soundcloud\Service($clientId, $clientSecret, $redirectUri);
|
||||
$accessToken = Application_Model_Preference::getSoundCloudRequestToken();
|
||||
if (!empty($accessToken)) {
|
||||
$this->_accessToken = $accessToken;
|
||||
$this->_client->setAccessToken($accessToken);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a parameter array for the track being uploaded to SoundCloud
|
||||
*
|
||||
* @param $file Application_Model_StoredFile the file being uploaded
|
||||
*
|
||||
* @return array the track array to send to SoundCloud
|
||||
*/
|
||||
protected function _getUploadData($file) {
|
||||
$file = $file->getPropelOrm();
|
||||
$trackArray = $this->_serializeTrack($file);
|
||||
foreach (self::$_SOUNDCLOUD_PREF_FUNCTIONS as $func => $param) {
|
||||
$val = Application_Model_Preference::$func();
|
||||
if (!empty($val)) {
|
||||
$trackArray[$param] = $val;
|
||||
}
|
||||
}
|
||||
|
||||
return $trackArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* Serialize Airtime file data to send to SoundCloud
|
||||
*
|
||||
* Ignores any null fields, as these will cause the upload to throw a 422
|
||||
* Unprocessable Entity error
|
||||
*
|
||||
* TODO: Move this into a proper serializer
|
||||
*
|
||||
* @param $file CcFiles file object
|
||||
*
|
||||
* @return array the serialized data
|
||||
*/
|
||||
protected function _serializeTrack($file) {
|
||||
$fileData = array(
|
||||
'title' => $file->getDbTrackTitle(),
|
||||
'genre' => $file->getDbGenre(),
|
||||
'bpm' => $file->getDbBpm(),
|
||||
'release_year' => $file->getDbYear(),
|
||||
);
|
||||
$trackArray = array();
|
||||
foreach ($fileData as $k => $v) {
|
||||
if (!empty($v)) {
|
||||
$trackArray[$k] = $v;
|
||||
}
|
||||
}
|
||||
return $trackArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a ThirdPartyTrackReferences object for a completed upload
|
||||
*
|
||||
* TODO: should we have a database layer class to handle Propel operations?
|
||||
*
|
||||
* @param $trackId int ThirdPartyTrackReferences identifier
|
||||
* @param $track object third-party service track object
|
||||
* @param $status string Celery task status
|
||||
*
|
||||
* @throws Exception
|
||||
* @throws PropelException
|
||||
*/
|
||||
public function updateTrackReference($trackId, $track, $status) {
|
||||
parent::updateTrackReference($trackId, $track, $status);
|
||||
$ref = ThirdPartyTrackReferencesQuery::create()
|
||||
->findOneByDbId($trackId);
|
||||
if (is_null($ref)) {
|
||||
$ref = new ThirdPartyTrackReferences();
|
||||
}
|
||||
$ref->setDbService(static::$_SERVICE_NAME);
|
||||
// Only set the SoundCloud fields if the task was successful
|
||||
if ($status == CELERY_SUCCESS_STATUS) {
|
||||
$utc = new DateTimeZone("UTC");
|
||||
$ref->setDbUploadTime(new DateTime("now", $utc));
|
||||
// TODO: fetch any additional SoundCloud parameters we want to store
|
||||
$ref->setDbForeignId($track->id); // SoundCloud identifier
|
||||
}
|
||||
// TODO: set SoundCloud upload status?
|
||||
// $ref->setDbStatus($status);
|
||||
$ref->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a CcFiles identifier for a file that's been uploaded to SoundCloud,
|
||||
* return a link to the remote file
|
||||
*
|
||||
* @param int $fileId the local CcFiles identifier
|
||||
*
|
||||
* @return string the link to the remote file
|
||||
*
|
||||
* @throws Soundcloud\Exception\InvalidHttpResponseCodeException when SoundCloud returns a 4xx/5xx response
|
||||
*/
|
||||
public function getLinkToFile($fileId) {
|
||||
$serviceId = $this->getServiceId($fileId);
|
||||
// If we don't find a record for the file we'll get 0 back for the id
|
||||
if ($serviceId == 0) { return ''; }
|
||||
try {
|
||||
$track = json_decode($this->_client->get('tracks/' . $serviceId));
|
||||
} catch (Soundcloud\Exception\InvalidHttpResponseCodeException $e) {
|
||||
// If we end up here it means the track was removed from SoundCloud
|
||||
// or the foreign id in our database is incorrect, so we should just
|
||||
// get rid of the database record
|
||||
Logging::warn("Error retrieving track data from SoundCloud: " . $e->getMessage());
|
||||
$this->removeTrackReference($fileId);
|
||||
throw $e; // Throw the exception up to the controller so we can redirect to a 404
|
||||
}
|
||||
return $track->permalink_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether an access token exists for the SoundCloud client
|
||||
*
|
||||
* @return bool true if an access token exists, otherwise false
|
||||
*/
|
||||
public function hasAccessToken() {
|
||||
return !empty($this->_accessToken);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the SoundCloud authorization URL
|
||||
*
|
||||
* @return string the authorization URL
|
||||
*/
|
||||
public function getAuthorizeUrl() {
|
||||
// Pass the current URL in the state parameter in order to preserve it
|
||||
// in the redirect. This allows us to create a singular script to redirect
|
||||
// back to any station the request comes from.
|
||||
$url = urlencode('http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['HTTP_HOST'].'/soundcloud/redirect');
|
||||
return $this->_client->getAuthorizeUrl(array("state" => $url, "scope" => "non-expiring"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Request a new access token from SoundCloud and store it in CcPref
|
||||
*
|
||||
* @param $code string exchange authorization code for access token
|
||||
*/
|
||||
public function requestNewAccessToken($code) {
|
||||
// Get a non-expiring access token
|
||||
$response = $this->_client->accessToken($code);
|
||||
$accessToken = $response['access_token'];
|
||||
Application_Model_Preference::setSoundCloudRequestToken($accessToken);
|
||||
$this->_accessToken = $accessToken;
|
||||
}
|
||||
|
||||
/**
|
||||
* Regenerate the SoundCloud client's access token
|
||||
*
|
||||
* @throws Soundcloud\Exception\InvalidHttpResponseCodeException
|
||||
* thrown when attempting to regenerate a stale token
|
||||
*/
|
||||
public function accessTokenRefresh() {
|
||||
assert($this->hasAccessToken());
|
||||
try {
|
||||
$accessToken = $this->_accessToken;
|
||||
$this->_client->accessTokenRefresh($accessToken);
|
||||
} catch(Soundcloud\Exception\InvalidHttpResponseCodeException $e) {
|
||||
// If we get here, then that means our token is stale, so remove it
|
||||
// Because we're using non-expiring tokens, we shouldn't get here (!)
|
||||
Application_Model_Preference::setSoundCloudRequestToken("");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,131 @@
|
|||
<?php
|
||||
|
||||
require_once "ThirdPartyService.php";
|
||||
|
||||
abstract class ThirdPartyCeleryService extends ThirdPartyService {
|
||||
|
||||
/**
|
||||
* @var string broker exchange name for third-party tasks
|
||||
*/
|
||||
protected static $_CELERY_EXCHANGE_NAME;
|
||||
|
||||
/**
|
||||
* @var string celery task name for third-party uploads
|
||||
*/
|
||||
protected static $_CELERY_UPLOAD_TASK_NAME;
|
||||
|
||||
/**
|
||||
* @var string celery task name for third-party deletion
|
||||
*/
|
||||
protected static $_CELERY_DELETE_TASK_NAME;
|
||||
|
||||
/**
|
||||
* Upload the file with the given identifier to a third-party service
|
||||
*
|
||||
* @param int $fileId the local CcFiles identifier
|
||||
*/
|
||||
public function upload($fileId) {
|
||||
$file = Application_Model_StoredFile::RecallById($fileId);
|
||||
$data = array(
|
||||
'data' => $this->_getUploadData($file),
|
||||
'token' => $this->_accessToken,
|
||||
'file_path' => $file->getFilePaths()[0]
|
||||
);
|
||||
try {
|
||||
$brokerTaskId = CeleryService::sendCeleryMessage(static::$_CELERY_UPLOAD_TASK_NAME,
|
||||
static::$_CELERY_EXCHANGE_NAME,
|
||||
$data);
|
||||
$this->_createTaskReference($fileId, $brokerTaskId, static::$_CELERY_UPLOAD_TASK_NAME);
|
||||
} catch (Exception $e) {
|
||||
Logging::info("Invalid request: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the file with the given identifier from a third-party service
|
||||
*
|
||||
* @param int $fileId the local CcFiles identifier
|
||||
*
|
||||
* @throws ServiceNotFoundException when a $fileId with no corresponding
|
||||
* service identifier is given
|
||||
*/
|
||||
public function delete($fileId) {
|
||||
$serviceId = $this->getServiceId($fileId);
|
||||
if ($serviceId == 0) {
|
||||
throw new ServiceNotFoundException("No service found for file with ID $fileId");
|
||||
}
|
||||
$data = array(
|
||||
'token' => $this->_accessToken,
|
||||
'track_id' => $serviceId
|
||||
);
|
||||
try {
|
||||
$brokerTaskId = CeleryService::sendCeleryMessage(static::$_CELERY_DELETE_TASK_NAME,
|
||||
static::$_CELERY_EXCHANGE_NAME,
|
||||
$data);
|
||||
$this->_createTaskReference($fileId, $brokerTaskId, static::$_CELERY_DELETE_TASK_NAME);
|
||||
} catch (Exception $e) {
|
||||
Logging::info("Invalid request: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a CeleryTasks object for a pending task
|
||||
* TODO: should we have a database layer class to handle Propel operations?
|
||||
*
|
||||
* @param $fileId int CcFiles identifier
|
||||
* @param $brokerTaskId int broker task identifier to so we can asynchronously
|
||||
* receive completed task messages
|
||||
* @param $taskName string broker task name
|
||||
*
|
||||
* @throws Exception
|
||||
* @throws PropelException
|
||||
*/
|
||||
protected function _createTaskReference($fileId, $brokerTaskId, $taskName) {
|
||||
$trackId = $this->createTrackReference($fileId);
|
||||
$task = new CeleryTasks();
|
||||
$task->setDbTaskId($brokerTaskId);
|
||||
$task->setDbName($taskName);
|
||||
$utc = new DateTimeZone("UTC");
|
||||
$task->setDbDispatchTime(new DateTime("now", $utc));
|
||||
$task->setDbStatus(CELERY_PENDING_STATUS);
|
||||
$task->setDbTrackReference($trackId);
|
||||
$task->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a CeleryTasks object for a completed upload
|
||||
* TODO: should we have a database layer class to handle Propel operations?
|
||||
*
|
||||
* @param $trackId int ThirdPartyTrackReferences identifier
|
||||
* @param $track object third-party service track object
|
||||
* @param $status string Celery task status
|
||||
*
|
||||
* @throws Exception
|
||||
* @throws PropelException
|
||||
*/
|
||||
public function updateTrackReference($trackId, $track, $status) {
|
||||
$task = CeleryTasksQuery::create()
|
||||
->findOneByDbTrackReference($trackId);
|
||||
$task->setDbStatus($status);
|
||||
$task->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Field accessor for $_CELERY_DELETE_TASK_NAME
|
||||
*
|
||||
* @return string the Celery task name for deleting tracks from this service
|
||||
*/
|
||||
public function getCeleryDeleteTaskName() {
|
||||
return static::$_CELERY_DELETE_TASK_NAME;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a parameter array for the file being uploaded to a third party service
|
||||
*
|
||||
* @param $file Application_Model_StoredFile the file being uploaded
|
||||
*
|
||||
* @return array the track array to send to the third party service
|
||||
*/
|
||||
abstract protected function _getUploadData($file);
|
||||
|
||||
}
|
|
@ -0,0 +1,149 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Class ServiceNotFoundException
|
||||
*/
|
||||
class ServiceNotFoundException extends Exception {}
|
||||
|
||||
/**
|
||||
* Class ThirdPartyService generic superclass for third-party services
|
||||
*/
|
||||
abstract class ThirdPartyService {
|
||||
|
||||
/**
|
||||
* @var string service access token for accessing third-party API
|
||||
*/
|
||||
protected $_accessToken;
|
||||
|
||||
/**
|
||||
* @var string service name to store in ThirdPartyTrackReferences database
|
||||
*/
|
||||
protected static $_SERVICE_NAME;
|
||||
|
||||
/**
|
||||
* @var string base URI for third-party tracks
|
||||
*/
|
||||
protected static $_THIRD_PARTY_TRACK_URI;
|
||||
|
||||
/**
|
||||
* Create a ThirdPartyTrackReferences object for a track that's been uploaded
|
||||
* to an external service
|
||||
* TODO: should we have a database layer class to handle Propel operations?
|
||||
*
|
||||
* @param $fileId int local CcFiles identifier
|
||||
*
|
||||
* @return string the new ThirdPartyTrackReferences identifier
|
||||
*
|
||||
* @throws Exception
|
||||
* @throws PropelException
|
||||
*/
|
||||
public function createTrackReference($fileId) {
|
||||
// First, check if the track already has an entry in the database
|
||||
$ref = ThirdPartyTrackReferencesQuery::create()
|
||||
->filterByDbService(static::$_SERVICE_NAME)
|
||||
->findOneByDbFileId($fileId);
|
||||
if (is_null($ref)) {
|
||||
$ref = new ThirdPartyTrackReferences();
|
||||
}
|
||||
$ref->setDbService(static::$_SERVICE_NAME);
|
||||
// TODO: implement service-specific statuses?
|
||||
// $ref->setDbStatus(CELERY_PENDING_STATUS);
|
||||
$ref->setDbFileId($fileId);
|
||||
$ref->save();
|
||||
return $ref->getDbId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a ThirdPartyTrackReferences from the database.
|
||||
* This is necessary if the track was removed from the service
|
||||
* or the foreign id in our database is incorrect
|
||||
*
|
||||
* @param $fileId int cc_files identifier
|
||||
*
|
||||
* @throws Exception
|
||||
* @throws PropelException
|
||||
*/
|
||||
public function removeTrackReference($fileId) {
|
||||
$ref = ThirdPartyTrackReferencesQuery::create()
|
||||
->filterByDbService(static::$_SERVICE_NAME)
|
||||
->findOneByDbFileId($fileId);
|
||||
$ref->delete();
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a CcFiles identifier for a file that's been uploaded to a third-party service,
|
||||
* return the third-party identifier for the remote file
|
||||
*
|
||||
* @param int $fileId the cc_files identifier
|
||||
*
|
||||
* @return string the service foreign identifier
|
||||
*/
|
||||
public function getServiceId($fileId) {
|
||||
$ref = ThirdPartyTrackReferencesQuery::create()
|
||||
->filterByDbService(static::$_SERVICE_NAME)
|
||||
->findOneByDbFileId($fileId); // There shouldn't be duplicates!
|
||||
return empty($ref) ? '' : $ref->getDbForeignId();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a reference exists for a given CcFiles identifier
|
||||
*
|
||||
* @param int $fileId the cc_files identifier
|
||||
*
|
||||
* @return string the service foreign identifier
|
||||
*/
|
||||
public function referenceExists($fileId) {
|
||||
$ref = ThirdPartyTrackReferencesQuery::create()
|
||||
->filterByDbService(static::$_SERVICE_NAME)
|
||||
->findOneByDbFileId($fileId); // There shouldn't be duplicates!
|
||||
if (!empty($ref)) {
|
||||
$task = CeleryTasksQuery::create()
|
||||
->findOneByDbTrackReference($ref->getDbId());
|
||||
return $task->getDbStatus() != CELERY_FAILED_STATUS;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a CcFiles identifier for a file that's been uploaded to a third-party service,
|
||||
* return a link to the remote file
|
||||
*
|
||||
* @param int $fileId the cc_files identifier
|
||||
*
|
||||
* @return string the link to the remote file
|
||||
*/
|
||||
public function getLinkToFile($fileId) {
|
||||
$serviceId = $this->getServiceId($fileId);
|
||||
return empty($serviceId) ? '' : static::$_THIRD_PARTY_TRACK_URI . $serviceId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Upload the file with the given identifier to a third-party service
|
||||
*
|
||||
* @param int $fileId the cc_files identifier
|
||||
*/
|
||||
abstract function upload($fileId);
|
||||
|
||||
/**
|
||||
* Delete the file with the given identifier from a third-party service
|
||||
*
|
||||
* @param int $fileId the cc_files identifier
|
||||
*
|
||||
* @throws ServiceNotFoundException when a $fileId with no corresponding
|
||||
* service identifier is given
|
||||
*/
|
||||
abstract function delete($fileId);
|
||||
|
||||
/**
|
||||
* Update a ThirdPartyTrackReferences object for a completed task
|
||||
*
|
||||
* @param $trackId int ThirdPartyTrackReferences identifier
|
||||
* @param $track object third-party service track object
|
||||
* @param $status string Celery task status
|
||||
*
|
||||
* @throws Exception
|
||||
* @throws PropelException
|
||||
*/
|
||||
abstract function updateTrackReference($trackId, $track, $status);
|
||||
|
||||
}
|
|
@ -1,69 +1,137 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Check if a given classname belongs to a subclass of AirtimeUpgrader
|
||||
*
|
||||
* @param $c string class name
|
||||
*
|
||||
* @return bool true if the $c is a subclass of AirtimeUpgrader
|
||||
*/
|
||||
function isUpgrade($c) {
|
||||
return is_subclass_of($c, "AirtimeUpgrader");
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter all declared classes to get all upgrade classes dynamically
|
||||
*
|
||||
* @return array all upgrade classes
|
||||
*/
|
||||
function getUpgrades() {
|
||||
return array_filter(get_declared_classes(), "isUpgrade");
|
||||
}
|
||||
|
||||
class UpgradeManager
|
||||
{
|
||||
/** Used to determine if the database schema needs an upgrade in order for this version of the Airtime codebase to work correctly.
|
||||
|
||||
/**
|
||||
* Used to determine if the database schema needs an upgrade in order for this version of the Airtime codebase to work correctly.
|
||||
* @return array A list of schema versions that this version of the codebase supports.
|
||||
*/
|
||||
public static function getSupportedSchemaVersions()
|
||||
{
|
||||
//What versions of the schema does the code support today:
|
||||
return array('2.5.12');
|
||||
return array(AIRTIME_CODE_VERSION);
|
||||
}
|
||||
|
||||
public static function checkIfUpgradeIsNeeded()
|
||||
{
|
||||
$schemaVersion = Application_Model_Preference::GetSchemaVersion();
|
||||
$supportedSchemaVersions = self::getSupportedSchemaVersions();
|
||||
$upgradeNeeded = !in_array($schemaVersion, $supportedSchemaVersions);
|
||||
return !in_array($schemaVersion, $supportedSchemaVersions);
|
||||
// We shouldn't run the upgrade as a side-effect of this function!
|
||||
/*
|
||||
if ($upgradeNeeded) {
|
||||
self::doUpgrade();
|
||||
}
|
||||
}
|
||||
|
||||
public static function doUpgrade()
|
||||
{
|
||||
$upgradeManager = new UpgradeManager();
|
||||
$upgraders = array();
|
||||
array_push($upgraders, new AirtimeUpgrader253());
|
||||
array_push($upgraders, new AirtimeUpgrader254());
|
||||
array_push($upgraders, new AirtimeUpgrader255());
|
||||
array_push($upgraders, new AirtimeUpgrader259());
|
||||
array_push($upgraders, new AirtimeUpgrader2510());
|
||||
array_push($upgraders, new AirtimeUpgrader2511());
|
||||
array_push($upgraders, new AirtimeUpgrader2512());
|
||||
return $upgradeManager->runUpgrades($upgraders, (dirname(__DIR__) . "/controllers"));
|
||||
*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Run a given set of upgrades
|
||||
*
|
||||
* @param array $upgraders the upgrades to perform
|
||||
* @param string $dir the directory containing the upgrade sql
|
||||
* Upgrade the Airtime schema version to match the highest supported version
|
||||
*
|
||||
* @return boolean whether or not an upgrade was performed
|
||||
*/
|
||||
public function runUpgrades($upgraders, $dir) {
|
||||
public static function doUpgrade()
|
||||
{
|
||||
// Get all upgrades dynamically (in declaration order!) so we don't have to add them explicitly each time
|
||||
// TODO: explicitly sort classnames by ascending version suffix for safety
|
||||
$upgraders = getUpgrades();
|
||||
$dir = (dirname(__DIR__) . "/controllers");
|
||||
$upgradePerformed = false;
|
||||
|
||||
for($i = 0; $i < count($upgraders); $i++) {
|
||||
$upgrader = $upgraders[$i];
|
||||
if ($upgrader->checkIfUpgradeSupported()) {
|
||||
// pass the given directory to the upgrades, since __DIR__ returns parent dir of file, not executor
|
||||
$upgrader->upgrade($dir); // This will throw an exception if the upgrade fails.
|
||||
$upgradePerformed = true;
|
||||
$i = 0; // Start over, in case the upgrade handlers are not in ascending order.
|
||||
}
|
||||
|
||||
foreach ($upgraders as $upgrader) {
|
||||
$upgradePerformed = self::_runUpgrade(new $upgrader($dir)) ? true : $upgradePerformed;
|
||||
}
|
||||
|
||||
|
||||
return $upgradePerformed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Downgrade the Airtime schema version to match the given version
|
||||
*
|
||||
* @param string $toVersion the version we want to downgrade to
|
||||
*
|
||||
* @return boolean whether or not an upgrade was performed
|
||||
*/
|
||||
public static function doDowngrade($toVersion)
|
||||
{
|
||||
$downgraders = array_reverse(getUpgrades()); // Reverse the array because we're downgrading
|
||||
$dir = (dirname(__DIR__) . "/controllers");
|
||||
$downgradePerformed = false;
|
||||
|
||||
foreach ($downgraders as $downgrader) {
|
||||
/** @var AirtimeUpgrader $downgrader */
|
||||
$downgrader = new $downgrader($dir);
|
||||
if ($downgrader->getNewVersion() == $toVersion) {
|
||||
break; // We've reached the version we wanted to downgrade to, so break
|
||||
}
|
||||
$downgradePerformed = self::_runDowngrade($downgrader) ? true : $downgradePerformed;
|
||||
}
|
||||
|
||||
return $downgradePerformed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the given upgrade
|
||||
*
|
||||
* @param $upgrader AirtimeUpgrader the upgrader class to be executed
|
||||
*
|
||||
* @return bool true if the upgrade was successful, otherwise false
|
||||
*/
|
||||
private static function _runUpgrade(AirtimeUpgrader $upgrader) {
|
||||
return $upgrader->checkIfUpgradeSupported() && $upgrader->upgrade();
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the given downgrade
|
||||
*
|
||||
* @param $downgrader AirtimeUpgrader the upgrader class to be executed
|
||||
* @param $supportedVersions array array of supported versions
|
||||
*
|
||||
* @return bool true if the downgrade was successful, otherwise false
|
||||
*/
|
||||
private static function _runDowngrade(AirtimeUpgrader $downgrader) {
|
||||
return $downgrader->checkIfDowngradeSupported() && $downgrader->downgrade();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
abstract class AirtimeUpgrader
|
||||
{
|
||||
protected $_dir;
|
||||
|
||||
protected $username, $password, $host, $database;
|
||||
|
||||
/**
|
||||
* @param $dir string directory housing upgrade files
|
||||
*/
|
||||
public function __construct($dir) {
|
||||
$this->_dir = $dir;
|
||||
}
|
||||
|
||||
/** Schema versions that this upgrader class can upgrade from (an array of version strings). */
|
||||
abstract protected function getSupportedSchemaVersions();
|
||||
|
||||
/** The schema version that this upgrader class will upgrade to. (returns a version string) */
|
||||
abstract public function getNewVersion();
|
||||
|
||||
|
@ -71,19 +139,26 @@ abstract class AirtimeUpgrader
|
|||
{
|
||||
return Application_Model_Preference::GetSchemaVersion();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
/**
|
||||
* This function checks to see if this class can perform an upgrade of your version of Airtime
|
||||
* @return boolean True if we can upgrade your version of Airtime.
|
||||
*/
|
||||
public function checkIfUpgradeSupported()
|
||||
{
|
||||
if (!in_array(AirtimeUpgrader::getCurrentSchemaVersion(), $this->getSupportedSchemaVersions())) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
{
|
||||
return in_array(static::getCurrentSchemaVersion(), $this->getSupportedSchemaVersions());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This function checks to see if this class can perform a downgrade of your version of Airtime
|
||||
*
|
||||
* @return boolean True if we can downgrade your version of Airtime.
|
||||
*/
|
||||
public function checkIfDowngradeSupported()
|
||||
{
|
||||
return static::getCurrentSchemaVersion() == $this->getNewVersion();
|
||||
}
|
||||
|
||||
protected function toggleMaintenanceScreen($toggle)
|
||||
{
|
||||
if ($toggle)
|
||||
|
@ -105,9 +180,86 @@ abstract class AirtimeUpgrader
|
|||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
/** Implement this for each new version of Airtime */
|
||||
abstract public function upgrade();
|
||||
|
||||
/**
|
||||
* Implement this for each new version of Airtime
|
||||
* This function abstracts out the core upgrade functionality,
|
||||
* allowing child classes to overwrite _runUpgrade to reduce duplication
|
||||
*/
|
||||
public function upgrade() {
|
||||
Cache::clear();
|
||||
assert($this->checkIfUpgradeSupported());
|
||||
|
||||
try {
|
||||
// $this->toggleMaintenanceScreen(true);
|
||||
Cache::clear();
|
||||
|
||||
$this->_getDbValues();
|
||||
$this->_runUpgrade();
|
||||
|
||||
Application_Model_Preference::SetSchemaVersion($this->getNewVersion());
|
||||
Cache::clear();
|
||||
|
||||
// $this->toggleMaintenanceScreen(false);
|
||||
} catch(Exception $e) {
|
||||
// $this->toggleMaintenanceScreen(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implement this for each new version of Airtime
|
||||
* This function abstracts out the core downgrade functionality,
|
||||
* allowing child classes to overwrite _runDowngrade to reduce duplication
|
||||
*/
|
||||
public function downgrade() {
|
||||
Cache::clear();
|
||||
|
||||
try {
|
||||
$this->_getDbValues();
|
||||
$this->_runDowngrade();
|
||||
|
||||
$highestSupportedVersion = null;
|
||||
foreach ($this->getSupportedSchemaVersions() as $v) {
|
||||
// version_compare returns 1 (true) if the second parameter is lower
|
||||
if (!$highestSupportedVersion || version_compare($v, $highestSupportedVersion)) {
|
||||
$highestSupportedVersion = $v;
|
||||
}
|
||||
}
|
||||
|
||||
// Set the schema version to the highest supported version so we don't skip versions when downgrading
|
||||
Application_Model_Preference::SetSchemaVersion($highestSupportedVersion);
|
||||
|
||||
Cache::clear();
|
||||
} catch(Exception $e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
protected function _getDbValues() {
|
||||
$airtimeConf = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf";
|
||||
$values = parse_ini_file($airtimeConf, true);
|
||||
|
||||
$this->username = $values['database']['dbuser'];
|
||||
$this->password = $values['database']['dbpass'];
|
||||
$this->host = $values['database']['host'];
|
||||
$this->database = $values['database']['dbname'];
|
||||
}
|
||||
|
||||
protected function _runUpgrade() {
|
||||
passthru("export PGPASSWORD=".$this->password." && psql -h ".$this->host." -U ".$this->username." -q -f ".$this->_dir."/upgrade_sql/airtime_"
|
||||
.$this->getNewVersion()."/upgrade.sql ".$this->database." 2>&1 | grep -v -E \"will create implicit sequence|will create implicit index\"");
|
||||
}
|
||||
|
||||
protected function _runDowngrade() {
|
||||
passthru("export PGPASSWORD=".$this->password." && psql -h ".$this->host." -U ".$this->username." -q -f ".$this->_dir."/downgrade_sql/airtime_"
|
||||
.$this->getNewVersion()."/downgrade.sql ".$this->database." 2>&1 | grep -v -E \"will create implicit sequence|will create implicit index\"");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class AirtimeUpgrader253 extends AirtimeUpgrader
|
||||
|
@ -121,60 +273,17 @@ class AirtimeUpgrader253 extends AirtimeUpgrader
|
|||
{
|
||||
return '2.5.3';
|
||||
}
|
||||
|
||||
public function upgrade($dir = __DIR__)
|
||||
{
|
||||
Cache::clear();
|
||||
assert($this->checkIfUpgradeSupported());
|
||||
|
||||
$con = Propel::getConnection();
|
||||
$con->beginTransaction();
|
||||
try {
|
||||
|
||||
$this->toggleMaintenanceScreen(true);
|
||||
Cache::clear();
|
||||
|
||||
//Begin upgrade
|
||||
|
||||
//Update disk_usage value in cc_pref
|
||||
$musicDir = CcMusicDirsQuery::create()
|
||||
->filterByType('stor')
|
||||
->filterByExists(true)
|
||||
->findOne();
|
||||
$storPath = $musicDir->getDirectory();
|
||||
|
||||
//Update disk_usage value in cc_pref
|
||||
$storDir = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."srv/airtime/stor" : "/srv/airtime/stor";
|
||||
$diskUsage = shell_exec("du -sb $storDir | awk '{print $1}'");
|
||||
|
||||
Application_Model_Preference::setDiskUsage($diskUsage);
|
||||
|
||||
//clear out the cache
|
||||
Cache::clear();
|
||||
|
||||
$con->commit();
|
||||
|
||||
//update system_version in cc_pref and change some columns in cc_files
|
||||
$airtimeConf = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf";
|
||||
$values = parse_ini_file($airtimeConf, true);
|
||||
|
||||
$username = $values['database']['dbuser'];
|
||||
$password = $values['database']['dbpass'];
|
||||
$host = $values['database']['host'];
|
||||
$database = $values['database']['dbname'];
|
||||
|
||||
passthru("export PGPASSWORD=$password && psql -h $host -U $username -q -f $dir/upgrade_sql/airtime_".$this->getNewVersion()."/upgrade.sql $database 2>&1 | grep -v -E \"will create implicit sequence|will create implicit index\"");
|
||||
Application_Model_Preference::SetSchemaVersion($this->getNewVersion());
|
||||
|
||||
//clear out the cache
|
||||
Cache::clear();
|
||||
|
||||
$this->toggleMaintenanceScreen(false);
|
||||
|
||||
} catch (Exception $e) {
|
||||
$con->rollback();
|
||||
$this->toggleMaintenanceScreen(false);
|
||||
}
|
||||
protected function _runUpgrade()
|
||||
{
|
||||
//Update disk_usage value in cc_pref
|
||||
$storDir = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."srv/airtime/stor" : "/srv/airtime/stor";
|
||||
$diskUsage = shell_exec("du -sb $storDir | awk '{print $1}'");
|
||||
|
||||
Application_Model_Preference::setDiskUsage($diskUsage);
|
||||
|
||||
//update system_version in cc_pref and change some columns in cc_files
|
||||
parent::_runUpgrade();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -189,78 +298,49 @@ class AirtimeUpgrader254 extends AirtimeUpgrader
|
|||
return '2.5.4';
|
||||
}
|
||||
|
||||
public function upgrade()
|
||||
protected function _runUpgrade()
|
||||
{
|
||||
Cache::clear();
|
||||
|
||||
assert($this->checkIfUpgradeSupported());
|
||||
|
||||
$newVersion = $this->getNewVersion();
|
||||
|
||||
$con = Propel::getConnection();
|
||||
//$con->beginTransaction();
|
||||
try {
|
||||
$this->toggleMaintenanceScreen(true);
|
||||
Cache::clear();
|
||||
|
||||
//Begin upgrade
|
||||
|
||||
//First, ensure there are no superadmins already.
|
||||
$numberOfSuperAdmins = CcSubjsQuery::create()
|
||||
//First, ensure there are no superadmins already.
|
||||
$numberOfSuperAdmins = CcSubjsQuery::create()
|
||||
->filterByDbType(UTYPE_SUPERADMIN)
|
||||
->filterByDbLogin("sourcefabric_admin", Criteria::NOT_EQUAL) //Ignore sourcefabric_admin users
|
||||
->count();
|
||||
|
||||
//Only create a super admin if there isn't one already.
|
||||
if ($numberOfSuperAdmins == 0)
|
||||
{
|
||||
//Find the "admin" user and promote them to superadmin.
|
||||
$adminUser = CcSubjsQuery::create()
|
||||
|
||||
//Only create a super admin if there isn't one already.
|
||||
if ($numberOfSuperAdmins == 0)
|
||||
{
|
||||
//Find the "admin" user and promote them to superadmin.
|
||||
$adminUser = CcSubjsQuery::create()
|
||||
->filterByDbLogin('admin')
|
||||
->findOne();
|
||||
if (!$adminUser)
|
||||
{
|
||||
//TODO: Otherwise get the user with the lowest ID that is of type administrator:
|
||||
//
|
||||
$adminUser = CcSubjsQuery::create()
|
||||
if (!$adminUser)
|
||||
{
|
||||
// Otherwise get the user with the lowest ID that is of type administrator:
|
||||
$adminUser = CcSubjsQuery::create()
|
||||
->filterByDbType(UTYPE_ADMIN)
|
||||
->orderByDbId(Criteria::ASC)
|
||||
->findOne();
|
||||
|
||||
if (!$adminUser) {
|
||||
throw new Exception("Failed to find any users of type 'admin' ('A').");
|
||||
}
|
||||
}
|
||||
|
||||
$adminUser = new Application_Model_User($adminUser->getDbId());
|
||||
$adminUser->setType(UTYPE_SUPERADMIN);
|
||||
$adminUser->save();
|
||||
Logging::info($_SERVER['HTTP_HOST'] . ': ' . $newVersion . " Upgrade: Promoted user " . $adminUser->getLogin() . " to be a Super Admin.");
|
||||
|
||||
//Also try to promote the sourcefabric_admin user
|
||||
$sofabAdminUser = CcSubjsQuery::create()
|
||||
->filterByDbLogin('sourcefabric_admin')
|
||||
->findOne();
|
||||
if ($sofabAdminUser) {
|
||||
$sofabAdminUser = new Application_Model_User($sofabAdminUser->getDbId());
|
||||
$sofabAdminUser->setType(UTYPE_SUPERADMIN);
|
||||
$sofabAdminUser->save();
|
||||
Logging::info($_SERVER['HTTP_HOST'] . ': ' . $newVersion . " Upgrade: Promoted user " . $sofabAdminUser->getLogin() . " to be a Super Admin.");
|
||||
|
||||
if (!$adminUser) {
|
||||
throw new Exception("Failed to find any users of type 'admin' ('A').");
|
||||
}
|
||||
}
|
||||
|
||||
//$con->commit();
|
||||
Application_Model_Preference::SetSchemaVersion($newVersion);
|
||||
Cache::clear();
|
||||
|
||||
$this->toggleMaintenanceScreen(false);
|
||||
|
||||
return true;
|
||||
|
||||
} catch(Exception $e) {
|
||||
//$con->rollback();
|
||||
$this->toggleMaintenanceScreen(false);
|
||||
throw $e;
|
||||
|
||||
$adminUser = new Application_Model_User($adminUser->getDbId());
|
||||
$adminUser->setType(UTYPE_SUPERADMIN);
|
||||
$adminUser->save();
|
||||
Logging::info($_SERVER['HTTP_HOST'] . ': ' . $this->getNewVersion() . " Upgrade: Promoted user " . $adminUser->getLogin() . " to be a Super Admin.");
|
||||
|
||||
//Also try to promote the sourcefabric_admin user
|
||||
$sofabAdminUser = CcSubjsQuery::create()
|
||||
->filterByDbLogin('sourcefabric_admin')
|
||||
->findOne();
|
||||
if ($sofabAdminUser) {
|
||||
$sofabAdminUser = new Application_Model_User($sofabAdminUser->getDbId());
|
||||
$sofabAdminUser->setType(UTYPE_SUPERADMIN);
|
||||
$sofabAdminUser->save();
|
||||
Logging::info($_SERVER['HTTP_HOST'] . ': ' . $this->getNewVersion() . " Upgrade: Promoted user " . $sofabAdminUser->getLogin() . " to be a Super Admin.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -275,40 +355,6 @@ class AirtimeUpgrader255 extends AirtimeUpgrader {
|
|||
public function getNewVersion() {
|
||||
return '2.5.5';
|
||||
}
|
||||
|
||||
public function upgrade($dir = __DIR__) {
|
||||
Cache::clear();
|
||||
assert($this->checkIfUpgradeSupported());
|
||||
|
||||
$newVersion = $this->getNewVersion();
|
||||
|
||||
try {
|
||||
$this->toggleMaintenanceScreen(true);
|
||||
Cache::clear();
|
||||
|
||||
// Begin upgrade
|
||||
$airtimeConf = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf";
|
||||
$values = parse_ini_file($airtimeConf, true);
|
||||
|
||||
$username = $values['database']['dbuser'];
|
||||
$password = $values['database']['dbpass'];
|
||||
$host = $values['database']['host'];
|
||||
$database = $values['database']['dbname'];
|
||||
|
||||
passthru("export PGPASSWORD=$password && psql -h $host -U $username -q -f $dir/upgrade_sql/airtime_"
|
||||
.$this->getNewVersion()."/upgrade.sql $database 2>&1 | grep -v -E \"will create implicit sequence|will create implicit index\"");
|
||||
|
||||
Application_Model_Preference::SetSchemaVersion($newVersion);
|
||||
Cache::clear();
|
||||
|
||||
$this->toggleMaintenanceScreen(false);
|
||||
|
||||
return true;
|
||||
} catch(Exception $e) {
|
||||
$this->toggleMaintenanceScreen(false);
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class AirtimeUpgrader259 extends AirtimeUpgrader {
|
||||
|
@ -321,38 +367,6 @@ class AirtimeUpgrader259 extends AirtimeUpgrader {
|
|||
public function getNewVersion() {
|
||||
return '2.5.9';
|
||||
}
|
||||
|
||||
public function upgrade($dir = __DIR__) {
|
||||
Cache::clear();
|
||||
assert($this->checkIfUpgradeSupported());
|
||||
|
||||
$newVersion = $this->getNewVersion();
|
||||
|
||||
try {
|
||||
$this->toggleMaintenanceScreen(true);
|
||||
Cache::clear();
|
||||
|
||||
// Begin upgrade
|
||||
$airtimeConf = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf";
|
||||
$values = parse_ini_file($airtimeConf, true);
|
||||
|
||||
$username = $values['database']['dbuser'];
|
||||
$password = $values['database']['dbpass'];
|
||||
$host = $values['database']['host'];
|
||||
$database = $values['database']['dbname'];
|
||||
|
||||
passthru("export PGPASSWORD=$password && psql -h $host -U $username -q -f $dir/upgrade_sql/airtime_"
|
||||
.$this->getNewVersion()."/upgrade.sql $database 2>&1 | grep -v -E \"will create implicit sequence|will create implicit index\"");
|
||||
|
||||
Application_Model_Preference::SetSchemaVersion($newVersion);
|
||||
Cache::clear();
|
||||
|
||||
$this->toggleMaintenanceScreen(false);
|
||||
} catch(Exception $e) {
|
||||
$this->toggleMaintenanceScreen(false);
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class AirtimeUpgrader2510 extends AirtimeUpgrader
|
||||
|
@ -366,38 +380,6 @@ class AirtimeUpgrader2510 extends AirtimeUpgrader
|
|||
public function getNewVersion() {
|
||||
return '2.5.10';
|
||||
}
|
||||
|
||||
public function upgrade($dir = __DIR__) {
|
||||
Cache::clear();
|
||||
assert($this->checkIfUpgradeSupported());
|
||||
|
||||
$newVersion = $this->getNewVersion();
|
||||
|
||||
try {
|
||||
$this->toggleMaintenanceScreen(true);
|
||||
Cache::clear();
|
||||
|
||||
// Begin upgrade
|
||||
$airtimeConf = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf";
|
||||
$values = parse_ini_file($airtimeConf, true);
|
||||
|
||||
$username = $values['database']['dbuser'];
|
||||
$password = $values['database']['dbpass'];
|
||||
$host = $values['database']['host'];
|
||||
$database = $values['database']['dbname'];
|
||||
|
||||
passthru("export PGPASSWORD=$password && psql -h $host -U $username -q -f $dir/upgrade_sql/airtime_"
|
||||
.$this->getNewVersion()."/upgrade.sql $database 2>&1 | grep -v -E \"will create implicit sequence|will create implicit index\"");
|
||||
|
||||
Application_Model_Preference::SetSchemaVersion($newVersion);
|
||||
Cache::clear();
|
||||
|
||||
$this->toggleMaintenanceScreen(false);
|
||||
} catch(Exception $e) {
|
||||
$this->toggleMaintenanceScreen(false);
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class AirtimeUpgrader2511 extends AirtimeUpgrader
|
||||
|
@ -412,35 +394,13 @@ class AirtimeUpgrader2511 extends AirtimeUpgrader
|
|||
return '2.5.11';
|
||||
}
|
||||
|
||||
public function upgrade($dir = __DIR__) {
|
||||
Cache::clear();
|
||||
assert($this->checkIfUpgradeSupported());
|
||||
|
||||
$newVersion = $this->getNewVersion();
|
||||
|
||||
try {
|
||||
$this->toggleMaintenanceScreen(true);
|
||||
Cache::clear();
|
||||
|
||||
// Begin upgrade
|
||||
$queryResult = CcFilesQuery::create()
|
||||
->select(array('disk_usage'))
|
||||
->withColumn('SUM(CcFiles.filesize)', 'disk_usage')
|
||||
->find();
|
||||
$disk_usage = $queryResult[0];
|
||||
Application_Model_Preference::setDiskUsage($disk_usage);
|
||||
|
||||
Application_Model_Preference::SetSchemaVersion($newVersion);
|
||||
Cache::clear();
|
||||
|
||||
$this->toggleMaintenanceScreen(false);
|
||||
} catch(Exception $e) {
|
||||
$this->toggleMaintenanceScreen(false);
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
public function downgrade() {
|
||||
|
||||
protected function _runUpgrade() {
|
||||
$queryResult = CcFilesQuery::create()
|
||||
->select(array('disk_usage'))
|
||||
->withColumn('SUM(CcFiles.filesize)', 'disk_usage')
|
||||
->find();
|
||||
$disk_usage = $queryResult[0];
|
||||
Application_Model_Preference::setDiskUsage($disk_usage);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -456,39 +416,42 @@ class AirtimeUpgrader2512 extends AirtimeUpgrader
|
|||
public function getNewVersion() {
|
||||
return '2.5.12';
|
||||
}
|
||||
}
|
||||
|
||||
public function upgrade($dir = __DIR__) {
|
||||
Cache::clear();
|
||||
assert($this->checkIfUpgradeSupported());
|
||||
|
||||
$newVersion = $this->getNewVersion();
|
||||
|
||||
try {
|
||||
$this->toggleMaintenanceScreen(true);
|
||||
Cache::clear();
|
||||
|
||||
// Begin upgrade
|
||||
$airtimeConf = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf";
|
||||
$values = parse_ini_file($airtimeConf, true);
|
||||
|
||||
$username = $values['database']['dbuser'];
|
||||
$password = $values['database']['dbpass'];
|
||||
$host = $values['database']['host'];
|
||||
$database = $values['database']['dbname'];
|
||||
|
||||
passthru("export PGPASSWORD=$password && psql -h $host -U $username -q -f $dir/upgrade_sql/airtime_"
|
||||
.$this->getNewVersion()."/upgrade.sql $database 2>&1 | grep -v -E \"will create implicit sequence|will create implicit index\"");
|
||||
|
||||
Application_Model_Preference::SetSchemaVersion($newVersion);
|
||||
Cache::clear();
|
||||
|
||||
$this->toggleMaintenanceScreen(false);
|
||||
} catch(Exception $e) {
|
||||
$this->toggleMaintenanceScreen(false);
|
||||
throw $e;
|
||||
}
|
||||
/**
|
||||
* Class AirtimeUpgrader2513 - Celery and SoundCloud upgrade
|
||||
*
|
||||
* Adds third_party_track_references and celery_tasks tables for third party service
|
||||
* authentication and task architecture.
|
||||
*
|
||||
* <br/><b>third_party_track_references</b> schema:
|
||||
*
|
||||
* id -> int PK
|
||||
* service -> string internal service name
|
||||
* foreign_id -> int external unique service id
|
||||
* file_id -> int internal FK->cc_files track id
|
||||
* upload_time -> timestamp internal upload timestamp
|
||||
* status -> string external service status
|
||||
*
|
||||
* <br/><b>celery_tasks</b> schema:
|
||||
*
|
||||
* id -> int PK
|
||||
* task_id -> string external unique amqp results identifier
|
||||
* track_reference -> int internal FK->third_party_track_references id
|
||||
* name -> string external Celery task name
|
||||
* dispatch_time -> timestamp internal message dispatch time
|
||||
* status -> string external Celery task status
|
||||
*
|
||||
*/
|
||||
class AirtimeUpgrader2513 extends AirtimeUpgrader
|
||||
{
|
||||
protected function getSupportedSchemaVersions() {
|
||||
return array (
|
||||
'2.5.12'
|
||||
);
|
||||
}
|
||||
public function downgrade() {
|
||||
|
||||
public function getNewVersion() {
|
||||
return '2.5.13';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN";
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title><?php echo _("An error has occurred.") ?></title>
|
||||
<?php echo $this->headLink(); ?>
|
||||
</head>
|
||||
<body>
|
||||
<div class="error-content" id="error-404">
|
||||
<h2><?php echo _("Page not found!")?></h2>
|
||||
<p><?php echo _("We couldn't find the page you were looking for.")?></p>
|
||||
<div class="button-bar">
|
||||
<a class="toggle-button" href="<?php echo $this->baseUrl('dashboard/help'); ?>"><?php echo _("Help") ?></a>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -8,11 +8,14 @@
|
|||
<?php echo $this->element->getSubform('preferences_tunein') ?>
|
||||
</div>
|
||||
|
||||
<h3 class="collapsible-header" id="soundcloud-heading"><span class="arrow-icon"></span><?php echo _("SoundCloud Settings") ?></h3>
|
||||
<div class="collapsible-content" id="soundcloud-settings">
|
||||
<?php echo $this->element->getSubform('preferences_soundcloud') ?>
|
||||
</div>
|
||||
|
||||
<?php //No soundcloud stuff on Airtime Pro -- Albert ?>
|
||||
|
||||
<h3 class="collapsible-header" id="dangerous-heading"><span class="arrow-icon"></span><?php echo _("Dangerous Options") ?></h3>
|
||||
<div class="collapsible-content" id="dangerous-settings">
|
||||
<!-- Hide the 'dangerous settings' by default -->
|
||||
<h3 class="collapsible-header closed" id="dangerous-heading"><span class="arrow-icon"></span><?php echo _("Dangerous Options") ?></h3>
|
||||
<div class="collapsible-content" id="dangerous-settings" style="display:none;">
|
||||
<?php echo $this->element->getSubform('preferences_danger') ?>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -37,7 +37,5 @@
|
|||
|
||||
<?php echo $this->element->getElement('thirdPartyApi')->render() ?>
|
||||
|
||||
<?php echo $this->element->getElement('widgetCode')->render() ?>
|
||||
|
||||
</dl>
|
||||
</fieldset>
|
||||
|
|
|
@ -1,112 +1,16 @@
|
|||
<fieldset class="padded">
|
||||
<dl class="zend_form">
|
||||
<dd id="UploadToSoundcloudOption-element" class="block-display" style=" margin:6px 0 10px 0">
|
||||
<label class="optional" for="UploadToSoundcloudOption">
|
||||
<?php echo $this->element->getElement('UploadToSoundcloudOption') ?>
|
||||
<strong><?php echo $this->element->getElement('UploadToSoundcloudOption')->getLabel() ?></strong>
|
||||
</label>
|
||||
<?php if($this->element->getElement('UploadToSoundcloudOption')->hasErrors()) : ?>
|
||||
<ul class='errors'>
|
||||
<?php foreach($this->element->getElement('UploadToSoundcloudOption')->getMessages() as $error): ?>
|
||||
<li><?php echo $error; ?></li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
</dd>
|
||||
<dd id="SoundCloudDownloadbleOption-element" class="block-display" style="padding-left:20px; margin:6px 0 10px 0">
|
||||
<label class="optional" for="SoundCloudDownloadbleOption">
|
||||
<?php echo $this->element->getElement('SoundCloudDownloadbleOption') ?>
|
||||
<strong><?php echo $this->element->getElement('SoundCloudDownloadbleOption')->getLabel() ?></strong>
|
||||
</label>
|
||||
<?php if($this->element->getElement('SoundCloudDownloadbleOption')->hasErrors()) : ?>
|
||||
<ul class='errors'>
|
||||
<?php foreach($this->element->getElement('SoundCloudDownloadbleOption')->getMessages() as $error): ?>
|
||||
<li><?php echo $error; ?></li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
</dd>
|
||||
<dt id="SoundCloudUser-label" class="block-display">
|
||||
<label class="optional" for="SoundCloudUser"><?php echo $this->element->getElement('SoundCloudUser')->getLabel() ?>
|
||||
<span class="info-text-small"><?php echo _("(Required)")?></span> :
|
||||
</label>
|
||||
</dt>
|
||||
<dd id="SoundCloudUser-element" class="block-display">
|
||||
<?php echo $this->element->getElement('SoundCloudUser') ?>
|
||||
<?php if($this->element->getElement('SoundCloudUser')->hasErrors()) : ?>
|
||||
<ul class='errors'>
|
||||
<?php foreach($this->element->getElement('SoundCloudUser')->getMessages() as $error): ?>
|
||||
<li><?php echo $error; ?></li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
</dd>
|
||||
<dt id="SoundCloudPassword-label" class="block-display">
|
||||
<label class="optional" for="SoundCloudPassword"><?php echo $this->element->getElement('SoundCloudPassword')->getLabel() ?>
|
||||
<span class="info-text-small"><?php echo _("(Required)")?></span> :
|
||||
</label>
|
||||
</dt>
|
||||
<dd id="SoundCloudPassword-element" class="block-display">
|
||||
<?php echo $this->element->getElement('SoundCloudPassword') ?>
|
||||
<?php if($this->element->getElement('SoundCloudPassword')->hasErrors()) : ?>
|
||||
<ul class='errors'>
|
||||
<?php foreach($this->element->getElement('SoundCloudPassword')->getMessages() as $error): ?>
|
||||
<li><?php echo $error; ?></li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
</dd>
|
||||
<dt id="SoundCloudTags-label" class="block-display">
|
||||
<label class="optional" for="SoundCloudTags"><?php echo $this->element->getElement('SoundCloudTags')->getLabel() ?></label>
|
||||
</dt>
|
||||
<dd id="SoundCloudTags-element" class="block-display clearfix">
|
||||
<?php echo $this->element->getElement('SoundCloudTags') ?>
|
||||
<?php if($this->element->getElement('SoundCloudTags')->hasErrors()) : ?>
|
||||
<ul class='errors'>
|
||||
<?php foreach($this->element->getElement('SoundCloudTags')->getMessages() as $error): ?>
|
||||
<li><?php echo $error; ?></li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
</dd>
|
||||
<dt id="SoundCloudGenre-label" class="block-display">
|
||||
<label class="optional" for="SoundCloudGenre"><?php echo $this->element->getElement('SoundCloudGenre')->getLabel() ?></label>
|
||||
</dt>
|
||||
<dd id="SoundCloudGenre-element" class="block-display">
|
||||
<?php echo $this->element->getElement('SoundCloudGenre') ?>
|
||||
<?php if($this->element->getElement('SoundCloudGenre')->hasErrors()) : ?>
|
||||
<ul class='errors'>
|
||||
<?php foreach($this->element->getElement('SoundCloudGenre')->getMessages() as $error): ?>
|
||||
<li><?php echo $error; ?></li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
</dd>
|
||||
<dt id="SoundCloudTrackType-label" class="block-display">
|
||||
<label class="optional" for="SoundCloudTrackType"><?php echo $this->element->getElement('SoundCloudTrackType')->getLabel() ?></label>
|
||||
</dt>
|
||||
<dd id="SoundCloudTrackType-element" class="block-display">
|
||||
<?php echo $this->element->getElement('SoundCloudTrackType') ?>
|
||||
<?php if($this->element->getElement('SoundCloudTrackType')->hasErrors()) : ?>
|
||||
<ul class='errors'>
|
||||
<?php foreach($this->element->getElement('SoundCloudTrackType')->getMessages() as $error): ?>
|
||||
<li><?php echo $error; ?></li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
</dd>
|
||||
<dt id="SoundCloudLicense-label" class="block-display">
|
||||
<label class="optional" for="SoundCloudLicense"><?php echo $this->element->getElement('SoundCloudLicense')->getLabel() ?></label>
|
||||
</dt>
|
||||
<dd id="SoundCloudLicense-element" class="block-display">
|
||||
<?php echo $this->element->getElement('SoundCloudLicense') ?>
|
||||
<?php if($this->element->getElement('SoundCloudLicense')->hasErrors()) : ?>
|
||||
<ul class='errors'>
|
||||
<?php foreach($this->element->getElement('SoundCloudLicense')->getMessages() as $error): ?>
|
||||
<li><?php echo $error; ?></li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
<?php endif; ?>
|
||||
</dd>
|
||||
<?php
|
||||
$soundcloudService = new SoundcloudService();
|
||||
if ($soundcloudService->hasAccessToken()) {
|
||||
echo $this->element->getElement('SoundCloudDisconnect')->render();
|
||||
} else {
|
||||
echo $this->element->getElement('SoundCloudConnect')->render();
|
||||
}
|
||||
?>
|
||||
|
||||
<?php echo $this->element->getElement('SoundCloudLicense')->render() ?>
|
||||
|
||||
<?php echo $this->element->getElement('SoundCloudSharing')->render() ?>
|
||||
</dl>
|
||||
</fieldset>
|
||||
|
|
|
@ -9,7 +9,8 @@
|
|||
</p>
|
||||
<pre style="text-align: left">sudo service airtime-playout start
|
||||
sudo service airtime-liquidsoap start
|
||||
sudo service airtime-media-monitor start</pre>
|
||||
sudo service airtime_analyzer start
|
||||
sudo service airtime-celery start</pre>
|
||||
<p>
|
||||
Click "Done!" to bring up the Airtime configuration checklist; if your configuration is all green,
|
||||
you're ready to get started with your personal Airtime station!
|
||||
|
|
|
@ -63,7 +63,7 @@ function checkDatabaseDependencies() {
|
|||
function checkExternalServices() {
|
||||
return array(
|
||||
"database" => checkDatabaseConfiguration(),
|
||||
"media-monitor" => checkMediaMonitorService(),
|
||||
"analyzer" => checkAnalyzerService(),
|
||||
"pypo" => checkPlayoutService(),
|
||||
"liquidsoap" => checkLiquidsoapService(),
|
||||
"rabbitmq" => checkRMQConnection()
|
||||
|
@ -123,8 +123,8 @@ function checkRMQConnection() {
|
|||
*
|
||||
* @return boolean true if airtime-media-monitor is running
|
||||
*/
|
||||
function checkMediaMonitorService() {
|
||||
exec("pgrep -f -u www-data airtime-media-monitor", $out, $status);
|
||||
function checkAnalyzerService() {
|
||||
exec("pgrep -f -u www-data airtime_analyzer", $out, $status);
|
||||
if (array_key_exists(0, $out) && $status == 0) {
|
||||
return posix_kill(rtrim($out[0]), 0);
|
||||
}
|
||||
|
|
|
@ -4,8 +4,8 @@
|
|||
#
|
||||
# This is an example configuration for Airtime. If you just want to
|
||||
# get started with a basic Airtime setup, or don't know if you should
|
||||
# be reconfiguring any of the following values, just rename this file
|
||||
# to 'airtime.conf'.
|
||||
# be reconfiguring any of the following values, just move this file
|
||||
# to '/etc/airtime/' and rename it 'airtime.conf'.
|
||||
#
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
|
@ -37,6 +37,11 @@
|
|||
# engine (pypo) should cache scheduled media files.
|
||||
# The default is 1.
|
||||
#
|
||||
# airtime_dir: Only used in saas, needed for compatibility.
|
||||
#
|
||||
# station_id: The Airtime station name.
|
||||
# Only used in saas, needed for compatibility.
|
||||
#
|
||||
[general]
|
||||
api_key =
|
||||
web_server_user = www-data
|
||||
|
@ -44,6 +49,8 @@ base_url = localhost
|
|||
base_port = 80
|
||||
base_dir = /
|
||||
cache_ahead_hours = 1
|
||||
airtime_dir =
|
||||
station_id =
|
||||
#
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
|
@ -107,6 +114,23 @@ vhost = /airtime
|
|||
# ----------------------------------------------------------------------
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# M O N I T
|
||||
# ----------------------------------------------------------------------
|
||||
#
|
||||
# These settings are only for backwards compatibility.
|
||||
#
|
||||
# user: The username for the monit user.
|
||||
#
|
||||
# password: The password for the monit user.
|
||||
#
|
||||
[monit]
|
||||
user =
|
||||
password =
|
||||
#
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# M E D I A M O N I T O R
|
||||
# ----------------------------------------------------------------------
|
||||
|
@ -132,10 +156,12 @@ vhost = /airtime
|
|||
# The default is 0.1
|
||||
#
|
||||
# logpath: The media monitor log file path
|
||||
# The default is '/var/log/airtime/media-monitor/media-monitor.log'
|
||||
# The default is
|
||||
# '/var/log/airtime/media-monitor/media-monitor.log'
|
||||
#
|
||||
# index_path: The media monitor index path
|
||||
# The default is '/var/tmp/airtime/media-monitor/last_index'
|
||||
# The default is
|
||||
# '/var/tmp/airtime/media-monitor/last_index'
|
||||
#
|
||||
[media-monitor]
|
||||
check_filesystem_events = 5
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#Note: project.home is automatically generated by the propel-install script.
|
||||
#Any manual changes to this value will be overwritten.
|
||||
project.home = /home/sourcefabric/dev/Airtime-SaaS/Airtime/airtime_mvc
|
||||
project.home = /home/sourcefabric/dev/Airtime/airtime_mvc
|
||||
project.build = ${project.home}/build
|
||||
|
||||
#Database driver
|
||||
|
|
|
@ -531,4 +531,34 @@
|
|||
<reference local="template_id" foreign="id"/>
|
||||
</foreign-key>
|
||||
</table>
|
||||
<table name="third_party_track_references" phpName="ThirdPartyTrackReferences">
|
||||
<column name="id" phpName="DbId" primaryKey="true" type="INTEGER" autoIncrement="true" required="true" />
|
||||
<column name="service" phpName="DbService" type="VARCHAR" size="256" required="true" />
|
||||
<!-- Make foreign ID a VARCHAR field in case a service uses hashes or other non-integer identifiers -->
|
||||
<column name="foreign_id" phpName="DbForeignId" type="VARCHAR" size="256" />
|
||||
<column name="file_id" phpName="DbFileId" type="INTEGER" required="true" />
|
||||
<column name="upload_time" phpName="DbUploadTime" type="TIMESTAMP" />
|
||||
<column name="status" phpName="DbStatus" type="VARCHAR" size="256" />
|
||||
<unique name="foreign_id_unique">
|
||||
<unique-column name="foreign_id"/>
|
||||
</unique>
|
||||
<foreign-key foreignTable="cc_files" name="track_reference_fkey" onDelete="CASCADE">
|
||||
<reference local="file_id" foreign="id"/>
|
||||
</foreign-key>
|
||||
</table>
|
||||
|
||||
<table name="celery_tasks" phpName="CeleryTasks">
|
||||
<column name="id" phpName="DbId" primaryKey="true" type="INTEGER" autoIncrement="true" required="true" />
|
||||
<column name="task_id" phpName="DbTaskId" type="VARCHAR" size="256" required="true" />
|
||||
<column name="track_reference" phpName="DbTrackReference" type="INTEGER" required="true" />
|
||||
<column name="name" phpName="DbName" type="VARCHAR" size="256" />
|
||||
<column name="dispatch_time" phpName="DbDispatchTime" type="TIMESTAMP" />
|
||||
<column name="status" phpName="DbStatus" type="VARCHAR" size="256" required="true" />
|
||||
<unique name="id_unique">
|
||||
<unique-column name="id"/>
|
||||
</unique>
|
||||
<foreign-key foreignTable="third_party_track_references" name="celery_service_fkey" onDelete="CASCADE">
|
||||
<reference local="track_reference" foreign="id"/>
|
||||
</foreign-key>
|
||||
</table>
|
||||
</database>
|
||||
|
|
|
@ -670,6 +670,42 @@ CREATE TABLE "cc_playout_history_template_field"
|
|||
PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
-- third_party_track_references
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
DROP TABLE IF EXISTS "third_party_track_references" CASCADE;
|
||||
|
||||
CREATE TABLE "third_party_track_references"
|
||||
(
|
||||
"id" serial NOT NULL,
|
||||
"service" VARCHAR(256) NOT NULL,
|
||||
"foreign_id" VARCHAR(256),
|
||||
"file_id" INTEGER NOT NULL,
|
||||
"upload_time" TIMESTAMP,
|
||||
"status" VARCHAR(256),
|
||||
PRIMARY KEY ("id"),
|
||||
CONSTRAINT "foreign_id_unique" UNIQUE ("foreign_id")
|
||||
);
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
-- celery_tasks
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
DROP TABLE IF EXISTS "celery_tasks" CASCADE;
|
||||
|
||||
CREATE TABLE "celery_tasks"
|
||||
(
|
||||
"id" serial NOT NULL,
|
||||
"task_id" VARCHAR(256) NOT NULL,
|
||||
"track_reference" INTEGER NOT NULL,
|
||||
"name" VARCHAR(256),
|
||||
"dispatch_time" TIMESTAMP,
|
||||
"status" VARCHAR(256) NOT NULL,
|
||||
PRIMARY KEY ("id"),
|
||||
CONSTRAINT "id_unique" UNIQUE ("id")
|
||||
);
|
||||
|
||||
ALTER TABLE "cc_files" ADD CONSTRAINT "cc_files_owner_fkey"
|
||||
FOREIGN KEY ("owner_id")
|
||||
REFERENCES "cc_subjs" ("id");
|
||||
|
@ -831,3 +867,13 @@ ALTER TABLE "cc_playout_history_template_field" ADD CONSTRAINT "cc_playout_histo
|
|||
FOREIGN KEY ("template_id")
|
||||
REFERENCES "cc_playout_history_template" ("id")
|
||||
ON DELETE CASCADE;
|
||||
|
||||
ALTER TABLE "third_party_track_references" ADD CONSTRAINT "track_reference_fkey"
|
||||
FOREIGN KEY ("file_id")
|
||||
REFERENCES "cc_files" ("id")
|
||||
ON DELETE CASCADE;
|
||||
|
||||
ALTER TABLE "celery_tasks" ADD CONSTRAINT "celery_service_fkey"
|
||||
FOREIGN KEY ("track_reference")
|
||||
REFERENCES "third_party_track_references" ("id")
|
||||
ON DELETE CASCADE;
|
||||
|
|
|
@ -1,114 +0,0 @@
|
|||
# SoundCloud PHP API Wrapper
|
||||
|
||||
## Introduction
|
||||
|
||||
A wrapper for the SoundCloud API written in PHP with support for authentication using [OAuth 2.0](http://oauth.net/2/).
|
||||
|
||||
The wrapper got a real overhaul with version 2.0. The current version was written with [PEAR](http://pear.php.net/) in mind and can easily by distributed as a PEAR package.
|
||||
|
||||
## Getting started
|
||||
|
||||
Check out the [getting started](https://github.com/mptre/php-soundcloud/wiki/OAuth-2) wiki entry for further reference on how to get started. Also make sure to check out the [demo application](https://github.com/mptre/ci-soundcloud) for some example code.
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
The wrapper includes convenient methods used to perform HTTP requests on behalf of the authenticated user. Below you'll find a few quick examples.
|
||||
|
||||
Ofcourse you need to handle the authentication first before being able to request and modify protect resources as demonstrated below. Therefor I refer to the [demo application](https://github.com/mptre/ci-soundcloud) which got some example code on how to handle authentication.
|
||||
|
||||
### GET
|
||||
|
||||
<pre><code>try {
|
||||
$response = json_decode($soundcloud->get('me'), true);
|
||||
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
|
||||
exit($e->getMessage());
|
||||
}</code></pre>
|
||||
|
||||
### POST
|
||||
|
||||
<pre><code>$comment = <<<EOH
|
||||
<comment>
|
||||
<body>Yeah!</body>
|
||||
</comment>
|
||||
EOH;
|
||||
|
||||
try {
|
||||
$response = json_decode(
|
||||
$soundcloud->post(
|
||||
'tracks/1/comments',
|
||||
$comment,
|
||||
array(CURLOPT_HTTPHEADER => array('Content-Type: application/xml'))
|
||||
),
|
||||
true
|
||||
);
|
||||
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
|
||||
exit($e->getMessage());
|
||||
}</code></pre>
|
||||
|
||||
### PUT
|
||||
|
||||
<pre><code>$track = <<<EOH
|
||||
<track>
|
||||
<downloadable>true</downloadable>
|
||||
</track>
|
||||
EOH;
|
||||
|
||||
try {
|
||||
$response = json_decode(
|
||||
$soundcloud->put(
|
||||
'tracks/1',
|
||||
$track,
|
||||
array(CURLOPT_HTTPHEADER => array('Content-Type: application/xml'))
|
||||
),
|
||||
true
|
||||
);
|
||||
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
|
||||
exit($e->getMessage());
|
||||
}</code></pre>
|
||||
|
||||
### DELETE
|
||||
|
||||
<pre><code>try {
|
||||
$response = json_decode($soundcloud->delete('tracks/1'), true);
|
||||
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
|
||||
exit($e->getMessage());
|
||||
}</code></pre>
|
||||
|
||||
### DOWNLOAD TRACK
|
||||
|
||||
<pre><code>try {
|
||||
$track = $soundcloud->download(1337);
|
||||
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
|
||||
exit($e->getMessage());
|
||||
}
|
||||
|
||||
// do something clever with $track. Save to file perhaps?</code></pre>
|
||||
|
||||
## Feedback and questions
|
||||
|
||||
Found a bug or missing a feature? Don't hesitate to create a new issue here on GitHub. Or contact me [directly](https://github.com/mptre).
|
||||
|
||||
Also make sure to check out the official [documentation](https://github.com/soundcloud/api/wiki/) and the join [Google Group](https://groups.google.com/group/soundcloudapi?pli=1) in order to stay updated.
|
||||
|
||||
## License
|
||||
|
||||
Copyright (c) 2011 Anton Lindqvist
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
|
@ -1,737 +0,0 @@
|
|||
<?php
|
||||
require_once 'Soundcloud/Exception.php';
|
||||
require_once 'Soundcloud/Version.php';
|
||||
|
||||
/**
|
||||
* SoundCloud API wrapper with support for authentication using OAuth 2.
|
||||
*
|
||||
* @category Services
|
||||
* @package Services_Soundcloud
|
||||
* @author Anton Lindqvist <anton@qvister.se>
|
||||
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
||||
* @link http://github.com/mptre/php-soundcloud
|
||||
*/
|
||||
class Services_Soundcloud {
|
||||
|
||||
/**
|
||||
* Custom cURL option.
|
||||
*
|
||||
* @access public
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
const CURLOPT_OAUTH_TOKEN = 173;
|
||||
|
||||
/**
|
||||
* Access token returned by the service provider after a successful authentication.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_accessToken;
|
||||
|
||||
/**
|
||||
* Version of the API to use.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
private static $_apiVersion = 1;
|
||||
|
||||
/**
|
||||
* Supported audio MIME types.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_audioMimeTypes = array(
|
||||
'aac' => 'video/mp4',
|
||||
'aiff' => 'audio/x-aiff',
|
||||
'flac' => 'audio/flac',
|
||||
'mp3' => 'audio/mpeg',
|
||||
'ogg' => 'audio/ogg',
|
||||
'wav' => 'audio/x-wav'
|
||||
);
|
||||
|
||||
/**
|
||||
* OAuth client id.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_clientId;
|
||||
|
||||
/**
|
||||
* OAuth client secret.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_clientSecret;
|
||||
|
||||
/**
|
||||
* Development mode.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
private $_development;
|
||||
|
||||
/**
|
||||
* Available API domains.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_domains = array(
|
||||
'development' => 'sandbox-soundcloud.com',
|
||||
'production' => 'soundcloud.com'
|
||||
);
|
||||
|
||||
/**
|
||||
* HTTP response body from the last request.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_lastHttpResponseBody;
|
||||
|
||||
/**
|
||||
* HTTP response code from the last request.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
private $_lastHttpResponseCode;
|
||||
|
||||
/**
|
||||
* HTTP response headers from last request.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $_lastHttpResponseHeaders;
|
||||
|
||||
/**
|
||||
* OAuth paths.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_paths = array(
|
||||
'authorize' => 'connect',
|
||||
'access_token' => 'oauth2/token',
|
||||
);
|
||||
|
||||
/**
|
||||
* OAuth redirect uri.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_redirectUri;
|
||||
|
||||
/**
|
||||
* API response format MIME type.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_requestFormat;
|
||||
|
||||
/**
|
||||
* Available response formats.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_responseFormats = array(
|
||||
'*' => '*/*',
|
||||
'json' => 'application/json',
|
||||
'xml' => 'application/xml'
|
||||
);
|
||||
|
||||
/**
|
||||
* HTTP user agent.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private static $_userAgent = 'PHP-SoundCloud';
|
||||
|
||||
/**
|
||||
* Class version.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $version;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $clientId OAuth client id
|
||||
* @param string $clientSecret OAuth client secret
|
||||
* @param string $redirectUri OAuth redirect uri
|
||||
* @param boolean $development Sandbox mode
|
||||
*
|
||||
* @throws Services_Soundcloud_Missing_Client_Id_Exception when missing client id
|
||||
* @return void
|
||||
*/
|
||||
function __construct($clientId, $clientSecret, $redirectUri = null, $development = false) {
|
||||
if (empty($clientId)) {
|
||||
throw new Services_Soundcloud_Missing_Client_Id_Exception();
|
||||
}
|
||||
|
||||
$this->_clientId = $clientId;
|
||||
$this->_clientSecret = $clientSecret;
|
||||
$this->_redirectUri = $redirectUri;
|
||||
$this->_development = $development;
|
||||
$this->_responseFormat = self::$_responseFormats['json'];
|
||||
$this->version = Services_Soundcloud_Version::get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get authorization URL.
|
||||
*
|
||||
* @param array $params Optional query string parameters
|
||||
*
|
||||
* @return string
|
||||
* @see Soundcloud::_buildUrl()
|
||||
*/
|
||||
function getAuthorizeUrl($params = array()) {
|
||||
$defaultParams = array(
|
||||
'client_id' => $this->_clientId,
|
||||
'redirect_uri' => $this->_redirectUri,
|
||||
'response_type' => 'code'
|
||||
);
|
||||
$params = array_merge($defaultParams, $params);
|
||||
|
||||
return $this->_buildUrl(self::$_paths['authorize'], $params, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get access token URL.
|
||||
*
|
||||
* @param array $params Optional query string parameters
|
||||
*
|
||||
* @return string
|
||||
* @see Soundcloud::_buildUrl()
|
||||
*/
|
||||
function getAccessTokenUrl($params = array()) {
|
||||
return $this->_buildUrl(self::$_paths['access_token'], $params, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve access token.
|
||||
*
|
||||
* @param string $code OAuth code returned from the service provider
|
||||
* @param array $postData Optional post data
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
* @see Soundcloud::_getAccessToken()
|
||||
*/
|
||||
function accessToken($code, $postData = array(), $curlOptions = array()) {
|
||||
$defaultPostData = array(
|
||||
'code' => $code,
|
||||
'client_id' => $this->_clientId,
|
||||
'client_secret' => $this->_clientSecret,
|
||||
'redirect_uri' => $this->_redirectUri,
|
||||
'grant_type' => 'authorization_code'
|
||||
);
|
||||
$postData = array_merge($defaultPostData, $postData);
|
||||
|
||||
return $this->_getAccessToken($postData, $curlOptions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve access token.
|
||||
*
|
||||
* @param string $username
|
||||
* @param string $password
|
||||
* @param array $postData Optional post data
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
* @see Soundcloud::_getAccessToken()
|
||||
*/
|
||||
function accessTokenResourceOwner($username, $password, $postData = array(), $curlOptions = array()) {
|
||||
$defaultPostData = array(
|
||||
'client_id' => $this->_clientId,
|
||||
'client_secret' => $this->_clientSecret,
|
||||
'grant_type' => 'password',
|
||||
'username' => $username,
|
||||
'password' => $password
|
||||
);
|
||||
$postData = array_merge($defaultPostData, $postData);
|
||||
|
||||
return $this->_getAccessToken($postData, $curlOptions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh access token.
|
||||
*
|
||||
* @param string $refreshToken
|
||||
* @param array $postData Optional post data
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
* @see Soundcloud::_getAccessToken()
|
||||
*/
|
||||
function accessTokenRefresh($refreshToken, $postData = array(), $curlOptions = array()) {
|
||||
$defaultPostData = array(
|
||||
'refresh_token' => $refreshToken,
|
||||
'client_id' => $this->_clientId,
|
||||
'client_secret' => $this->_clientSecret,
|
||||
'redirect_uri' => $this->_redirectUri,
|
||||
'grant_type' => 'refresh_token'
|
||||
);
|
||||
$postData = array_merge($defaultPostData, $postData);
|
||||
|
||||
return $this->_getAccessToken($postData, $curlOptions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get access token.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function getAccessToken() {
|
||||
return $this->_accessToken;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get API version.
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
function getApiVersion() {
|
||||
return self::$_apiVersion;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the corresponding MIME type for a given file extension.
|
||||
*
|
||||
* @param string $extension
|
||||
*
|
||||
* @return string
|
||||
* @throws Services_Soundcloud_Unsupported_Audio_Format_Exception if the format is unsupported
|
||||
*/
|
||||
function getAudioMimeType($extension) {
|
||||
if (array_key_exists($extension, self::$_audioMimeTypes)) {
|
||||
return self::$_audioMimeTypes[$extension];
|
||||
} else {
|
||||
throw new Services_Soundcloud_Unsupported_Audio_Format_Exception();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get development mode.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
function getDevelopment() {
|
||||
return $this->_development;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get HTTP response header.
|
||||
*
|
||||
* @param string $header Name of the header
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function getHttpHeader($header) {
|
||||
if (is_array($this->_lastHttpResponseHeaders)
|
||||
&& array_key_exists($header, $this->_lastHttpResponseHeaders)
|
||||
) {
|
||||
return $this->_lastHttpResponseHeaders[$header];
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get redirect uri.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function getRedirectUri() {
|
||||
return $this->_redirectUri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get response format.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getResponseFormat() {
|
||||
return $this->_responseFormat;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set access token.
|
||||
*
|
||||
* @param string $accessToken
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
function setAccessToken($accessToken) {
|
||||
$this->_accessToken = $accessToken;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set redirect uri.
|
||||
*
|
||||
* @param string $redirectUri
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
function setRedirectUri($redirectUri) {
|
||||
$this->_redirectUri = $redirectUri;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set response format.
|
||||
*
|
||||
* @param string $format Could either be xml or json
|
||||
*
|
||||
* @throws Services_Soundcloud_Unsupported_Response_Format_Exception if the given response format isn't supported
|
||||
* @return object
|
||||
*/
|
||||
function setResponseFormat($format) {
|
||||
if (array_key_exists($format, self::$_responseFormats)) {
|
||||
$this->_responseFormat = self::$_responseFormats[$format];
|
||||
} else {
|
||||
throw new Services_Soundcloud_Unsupported_Response_Format_Exception();
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set development mode.
|
||||
*
|
||||
* @param boolean $development
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
function setDevelopment($development) {
|
||||
$this->_development = $development;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a GET HTTP request.
|
||||
*
|
||||
* @param string $path URI to request
|
||||
* @param array $params Optional query string parameters
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
* @see Soundcloud::_request()
|
||||
*/
|
||||
function get($path, $params = array(), $curlOptions = array()) {
|
||||
$url = $this->_buildUrl($path, $params);
|
||||
|
||||
return $this->_request($url, $curlOptions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a POST HTTP request.
|
||||
*
|
||||
* @param string $path URI to request
|
||||
* @param array $postData Optional post data
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
* @see Soundcloud::_request()
|
||||
*/
|
||||
function post($path, $postData = array(), $curlOptions = array()) {
|
||||
$url = $this->_buildUrl($path);
|
||||
$options = array(CURLOPT_POST => true, CURLOPT_POSTFIELDS => $postData);
|
||||
$options += $curlOptions;
|
||||
|
||||
return $this->_request($url, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a PUT HTTP request.
|
||||
*
|
||||
* @param string $path URI to request
|
||||
* @param array $postData Optional post data
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
* @see Soundcloud::_request()
|
||||
*/
|
||||
function put($path, $postData, $curlOptions = array()) {
|
||||
$url = $this->_buildUrl($path);
|
||||
$options = array(
|
||||
CURLOPT_CUSTOMREQUEST => 'PUT',
|
||||
CURLOPT_POSTFIELDS => $postData
|
||||
);
|
||||
$options += $curlOptions;
|
||||
|
||||
return $this->_request($url, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a DELETE HTTP request.
|
||||
*
|
||||
* @param string $path URI to request
|
||||
* @param array $params Optional query string parameters
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
* @see Soundcloud::_request()
|
||||
*/
|
||||
function delete($path, $params = array(), $curlOptions = array()) {
|
||||
$url = $this->_buildUrl($path, $params);
|
||||
$options = array(CURLOPT_CUSTOMREQUEST => 'DELETE');
|
||||
$options += $curlOptions;
|
||||
|
||||
return $this->_request($url, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Download track.
|
||||
*
|
||||
* @param integer $trackId
|
||||
* @param array Optional query string parameters
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
* @see Soundcloud::_request()
|
||||
*/
|
||||
function download($trackId, $params = array(), $curlOptions = array()) {
|
||||
$lastResponseFormat = array_pop(
|
||||
preg_split('/\//', $this->getResponseFormat())
|
||||
);
|
||||
$defaultParams = array('oauth_token' => $this->getAccessToken());
|
||||
$defaultCurlOptions = array(
|
||||
CURLOPT_FOLLOWLOCATION => true,
|
||||
self::CURLOPT_OAUTH_TOKEN => false
|
||||
);
|
||||
$url = $this->_buildUrl(
|
||||
'tracks/' . $trackId . '/download',
|
||||
array_merge($defaultParams, $params)
|
||||
);
|
||||
$options = $defaultCurlOptions + $curlOptions;
|
||||
|
||||
$this->setResponseFormat('*');
|
||||
|
||||
$response = $this->_request($url, $options);
|
||||
|
||||
// rollback to the previously defined response format.
|
||||
$this->setResponseFormat($lastResponseFormat);
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct default HTTP headers including response format and authorization.
|
||||
*
|
||||
* @param boolean Include access token or not
|
||||
*
|
||||
* @return array $headers
|
||||
*/
|
||||
protected function _buildDefaultHeaders($includeAccessToken = true) {
|
||||
$headers = array();
|
||||
|
||||
if ($this->_responseFormat) {
|
||||
array_push($headers, 'Accept: ' . $this->_responseFormat);
|
||||
}
|
||||
|
||||
if ($includeAccessToken && $this->_accessToken) {
|
||||
array_push($headers, 'Authorization: OAuth ' . $this->_accessToken);
|
||||
}
|
||||
|
||||
return $headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a URL.
|
||||
*
|
||||
* @param string $path Relative or absolute URI
|
||||
* @param array $params Optional query string parameters
|
||||
* @param boolean $includeVersion Include API version
|
||||
*
|
||||
* @return string $url
|
||||
*/
|
||||
protected function _buildUrl($path, $params = null, $includeVersion = true) {
|
||||
if (preg_match('/^https?\:\/\//', $path)) {
|
||||
$url = $path;
|
||||
} else {
|
||||
$url = 'https://';
|
||||
$url .= (!preg_match('/connect/', $path)) ? 'api.' : '';
|
||||
$url .= ($this->_development)
|
||||
? self::$_domains['development']
|
||||
: self::$_domains['production'];
|
||||
$url .= '/';
|
||||
$url .= ($includeVersion) ? 'v' . self::$_apiVersion . '/' : '';
|
||||
$url .= $path;
|
||||
}
|
||||
|
||||
$url .= (count($params)) ? '?' . http_build_query($params) : '';
|
||||
|
||||
return $url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve access token.
|
||||
*
|
||||
* @param array $postData Post data
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
protected function _getAccessToken($postData, $curlOptions = array()) {
|
||||
$options = array(CURLOPT_POST => true, CURLOPT_POSTFIELDS => $postData);
|
||||
$options += $curlOptions;
|
||||
$response = json_decode(
|
||||
$this->_request($this->getAccessTokenUrl(), $options),
|
||||
true
|
||||
);
|
||||
|
||||
if (array_key_exists('access_token', $response)) {
|
||||
$this->_accessToken = $response['access_token'];
|
||||
|
||||
return $response;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get HTTP user agent.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function _getUserAgent() {
|
||||
return self::$_userAgent . '/' . $this->version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse HTTP response headers.
|
||||
*
|
||||
* @param string $headers
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function _parseHttpHeaders($headers) {
|
||||
$headers = preg_split('/\n/', trim($headers));
|
||||
$parsedHeaders = array();
|
||||
|
||||
foreach ($headers as $header) {
|
||||
if (!preg_match('/\:\s/', $header)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
list($key, $val) = preg_split('/\:\s/', $header, 2);
|
||||
$key = str_replace('-', '_', strtolower($key));
|
||||
$val = trim($val);
|
||||
|
||||
$parsedHeaders[$key] = $val;
|
||||
}
|
||||
|
||||
return $parsedHeaders;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates HTTP response code.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
protected function _validResponseCode($code) {
|
||||
return (bool)preg_match('/^20[0-9]{1}$/', $code);
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs the actual HTTP request using curl. Can be overwritten by extending classes.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @param string $url
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @throws Services_Soundcloud_Invalid_Http_Response_Code_Exception if the response code isn't valid
|
||||
* @return mixed
|
||||
*/
|
||||
protected function _request($url, $curlOptions = array()) {
|
||||
$ch = curl_init();
|
||||
$options = array(
|
||||
CURLOPT_URL => $url,
|
||||
CURLOPT_HEADER => true,
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_USERAGENT => $this->_getUserAgent()
|
||||
);
|
||||
$options += $curlOptions;
|
||||
|
||||
if (array_key_exists(self::CURLOPT_OAUTH_TOKEN, $options)) {
|
||||
$includeAccessToken = $options[self::CURLOPT_OAUTH_TOKEN];
|
||||
unset($options[self::CURLOPT_OAUTH_TOKEN]);
|
||||
} else {
|
||||
$includeAccessToken = true;
|
||||
}
|
||||
|
||||
if (array_key_exists(CURLOPT_HTTPHEADER, $options)) {
|
||||
$options[CURLOPT_HTTPHEADER] = array_merge(
|
||||
$this->_buildDefaultHeaders(),
|
||||
$curlOptions[CURLOPT_HTTPHEADER]
|
||||
);
|
||||
} else {
|
||||
$options[CURLOPT_HTTPHEADER] = $this->_buildDefaultHeaders($includeAccessToken);
|
||||
}
|
||||
|
||||
curl_setopt_array($ch, $options);
|
||||
|
||||
$data = curl_exec($ch);
|
||||
$info = curl_getinfo($ch);
|
||||
|
||||
curl_close($ch);
|
||||
|
||||
$this->_lastHttpResponseHeaders = $this->_parseHttpHeaders(
|
||||
substr($data, 0, $info['header_size'])
|
||||
);
|
||||
$this->_lastHttpResponseBody = substr($data, $info['header_size']);
|
||||
$this->_lastHttpResponseCode = $info['http_code'];
|
||||
|
||||
if ($this->_validResponseCode($this->_lastHttpResponseCode)) {
|
||||
return $this->_lastHttpResponseBody;
|
||||
} else {
|
||||
throw new Services_Soundcloud_Invalid_Http_Response_Code_Exception(
|
||||
null,
|
||||
0,
|
||||
$this->_lastHttpResponseBody,
|
||||
$this->_lastHttpResponseCode
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,146 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Soundcloud missing client id exception.
|
||||
*
|
||||
* @category Services
|
||||
* @package Services_Soundcloud
|
||||
* @author Anton Lindqvist <anton@qvister.se>
|
||||
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
||||
* @link http://github.com/mptre/php-soundcloud
|
||||
*/
|
||||
class Services_Soundcloud_Missing_Client_Id_Exception extends Exception {
|
||||
|
||||
/**
|
||||
* Default message.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $message = 'All requests must include a consumer key. Referred to as client_id in OAuth2.';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Soundcloud invalid HTTP response code exception.
|
||||
*
|
||||
* @category Services
|
||||
* @package Services_Soundcloud
|
||||
* @author Anton Lindqvist <anton@qvister.se>
|
||||
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
||||
* @link http://github.com/mptre/php-soundcloud
|
||||
*/
|
||||
class Services_Soundcloud_Invalid_Http_Response_Code_Exception extends Exception {
|
||||
|
||||
/**
|
||||
* HTTP response body.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $httpBody;
|
||||
|
||||
/**
|
||||
* HTTP response code.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
protected $httpCode;
|
||||
|
||||
/**
|
||||
* Default message.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $message = 'The requested URL responded with HTTP code %d.';
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $message
|
||||
* @param string $code
|
||||
* @param string $httpBody
|
||||
* @param integer $httpCode
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function __construct($message = null, $code = 0, $httpBody = null, $httpCode = 0) {
|
||||
$this->httpBody = $httpBody;
|
||||
$this->httpCode = $httpCode;
|
||||
$message = sprintf($this->message, $httpCode);
|
||||
|
||||
parent::__construct($message, $code);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get HTTP response body.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function getHttpBody() {
|
||||
return $this->httpBody;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get HTTP response code.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function getHttpCode() {
|
||||
return $this->httpCode;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Soundcloud unsupported response format exception.
|
||||
*
|
||||
* @category Services
|
||||
* @package Services_Soundcloud
|
||||
* @author Anton Lindqvist <anton@qvister.se>
|
||||
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
||||
* @link http://github.com/mptre/php-soundcloud
|
||||
*/
|
||||
class Services_Soundcloud_Unsupported_Response_Format_Exception extends Exception {
|
||||
|
||||
/**
|
||||
* Default message.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $message = 'The given response format is unsupported.';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Soundcloud unsupported audio format exception.
|
||||
*
|
||||
* @category Services
|
||||
* @package Services_Soundcloud
|
||||
* @author Anton Lindqvist <anton@qvister.se>
|
||||
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
||||
* @link http://github.com/mptre/php-soundcloud
|
||||
*/
|
||||
class Services_Soundcloud_Unsupported_Audio_Format_Exception extends Exception {
|
||||
|
||||
/**
|
||||
* Default message.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $message = 'The given audio format is unsupported.';
|
||||
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Soundcloud package version.
|
||||
*
|
||||
* @category Services
|
||||
* @package Services_Soundcloud
|
||||
* @author Anton Lindqvist <anton@qvister.se>
|
||||
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
||||
* @link http://github.com/mptre/php-soundcloud
|
||||
*/
|
||||
class Services_Soundcloud_Version {
|
||||
|
||||
const MAJOR = 2;
|
||||
const MINOR = 1;
|
||||
const PATCH = 1;
|
||||
|
||||
public static function get() {
|
||||
return implode('.', array(self::MAJOR, self::MINOR, self::PATCH));
|
||||
}
|
||||
|
||||
}
|
|
@ -1,310 +0,0 @@
|
|||
<?php
|
||||
require_once 'Soundcloud_Test_Helper.php';
|
||||
|
||||
class Soundcloud_Test extends PHPUnit_Framework_TestCase {
|
||||
|
||||
protected $soundcloud;
|
||||
|
||||
function setUp() {
|
||||
$this->soundcloud = new Services_Soundcloud_Expose(
|
||||
'1337',
|
||||
'1337',
|
||||
'http://soundcloud.local/callback'
|
||||
);
|
||||
}
|
||||
|
||||
function tearDown() {
|
||||
$this->soundcloud = null;
|
||||
}
|
||||
|
||||
function testVersionFormat() {
|
||||
$this->assertRegExp(
|
||||
'/^[0-9]+\.[0-9]+\.[0-9]+$/',
|
||||
Services_Soundcloud_Version::get()
|
||||
);
|
||||
}
|
||||
|
||||
function testGetUserAgent() {
|
||||
$this->assertRegExp(
|
||||
'/^PHP\-SoundCloud\/[0-9]+\.[0-9]+\.[0-9]+$/',
|
||||
$this->soundcloud->getUserAgent()
|
||||
);
|
||||
}
|
||||
|
||||
function testApiVersion() {
|
||||
$this->assertEquals(1, $this->soundcloud->getApiVersion());
|
||||
}
|
||||
|
||||
function testGetAudioMimeTypes() {
|
||||
$supportedExtensions = array(
|
||||
'aac' => 'video/mp4',
|
||||
'aiff' => 'audio/x-aiff',
|
||||
'flac' => 'audio/flac',
|
||||
'mp3' => 'audio/mpeg',
|
||||
'ogg' => 'audio/ogg',
|
||||
'wav' => 'audio/x-wav'
|
||||
);
|
||||
$unsupportedExtensions = array('gif', 'html', 'jpg', 'mp4', 'xml', 'xspf');
|
||||
|
||||
foreach ($supportedExtensions as $extension => $mimeType) {
|
||||
$this->assertEquals(
|
||||
$mimeType,
|
||||
$this->soundcloud->getAudioMimeType($extension)
|
||||
);
|
||||
}
|
||||
|
||||
foreach ($unsupportedExtensions as $extension => $mimeType) {
|
||||
$this->setExpectedException('Services_Soundcloud_Unsupported_Audio_Format_Exception');
|
||||
|
||||
$this->soundcloud->getAudioMimeType($extension);
|
||||
}
|
||||
}
|
||||
|
||||
function testGetAuthorizeUrl() {
|
||||
$this->assertEquals(
|
||||
'https://soundcloud.com/connect?client_id=1337&redirect_uri=http%3A%2F%2Fsoundcloud.local%2Fcallback&response_type=code',
|
||||
$this->soundcloud->getAuthorizeUrl()
|
||||
);
|
||||
}
|
||||
|
||||
function testGetAuthorizeUrlWithCustomQueryParameters() {
|
||||
$this->assertEquals(
|
||||
'https://soundcloud.com/connect?client_id=1337&redirect_uri=http%3A%2F%2Fsoundcloud.local%2Fcallback&response_type=code&foo=bar',
|
||||
$this->soundcloud->getAuthorizeUrl(array('foo' => 'bar'))
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
'https://soundcloud.com/connect?client_id=1337&redirect_uri=http%3A%2F%2Fsoundcloud.local%2Fcallback&response_type=code&foo=bar&bar=foo',
|
||||
$this->soundcloud->getAuthorizeUrl(array('foo' => 'bar', 'bar' => 'foo'))
|
||||
);
|
||||
}
|
||||
|
||||
function testGetAccessTokenUrl() {
|
||||
$this->assertEquals(
|
||||
'https://api.soundcloud.com/oauth2/token',
|
||||
$this->soundcloud->getAccessTokenUrl()
|
||||
);
|
||||
}
|
||||
|
||||
function testSetAccessToken() {
|
||||
$this->soundcloud->setAccessToken('1337');
|
||||
|
||||
$this->assertEquals('1337', $this->soundcloud->getAccessToken());
|
||||
}
|
||||
|
||||
function testSetDevelopment() {
|
||||
$this->soundcloud->setDevelopment(true);
|
||||
|
||||
$this->assertTrue($this->soundcloud->getDevelopment());
|
||||
}
|
||||
|
||||
function testSetRedirectUri() {
|
||||
$this->soundcloud->setRedirectUri('http://soundcloud.local/callback');
|
||||
|
||||
$this->assertEquals(
|
||||
'http://soundcloud.local/callback',
|
||||
$this->soundcloud->getRedirectUri()
|
||||
);
|
||||
}
|
||||
|
||||
function testDefaultResponseFormat() {
|
||||
$this->assertEquals(
|
||||
'application/json',
|
||||
$this->soundcloud->getResponseFormat()
|
||||
);
|
||||
}
|
||||
|
||||
function testSetResponseFormatHtml() {
|
||||
$this->setExpectedException('Services_Soundcloud_Unsupported_Response_Format_Exception');
|
||||
|
||||
$this->soundcloud->setResponseFormat('html');
|
||||
}
|
||||
|
||||
function testSetResponseFormatAll() {
|
||||
$this->soundcloud->setResponseFormat('*');
|
||||
|
||||
$this->assertEquals(
|
||||
'*/*',
|
||||
$this->soundcloud->getResponseFormat()
|
||||
);
|
||||
}
|
||||
|
||||
function testSetResponseFormatJson() {
|
||||
$this->soundcloud->setResponseFormat('json');
|
||||
|
||||
$this->assertEquals(
|
||||
'application/json',
|
||||
$this->soundcloud->getResponseFormat()
|
||||
);
|
||||
}
|
||||
|
||||
function testSetResponseFormatXml() {
|
||||
$this->soundcloud->setResponseFormat('xml');
|
||||
|
||||
$this->assertEquals(
|
||||
'application/xml',
|
||||
$this->soundcloud->getResponseFormat()
|
||||
);
|
||||
}
|
||||
|
||||
function testResponseCodeSuccess() {
|
||||
$this->assertTrue($this->soundcloud->validResponseCode(200));
|
||||
}
|
||||
|
||||
function testResponseCodeRedirect() {
|
||||
$this->assertFalse($this->soundcloud->validResponseCode(301));
|
||||
}
|
||||
|
||||
function testResponseCodeClientError() {
|
||||
$this->assertFalse($this->soundcloud->validResponseCode(400));
|
||||
}
|
||||
|
||||
function testResponseCodeServerError() {
|
||||
$this->assertFalse($this->soundcloud->validResponseCode(500));
|
||||
}
|
||||
|
||||
function testBuildDefaultHeaders() {
|
||||
$this->assertEquals(
|
||||
array('Accept: application/json'),
|
||||
$this->soundcloud->buildDefaultHeaders()
|
||||
);
|
||||
}
|
||||
|
||||
function testBuildDefaultHeadersWithAccessToken() {
|
||||
$this->soundcloud->setAccessToken('1337');
|
||||
|
||||
$this->assertEquals(
|
||||
array('Accept: application/json', 'Authorization: OAuth 1337'),
|
||||
$this->soundcloud->buildDefaultHeaders()
|
||||
);
|
||||
}
|
||||
|
||||
function testBuildUrl() {
|
||||
$this->assertEquals(
|
||||
'https://api.soundcloud.com/v1/me',
|
||||
$this->soundcloud->buildUrl('me')
|
||||
);
|
||||
}
|
||||
|
||||
function testBuildUrlWithQueryParameters() {
|
||||
$this->assertEquals(
|
||||
'https://api.soundcloud.com/v1/tracks?q=rofl+dubstep',
|
||||
$this->soundcloud->buildUrl(
|
||||
'tracks',
|
||||
array('q' => 'rofl dubstep')
|
||||
)
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
'https://api.soundcloud.com/v1/tracks?q=rofl+dubstep&filter=public',
|
||||
$this->soundcloud->buildUrl(
|
||||
'tracks',
|
||||
array('q' => 'rofl dubstep', 'filter' => 'public')
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
function testBuildUrlWithDevelopmentDomain() {
|
||||
$this->soundcloud->setDevelopment(true);
|
||||
|
||||
$this->assertEquals(
|
||||
'https://api.sandbox-soundcloud.com/v1/me',
|
||||
$this->soundcloud->buildUrl('me')
|
||||
);
|
||||
}
|
||||
|
||||
function testBuildUrlWithoutApiVersion() {
|
||||
$this->assertEquals(
|
||||
'https://api.soundcloud.com/me',
|
||||
$this->soundcloud->buildUrl('me', null, false)
|
||||
);
|
||||
}
|
||||
|
||||
function testBuildUrlWithAbsoluteUrl() {
|
||||
$this->assertEquals(
|
||||
'https://api.soundcloud.com/me',
|
||||
$this->soundcloud->buildUrl('https://api.soundcloud.com/me')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataProviderHttpHeaders
|
||||
*/
|
||||
function testParseHttpHeaders($rawHeaders, $expectedHeaders) {
|
||||
$parsedHeaders = $this->soundcloud->parseHttpHeaders($rawHeaders);
|
||||
|
||||
foreach ($parsedHeaders as $key => $val) {
|
||||
$this->assertEquals($val, $expectedHeaders[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
function testSoundcloudMissingConsumerKeyException() {
|
||||
$this->setExpectedException('Services_Soundcloud_Missing_Client_Id_Exception');
|
||||
|
||||
$soundcloud = new Services_Soundcloud('', '');
|
||||
}
|
||||
|
||||
function testSoundcloudInvalidHttpResponseCodeException() {
|
||||
$this->setExpectedException('Services_Soundcloud_Invalid_Http_Response_Code_Exception');
|
||||
|
||||
$this->soundcloud->get('me');
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataProviderSoundcloudInvalidHttpResponseCode
|
||||
*/
|
||||
function testSoundcloudInvalidHttpResponseCode($expectedHeaders) {
|
||||
try {
|
||||
$this->soundcloud->get('me');
|
||||
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
|
||||
$this->assertEquals(
|
||||
'{"error":"401 - Unauthorized"}',
|
||||
$e->getHttpBody()
|
||||
);
|
||||
|
||||
$this->assertEquals(401, $e->getHttpCode());
|
||||
|
||||
foreach ($expectedHeaders as $key => $val) {
|
||||
$this->assertEquals(
|
||||
$val,
|
||||
$this->soundcloud->getHttpHeader($key)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static function dataProviderHttpHeaders() {
|
||||
$rawHeaders = <<<HEADERS
|
||||
HTTP/1.1 200 OK
|
||||
Date: Wed, 17 Nov 2010 15:39:52 GMT
|
||||
Cache-Control: public
|
||||
Content-Type: text/html; charset=utf-8
|
||||
Content-Encoding: gzip
|
||||
Server: foobar
|
||||
Content-Length: 1337
|
||||
HEADERS;
|
||||
$expectedHeaders = array(
|
||||
'date' => 'Wed, 17 Nov 2010 15:39:52 GMT',
|
||||
'cache_control' => 'public',
|
||||
'content_type' => 'text/html; charset=utf-8',
|
||||
'content_encoding' => 'gzip',
|
||||
'server' => 'foobar',
|
||||
'content_length' => '1337'
|
||||
);
|
||||
|
||||
return array(array($rawHeaders, $expectedHeaders));
|
||||
}
|
||||
|
||||
static function dataProviderSoundcloudInvalidHttpResponseCode() {
|
||||
$expectedHeaders = array(
|
||||
'server' => 'nginx',
|
||||
'content_type' => 'application/json; charset=utf-8',
|
||||
'connection' => 'keep-alive',
|
||||
'cache_control' => 'no-cache',
|
||||
'content_length' => '30'
|
||||
);
|
||||
|
||||
return array(array($expectedHeaders));
|
||||
}
|
||||
|
||||
}
|
|
@ -1,94 +0,0 @@
|
|||
<?php
|
||||
set_include_path(
|
||||
get_include_path()
|
||||
. PATH_SEPARATOR
|
||||
. realpath(dirname(__FILE__) . '/../')
|
||||
);
|
||||
|
||||
require_once 'Services/Soundcloud.php';
|
||||
|
||||
/**
|
||||
* Extended class of the Soundcloud class in order to expose protected methods
|
||||
* for testing.
|
||||
*
|
||||
* @category Services
|
||||
* @package Services_Soundcloud
|
||||
* @author Anton Lindqvist <anton@qvister.se>
|
||||
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
||||
* @link http://github.com/mptre/php-soundcloud
|
||||
*/
|
||||
class Services_Soundcloud_Expose extends Services_Soundcloud {
|
||||
|
||||
/**
|
||||
* Class constructor. See parent constructor for further reference.
|
||||
*
|
||||
* @param string $clientId Application client id
|
||||
* @param string $clientSecret Application client secret
|
||||
* @param string $redirectUri Application redirect uri
|
||||
* @param boolean $development Sandbox mode
|
||||
*
|
||||
* @return void
|
||||
* @see Soundcloud
|
||||
*/
|
||||
function __construct($clientId, $clientSecret, $redirectUri = null, $development = false) {
|
||||
parent::__construct($clientId, $clientSecret, $redirectUri, $development);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct default http headers including response format and authorization.
|
||||
*
|
||||
* @return array
|
||||
* @see Soundcloud::_buildDefaultHeaders()
|
||||
*/
|
||||
function buildDefaultHeaders() {
|
||||
return $this->_buildDefaultHeaders();
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a url.
|
||||
*
|
||||
* @param string $path Relative or absolute uri
|
||||
* @param array $params Optional query string parameters
|
||||
* @param boolean $includeVersion Include the api version
|
||||
*
|
||||
* @return string
|
||||
* @see Soundcloud::_buildUrl()
|
||||
*/
|
||||
function buildUrl($path, $params = null, $includeVersion = true) {
|
||||
return $this->_buildUrl($path, $params, $includeVersion);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get http user agent.
|
||||
*
|
||||
* @return string
|
||||
* @see Soundcloud::_getUserAgent()
|
||||
*/
|
||||
function getUserAgent() {
|
||||
return $this->_getUserAgent();
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse HTTP response headers.
|
||||
*
|
||||
* @param string $headers
|
||||
*
|
||||
* @return array
|
||||
* @see Soundcloud::_parseHttpHeaders()
|
||||
*/
|
||||
function parseHttpHeaders($headers) {
|
||||
return $this->_parseHttpHeaders($headers);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates http response code.
|
||||
*
|
||||
* @return boolean
|
||||
* @see Soundcloud::_validResponseCode()
|
||||
*/
|
||||
function validResponseCode($code) {
|
||||
return $this->_validResponseCode($code);
|
||||
}
|
||||
|
||||
}
|
Binary file not shown.
Binary file not shown.
|
@ -97,6 +97,8 @@ msgid ""
|
|||
"%1$s copyright © %2$s All rights reserved.%3$sMaintained and "
|
||||
"distributed under the %4$s by %5$s"
|
||||
msgstr ""
|
||||
"%1$s copyright © %2$sVeškerá práva vyhrazena.%3$sUdržován a "
|
||||
"distribuován pod %4$s by %5$s"
|
||||
|
||||
#: airtime_mvc/application/layouts/scripts/livestream.phtml:9
|
||||
#: airtime_mvc/application/views/scripts/dashboard/stream-player.phtml:2
|
||||
|
@ -1365,19 +1367,19 @@ msgstr "Logo stanice:"
|
|||
msgid "Send support feedback"
|
||||
msgstr "Odeslat zpětnou vazbu"
|
||||
|
||||
#: airtime_mvc/application/forms/SupportSettings.php:121
|
||||
#: airtime_mvc/application/forms/RegisterAirtime.php:126
|
||||
#: airtime_mvc/application/forms/SupportSettings.php:122
|
||||
#: airtime_mvc/application/forms/RegisterAirtime.php:126
|
||||
#, php-format
|
||||
msgid "Promote my station on %s"
|
||||
msgstr ""
|
||||
msgstr "Podpořit mou stanici na %s"
|
||||
|
||||
#: airtime_mvc/application/forms/SupportSettings.php:133
|
||||
#: airtime_mvc/application/forms/RegisterAirtime.php:151
|
||||
#: airtime_mvc/application/forms/SupportSettings.php:150
|
||||
#: airtime_mvc/application/forms/RegisterAirtime.php:151
|
||||
#, php-format
|
||||
msgid "By checking this box, I agree to %s's %sprivacy policy%s."
|
||||
msgstr ""
|
||||
"Zaškrtnutí tohoto okénka souhlasím s %s's %spravidly ochrany osobních údajů"
|
||||
"%s."
|
||||
|
||||
#: airtime_mvc/application/forms/SupportSettings.php:156
|
||||
#: airtime_mvc/application/forms/RegisterAirtime.php:169
|
||||
|
@ -1422,7 +1424,7 @@ msgstr "Vysílat znovu?"
|
|||
#: airtime_mvc/application/forms/AddShowLiveStream.php:10
|
||||
#, php-format
|
||||
msgid "Use %s Authentication:"
|
||||
msgstr ""
|
||||
msgstr "Použij %s ověření pravosti:"
|
||||
|
||||
#: airtime_mvc/application/forms/AddShowLiveStream.php:16
|
||||
msgid "Use Custom Authentication:"
|
||||
|
@ -2427,11 +2429,10 @@ msgstr ""
|
|||
"Toto je administrátorské jméno a heslo pro Icecast / SHOUTcast k získání "
|
||||
"statistik poslechovosti."
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:180
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:178
|
||||
msgid ""
|
||||
"Warning: You cannot change this field while the show is currently playing"
|
||||
msgstr ""
|
||||
msgstr "Upozornění: Nelze změnit toto pole v průběhu vysílání programu"
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:181
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:179
|
||||
|
@ -3267,15 +3268,12 @@ msgstr "Nemáte udělen přístup k tomuto zdroji."
|
|||
msgid "You are not allowed to access this resource. "
|
||||
msgstr "Nemáte udělen přístup k tomuto zdroji. "
|
||||
|
||||
#: airtime_mvc/application/controllers/ApiController.php:848
|
||||
#: airtime_mvc/application/controllers/ApiController.php:868
|
||||
#: airtime_mvc/application/controllers/ApiController.php:880
|
||||
#: airtime_mvc/application/controllers/ApiController.php:771
|
||||
#: airtime_mvc/application/controllers/ApiController.php:791
|
||||
#: airtime_mvc/application/controllers/ApiController.php:803
|
||||
#, php-format
|
||||
msgid "File does not exist in %s"
|
||||
msgstr ""
|
||||
msgstr "Soubor neexistuje v %s"
|
||||
|
||||
#: airtime_mvc/application/controllers/ApiController.php:931
|
||||
#: airtime_mvc/application/controllers/ApiController.php:854
|
||||
|
@ -3546,7 +3544,7 @@ msgstr "Paměť"
|
|||
#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:14
|
||||
#, php-format
|
||||
msgid "%s Version"
|
||||
msgstr ""
|
||||
msgstr "%s Verze"
|
||||
|
||||
#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:30
|
||||
msgid "Disk Space"
|
||||
|
@ -3630,12 +3628,16 @@ msgid ""
|
|||
"collected regularly in order to enhance your user experience.%2$sClick 'Yes, "
|
||||
"help %1$s' and we'll make sure the features you use are constantly improving."
|
||||
msgstr ""
|
||||
"Pomozte %1$s zlepšit tím, že nám dáte vědět jak to používáte. Tyto informace "
|
||||
"budou pravidelně shromažďovány, aby se zvýšila vaše uživatelská zkušenosti. "
|
||||
"%2$s Zmáčkněte 'Odeslat feedback' 'Ano, pomoc %1$s' my budeme pracovat na "
|
||||
"tom, aby funkce, které používáte byly neustále zlepšovány."
|
||||
|
||||
#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:29
|
||||
#: airtime_mvc/application/views/scripts/form/support-setting.phtml:29
|
||||
#, php-format
|
||||
msgid "Click the box below to promote your station on %s."
|
||||
msgstr ""
|
||||
msgstr "Klikněte na box níže pro podporu vaší stanice na %s."
|
||||
|
||||
#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:67
|
||||
#: airtime_mvc/application/views/scripts/form/register-dialog.phtml:81
|
||||
|
@ -3695,6 +3697,8 @@ msgid ""
|
|||
"Rescan watched directory (This is useful if it is network mount and may be "
|
||||
"out of sync with %s)"
|
||||
msgstr ""
|
||||
"Znovu projít sledovaný adresář (Tato funkce je užitečná, pokud je síť "
|
||||
"přeplněna a nedojde k synchronizaci s %s)"
|
||||
|
||||
#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:44
|
||||
msgid "Remove watched directory"
|
||||
|
@ -4028,12 +4032,13 @@ msgstr "Počítaní posluchačů v čase"
|
|||
#: airtime_mvc/application/views/scripts/dashboard/help.phtml:3
|
||||
#, php-format
|
||||
msgid "Welcome to %s!"
|
||||
msgstr ""
|
||||
msgstr "Vítejte v %s!"
|
||||
|
||||
#: airtime_mvc/application/views/scripts/dashboard/help.phtml:4
|
||||
#, php-format
|
||||
msgid "Here's how you can get started using %s to automate your broadcasts: "
|
||||
msgstr ""
|
||||
"Zde můžete vidět jak začít s používáním %s pro automatizované vysílání:"
|
||||
|
||||
#: airtime_mvc/application/views/scripts/dashboard/help.phtml:7
|
||||
msgid ""
|
||||
|
@ -4094,11 +4099,12 @@ msgid ""
|
|||
"%1$s %2$s, the open radio software for scheduling and remote station "
|
||||
"management."
|
||||
msgstr ""
|
||||
"%1$s %2$s, open radio software pro plánování a řízení vzdálené stanice. "
|
||||
|
||||
#: airtime_mvc/application/views/scripts/dashboard/about.phtml:22
|
||||
#, php-format
|
||||
msgid "%1$s %2$s is distributed under the %3$s"
|
||||
msgstr ""
|
||||
msgstr "%1$s %2$s je distribuován pod %3$s"
|
||||
|
||||
#: airtime_mvc/application/views/scripts/login/password-change.phtml:3
|
||||
msgid "New password"
|
||||
|
@ -4134,6 +4140,8 @@ msgid ""
|
|||
"Welcome to the %s demo! You can log in using the username 'admin' and the "
|
||||
"password 'admin'."
|
||||
msgstr ""
|
||||
"Vítejte v %s demo! Můžete se přihlásit přes uživatelské jméno 'admin' a "
|
||||
"heslo 'admin'."
|
||||
|
||||
#: airtime_mvc/application/views/scripts/partialviews/header.phtml:3
|
||||
msgid "Previous:"
|
||||
|
@ -4522,7 +4530,7 @@ msgstr ""
|
|||
|
||||
#: airtime_mvc/application/models/Scheduler.php:195
|
||||
msgid "Cannot schedule a playlist that contains missing files."
|
||||
msgstr ""
|
||||
msgstr "Nelze naplánovat playlist, který obsahuje chybějící soubory."
|
||||
|
||||
#: airtime_mvc/application/models/Scheduler.php:216
|
||||
#: airtime_mvc/application/models/Scheduler.php:305
|
||||
|
@ -4582,7 +4590,7 @@ msgstr ""
|
|||
#: airtime_mvc/application/models/Auth.php:36
|
||||
#, php-format
|
||||
msgid "%s Password Reset"
|
||||
msgstr ""
|
||||
msgstr "%s Heslo onboveno"
|
||||
|
||||
#: airtime_mvc/application/services/CalendarService.php:50
|
||||
msgid "Record file doesn't exist"
|
||||
|
@ -4806,11 +4814,15 @@ msgid ""
|
|||
"the 'Send support feedback' box and we'll make sure the features you use are "
|
||||
"constantly improving."
|
||||
msgstr ""
|
||||
"Pomozte %s zlepšit %s tím, že dáte vědět jak to používáte. Tyto informace "
|
||||
"budou pravidelně shromažďovány, aby se zvýšily vaše uživatelské zkušenosti."
|
||||
"%sZmáčkněte 'Odeslat feedback' box a my budeme pracovat na tom, aby funkce, "
|
||||
"které používáte byly neustále zlepšovány."
|
||||
|
||||
#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:9
|
||||
#, php-format
|
||||
msgid "Purchase your copy of %s"
|
||||
msgstr ""
|
||||
msgstr "Kup si svou kopii %s"
|
||||
|
||||
#: airtime_mvc/application/forms/RegisterAirtime.php:126
|
||||
#: airtime_mvc/application/forms/SupportSettings.php:122
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue