Merge branch 'saas-dev' into saas-dev-schedule-widget-angular
This commit is contained in:
commit
5f925f2f1f
103 changed files with 9339 additions and 2988 deletions
|
@ -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,7 +144,9 @@ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
|
|||
|
||||
$baseUrl = Application_Common_OsPath::getBaseDir();
|
||||
|
||||
$view->headLink(array('rel' => 'icon', 'href' => $baseUrl . 'favicon.ico', 'type' => 'image/x-icon'), 'PREPEND')
|
||||
$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'])
|
||||
|
|
232
airtime_mvc/application/common/TaskManager.php
Normal file
232
airtime_mvc/application/common/TaskManager.php
Normal file
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
31
airtime_mvc/application/common/interface/OAuth2.php
Normal file
31
airtime_mvc/application/common/interface/OAuth2.php
Normal file
|
@ -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,7 +10,6 @@ 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');
|
||||
|
@ -88,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");
|
||||
|
@ -107,4 +99,16 @@ define('PROVISIONING_STATUS_SUSPENDED' , 'Suspended');
|
|||
define('PROVISIONING_STATUS_ACTIVE' , 'Active');
|
||||
|
||||
//TuneIn integration
|
||||
define("TUNEIN_API_URL", "http://air.radiotime.com/Playing.ashx");
|
||||
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');
|
||||
|
|
|
@ -648,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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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');
|
||||
|
|
41
airtime_mvc/application/controllers/SoundcloudController.php
Normal file
41
airtime_mvc/application/controllers/SoundcloudController.php
Normal file
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
93
airtime_mvc/application/controllers/ThirdPartyController.php
Normal file
93
airtime_mvc/application/controllers/ThirdPartyController.php
Normal file
|
@ -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;
|
|
@ -1,6 +1,5 @@
|
|||
<?php
|
||||
require_once 'customvalidators/ConditionalNotEmpty.php';
|
||||
require_once 'customvalidators/PasswordNotEmpty.php';
|
||||
|
||||
class Application_Form_EmailServerPreferences extends Zend_Form_SubForm
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
|
|
57
airtime_mvc/application/forms/SoundCloudPreferences.php
Normal file
57
airtime_mvc/application/forms/SoundCloudPreferences.php
Normal file
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -200,14 +200,14 @@ SQL;
|
|||
// track information to the current show values
|
||||
if ($source != self::SCHEDULED_SOURCE_NAME) {
|
||||
$show = Application_Model_Show::getCurrentShow();
|
||||
$results["current"] = array(
|
||||
"starts" => $show[0]["starts"],
|
||||
"ends" => $show[0]["ends"],
|
||||
"type" => _("livestream"),
|
||||
"name" => (isset($show[0])?$show[0]["name"]:"") . " - " . _(self::LIVE_STREAM),
|
||||
$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"
|
||||
);
|
||||
"record" => "0"
|
||||
) : null;
|
||||
} else if (count($rows) >= 1) {
|
||||
$currentMedia = $rows[0];
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
18
airtime_mvc/application/models/airtime/CeleryTasks.php
Normal file
18
airtime_mvc/application/models/airtime/CeleryTasks.php
Normal file
|
@ -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
|
||||
{
|
||||
}
|
18
airtime_mvc/application/models/airtime/CeleryTasksPeer.php
Normal file
18
airtime_mvc/application/models/airtime/CeleryTasksPeer.php
Normal file
|
@ -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
|
||||
{
|
||||
}
|
18
airtime_mvc/application/models/airtime/CeleryTasksQuery.php
Normal file
18
airtime_mvc/application/models/airtime/CeleryTasksQuery.php
Normal file
|
@ -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
|
||||
*
|
||||
|
|
1189
airtime_mvc/application/models/airtime/om/BaseCeleryTasks.php
Normal file
1189
airtime_mvc/application/models/airtime/om/BaseCeleryTasks.php
Normal file
File diff suppressed because it is too large
Load diff
1019
airtime_mvc/application/models/airtime/om/BaseCeleryTasksPeer.php
Normal file
1019
airtime_mvc/application/models/airtime/om/BaseCeleryTasksPeer.php
Normal file
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"),
|
||||
|
|
211
airtime_mvc/application/services/CeleryService.php
Normal file
211
airtime_mvc/application/services/CeleryService.php
Normal file
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
20
airtime_mvc/application/services/CeleryServiceFactory.php
Normal file
20
airtime_mvc/application/services/CeleryServiceFactory.php
Normal file
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
223
airtime_mvc/application/services/SoundcloudService.php
Normal file
223
airtime_mvc/application/services/SoundcloudService.php
Normal file
|
@ -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("");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
131
airtime_mvc/application/services/ThirdPartyCeleryService.php
Normal file
131
airtime_mvc/application/services/ThirdPartyCeleryService.php
Normal file
|
@ -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);
|
||||
|
||||
}
|
149
airtime_mvc/application/services/ThirdPartyService.php
Normal file
149
airtime_mvc/application/services/ThirdPartyService.php
Normal 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';
|
||||
}
|
||||
}
|
||||
|
|
18
airtime_mvc/application/views/scripts/error/error-404.phtml
Normal file
18
airtime_mvc/application/views/scripts/error/error-404.phtml
Normal file
|
@ -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,8 +8,10 @@
|
|||
<?php echo $this->element->getSubform('preferences_tunein') ?>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- No soundcloud stuff on Airtime Pro -- Albert -->
|
||||
<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>
|
||||
|
||||
<!-- Hide the 'dangerous settings' by default -->
|
||||
<h3 class="collapsible-header closed" id="dangerous-heading"><span class="arrow-icon"></span><?php echo _("Dangerous Options") ?></h3>
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue