CC-6046, CC-6045, CC-6047 - New SoundCloud implementation

This commit is contained in:
Duncan Sommerville 2015-06-03 16:57:17 -04:00
parent 51a3f19f43
commit b0b6e037ac
62 changed files with 4009 additions and 2491 deletions

View file

@ -27,6 +27,7 @@ require_once "ProvisioningHelper.php";
require_once "GoogleAnalytics.php";
require_once "Timezone.php";
require_once "Auth.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';

View file

@ -38,7 +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('player'))
->add(new Zend_Acl_Resource('soundcloud'));
/** Creating permissions */
$ccAcl->allow('G', 'index')
@ -72,6 +73,7 @@ $ccAcl->allow('G', 'index')
->allow('A', 'systemstatus')
->allow('A', 'preference')
->allow('A', 'player')
->allow('A', 'soundcloud')
->allow('S', 'thank-you')
->allow('S', 'billing');

View file

@ -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 (

View file

@ -103,6 +103,9 @@ return array (
'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',
@ -239,4 +242,8 @@ return array (
'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',
);

View file

@ -89,7 +89,17 @@ 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'];
if(isset($values['demo']['demo'])){
$CC_CONFIG['demo'] = $values['demo']['demo'];
}

View file

@ -717,11 +717,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()

View file

@ -71,6 +71,7 @@ class ErrorController extends Zend_Controller_Action {
* 404 error - route or controller
*/
public function error404Action() {
Logging::info("404!");
$this->_helper->viewRenderer('error-404');
$this->getResponse()->setHttpResponseCode(404);
$this->view->message = _('Page not found.');

View file

@ -265,8 +265,9 @@ class LibraryController extends Zend_Controller_Action
}
}
//SOUNDCLOUD MENU OPTIONS
if ($type === "audioclip" && Application_Model_Preference::GetUploadToSoundcloudOption()) {
// SOUNDCLOUD MENU OPTION
$soundcloudService = new SoundcloudService();
if ($type === "audioclip" && $soundcloudService->hasAccessToken()) {
//create a menu separator
$menu["sep1"] = "-----------";
@ -274,20 +275,16 @@ class LibraryController extends Zend_Controller_Action
//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);
}
if (!is_null($scid)) {
$serviceId = $soundcloudService->getServiceId($id);
if (!is_null($file) && $serviceId != 0) {
$menu["soundcloud"]["items"]["view"] = array("name" => _("View on Soundcloud"), "icon" => "soundcloud", "url" => $baseUrl."soundcloud/view-on-sound-cloud/id/{$id}");
$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}");
// TODO: reimplement how this works
$menu["soundcloud"]["items"]["upload"] = array("name" => $text, "icon" => "soundcloud", "url" => $baseUrl."soundcloud/upload/id/{$id}");
}
if (empty($menu)) {
@ -525,33 +522,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");
}
}
}

View file

@ -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>";
$this->view->form = $form;

View file

@ -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');

View file

@ -0,0 +1,78 @@
<?php
require_once "ThirdPartyController.php";
require_once "ise/php-soundcloud/src/Soundcloud/Service.php";
class SoundcloudController extends ThirdPartyController {
/**
* @var SoundcloudService
*/
private $_soundcloudService;
/**
* Set up SoundCloud access variables.
*/
public function init() {
parent::init();
$this->_soundcloudService = new SoundcloudService();
}
/**
* Send user to SoundCloud to authorize before being redirected
*/
public function authorizeAction() {
$auth_url = $this->_soundcloudService->getAuthorizeUrl();
header('Location: ' . $auth_url);
}
/**
* Called when user successfully completes SoundCloud authorization.
* Store the returned request token for future requests.
*/
public function redirectAction() {
$code = $_GET['code'];
$this->_soundcloudService->requestNewAccessToken($code);
header('Location: ' . $this->_baseUrl . 'Preference'); // Redirect back to the Preference page
}
/**
* 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->_soundcloudService->getLinkToFile($id);
header('Location: ' . $soundcloudLink);
} 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->_soundcloudService->removeTrackReference($id);
// Redirect to a 404 so the user knows something went wrong
header('Location: ' . $this->_baseUrl . 'error/error-404'); // Redirect back to the Preference page
}
}
/**
* Upload the file with the given id to SoundCloud.
*
* @throws Zend_Controller_Response_Exception thrown if upload fails for any reason
*/
public function uploadAction() {
$request = $this->getRequest();
$id = $request->getParam('id');
$this->_soundcloudService->upload($id);
}
/**
* Clear the previously saved request token from the preferences.
*/
public function deauthorizeAction() {
Application_Model_Preference::setSoundCloudRequestToken("");
header('Location: ' . $this->_baseUrl . 'Preference'); // Redirect back to the Preference page
}
}

View file

@ -0,0 +1,55 @@
<?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;
/**
* 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
*/
abstract function authorizeAction();
/**
* Called when user successfully completes third-party authorization.
* Store the returned request token for future requests.
*
* @return void
*/
abstract function redirectAction();
/**
* 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
*/
abstract function uploadAction();
/**
* Clear the previously saved request token from the preferences.
*
* @return void
*/
abstract function deauthorizeAction();
}

View file

@ -9,25 +9,21 @@ 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;
}
$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());
// Get all upgrades dynamically so we don't have to add them explicitly each time
$upgraders = getUpgrades();
Logging::info($upgraders);
$didWePerformAnUpgrade = false;
try
{
for ($i = 0; $i < count($upgraders); $i++)
foreach ($upgraders as $upgrader)
{
$upgrader = $upgraders[$i];
/** @var $upgrader AirtimeUpgrader */
$upgrader = new $upgrader();
if ($upgrader->checkIfUpgradeSupported())
{
// pass __DIR__ to the upgrades, since __DIR__ returns parent dir of file, not executor
@ -36,7 +32,6 @@ class UpgradeController extends Zend_Controller_Action
$this->getResponse()
->setHttpResponseCode(200)
->appendBody("Upgrade to Airtime " . $upgrader->getNewVersion() . " OK<br>");
$i = 0; //Start over, in case the upgrade handlers are not in ascending order.
}
}
@ -54,28 +49,4 @@ class UpgradeController extends Zend_Controller_Action
->appendBody($e->getMessage());
}
}
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");
$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;
}
return true;
}
}

View file

@ -0,0 +1,14 @@
CREATE TABLE IF NOT EXISTS "third_party_track_references"
(
"id" serial NOT NULL,
"service" VARCHAR(512) NOT NULL,
"foreign_id" INTEGER NOT NULL,
"file_id" INTEGER NOT NULL,
"status" VARCHAR(256) NOT NULL,
PRIMARY KEY ("id")
);
ALTER TABLE "third_party_track_references" ADD CONSTRAINT "track_reference_fkey"
FOREIGN KEY ("file_id")
REFERENCES "cc_files" ("id")
ON DELETE CASCADE;

View file

@ -1,6 +1,5 @@
<?php
require_once 'customvalidators/ConditionalNotEmpty.php';
require_once 'customvalidators/PasswordNotEmpty.php';
class Application_Form_EmailServerPreferences extends Zend_Form_SubForm
{

View file

@ -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();

View file

@ -0,0 +1,81 @@
<?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('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::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'
)
));
}
}

View file

@ -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);
}
}

View file

@ -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;
}
}

View file

@ -329,77 +329,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);
@ -660,12 +589,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();
@ -711,12 +634,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 {
@ -930,26 +847,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);
@ -1503,4 +1400,33 @@ class Application_Model_Preference
{
self::setValue("last_tunein_metadata_update", $value);
}
/* Third Party */
// SoundCloud
public static function getDefaultSoundCloudLicenseType() {
return self::getValue("soundcloud_license_type");
}
public static function setDefaultSoundCloudLicenseType($value) {
self::setValue("soundcloud_license_type", $value);
}
public static function getDefaultSoundCloudSharingType() {
return self::getValue("soundcloud_sharing_type");
}
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);
}
}

View file

@ -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) {

View file

@ -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();

View file

@ -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 {}

View file

@ -616,6 +616,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 +905,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);
@ -1131,77 +1134,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();
@ -1217,12 +1149,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
@ -1237,51 +1163,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) {

View file

@ -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
{
}

View file

@ -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
{
}

View file

@ -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
{
}

View file

@ -51,6 +51,7 @@ class CcPlayoutHistoryTemplateTableMap extends TableMap
public function buildRelations()
{
$this->addRelation('CcPlayoutHistoryTemplateField', 'CcPlayoutHistoryTemplateField', RelationMap::ONE_TO_MANY, array('id' => 'template_id', ), 'CASCADE', null, 'CcPlayoutHistoryTemplateFields');
$this->addRelation('ThirdPartyTrackReferences', 'ThirdPartyTrackReferences', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null, 'ThirdPartyTrackReferencess');
} // buildRelations()
} // CcPlayoutHistoryTemplateTableMap

View file

@ -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);

View file

@ -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);

View file

@ -0,0 +1,58 @@
<?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, 512, null);
$this->addColumn('foreign_id', 'DbForeignId', 'INTEGER', true, null, null);
$this->addForeignKey('file_id', 'DbFileId', 'INTEGER', 'cc_playout_history_template', 'id', true, 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('CcPlayoutHistoryTemplate', 'CcPlayoutHistoryTemplate', RelationMap::MANY_TO_ONE, array('file_id' => 'id', ), 'CASCADE', null);
} // buildRelations()
} // ThirdPartyTrackReferencesTableMap

View file

@ -53,6 +53,12 @@ abstract class BaseCcPlayoutHistoryTemplate extends BaseObject implements Persis
protected $collCcPlayoutHistoryTemplateFields;
protected $collCcPlayoutHistoryTemplateFieldsPartial;
/**
* @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.
@ -79,6 +85,12 @@ abstract class BaseCcPlayoutHistoryTemplate extends BaseObject implements Persis
*/
protected $ccPlayoutHistoryTemplateFieldsScheduledForDeletion = null;
/**
* An array of objects scheduled for deletion.
* @var PropelObjectCollection
*/
protected $thirdPartyTrackReferencessScheduledForDeletion = null;
/**
* Get the [id] column value.
*
@ -283,6 +295,8 @@ abstract class BaseCcPlayoutHistoryTemplate extends BaseObject implements Persis
$this->collCcPlayoutHistoryTemplateFields = null;
$this->collThirdPartyTrackReferencess = null;
} // if (deep)
}
@ -424,6 +438,23 @@ abstract class BaseCcPlayoutHistoryTemplate extends BaseObject implements Persis
}
}
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;
}
@ -589,6 +620,14 @@ abstract class BaseCcPlayoutHistoryTemplate extends BaseObject implements Persis
}
}
if ($this->collThirdPartyTrackReferencess !== null) {
foreach ($this->collThirdPartyTrackReferencess as $referrerFK) {
if (!$referrerFK->validate($columns)) {
$failureMap = array_merge($failureMap, $referrerFK->getValidationFailures());
}
}
}
$this->alreadyInValidation = false;
}
@ -675,6 +714,9 @@ abstract class BaseCcPlayoutHistoryTemplate extends BaseObject implements Persis
if (null !== $this->collCcPlayoutHistoryTemplateFields) {
$result['CcPlayoutHistoryTemplateFields'] = $this->collCcPlayoutHistoryTemplateFields->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects);
}
if (null !== $this->collThirdPartyTrackReferencess) {
$result['ThirdPartyTrackReferencess'] = $this->collThirdPartyTrackReferencess->toArray(null, true, $keyType, $includeLazyLoadColumns, $alreadyDumpedObjects);
}
}
return $result;
@ -838,6 +880,12 @@ abstract class BaseCcPlayoutHistoryTemplate extends BaseObject implements Persis
}
}
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)
@ -902,6 +950,9 @@ abstract class BaseCcPlayoutHistoryTemplate extends BaseObject implements Persis
if ('CcPlayoutHistoryTemplateField' == $relationName) {
$this->initCcPlayoutHistoryTemplateFields();
}
if ('ThirdPartyTrackReferences' == $relationName) {
$this->initThirdPartyTrackReferencess();
}
}
/**
@ -1129,6 +1180,231 @@ abstract class BaseCcPlayoutHistoryTemplate extends BaseObject implements Persis
return $this;
}
/**
* 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 CcPlayoutHistoryTemplate 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 CcPlayoutHistoryTemplate 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)
->filterByCcPlayoutHistoryTemplate($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 CcPlayoutHistoryTemplate 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->setCcPlayoutHistoryTemplate(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
->filterByCcPlayoutHistoryTemplate($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 CcPlayoutHistoryTemplate 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->setCcPlayoutHistoryTemplate($this);
}
/**
* @param ThirdPartyTrackReferences $thirdPartyTrackReferences The thirdPartyTrackReferences object to remove.
* @return CcPlayoutHistoryTemplate 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->setCcPlayoutHistoryTemplate(null);
}
return $this;
}
/**
* Clears the current object and sets all attributes to their default values
*/
@ -1164,6 +1440,11 @@ abstract class BaseCcPlayoutHistoryTemplate extends BaseObject implements Persis
$o->clearAllReferences($deep);
}
}
if ($this->collThirdPartyTrackReferencess) {
foreach ($this->collThirdPartyTrackReferencess as $o) {
$o->clearAllReferences($deep);
}
}
$this->alreadyInClearAllReferencesDeep = false;
} // if ($deep)
@ -1172,6 +1453,10 @@ abstract class BaseCcPlayoutHistoryTemplate extends BaseObject implements Persis
$this->collCcPlayoutHistoryTemplateFields->clearIterator();
}
$this->collCcPlayoutHistoryTemplateFields = null;
if ($this->collThirdPartyTrackReferencess instanceof PropelCollection) {
$this->collThirdPartyTrackReferencess->clearIterator();
}
$this->collThirdPartyTrackReferencess = null;
}
/**

View file

@ -368,6 +368,9 @@ abstract class BaseCcPlayoutHistoryTemplatePeer
// Invalidate objects in CcPlayoutHistoryTemplateFieldPeer instance pool,
// since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule.
CcPlayoutHistoryTemplateFieldPeer::clearInstancePool();
// Invalidate objects in ThirdPartyTrackReferencesPeer instance pool,
// since one or more of them may be deleted by ON DELETE CASCADE/SETNULL rule.
ThirdPartyTrackReferencesPeer::clearInstancePool();
}
/**

View file

@ -22,6 +22,10 @@
* @method CcPlayoutHistoryTemplateQuery rightJoinCcPlayoutHistoryTemplateField($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcPlayoutHistoryTemplateField relation
* @method CcPlayoutHistoryTemplateQuery innerJoinCcPlayoutHistoryTemplateField($relationAlias = null) Adds a INNER JOIN clause to the query using the CcPlayoutHistoryTemplateField relation
*
* @method CcPlayoutHistoryTemplateQuery leftJoinThirdPartyTrackReferences($relationAlias = null) Adds a LEFT JOIN clause to the query using the ThirdPartyTrackReferences relation
* @method CcPlayoutHistoryTemplateQuery rightJoinThirdPartyTrackReferences($relationAlias = null) Adds a RIGHT JOIN clause to the query using the ThirdPartyTrackReferences relation
* @method CcPlayoutHistoryTemplateQuery innerJoinThirdPartyTrackReferences($relationAlias = null) Adds a INNER JOIN clause to the query using the ThirdPartyTrackReferences relation
*
* @method CcPlayoutHistoryTemplate findOne(PropelPDO $con = null) Return the first CcPlayoutHistoryTemplate matching the query
* @method CcPlayoutHistoryTemplate findOneOrCreate(PropelPDO $con = null) Return the first CcPlayoutHistoryTemplate matching the query, or a new CcPlayoutHistoryTemplate object populated from the query conditions when no match is found
*
@ -401,6 +405,80 @@ abstract class BaseCcPlayoutHistoryTemplateQuery extends ModelCriteria
->useQuery($relationAlias ? $relationAlias : 'CcPlayoutHistoryTemplateField', 'CcPlayoutHistoryTemplateFieldQuery');
}
/**
* 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 CcPlayoutHistoryTemplateQuery 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(CcPlayoutHistoryTemplatePeer::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 CcPlayoutHistoryTemplateQuery The current query, for fluid interface
*/
public function joinThirdPartyTrackReferences($relationAlias = null, $joinType = Criteria::INNER_JOIN)
{
$tableMap = $this->getTableMap();
$relationMap = $tableMap->getRelation('ThirdPartyTrackReferences');
// create a ModelJoin object for this join
$join = new ModelJoin();
$join->setJoinType($joinType);
$join->setRelationMap($relationMap, $this->useAliasInSQL ? $this->getModelAlias() : null, $relationAlias);
if ($previousJoin = $this->getPreviousJoin()) {
$join->setPreviousJoin($previousJoin);
}
// add the ModelJoin to the current object
if ($relationAlias) {
$this->addAlias($relationAlias, $relationMap->getRightTable()->getName());
$this->addJoinObject($join, $relationAlias);
} else {
$this->addJoinObject($join, 'ThirdPartyTrackReferences');
}
return $this;
}
/**
* Use the ThirdPartyTrackReferences relation ThirdPartyTrackReferences object
*
* @see useQuery()
*
* @param string $relationAlias optional alias for the relation,
* to be used as main alias in the secondary query
* @param string $joinType Accepted values are null, 'left join', 'right join', 'inner join'
*
* @return ThirdPartyTrackReferencesQuery A secondary query class using the current class as primary query
*/
public function useThirdPartyTrackReferencesQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN)
{
return $this
->joinThirdPartyTrackReferences($relationAlias, $joinType)
->useQuery($relationAlias ? $relationAlias : 'ThirdPartyTrackReferences', 'ThirdPartyTrackReferencesQuery');
}
/**
* Exclude object from result
*

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,516 @@
<?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 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 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 leftJoinCcPlayoutHistoryTemplate($relationAlias = null) Adds a LEFT JOIN clause to the query using the CcPlayoutHistoryTemplate relation
* @method ThirdPartyTrackReferencesQuery rightJoinCcPlayoutHistoryTemplate($relationAlias = null) Adds a RIGHT JOIN clause to the query using the CcPlayoutHistoryTemplate relation
* @method ThirdPartyTrackReferencesQuery innerJoinCcPlayoutHistoryTemplate($relationAlias = null) Adds a INNER JOIN clause to the query using the CcPlayoutHistoryTemplate 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(int $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 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(int $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 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", "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(1234); // WHERE foreign_id = 1234
* $query->filterByDbForeignId(array(12, 34)); // WHERE foreign_id IN (12, 34)
* $query->filterByDbForeignId(array('min' => 12)); // WHERE foreign_id >= 12
* $query->filterByDbForeignId(array('max' => 12)); // WHERE foreign_id <= 12
* </code>
*
* @param mixed $dbForeignId 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 filterByDbForeignId($dbForeignId = null, $comparison = null)
{
if (is_array($dbForeignId)) {
$useMinMax = false;
if (isset($dbForeignId['min'])) {
$this->addUsingAlias(ThirdPartyTrackReferencesPeer::FOREIGN_ID, $dbForeignId['min'], Criteria::GREATER_EQUAL);
$useMinMax = true;
}
if (isset($dbForeignId['max'])) {
$this->addUsingAlias(ThirdPartyTrackReferencesPeer::FOREIGN_ID, $dbForeignId['max'], Criteria::LESS_EQUAL);
$useMinMax = true;
}
if ($useMinMax) {
return $this;
}
if (null === $comparison) {
$comparison = Criteria::IN;
}
}
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 filterByCcPlayoutHistoryTemplate()
*
* @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 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 CcPlayoutHistoryTemplate object
*
* @param CcPlayoutHistoryTemplate|PropelObjectCollection $ccPlayoutHistoryTemplate 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 filterByCcPlayoutHistoryTemplate($ccPlayoutHistoryTemplate, $comparison = null)
{
if ($ccPlayoutHistoryTemplate instanceof CcPlayoutHistoryTemplate) {
return $this
->addUsingAlias(ThirdPartyTrackReferencesPeer::FILE_ID, $ccPlayoutHistoryTemplate->getDbId(), $comparison);
} elseif ($ccPlayoutHistoryTemplate instanceof PropelObjectCollection) {
if (null === $comparison) {
$comparison = Criteria::IN;
}
return $this
->addUsingAlias(ThirdPartyTrackReferencesPeer::FILE_ID, $ccPlayoutHistoryTemplate->toKeyValue('PrimaryKey', 'DbId'), $comparison);
} else {
throw new PropelException('filterByCcPlayoutHistoryTemplate() only accepts arguments of type CcPlayoutHistoryTemplate or PropelCollection');
}
}
/**
* Adds a JOIN clause to the query using the CcPlayoutHistoryTemplate 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 joinCcPlayoutHistoryTemplate($relationAlias = null, $joinType = Criteria::INNER_JOIN)
{
$tableMap = $this->getTableMap();
$relationMap = $tableMap->getRelation('CcPlayoutHistoryTemplate');
// 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, 'CcPlayoutHistoryTemplate');
}
return $this;
}
/**
* Use the CcPlayoutHistoryTemplate relation CcPlayoutHistoryTemplate 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 CcPlayoutHistoryTemplateQuery A secondary query class using the current class as primary query
*/
public function useCcPlayoutHistoryTemplateQuery($relationAlias = null, $joinType = Criteria::INNER_JOIN)
{
return $this
->joinCcPlayoutHistoryTemplate($relationAlias, $joinType)
->useQuery($relationAlias ? $relationAlias : 'CcPlayoutHistoryTemplate', 'CcPlayoutHistoryTemplateQuery');
}
/**
* 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;
}
}

View file

@ -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"),

View file

@ -0,0 +1,164 @@
<?php
require_once "ThirdPartyService.php";
class SoundcloudService extends ThirdPartyService {
/**
* @var Soundcloud\Service SoundCloud API wrapper object
*/
private $_client;
/**
* @var string service name to store in ThirdPartyTrackReferences database
*/
protected $_SERVICE_NAME = 'SoundCloud';
/**
* @var string base URI for SoundCloud tracks
*/
protected $_THIRD_PARTY_TRACK_URI = 'http://api.soundcloud.com/tracks/';
/**
* @var array Application_Model_Preference functions for SoundCloud and their
* associated API parameter keys so that we can call them dynamically
*/
private $_SOUNDCLOUD_PREF_FUNCTIONS = array(
"getDefaultSoundCloudLicenseType" => "license",
"getDefaultSoundCloudSharingType" => "sharing"
);
/**
* Initialize the service
*/
public function __construct() {
$CC_CONFIG = Config::getConfig();
// FIXME: These values are hardcoded into conf.php right now...
// we should move these to a global config file
$clientId = $CC_CONFIG['soundcloud-client-id'];
$clientSecret = $CC_CONFIG['soundcloud-client-secret'];
$baseUrl = $CC_CONFIG['baseUrl'] . ":" . $CC_CONFIG['basePort'];
$redirectUri = 'http://' . $baseUrl . '/soundcloud/redirect';
$this->_client = new Soundcloud\Service($clientId, $clientSecret, $redirectUri);
$accessToken = Application_Model_Preference::getSoundCloudRequestToken();
if (!empty($accessToken)) {
$this->_client->setAccessToken($accessToken);
}
}
// TODO: upload functionality will be moved to python, this is just for testing
/**
* Upload the file with the given identifier to SoundCloud
*
* @param int $fileId the local CcFiles identifier
*
* @throws Soundcloud\Exception\InvalidHttpResponseCodeException
* thrown when the upload fails for any reason
*/
public function upload($fileId) {
$file = Application_Model_StoredFile::RecallById($fileId);
try {
$track = json_decode($this->_client->post('tracks', $this->_buildTrackArray($file)));
parent::_createTrackReference($fileId, $track);
} catch(Soundcloud\Exception\InvalidHttpResponseCodeException $e) {
Logging::info("Invalid request: " . $e->getMessage());
// We should only get here if we have an access token, so attempt to refresh
$this->accessTokenRefresh();
}
}
/**
* 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
*/
private function _buildTrackArray($file) {
$trackArray = array(
'track[title]' => $file->getName(),
// TODO: verify that S3 uploads work
'track[asset_data]' => '@'.$file->getFilePaths()[0]
);
foreach($this->_SOUNDCLOUD_PREF_FUNCTIONS as $func => $param) {
$val = Application_Model_Preference::$func();
if (!empty($val)) {
$trackArray["track[$param]"] = $val;
}
}
return $trackArray;
}
/**
* 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
*/
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 ''; }
$track = json_decode($this->_client->get('tracks/'. $serviceId));
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() {
$accessToken = $this->_client->getAccessToken();
return !empty($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'].$_SERVER['REQUEST_URI']);
return $this->_client->getAuthorizeUrl(array("state" => $url));
}
/**
* 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, $postData = array('scope' => 'non-expiring'));
$accessToken = $response['access_token'];
Application_Model_Preference::setSoundCloudRequestToken($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->_client->getAccessToken();
$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("");
}
}
}

View file

@ -0,0 +1,120 @@
<?php
/**
* Class ThirdPartyService generic superclass for third-party services
*/
abstract class ThirdPartyService {
/**
* @var string service name to store in ThirdPartyTrackReferences database
*/
protected $_SERVICE_NAME = '';
/**
* @var string base URI for third-party tracks
*/
protected $_THIRD_PARTY_TRACK_URI = '';
/**
* Upload the file with the given identifier to a third-party service
*
* @param int $fileId the local CcFiles identifier
*/
abstract function upload($fileId);
/**
* Create a ThirdPartyTrackReferences and save it to the database
*
* @param $fileId int local CcFiles identifier
* @param $track object third-party service track object
*
* @throws Exception
* @throws PropelException
*/
protected function _createTrackReference($fileId, $track) {
// First, check if the track already has an entry in the database
$ref = ThirdPartyTrackReferencesQuery::create()
->filterByDbService($this->_SERVICE_NAME)
->findOneByDbFileId($fileId);
if (is_null($ref)) {
$ref = new ThirdPartyTrackReferences();
}
$ref->setDbService($this->_SERVICE_NAME);
$ref->setDbForeignId($track->id);
$ref->setDbFileId($fileId);
$ref->setDbStatus($track->state);
$ref->save();
}
/**
* 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 local CcFiles identifier
*
* @throws Exception
* @throws PropelException
*/
public function removeTrackReference($fileId) {
$ref = ThirdPartyTrackReferencesQuery::create()
->filterByDbService($this->_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 local CcFiles identifier
*
* @return int the service foreign identifier
*/
public function getServiceId($fileId) {
$ref = ThirdPartyTrackReferencesQuery::create()
->filterByDbService($this->_SERVICE_NAME)
->findOneByDbFileId($fileId); // There shouldn't be duplicates!
return is_null($ref) ? 0 : $ref->getDbForeignId();
}
/**
* 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 local CcFiles identifier
*
* @return string the link to the remote file
*/
public function getLinkToFile($fileId) {
$serviceId = $this->getServiceId($fileId);
return $serviceId > 0 ? $this->_THIRD_PARTY_TRACK_URI . $serviceId : '';
}
/**
* Check whether an OAuth access token exists for the third-party client
*
* @return bool true if an access token exists, otherwise false
*/
abstract function hasAccessToken();
/**
* Get the OAuth authorization URL
*
* @return string the authorization URL
*/
abstract function getAuthorizeUrl();
/**
* Request a new OAuth access token from a third-party service and store it in CcPref
*
* @param $code string exchange authorization code for access token
*/
abstract function requestNewAccessToken($code);
/**
* Regenerate the third-party client's OAuth access token
*/
abstract function accessTokenRefresh();
}

View file

@ -1,5 +1,25 @@
<?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");
}
abstract class AirtimeUpgrader
{
/** Versions that this upgrader class can upgrade from (an array of version strings). */
@ -9,27 +29,27 @@ abstract class AirtimeUpgrader
public static function getCurrentVersion()
{
CcPrefPeer::clearInstancePool(); //Ensure we don't get a cached Propel object (cached DB results)
//because we're updating this version number within this HTTP request as well.
CcPrefPeer::clearInstancePool(); //Ensure we don't get a cached Propel object (cached DB results)
//because we're updating this version number within this HTTP request as well.
$pref = CcPrefQuery::create()
->filterByKeystr('system_version')
->findOne();
->filterByKeystr('system_version')
->findOne();
$airtime_version = $pref->getValStr();
return $airtime_version;
}
/**
/**
* 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::getCurrentVersion(), $this->getSupportedVersions())) {
return false;
}
return true;
}
protected function toggleMaintenanceScreen($toggle)
{
if ($toggle)
@ -51,7 +71,7 @@ abstract class AirtimeUpgrader
}*/
}
}
/** Implement this for each new version of Airtime */
abstract public function upgrade();
}
@ -437,3 +457,49 @@ class AirtimeUpgrader2512 extends AirtimeUpgrader
}
}
class AirtimeUpgrader2513 extends AirtimeUpgrader
{
protected function getSupportedVersions() {
return array (
'2.5.12'
);
}
public function getNewVersion() {
return '2.5.13';
}
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_"
.$newVersion."/upgrade.sql $database 2>&1 | grep -v -E \"will create implicit sequence|will create implicit index\"");
Application_Model_Preference::SetAirtimeVersion($newVersion);
Cache::clear();
$this->toggleMaintenanceScreen(false);
} catch(Exception $e) {
$this->toggleMaintenanceScreen(false);
throw $e;
}
}
}

View 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>

View file

@ -11,6 +11,12 @@
<?php //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>
<h3 class="collapsible-header" id="dangerous-heading"><span class="arrow-icon"></span><?php echo _("Dangerous Options") ?></h3>
<div class="collapsible-content" id="dangerous-settings">
<?php echo $this->element->getSubform('preferences_danger') ?>

View file

@ -1,112 +1,30 @@
<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>
<!-- <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>-->
<?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>