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>

View File

@ -1,6 +1,6 @@
#Note: project.home is automatically generated by the propel-install script.
#Any manual changes to this value will be overwritten.
project.home = /home/sourcefabric/dev/Airtime-SaaS/Airtime/airtime_mvc
project.home = /home/sourcefabric/dev/Airtime/airtime_mvc
project.build = ${project.home}/build
#Database driver

View File

@ -531,4 +531,14 @@
<reference local="template_id" foreign="id"/>
</foreign-key>
</table>
<table name="third_party_track_references" phpName="ThirdPartyTrackReferences">
<column name="id" phpName="DbId" primaryKey="true" type="INTEGER" autoIncrement="true" required="true" />
<column name="service" phpName="DbService" type="VARCHAR" size="512" required="true" />
<column name="foreign_id" phpName="DbForeignId" type="INTEGER" required="true" />
<column name="file_id" phpName="DbFileId" type="INTEGER" required="true" />
<column name="status" phpName="DbStatus" type="VARCHAR" size="256" required="true" />
<foreign-key foreignTable="cc_playout_history_template" name="track_reference_fkey" onDelete="CASCADE">
<reference local="file_id" foreign="id"/>
</foreign-key>
</table>
</database>

View File

@ -670,6 +670,22 @@ CREATE TABLE "cc_playout_history_template_field"
PRIMARY KEY ("id")
);
-----------------------------------------------------------------------
-- third_party_track_references
-----------------------------------------------------------------------
DROP TABLE IF EXISTS "third_party_track_references" CASCADE;
CREATE TABLE "third_party_track_references"
(
"id" serial NOT NULL,
"service" VARCHAR(512) NOT NULL,
"foreign_id" INTEGER NOT NULL,
"file_id" INTEGER NOT NULL,
"status" VARCHAR(256) NOT NULL,
PRIMARY KEY ("id")
);
ALTER TABLE "cc_files" ADD CONSTRAINT "cc_files_owner_fkey"
FOREIGN KEY ("owner_id")
REFERENCES "cc_subjs" ("id");
@ -831,3 +847,8 @@ ALTER TABLE "cc_playout_history_template_field" ADD CONSTRAINT "cc_playout_histo
FOREIGN KEY ("template_id")
REFERENCES "cc_playout_history_template" ("id")
ON DELETE CASCADE;
ALTER TABLE "third_party_track_references" ADD CONSTRAINT "track_reference_fkey"
FOREIGN KEY ("file_id")
REFERENCES "cc_playout_history_template" ("id")
ON DELETE CASCADE;

View File

@ -1,114 +0,0 @@
# SoundCloud PHP API Wrapper
## Introduction
A wrapper for the SoundCloud API written in PHP with support for authentication using [OAuth 2.0](http://oauth.net/2/).
The wrapper got a real overhaul with version 2.0. The current version was written with [PEAR](http://pear.php.net/) in mind and can easily by distributed as a PEAR package.
## Getting started
Check out the [getting started](https://github.com/mptre/php-soundcloud/wiki/OAuth-2) wiki entry for further reference on how to get started. Also make sure to check out the [demo application](https://github.com/mptre/ci-soundcloud) for some example code.
## Examples
The wrapper includes convenient methods used to perform HTTP requests on behalf of the authenticated user. Below you'll find a few quick examples.
Ofcourse you need to handle the authentication first before being able to request and modify protect resources as demonstrated below. Therefor I refer to the [demo application](https://github.com/mptre/ci-soundcloud) which got some example code on how to handle authentication.
### GET
<pre><code>try {
$response = json_decode($soundcloud->get('me'), true);
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
exit($e->getMessage());
}</code></pre>
### POST
<pre><code>$comment = &lt;&lt;&lt;EOH
&lt;comment&gt;
&lt;body&gt;Yeah!&lt;/body&gt;
&lt;/comment&gt;
EOH;
try {
$response = json_decode(
$soundcloud->post(
'tracks/1/comments',
$comment,
array(CURLOPT_HTTPHEADER => array('Content-Type: application/xml'))
),
true
);
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
exit($e->getMessage());
}</code></pre>
### PUT
<pre><code>$track = &lt;&lt;&lt;EOH
&lt;track&gt;
&lt;downloadable&gt;true&lt;/downloadable&gt;
&lt;/track&gt;
EOH;
try {
$response = json_decode(
$soundcloud->put(
'tracks/1',
$track,
array(CURLOPT_HTTPHEADER => array('Content-Type: application/xml'))
),
true
);
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
exit($e->getMessage());
}</code></pre>
### DELETE
<pre><code>try {
$response = json_decode($soundcloud->delete('tracks/1'), true);
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
exit($e->getMessage());
}</code></pre>
### DOWNLOAD TRACK
<pre><code>try {
$track = $soundcloud->download(1337);
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
exit($e->getMessage());
}
// do something clever with $track. Save to file perhaps?</code></pre>
## Feedback and questions
Found a bug or missing a feature? Don't hesitate to create a new issue here on GitHub. Or contact me [directly](https://github.com/mptre).
Also make sure to check out the official [documentation](https://github.com/soundcloud/api/wiki/) and the join [Google Group](https://groups.google.com/group/soundcloudapi?pli=1) in order to stay updated.
## License
Copyright (c) 2011 Anton Lindqvist
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -1,737 +0,0 @@
<?php
require_once 'Soundcloud/Exception.php';
require_once 'Soundcloud/Version.php';
/**
* SoundCloud API wrapper with support for authentication using OAuth 2.
*
* @category Services
* @package Services_Soundcloud
* @author Anton Lindqvist <anton@qvister.se>
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://github.com/mptre/php-soundcloud
*/
class Services_Soundcloud {
/**
* Custom cURL option.
*
* @access public
*
* @var integer
*/
const CURLOPT_OAUTH_TOKEN = 173;
/**
* Access token returned by the service provider after a successful authentication.
*
* @access private
*
* @var string
*/
private $_accessToken;
/**
* Version of the API to use.
*
* @access private
*
* @var integer
*/
private static $_apiVersion = 1;
/**
* Supported audio MIME types.
*
* @access private
*
* @var array
*/
private static $_audioMimeTypes = array(
'aac' => 'video/mp4',
'aiff' => 'audio/x-aiff',
'flac' => 'audio/flac',
'mp3' => 'audio/mpeg',
'ogg' => 'audio/ogg',
'wav' => 'audio/x-wav'
);
/**
* OAuth client id.
*
* @access private
*
* @var string
*/
private $_clientId;
/**
* OAuth client secret.
*
* @access private
*
* @var string
*/
private $_clientSecret;
/**
* Development mode.
*
* @access private
*
* @var boolean
*/
private $_development;
/**
* Available API domains.
*
* @access private
*
* @var array
*/
private static $_domains = array(
'development' => 'sandbox-soundcloud.com',
'production' => 'soundcloud.com'
);
/**
* HTTP response body from the last request.
*
* @access private
*
* @var string
*/
private $_lastHttpResponseBody;
/**
* HTTP response code from the last request.
*
* @access private
*
* @var integer
*/
private $_lastHttpResponseCode;
/**
* HTTP response headers from last request.
*
* @access private
*
* @var array
*/
private $_lastHttpResponseHeaders;
/**
* OAuth paths.
*
* @access private
*
* @var array
*/
private static $_paths = array(
'authorize' => 'connect',
'access_token' => 'oauth2/token',
);
/**
* OAuth redirect uri.
*
* @access private
*
* @var string
*/
private $_redirectUri;
/**
* API response format MIME type.
*
* @access private
*
* @var string
*/
private $_requestFormat;
/**
* Available response formats.
*
* @access private
*
* @var array
*/
private static $_responseFormats = array(
'*' => '*/*',
'json' => 'application/json',
'xml' => 'application/xml'
);
/**
* HTTP user agent.
*
* @access private
*
* @var string
*/
private static $_userAgent = 'PHP-SoundCloud';
/**
* Class version.
*
* @var string
*/
public $version;
/**
* Constructor.
*
* @param string $clientId OAuth client id
* @param string $clientSecret OAuth client secret
* @param string $redirectUri OAuth redirect uri
* @param boolean $development Sandbox mode
*
* @throws Services_Soundcloud_Missing_Client_Id_Exception when missing client id
* @return void
*/
function __construct($clientId, $clientSecret, $redirectUri = null, $development = false) {
if (empty($clientId)) {
throw new Services_Soundcloud_Missing_Client_Id_Exception();
}
$this->_clientId = $clientId;
$this->_clientSecret = $clientSecret;
$this->_redirectUri = $redirectUri;
$this->_development = $development;
$this->_responseFormat = self::$_responseFormats['json'];
$this->version = Services_Soundcloud_Version::get();
}
/**
* Get authorization URL.
*
* @param array $params Optional query string parameters
*
* @return string
* @see Soundcloud::_buildUrl()
*/
function getAuthorizeUrl($params = array()) {
$defaultParams = array(
'client_id' => $this->_clientId,
'redirect_uri' => $this->_redirectUri,
'response_type' => 'code'
);
$params = array_merge($defaultParams, $params);
return $this->_buildUrl(self::$_paths['authorize'], $params, false);
}
/**
* Get access token URL.
*
* @param array $params Optional query string parameters
*
* @return string
* @see Soundcloud::_buildUrl()
*/
function getAccessTokenUrl($params = array()) {
return $this->_buildUrl(self::$_paths['access_token'], $params, false);
}
/**
* Retrieve access token.
*
* @param string $code OAuth code returned from the service provider
* @param array $postData Optional post data
* @param array $curlOptions Optional cURL options
*
* @return mixed
* @see Soundcloud::_getAccessToken()
*/
function accessToken($code, $postData = array(), $curlOptions = array()) {
$defaultPostData = array(
'code' => $code,
'client_id' => $this->_clientId,
'client_secret' => $this->_clientSecret,
'redirect_uri' => $this->_redirectUri,
'grant_type' => 'authorization_code'
);
$postData = array_merge($defaultPostData, $postData);
return $this->_getAccessToken($postData, $curlOptions);
}
/**
* Retrieve access token.
*
* @param string $username
* @param string $password
* @param array $postData Optional post data
* @param array $curlOptions Optional cURL options
*
* @return mixed
* @see Soundcloud::_getAccessToken()
*/
function accessTokenResourceOwner($username, $password, $postData = array(), $curlOptions = array()) {
$defaultPostData = array(
'client_id' => $this->_clientId,
'client_secret' => $this->_clientSecret,
'grant_type' => 'password',
'username' => $username,
'password' => $password
);
$postData = array_merge($defaultPostData, $postData);
return $this->_getAccessToken($postData, $curlOptions);
}
/**
* Refresh access token.
*
* @param string $refreshToken
* @param array $postData Optional post data
* @param array $curlOptions Optional cURL options
*
* @return mixed
* @see Soundcloud::_getAccessToken()
*/
function accessTokenRefresh($refreshToken, $postData = array(), $curlOptions = array()) {
$defaultPostData = array(
'refresh_token' => $refreshToken,
'client_id' => $this->_clientId,
'client_secret' => $this->_clientSecret,
'redirect_uri' => $this->_redirectUri,
'grant_type' => 'refresh_token'
);
$postData = array_merge($defaultPostData, $postData);
return $this->_getAccessToken($postData, $curlOptions);
}
/**
* Get access token.
*
* @return mixed
*/
function getAccessToken() {
return $this->_accessToken;
}
/**
* Get API version.
*
* @return integer
*/
function getApiVersion() {
return self::$_apiVersion;
}
/**
* Get the corresponding MIME type for a given file extension.
*
* @param string $extension
*
* @return string
* @throws Services_Soundcloud_Unsupported_Audio_Format_Exception if the format is unsupported
*/
function getAudioMimeType($extension) {
if (array_key_exists($extension, self::$_audioMimeTypes)) {
return self::$_audioMimeTypes[$extension];
} else {
throw new Services_Soundcloud_Unsupported_Audio_Format_Exception();
}
}
/**
* Get development mode.
*
* @return boolean
*/
function getDevelopment() {
return $this->_development;
}
/**
* Get HTTP response header.
*
* @param string $header Name of the header
*
* @return mixed
*/
function getHttpHeader($header) {
if (is_array($this->_lastHttpResponseHeaders)
&& array_key_exists($header, $this->_lastHttpResponseHeaders)
) {
return $this->_lastHttpResponseHeaders[$header];
} else {
return false;
}
}
/**
* Get redirect uri.
*
* @return mixed
*/
function getRedirectUri() {
return $this->_redirectUri;
}
/**
* Get response format.
*
* @return string
*/
function getResponseFormat() {
return $this->_responseFormat;
}
/**
* Set access token.
*
* @param string $accessToken
*
* @return object
*/
function setAccessToken($accessToken) {
$this->_accessToken = $accessToken;
return $this;
}
/**
* Set redirect uri.
*
* @param string $redirectUri
*
* @return object
*/
function setRedirectUri($redirectUri) {
$this->_redirectUri = $redirectUri;
return $this;
}
/**
* Set response format.
*
* @param string $format Could either be xml or json
*
* @throws Services_Soundcloud_Unsupported_Response_Format_Exception if the given response format isn't supported
* @return object
*/
function setResponseFormat($format) {
if (array_key_exists($format, self::$_responseFormats)) {
$this->_responseFormat = self::$_responseFormats[$format];
} else {
throw new Services_Soundcloud_Unsupported_Response_Format_Exception();
}
return $this;
}
/**
* Set development mode.
*
* @param boolean $development
*
* @return object
*/
function setDevelopment($development) {
$this->_development = $development;
return $this;
}
/**
* Send a GET HTTP request.
*
* @param string $path URI to request
* @param array $params Optional query string parameters
* @param array $curlOptions Optional cURL options
*
* @return mixed
* @see Soundcloud::_request()
*/
function get($path, $params = array(), $curlOptions = array()) {
$url = $this->_buildUrl($path, $params);
return $this->_request($url, $curlOptions);
}
/**
* Send a POST HTTP request.
*
* @param string $path URI to request
* @param array $postData Optional post data
* @param array $curlOptions Optional cURL options
*
* @return mixed
* @see Soundcloud::_request()
*/
function post($path, $postData = array(), $curlOptions = array()) {
$url = $this->_buildUrl($path);
$options = array(CURLOPT_POST => true, CURLOPT_POSTFIELDS => $postData);
$options += $curlOptions;
return $this->_request($url, $options);
}
/**
* Send a PUT HTTP request.
*
* @param string $path URI to request
* @param array $postData Optional post data
* @param array $curlOptions Optional cURL options
*
* @return mixed
* @see Soundcloud::_request()
*/
function put($path, $postData, $curlOptions = array()) {
$url = $this->_buildUrl($path);
$options = array(
CURLOPT_CUSTOMREQUEST => 'PUT',
CURLOPT_POSTFIELDS => $postData
);
$options += $curlOptions;
return $this->_request($url, $options);
}
/**
* Send a DELETE HTTP request.
*
* @param string $path URI to request
* @param array $params Optional query string parameters
* @param array $curlOptions Optional cURL options
*
* @return mixed
* @see Soundcloud::_request()
*/
function delete($path, $params = array(), $curlOptions = array()) {
$url = $this->_buildUrl($path, $params);
$options = array(CURLOPT_CUSTOMREQUEST => 'DELETE');
$options += $curlOptions;
return $this->_request($url, $options);
}
/**
* Download track.
*
* @param integer $trackId
* @param array Optional query string parameters
* @param array $curlOptions Optional cURL options
*
* @return mixed
* @see Soundcloud::_request()
*/
function download($trackId, $params = array(), $curlOptions = array()) {
$lastResponseFormat = array_pop(
preg_split('/\//', $this->getResponseFormat())
);
$defaultParams = array('oauth_token' => $this->getAccessToken());
$defaultCurlOptions = array(
CURLOPT_FOLLOWLOCATION => true,
self::CURLOPT_OAUTH_TOKEN => false
);
$url = $this->_buildUrl(
'tracks/' . $trackId . '/download',
array_merge($defaultParams, $params)
);
$options = $defaultCurlOptions + $curlOptions;
$this->setResponseFormat('*');
$response = $this->_request($url, $options);
// rollback to the previously defined response format.
$this->setResponseFormat($lastResponseFormat);
return $response;
}
/**
* Construct default HTTP headers including response format and authorization.
*
* @param boolean Include access token or not
*
* @return array $headers
*/
protected function _buildDefaultHeaders($includeAccessToken = true) {
$headers = array();
if ($this->_responseFormat) {
array_push($headers, 'Accept: ' . $this->_responseFormat);
}
if ($includeAccessToken && $this->_accessToken) {
array_push($headers, 'Authorization: OAuth ' . $this->_accessToken);
}
return $headers;
}
/**
* Construct a URL.
*
* @param string $path Relative or absolute URI
* @param array $params Optional query string parameters
* @param boolean $includeVersion Include API version
*
* @return string $url
*/
protected function _buildUrl($path, $params = null, $includeVersion = true) {
if (preg_match('/^https?\:\/\//', $path)) {
$url = $path;
} else {
$url = 'https://';
$url .= (!preg_match('/connect/', $path)) ? 'api.' : '';
$url .= ($this->_development)
? self::$_domains['development']
: self::$_domains['production'];
$url .= '/';
$url .= ($includeVersion) ? 'v' . self::$_apiVersion . '/' : '';
$url .= $path;
}
$url .= (count($params)) ? '?' . http_build_query($params) : '';
return $url;
}
/**
* Retrieve access token.
*
* @param array $postData Post data
* @param array $curlOptions Optional cURL options
*
* @return mixed
*/
protected function _getAccessToken($postData, $curlOptions = array()) {
$options = array(CURLOPT_POST => true, CURLOPT_POSTFIELDS => $postData);
$options += $curlOptions;
$response = json_decode(
$this->_request($this->getAccessTokenUrl(), $options),
true
);
if (array_key_exists('access_token', $response)) {
$this->_accessToken = $response['access_token'];
return $response;
} else {
return false;
}
}
/**
* Get HTTP user agent.
*
* @access protected
*
* @return string
*/
protected function _getUserAgent() {
return self::$_userAgent . '/' . $this->version;
}
/**
* Parse HTTP response headers.
*
* @param string $headers
*
* @return array
*/
protected function _parseHttpHeaders($headers) {
$headers = preg_split('/\n/', trim($headers));
$parsedHeaders = array();
foreach ($headers as $header) {
if (!preg_match('/\:\s/', $header)) {
continue;
}
list($key, $val) = preg_split('/\:\s/', $header, 2);
$key = str_replace('-', '_', strtolower($key));
$val = trim($val);
$parsedHeaders[$key] = $val;
}
return $parsedHeaders;
}
/**
* Validates HTTP response code.
*
* @access protected
*
* @return boolean
*/
protected function _validResponseCode($code) {
return (bool)preg_match('/^20[0-9]{1}$/', $code);
}
/**
* Performs the actual HTTP request using curl. Can be overwritten by extending classes.
*
* @access protected
*
* @param string $url
* @param array $curlOptions Optional cURL options
*
* @throws Services_Soundcloud_Invalid_Http_Response_Code_Exception if the response code isn't valid
* @return mixed
*/
protected function _request($url, $curlOptions = array()) {
$ch = curl_init();
$options = array(
CURLOPT_URL => $url,
CURLOPT_HEADER => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERAGENT => $this->_getUserAgent()
);
$options += $curlOptions;
if (array_key_exists(self::CURLOPT_OAUTH_TOKEN, $options)) {
$includeAccessToken = $options[self::CURLOPT_OAUTH_TOKEN];
unset($options[self::CURLOPT_OAUTH_TOKEN]);
} else {
$includeAccessToken = true;
}
if (array_key_exists(CURLOPT_HTTPHEADER, $options)) {
$options[CURLOPT_HTTPHEADER] = array_merge(
$this->_buildDefaultHeaders(),
$curlOptions[CURLOPT_HTTPHEADER]
);
} else {
$options[CURLOPT_HTTPHEADER] = $this->_buildDefaultHeaders($includeAccessToken);
}
curl_setopt_array($ch, $options);
$data = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
$this->_lastHttpResponseHeaders = $this->_parseHttpHeaders(
substr($data, 0, $info['header_size'])
);
$this->_lastHttpResponseBody = substr($data, $info['header_size']);
$this->_lastHttpResponseCode = $info['http_code'];
if ($this->_validResponseCode($this->_lastHttpResponseCode)) {
return $this->_lastHttpResponseBody;
} else {
throw new Services_Soundcloud_Invalid_Http_Response_Code_Exception(
null,
0,
$this->_lastHttpResponseBody,
$this->_lastHttpResponseCode
);
}
}
}

View File

@ -1,146 +0,0 @@
<?php
/**
* Soundcloud missing client id exception.
*
* @category Services
* @package Services_Soundcloud
* @author Anton Lindqvist <anton@qvister.se>
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://github.com/mptre/php-soundcloud
*/
class Services_Soundcloud_Missing_Client_Id_Exception extends Exception {
/**
* Default message.
*
* @access protected
*
* @var string
*/
protected $message = 'All requests must include a consumer key. Referred to as client_id in OAuth2.';
}
/**
* Soundcloud invalid HTTP response code exception.
*
* @category Services
* @package Services_Soundcloud
* @author Anton Lindqvist <anton@qvister.se>
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://github.com/mptre/php-soundcloud
*/
class Services_Soundcloud_Invalid_Http_Response_Code_Exception extends Exception {
/**
* HTTP response body.
*
* @access protected
*
* @var string
*/
protected $httpBody;
/**
* HTTP response code.
*
* @access protected
*
* @var integer
*/
protected $httpCode;
/**
* Default message.
*
* @access protected
*
* @var string
*/
protected $message = 'The requested URL responded with HTTP code %d.';
/**
* Constructor.
*
* @param string $message
* @param string $code
* @param string $httpBody
* @param integer $httpCode
*
* @return void
*/
function __construct($message = null, $code = 0, $httpBody = null, $httpCode = 0) {
$this->httpBody = $httpBody;
$this->httpCode = $httpCode;
$message = sprintf($this->message, $httpCode);
parent::__construct($message, $code);
}
/**
* Get HTTP response body.
*
* @return mixed
*/
function getHttpBody() {
return $this->httpBody;
}
/**
* Get HTTP response code.
*
* @return mixed
*/
function getHttpCode() {
return $this->httpCode;
}
}
/**
* Soundcloud unsupported response format exception.
*
* @category Services
* @package Services_Soundcloud
* @author Anton Lindqvist <anton@qvister.se>
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://github.com/mptre/php-soundcloud
*/
class Services_Soundcloud_Unsupported_Response_Format_Exception extends Exception {
/**
* Default message.
*
* @access protected
*
* @var string
*/
protected $message = 'The given response format is unsupported.';
}
/**
* Soundcloud unsupported audio format exception.
*
* @category Services
* @package Services_Soundcloud
* @author Anton Lindqvist <anton@qvister.se>
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://github.com/mptre/php-soundcloud
*/
class Services_Soundcloud_Unsupported_Audio_Format_Exception extends Exception {
/**
* Default message.
*
* @access protected
*
* @var string
*/
protected $message = 'The given audio format is unsupported.';
}

View File

@ -1,22 +0,0 @@
<?php
/**
* Soundcloud package version.
*
* @category Services
* @package Services_Soundcloud
* @author Anton Lindqvist <anton@qvister.se>
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://github.com/mptre/php-soundcloud
*/
class Services_Soundcloud_Version {
const MAJOR = 2;
const MINOR = 1;
const PATCH = 1;
public static function get() {
return implode('.', array(self::MAJOR, self::MINOR, self::PATCH));
}
}

View File

@ -1,310 +0,0 @@
<?php
require_once 'Soundcloud_Test_Helper.php';
class Soundcloud_Test extends PHPUnit_Framework_TestCase {
protected $soundcloud;
function setUp() {
$this->soundcloud = new Services_Soundcloud_Expose(
'1337',
'1337',
'http://soundcloud.local/callback'
);
}
function tearDown() {
$this->soundcloud = null;
}
function testVersionFormat() {
$this->assertRegExp(
'/^[0-9]+\.[0-9]+\.[0-9]+$/',
Services_Soundcloud_Version::get()
);
}
function testGetUserAgent() {
$this->assertRegExp(
'/^PHP\-SoundCloud\/[0-9]+\.[0-9]+\.[0-9]+$/',
$this->soundcloud->getUserAgent()
);
}
function testApiVersion() {
$this->assertEquals(1, $this->soundcloud->getApiVersion());
}
function testGetAudioMimeTypes() {
$supportedExtensions = array(
'aac' => 'video/mp4',
'aiff' => 'audio/x-aiff',
'flac' => 'audio/flac',
'mp3' => 'audio/mpeg',
'ogg' => 'audio/ogg',
'wav' => 'audio/x-wav'
);
$unsupportedExtensions = array('gif', 'html', 'jpg', 'mp4', 'xml', 'xspf');
foreach ($supportedExtensions as $extension => $mimeType) {
$this->assertEquals(
$mimeType,
$this->soundcloud->getAudioMimeType($extension)
);
}
foreach ($unsupportedExtensions as $extension => $mimeType) {
$this->setExpectedException('Services_Soundcloud_Unsupported_Audio_Format_Exception');
$this->soundcloud->getAudioMimeType($extension);
}
}
function testGetAuthorizeUrl() {
$this->assertEquals(
'https://soundcloud.com/connect?client_id=1337&redirect_uri=http%3A%2F%2Fsoundcloud.local%2Fcallback&response_type=code',
$this->soundcloud->getAuthorizeUrl()
);
}
function testGetAuthorizeUrlWithCustomQueryParameters() {
$this->assertEquals(
'https://soundcloud.com/connect?client_id=1337&redirect_uri=http%3A%2F%2Fsoundcloud.local%2Fcallback&response_type=code&foo=bar',
$this->soundcloud->getAuthorizeUrl(array('foo' => 'bar'))
);
$this->assertEquals(
'https://soundcloud.com/connect?client_id=1337&redirect_uri=http%3A%2F%2Fsoundcloud.local%2Fcallback&response_type=code&foo=bar&bar=foo',
$this->soundcloud->getAuthorizeUrl(array('foo' => 'bar', 'bar' => 'foo'))
);
}
function testGetAccessTokenUrl() {
$this->assertEquals(
'https://api.soundcloud.com/oauth2/token',
$this->soundcloud->getAccessTokenUrl()
);
}
function testSetAccessToken() {
$this->soundcloud->setAccessToken('1337');
$this->assertEquals('1337', $this->soundcloud->getAccessToken());
}
function testSetDevelopment() {
$this->soundcloud->setDevelopment(true);
$this->assertTrue($this->soundcloud->getDevelopment());
}
function testSetRedirectUri() {
$this->soundcloud->setRedirectUri('http://soundcloud.local/callback');
$this->assertEquals(
'http://soundcloud.local/callback',
$this->soundcloud->getRedirectUri()
);
}
function testDefaultResponseFormat() {
$this->assertEquals(
'application/json',
$this->soundcloud->getResponseFormat()
);
}
function testSetResponseFormatHtml() {
$this->setExpectedException('Services_Soundcloud_Unsupported_Response_Format_Exception');
$this->soundcloud->setResponseFormat('html');
}
function testSetResponseFormatAll() {
$this->soundcloud->setResponseFormat('*');
$this->assertEquals(
'*/*',
$this->soundcloud->getResponseFormat()
);
}
function testSetResponseFormatJson() {
$this->soundcloud->setResponseFormat('json');
$this->assertEquals(
'application/json',
$this->soundcloud->getResponseFormat()
);
}
function testSetResponseFormatXml() {
$this->soundcloud->setResponseFormat('xml');
$this->assertEquals(
'application/xml',
$this->soundcloud->getResponseFormat()
);
}
function testResponseCodeSuccess() {
$this->assertTrue($this->soundcloud->validResponseCode(200));
}
function testResponseCodeRedirect() {
$this->assertFalse($this->soundcloud->validResponseCode(301));
}
function testResponseCodeClientError() {
$this->assertFalse($this->soundcloud->validResponseCode(400));
}
function testResponseCodeServerError() {
$this->assertFalse($this->soundcloud->validResponseCode(500));
}
function testBuildDefaultHeaders() {
$this->assertEquals(
array('Accept: application/json'),
$this->soundcloud->buildDefaultHeaders()
);
}
function testBuildDefaultHeadersWithAccessToken() {
$this->soundcloud->setAccessToken('1337');
$this->assertEquals(
array('Accept: application/json', 'Authorization: OAuth 1337'),
$this->soundcloud->buildDefaultHeaders()
);
}
function testBuildUrl() {
$this->assertEquals(
'https://api.soundcloud.com/v1/me',
$this->soundcloud->buildUrl('me')
);
}
function testBuildUrlWithQueryParameters() {
$this->assertEquals(
'https://api.soundcloud.com/v1/tracks?q=rofl+dubstep',
$this->soundcloud->buildUrl(
'tracks',
array('q' => 'rofl dubstep')
)
);
$this->assertEquals(
'https://api.soundcloud.com/v1/tracks?q=rofl+dubstep&filter=public',
$this->soundcloud->buildUrl(
'tracks',
array('q' => 'rofl dubstep', 'filter' => 'public')
)
);
}
function testBuildUrlWithDevelopmentDomain() {
$this->soundcloud->setDevelopment(true);
$this->assertEquals(
'https://api.sandbox-soundcloud.com/v1/me',
$this->soundcloud->buildUrl('me')
);
}
function testBuildUrlWithoutApiVersion() {
$this->assertEquals(
'https://api.soundcloud.com/me',
$this->soundcloud->buildUrl('me', null, false)
);
}
function testBuildUrlWithAbsoluteUrl() {
$this->assertEquals(
'https://api.soundcloud.com/me',
$this->soundcloud->buildUrl('https://api.soundcloud.com/me')
);
}
/**
* @dataProvider dataProviderHttpHeaders
*/
function testParseHttpHeaders($rawHeaders, $expectedHeaders) {
$parsedHeaders = $this->soundcloud->parseHttpHeaders($rawHeaders);
foreach ($parsedHeaders as $key => $val) {
$this->assertEquals($val, $expectedHeaders[$key]);
}
}
function testSoundcloudMissingConsumerKeyException() {
$this->setExpectedException('Services_Soundcloud_Missing_Client_Id_Exception');
$soundcloud = new Services_Soundcloud('', '');
}
function testSoundcloudInvalidHttpResponseCodeException() {
$this->setExpectedException('Services_Soundcloud_Invalid_Http_Response_Code_Exception');
$this->soundcloud->get('me');
}
/**
* @dataProvider dataProviderSoundcloudInvalidHttpResponseCode
*/
function testSoundcloudInvalidHttpResponseCode($expectedHeaders) {
try {
$this->soundcloud->get('me');
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
$this->assertEquals(
'{"error":"401 - Unauthorized"}',
$e->getHttpBody()
);
$this->assertEquals(401, $e->getHttpCode());
foreach ($expectedHeaders as $key => $val) {
$this->assertEquals(
$val,
$this->soundcloud->getHttpHeader($key)
);
}
}
}
static function dataProviderHttpHeaders() {
$rawHeaders = <<<HEADERS
HTTP/1.1 200 OK
Date: Wed, 17 Nov 2010 15:39:52 GMT
Cache-Control: public
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Server: foobar
Content-Length: 1337
HEADERS;
$expectedHeaders = array(
'date' => 'Wed, 17 Nov 2010 15:39:52 GMT',
'cache_control' => 'public',
'content_type' => 'text/html; charset=utf-8',
'content_encoding' => 'gzip',
'server' => 'foobar',
'content_length' => '1337'
);
return array(array($rawHeaders, $expectedHeaders));
}
static function dataProviderSoundcloudInvalidHttpResponseCode() {
$expectedHeaders = array(
'server' => 'nginx',
'content_type' => 'application/json; charset=utf-8',
'connection' => 'keep-alive',
'cache_control' => 'no-cache',
'content_length' => '30'
);
return array(array($expectedHeaders));
}
}

View File

@ -1,94 +0,0 @@
<?php
set_include_path(
get_include_path()
. PATH_SEPARATOR
. realpath(dirname(__FILE__) . '/../')
);
require_once 'Services/Soundcloud.php';
/**
* Extended class of the Soundcloud class in order to expose protected methods
* for testing.
*
* @category Services
* @package Services_Soundcloud
* @author Anton Lindqvist <anton@qvister.se>
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
* @license http://www.opensource.org/licenses/mit-license.php MIT
* @link http://github.com/mptre/php-soundcloud
*/
class Services_Soundcloud_Expose extends Services_Soundcloud {
/**
* Class constructor. See parent constructor for further reference.
*
* @param string $clientId Application client id
* @param string $clientSecret Application client secret
* @param string $redirectUri Application redirect uri
* @param boolean $development Sandbox mode
*
* @return void
* @see Soundcloud
*/
function __construct($clientId, $clientSecret, $redirectUri = null, $development = false) {
parent::__construct($clientId, $clientSecret, $redirectUri, $development);
}
/**
* Construct default http headers including response format and authorization.
*
* @return array
* @see Soundcloud::_buildDefaultHeaders()
*/
function buildDefaultHeaders() {
return $this->_buildDefaultHeaders();
}
/**
* Construct a url.
*
* @param string $path Relative or absolute uri
* @param array $params Optional query string parameters
* @param boolean $includeVersion Include the api version
*
* @return string
* @see Soundcloud::_buildUrl()
*/
function buildUrl($path, $params = null, $includeVersion = true) {
return $this->_buildUrl($path, $params, $includeVersion);
}
/**
* Get http user agent.
*
* @return string
* @see Soundcloud::_getUserAgent()
*/
function getUserAgent() {
return $this->_getUserAgent();
}
/**
* Parse HTTP response headers.
*
* @param string $headers
*
* @return array
* @see Soundcloud::_parseHttpHeaders()
*/
function parseHttpHeaders($headers) {
return $this->_parseHttpHeaders($headers);
}
/**
* Validates http response code.
*
* @return boolean
* @see Soundcloud::_validResponseCode()
*/
function validResponseCode($code) {
return $this->_validResponseCode($code);
}
}

View File

@ -612,17 +612,6 @@ var AIRTIME = (function(AIRTIME) {
},
"fnRowCallback": AIRTIME.library.fnRowCallback,
"fnCreatedRow": function( nRow, aData, iDataIndex ) {
//add soundcloud icon
if (aData.soundcloud_id !== undefined) {
if (aData.soundcloud_id === "-2") {
$(nRow).find("td.library_title").append('<span class="small-icon progress"/>');
} else if (aData.soundcloud_id === "-3") {
$(nRow).find("td.library_title").append('<span class="small-icon sc-error"/>');
} else if (aData.soundcloud_id !== null) {
$(nRow).find("td.library_title").append('<span class="small-icon soundcloud"/>');
}
}
// add checkbox
$(nRow).find('td.library_checkbox').html("<input type='checkbox' name='cb_"+aData.id+"'>");
@ -892,10 +881,6 @@ var AIRTIME = (function(AIRTIME) {
}
});
checkLibrarySCUploadStatus();
addQtipToSCIcons();
// begin context menu initialization.
$.contextMenu({
selector: '#library_display td:not(.library_checkbox)',
@ -1026,21 +1011,19 @@ var AIRTIME = (function(AIRTIME) {
// add callbacks for Soundcloud menu items.
if (oItems.soundcloud !== undefined) {
var soundcloud = oItems.soundcloud.items;
// define an upload to soundcloud callback.
if (soundcloud.upload !== undefined) {
callback = function() {
$.post(soundcloud.upload.url, function(){
addProgressIcon(data.id);
});
$.post(soundcloud.upload.url, function(){});
};
soundcloud.upload.callback = callback;
}
// define a view on soundcloud callback
if (soundcloud.view !== undefined) {
callback = function() {
window.open(soundcloud.view.url);
};
@ -1140,122 +1123,6 @@ function addProgressIcon(id) {
}
}
function checkLibrarySCUploadStatus(){
var url = baseUrl+'Library/get-upload-to-soundcloud-status',
span,
id;
function checkSCUploadStatusCallback(json) {
if (json.sc_id > 0) {
span.removeClass("progress").addClass("soundcloud");
}
else if (json.sc_id == "-3") {
span.removeClass("progress").addClass("sc-error");
}
}
function checkSCUploadStatusRequest() {
span = $(this);
id = span.parents("tr").data("aData").id;
$.post(url, {format: "json", id: id, type:"file"}, checkSCUploadStatusCallback);
}
$("#library_display span.progress").each(checkSCUploadStatusRequest);
setTimeout(checkLibrarySCUploadStatus, 5000);
}
function addQtipToSCIcons() {
$("#content")
.on('mouseover', ".progress, .soundcloud, .sc-error", function() {
var aData = $(this).parents("tr").data("aData"),
id = aData.id,
sc_id = aData.soundcloud_id;
if ($(this).hasClass("progress")){
$(this).qtip({
content: {
text: $.i18n._("Uploading in progress...")
},
position:{
adjust: {
resize: true,
method: "flip flip"
},
at: "right center",
my: "left top",
viewport: $(window)
},
style: {
classes: "ui-tooltip-dark file-md-long"
},
show: {
ready: true // Needed to make it show on first mouseover event
}
});
}
else if ($(this).hasClass("soundcloud")){
$(this).qtip({
content: {
text: $.i18n._("The soundcloud id for this file is: ") + sc_id
},
position:{
adjust: {
resize: true,
method: "flip flip"
},
at: "right center",
my: "left top",
viewport: $(window)
},
style: {
classes: "ui-tooltip-dark file-md-long"
},
show: {
ready: true // Needed to make it show on first mouseover event
}
});
}
else if ($(this).hasClass("sc-error")) {
$(this).qtip({
content: {
text: $.i18n._("Retreiving data from the server..."),
ajax: {
url: baseUrl+"Library/get-upload-to-soundcloud-status",
type: "post",
data: ({format: "json", id : id, type: "file"}),
success: function(json, status){
this.set('content.text', $.i18n._("There was an error while uploading to soundcloud.")+"<br>"+
$.i18n._("Error code: ")+json.error_code+
"<br>"+$.i18n._("Error msg: ")+json.error_msg+"<br>");
}
}
},
position:{
adjust: {
resize: true,
method: "flip flip"
},
at: "right center",
my: "left top",
viewport: $(window)
},
style: {
classes: "ui-tooltip-dark file-md-long"
},
show: {
ready: true // Needed to make it show on first mouseover event
}
});
}
});
}
/*
* This function is called from dataTables.columnFilter.js
*/

View File

@ -82,6 +82,20 @@ function setTuneInSettingsReadonly() {
}
}
function setSoundCloudSettingsListener() {
var connect = $("#SoundCloudConnect"),
disconnect = $("#SoundCloudDisconnect");
connect.click(function(e){
e.preventDefault();
window.location.replace(baseUrl + "soundcloud/authorize");
});
disconnect.click(function(e){
e.preventDefault();
window.location.replace(baseUrl + "soundcloud/deauthorize");
});
}
/*
* Enable/disable mail server authentication fields
*/
@ -118,21 +132,21 @@ function setCollapsibleWidgetJsCode() {
$('#thirdPartyApi-element input').click(x);
}
function setSoundCloudCheckBoxListener() {
var subCheckBox= $("#UseSoundCloud,#SoundCloudDownloadbleOption");
var mainCheckBox= $("#UploadToSoundcloudOption");
subCheckBox.change(function(e){
if (subCheckBox.is(':checked')) {
mainCheckBox.attr("checked", true);
}
});
mainCheckBox.change(function(e){
if (!mainCheckBox.is(':checked')) {
$("#UseSoundCloud,#SoundCloudDownloadbleOption").attr("checked", false);
}
});
}
//function setSoundCloudCheckBoxListener() {
// var subCheckBox= $("#UseSoundCloud,#SoundCloudDownloadbleOption");
// var mainCheckBox= $("#UploadToSoundcloudOption");
// subCheckBox.change(function(e){
// if (subCheckBox.is(':checked')) {
// mainCheckBox.attr("checked", true);
// }
// });
//
// mainCheckBox.change(function(e){
// if (!mainCheckBox.is(':checked')) {
// $("#UseSoundCloud,#SoundCloudDownloadbleOption").attr("checked", false);
// }
// });
//}
function removeLogo() {
$.post(baseUrl+'Preference/remove-logo', function(json){});
@ -176,7 +190,7 @@ $(document).ready(function() {
showErrorSections();
setSoundCloudCheckBoxListener();
//setSoundCloudCheckBoxListener();
setMailServerInputReadonly();
setSystemFromEmailReadonly();
setConfigureMailServerListener();
@ -184,4 +198,5 @@ $(document).ready(function() {
setCollapsibleWidgetJsCode();
setTuneInSettingsReadonly();
setTuneInSettingsListener();
setSoundCloudSettingsListener();
});

View File

@ -196,29 +196,29 @@ function eventRender(event, element, view) {
}
//add the record/rebroadcast/soundcloud icons if needed
if (event.record === 1) {
if (view.name === 'agendaDay' || view.name === 'agendaWeek') {
if (event.soundcloud_id === -1) {
$(element).find(".fc-event-time").before('<span class="small-icon recording"></span>');
} else if ( event.soundcloud_id > 0) {
$(element).find(".fc-event-time").before('<span class="small-icon recording"></span><span class="small-icon soundcloud"></span>');
} else if (event.soundcloud_id === -2) {
$(element).find(".fc-event-time").before('<span class="small-icon recording"></span><span class="small-icon progress"></span>');
} else if (event.soundcloud_id === -3) {
$(element).find(".fc-event-time").before('<span class="small-icon recording"></span><span class="small-icon sc-error"></span>');
}
} else if (view.name === 'month') {
if(event.soundcloud_id === -1) {
$(element).find(".fc-event-title").after('<span class="small-icon recording"></span>');
} else if (event.soundcloud_id > 0) {
$(element).find(".fc-event-title").after('<span class="small-icon recording"></span><span class="small-icon soundcloud"></span>');
} else if (event.soundcloud_id === -2) {
$(element).find(".fc-event-title").after('<span class="small-icon recording"></span><span class="small-icon progress"></span>');
} else if (event.soundcloud_id === -3) {
$(element).find(".fc-event-title").after('<span class="small-icon recording"></span><span class="small-icon sc-error"></span>');
}
}
}
//if (event.record === 1) {
// if (view.name === 'agendaDay' || view.name === 'agendaWeek') {
// if (event.soundcloud_id === -1) {
// $(element).find(".fc-event-time").before('<span class="small-icon recording"></span>');
// } else if ( event.soundcloud_id > 0) {
// $(element).find(".fc-event-time").before('<span class="small-icon recording"></span><span class="small-icon soundcloud"></span>');
// } else if (event.soundcloud_id === -2) {
// $(element).find(".fc-event-time").before('<span class="small-icon recording"></span><span class="small-icon progress"></span>');
// } else if (event.soundcloud_id === -3) {
// $(element).find(".fc-event-time").before('<span class="small-icon recording"></span><span class="small-icon sc-error"></span>');
// }
// } else if (view.name === 'month') {
// if(event.soundcloud_id === -1) {
// $(element).find(".fc-event-title").after('<span class="small-icon recording"></span>');
// } else if (event.soundcloud_id > 0) {
// $(element).find(".fc-event-title").after('<span class="small-icon recording"></span><span class="small-icon soundcloud"></span>');
// } else if (event.soundcloud_id === -2) {
// $(element).find(".fc-event-title").after('<span class="small-icon recording"></span><span class="small-icon progress"></span>');
// } else if (event.soundcloud_id === -3) {
// $(element).find(".fc-event-title").after('<span class="small-icon recording"></span><span class="small-icon sc-error"></span>');
// }
// }
//}
if (event.record === 0 && event.rebroadcast === 0) {
if (view.name === 'agendaDay' || view.name === 'agendaWeek') {

View File

@ -63,24 +63,24 @@ function confirmCancelRecordedShow(show_instance_id){
}
}
function uploadToSoundCloud(show_instance_id, el){
var url = baseUrl+"Schedule/upload-to-sound-cloud",
$el = $(el),
$span = $el.find(".soundcloud");
$.post(url, {id: show_instance_id, format: "json"});
//first upload to soundcloud.
if ($span.length === 0){
$span = $("<span/>", {"class": "progress"});
$el.find(".fc-event-title").after($span);
}
else {
$span.removeClass("soundcloud").addClass("progress");
}
}
//function uploadToSoundCloud(show_instance_id, el){
//
// var url = baseUrl+"Schedule/upload-to-sound-cloud",
// $el = $(el),
// $span = $el.find(".soundcloud");
//
// $.post(url, {id: show_instance_id, format: "json"});
//
// //first upload to soundcloud.
// if ($span.length === 0){
// $span = $("<span/>", {"class": "progress"});
//
// $el.find(".fc-event-title").after($span);
// }
// else {
// $span.removeClass("soundcloud").addClass("progress");
// }
//}
function checkCalendarSCUploadStatus(){
var url = baseUrl+'Library/get-upload-to-soundcloud-status',
@ -422,22 +422,22 @@ $(document).ready(function() {
}
//define a soundcloud upload callback.
if (oItems.soundcloud_upload !== undefined) {
callback = function() {
uploadToSoundCloud(data.id, this.context);
};
oItems.soundcloud_upload.callback = callback;
}
//if (oItems.soundcloud_upload !== undefined) {
//
// callback = function() {
// uploadToSoundCloud(data.id, this.context);
// };
// oItems.soundcloud_upload.callback = callback;
//}
//define a view on soundcloud callback.
if (oItems.soundcloud_view !== undefined) {
callback = function() {
window.open(oItems.soundcloud_view.url);
};
oItems.soundcloud_view.callback = callback;
}
//if (oItems.soundcloud_view !== undefined) {
//
// callback = function() {
// window.open(oItems.soundcloud_view.url);
// };
// oItems.soundcloud_view.callback = callback;
//}
//define a cancel recorded show callback.
if (oItems.cancel_recorded !== undefined) {

View File

@ -533,7 +533,7 @@ var AIRTIME = (function(AIRTIME){
if (aData.record === true) {
headerIcon = (aData.soundcloud_id > 0) ? "soundcloud" : "recording";
//headerIcon = (aData.soundcloud_id > 0) ? "soundcloud" : "recording";
$div = $("<div/>", {
"class": "small-icon " + headerIcon

View File

@ -2,6 +2,7 @@
"require": {
"propel/propel1": "1.7.0-stable",
"aws/aws-sdk-php": "2.7.9",
"raven/raven": "0.8.x-dev"
"raven/raven": "0.8.x-dev",
"ise/php-soundcloud": "3.0.1"
}
}

50
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"hash": "30ad5215f679ce0ab55c7210b21a3b32",
"hash": "e731a5b93a15b54d4c22e26f33dc1aaa",
"packages": [
{
"name": "aws/aws-sdk-php",
@ -165,6 +165,54 @@
],
"time": "2014-08-11 04:32:36"
},
{
"name": "ise/php-soundcloud",
"version": "3.0.1",
"source": {
"type": "git",
"url": "https://github.com/internalsystemerror/php-soundcloud.git",
"reference": "ac3ff2dce2a6e6d34636c58e66fd316d722c31df"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/internalsystemerror/php-soundcloud/zipball/ac3ff2dce2a6e6d34636c58e66fd316d722c31df",
"reference": "ac3ff2dce2a6e6d34636c58e66fd316d722c31df",
"shasum": ""
},
"require": {
"php": ">=5.3"
},
"type": "library",
"autoload": {
"psr-0": {
"Soundcloud\\": "src/",
"SoundcloudTest\\": "tests/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Anton Lindqvist",
"email": "anton@qvister.se",
"homepage": "http://qvister.se/",
"role": "developer"
},
{
"name": "Gary Lockett",
"email": "ise@garylockett.com",
"homepage": "http://www.garylockett.com/"
}
],
"description": "API Wrapper for SoundCloud written in PHP with support for authentication using OAuth 2.0 by Anton Lindqvist (mptre), composer support added by Gary Lockett (ise)",
"homepage": "https://github.com/internalsystemerror/php-soundcloud",
"keywords": [
"soundcloud"
],
"time": "2014-02-03 15:49:00"
},
{
"name": "phing/phing",
"version": "2.9.1",

View File

@ -1,34 +0,0 @@
#!/bin/bash
#-------------------------------------------------------------------------------
# Copyright (c) 2011 Sourcefabric O.P.S.
#
# This file is part of the Airtime project.
# http://airtime.sourcefabric.org/
#
# Airtime is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# Airtime is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Airtime; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
# This script upload files to soundcloud
#
# Absolute path to this script
SCRIPT=`readlink -f $0`
# Absolute directory this script is in
SCRIPTPATH=`dirname $SCRIPT`
invokePwd=$PWD
cd $SCRIPTPATH
php -q soundcloud-uploader.php "$@" > /dev/null 2>&1 || exit 1

View File

@ -1,61 +0,0 @@
<?php
date_default_timezone_set("UTC");
$values = parse_ini_file('/etc/airtime/airtime.conf', true);
// Name of the web server user
$CC_CONFIG['webServerUser'] = $values['general']['web_server_user'];
$CC_CONFIG['phpDir'] = $values['general']['airtime_dir'];
$CC_CONFIG['rabbitmq'] = $values['rabbitmq'];
$CC_CONFIG['baseUrl'] = $values['general']['base_url'];
$CC_CONFIG['basePort'] = $values['general']['base_port'];
// Database config
$CC_CONFIG['dsn']['username'] = $values['database']['dbuser'];
$CC_CONFIG['dsn']['password'] = $values['database']['dbpass'];
$CC_CONFIG['dsn']['hostspec'] = $values['database']['host'];
$CC_CONFIG['dsn']['phptype'] = 'pgsql';
$CC_CONFIG['dsn']['database'] = $values['database']['dbname'];
$CC_CONFIG['soundcloud-connection-retries'] = $values['soundcloud']['connection_retries'];
$CC_CONFIG['soundcloud-connection-wait'] = $values['soundcloud']['time_between_retries'];
require_once($CC_CONFIG['phpDir'].'/application/configs/constants.php');
require_once($CC_CONFIG['phpDir'].'/application/configs/conf.php');
$CC_CONFIG['phpDir'] = $values['general']['airtime_dir'];
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
get_include_path(),
realpath($CC_CONFIG['phpDir'] . '/library')
)));
require_once($CC_CONFIG['phpDir'].'/application/common/Database.php');
require_once($CC_CONFIG['phpDir'].'/application/models/StoredFile.php');
require_once($CC_CONFIG['phpDir'].'/application/models/Preference.php');
require_once($CC_CONFIG['phpDir'].'/application/models/MusicDir.php');
require_once($CC_CONFIG['phpDir'].'/application/common/OsPath.php');
set_include_path($CC_CONFIG['phpDir'].'/library' . PATH_SEPARATOR . get_include_path());
require_once($CC_CONFIG['phpDir'].'/application/models/Soundcloud.php');
set_include_path($CC_CONFIG['phpDir']."/application/models" . PATH_SEPARATOR . get_include_path());
require_once($CC_CONFIG['phpDir']."/library/propel/runtime/lib/Propel.php");
Propel::init($CC_CONFIG['phpDir']."/application/configs/airtime-conf.php");
require_once 'propel/runtime/lib/Propel.php';
Propel::init($CC_CONFIG['phpDir']."/application/configs/airtime-conf-production.php");
if(count($argv) != 2){
exit;
}
$id = $argv[1];
$file = Application_Model_StoredFile::RecallById($id);
// set id with -2 which is indicator for processing
$file->setSoundCloudFileId(SOUNDCLOUD_PROGRESS);
$file->uploadToSoundCloud();