CC-6046, CC-6045, CC-6047 - New SoundCloud implementation
This commit is contained in:
parent
51a3f19f43
commit
b0b6e037ac
|
@ -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';
|
||||
|
|
|
@ -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');
|
||||
|
||||
|
|
|
@ -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 (
|
||||
|
|
|
@ -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',
|
||||
);
|
|
@ -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'];
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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.');
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
|
@ -1,6 +1,5 @@
|
|||
<?php
|
||||
require_once 'customvalidators/ConditionalNotEmpty.php';
|
||||
require_once 'customvalidators/PasswordNotEmpty.php';
|
||||
|
||||
class Application_Form_EmailServerPreferences extends Zend_Form_SubForm
|
||||
{
|
||||
|
|
|
@ -30,7 +30,7 @@ class Application_Form_Preferences extends Zend_Form
|
|||
$tuneinPreferences = new Application_Form_TuneInPreferences();
|
||||
$this->addSubForm($tuneinPreferences, 'preferences_tunein');
|
||||
|
||||
$soundcloud_pref = new Application_Form_SoundcloudPreferences();
|
||||
$soundcloud_pref = new Application_Form_SoundCloudPreferences();
|
||||
$this->addSubForm($soundcloud_pref, 'preferences_soundcloud');
|
||||
|
||||
$danger_pref = new Application_Form_DangerousPreferences();
|
||||
|
|
|
@ -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'
|
||||
)
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -1,142 +0,0 @@
|
|||
<?php
|
||||
require_once 'customvalidators/ConditionalNotEmpty.php';
|
||||
require_once 'customvalidators/PasswordNotEmpty.php';
|
||||
|
||||
class Application_Form_SoundcloudPreferences extends Zend_Form_SubForm
|
||||
{
|
||||
|
||||
public function init()
|
||||
{
|
||||
$this->setDecorators(array(
|
||||
array('ViewScript', array('viewScript' => 'form/preferences_soundcloud.phtml'))
|
||||
));
|
||||
|
||||
//enable soundcloud uploads option
|
||||
$this->addElement('checkbox', 'UploadToSoundcloudOption', array(
|
||||
'label' => _('Enable SoundCloud Upload'),
|
||||
'required' => false,
|
||||
'value' => Application_Model_Preference::GetUploadToSoundcloudOption(),
|
||||
'decorators' => array(
|
||||
'ViewHelper'
|
||||
)
|
||||
));
|
||||
|
||||
//enable downloadable for soundcloud
|
||||
$this->addElement('checkbox', 'SoundCloudDownloadbleOption', array(
|
||||
'label' => _('Automatically Mark Files "Downloadable" on SoundCloud'),
|
||||
'required' => false,
|
||||
'value' => Application_Model_Preference::GetSoundCloudDownloadbleOption(),
|
||||
'decorators' => array(
|
||||
'ViewHelper'
|
||||
)
|
||||
));
|
||||
|
||||
//SoundCloud Username
|
||||
$this->addElement('text', 'SoundCloudUser', array(
|
||||
'class' => 'input_text',
|
||||
'label' => _('SoundCloud Email'),
|
||||
'filters' => array('StringTrim'),
|
||||
'autocomplete' => 'off',
|
||||
'value' => Application_Model_Preference::GetSoundCloudUser(),
|
||||
'decorators' => array(
|
||||
'ViewHelper'
|
||||
),
|
||||
|
||||
// By default, 'allowEmpty' is true. This means that our custom
|
||||
// validators are going to be skipped if this field is empty,
|
||||
// which is something we don't want
|
||||
'allowEmpty' => false,
|
||||
'validators' => array(
|
||||
new ConditionalNotEmpty(array('UploadToSoundcloudOption'=>'1'))
|
||||
)
|
||||
));
|
||||
|
||||
//SoundCloud Password
|
||||
$this->addElement('password', 'SoundCloudPassword', array(
|
||||
'class' => 'input_text',
|
||||
'label' => _('SoundCloud Password'),
|
||||
'filters' => array('StringTrim'),
|
||||
'autocomplete' => 'off',
|
||||
'value' => Application_Model_Preference::GetSoundCloudPassword(),
|
||||
'decorators' => array(
|
||||
'ViewHelper'
|
||||
),
|
||||
|
||||
// By default, 'allowEmpty' is true. This means that our custom
|
||||
// validators are going to be skipped if this field is empty,
|
||||
// which is something we don't want
|
||||
'allowEmpty' => false,
|
||||
'validators' => array(
|
||||
new ConditionalNotEmpty(array('UploadToSoundcloudOption'=>'1'))
|
||||
),
|
||||
'renderPassword' => true
|
||||
));
|
||||
|
||||
// Add the description element
|
||||
$this->addElement('textarea', 'SoundCloudTags', array(
|
||||
'label' => _('SoundCloud Tags: (separate tags with spaces)'),
|
||||
'required' => false,
|
||||
'class' => 'input_text_area',
|
||||
'value' => Application_Model_Preference::GetSoundCloudTags(),
|
||||
'decorators' => array(
|
||||
'ViewHelper'
|
||||
)
|
||||
));
|
||||
|
||||
//SoundCloud default genre
|
||||
$this->addElement('text', 'SoundCloudGenre', array(
|
||||
'class' => 'input_text',
|
||||
'label' => _('Default Genre:'),
|
||||
'required' => false,
|
||||
'filters' => array('StringTrim'),
|
||||
'value' => Application_Model_Preference::GetSoundCloudGenre(),
|
||||
'decorators' => array(
|
||||
'ViewHelper'
|
||||
)
|
||||
));
|
||||
|
||||
$select = new Zend_Form_Element_Select('SoundCloudTrackType');
|
||||
$select->setLabel(_('Default Track Type:'));
|
||||
$select->setAttrib('class', 'input_select');
|
||||
$select->setMultiOptions(array(
|
||||
"" => "",
|
||||
"original" => _("Original"),
|
||||
"remix" => _("Remix"),
|
||||
"live" => _("Live"),
|
||||
"recording" => _("Recording"),
|
||||
"spoken" => _("Spoken"),
|
||||
"podcast" => _("Podcast"),
|
||||
"demo" => _("Demo"),
|
||||
"in progress" => _("Work in progress"),
|
||||
"stem" => _("Stem"),
|
||||
"loop" => _("Loop"),
|
||||
"sound effect" => _("Sound Effect"),
|
||||
"sample" => _("One Shot Sample"),
|
||||
"other" => _("Other")
|
||||
));
|
||||
$select->setRequired(false);
|
||||
$select->setValue(Application_Model_Preference::GetSoundCloudTrackType());
|
||||
$select->setDecorators(array('ViewHelper'));
|
||||
$this->addElement($select);
|
||||
|
||||
$select = new Zend_Form_Element_Select('SoundCloudLicense');
|
||||
$select->setLabel(_('Default License:'));
|
||||
$select->setAttrib('class', 'input_select');
|
||||
$select->setMultiOptions(array(
|
||||
"" => "",
|
||||
"no-rights-reserved" => _("The work is in the public domain"),
|
||||
"all-rights-reserved" => _("All rights are reserved"),
|
||||
"cc-by" => _("Creative Commons Attribution"),
|
||||
"cc-by-nc" => _("Creative Commons Attribution Noncommercial"),
|
||||
"cc-by-nd" => _("Creative Commons Attribution No Derivative Works"),
|
||||
"cc-by-sa" => _("Creative Commons Attribution Share Alike"),
|
||||
"cc-by-nc-nd" => _("Creative Commons Attribution Noncommercial Non Derivate Works"),
|
||||
"cc-by-nc-sa" => _("Creative Commons Attribution Noncommercial Share Alike")
|
||||
));
|
||||
$select->setRequired(false);
|
||||
$select->setValue(Application_Model_Preference::GetSoundCloudLicense());
|
||||
$select->setDecorators(array('ViewHelper'));
|
||||
$this->addElement($select);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,18 +0,0 @@
|
|||
<?php
|
||||
|
||||
class PasswordNotEmpty extends ConditionalNotEmpty
|
||||
{
|
||||
public function isValid($value, $context = null)
|
||||
{
|
||||
$result = parent::isValid($value, $context);
|
||||
if (!$result) {
|
||||
// allow empty if username/email was set before and didn't change
|
||||
$storedUser = Application_Model_Preference::GetSoundCloudUser();
|
||||
if ($storedUser != '' && $storedUser == $context['SoundCloudUser']) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -212,16 +212,6 @@ class Application_Model_ShowBuilder
|
|||
$row["rebroadcast_title"] = sprintf(_("Rebroadcast of %s from %s"), $name, $time);
|
||||
} elseif (intval($p_item["si_record"]) === 1) {
|
||||
$row["record"] = true;
|
||||
|
||||
// at the time of creating on show, the recorded file is not in the DB yet.
|
||||
// therefore, 'si_file_id' is null. So we need to check it.
|
||||
if (Application_Model_Preference::GetUploadToSoundcloudOption() && isset($p_item['si_file_id'])) {
|
||||
$file = Application_Model_StoredFile::RecallById($p_item['si_file_id']);
|
||||
if (isset($file)) {
|
||||
$sid = $file->getSoundCloudId();
|
||||
$row['soundcloud_id'] = $sid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($startsEpoch < $this->epoch_now && $endsEpoch > $this->epoch_now) {
|
||||
|
|
|
@ -118,19 +118,6 @@ SQL;
|
|||
return $showStartExplode[1];
|
||||
}
|
||||
|
||||
public function setSoundCloudFileId($p_soundcloud_id)
|
||||
{
|
||||
$file = Application_Model_StoredFile::RecallById($this->_showInstance->getDbRecordedFile());
|
||||
$file->setSoundCloudFileId($p_soundcloud_id);
|
||||
}
|
||||
|
||||
public function getSoundCloudFileId()
|
||||
{
|
||||
$file = Application_Model_StoredFile::RecallById($this->_showInstance->getDbRecordedFile());
|
||||
|
||||
return $file->getSoundCloudId();
|
||||
}
|
||||
|
||||
public function getRecordedFile()
|
||||
{
|
||||
$file_id = $this->_showInstance->getDbRecordedFile();
|
||||
|
|
|
@ -1,99 +0,0 @@
|
|||
<?php
|
||||
require_once 'soundcloud-api/Services/Soundcloud.php';
|
||||
|
||||
class Application_Model_Soundcloud
|
||||
{
|
||||
private $_soundcloud;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$CC_CONFIG = Config::getConfig();
|
||||
$this->_soundcloud = new Services_Soundcloud(
|
||||
$CC_CONFIG['soundcloud-client-id'],
|
||||
$CC_CONFIG['soundcloud-client-secret']);
|
||||
}
|
||||
|
||||
private function getToken()
|
||||
{
|
||||
$username = Application_Model_Preference::GetSoundCloudUser();
|
||||
$password = Application_Model_Preference::GetSoundCloudPassword();
|
||||
|
||||
$token = $this->_soundcloud->accessTokenResourceOwner($username, $password);
|
||||
|
||||
return $token;
|
||||
}
|
||||
|
||||
public function uploadTrack($filepath, $filename, $description,
|
||||
$tags=array(), $release=null, $genre=null)
|
||||
{
|
||||
|
||||
if (!$this->getToken()) {
|
||||
throw new NoSoundCloundToken();
|
||||
}
|
||||
if (count($tags)) {
|
||||
$tags = join(" ", $tags);
|
||||
$tags = $tags." ".Application_Model_Preference::GetSoundCloudTags();
|
||||
} else {
|
||||
$tags = Application_Model_Preference::GetSoundCloudTags();
|
||||
}
|
||||
|
||||
$downloadable = Application_Model_Preference::GetSoundCloudDownloadbleOption() == '1';
|
||||
|
||||
$track_data = array(
|
||||
'track[sharing]' => 'private',
|
||||
'track[title]' => $filename,
|
||||
'track[asset_data]' => '@' . $filepath,
|
||||
'track[tag_list]' => $tags,
|
||||
'track[description]' => $description,
|
||||
'track[downloadable]' => $downloadable,
|
||||
|
||||
);
|
||||
|
||||
if (isset($release)) {
|
||||
$release = str_replace(" ", "-", $release);
|
||||
$release = str_replace(":", "-", $release);
|
||||
|
||||
//YYYY-MM-DD-HH-mm-SS
|
||||
$release = explode("-", $release);
|
||||
$track_data['track[release_year]'] = $release[0];
|
||||
$track_data['track[release_month]'] = $release[1];
|
||||
$track_data['track[release_day]'] = $release[2];
|
||||
}
|
||||
|
||||
if (isset($genre) && $genre != "") {
|
||||
$track_data['track[genre]'] = $genre;
|
||||
} else {
|
||||
$default_genre = Application_Model_Preference::GetSoundCloudGenre();
|
||||
if ($default_genre != "") {
|
||||
$track_data['track[genre]'] = $default_genre;
|
||||
}
|
||||
}
|
||||
|
||||
$track_type = Application_Model_Preference::GetSoundCloudTrackType();
|
||||
if ($track_type != "") {
|
||||
$track_data['track[track_type]'] = $track_type;
|
||||
}
|
||||
|
||||
$license = Application_Model_Preference::GetSoundCloudLicense();
|
||||
if ($license != "") {
|
||||
$track_data['track[license]'] = $license;
|
||||
}
|
||||
|
||||
$response = json_decode(
|
||||
$this->_soundcloud->post('tracks', $track_data),
|
||||
true
|
||||
);
|
||||
|
||||
return $response;
|
||||
|
||||
}
|
||||
|
||||
public static function uploadSoundcloud($id)
|
||||
{
|
||||
$cmd = "/usr/lib/airtime/utils/soundcloud-uploader $id > /dev/null &";
|
||||
Logging::info("Uploading soundcloud with command: $cmd");
|
||||
exec($cmd);
|
||||
}
|
||||
}
|
||||
|
||||
class NoSoundCloundToken extends Exception {}
|
|
@ -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) {
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for representing a row from the 'third_party_track_references' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* You should add additional methods to this class to meet the
|
||||
* application requirements. This class will only be generated as
|
||||
* long as it does not already exist in the output directory.
|
||||
*
|
||||
* @package propel.generator.airtime
|
||||
*/
|
||||
class ThirdPartyTrackReferences extends BaseThirdPartyTrackReferences
|
||||
{
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'third_party_track_references' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* You should add additional methods to this class to meet the
|
||||
* application requirements. This class will only be generated as
|
||||
* long as it does not already exist in the output directory.
|
||||
*
|
||||
* @package propel.generator.airtime
|
||||
*/
|
||||
class ThirdPartyTrackReferencesPeer extends BaseThirdPartyTrackReferencesPeer
|
||||
{
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'third_party_track_references' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* You should add additional methods to this class to meet the
|
||||
* application requirements. This class will only be generated as
|
||||
* long as it does not already exist in the output directory.
|
||||
*
|
||||
* @package propel.generator.airtime
|
||||
*/
|
||||
class ThirdPartyTrackReferencesQuery extends BaseThirdPartyTrackReferencesQuery
|
||||
{
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -40,7 +40,7 @@ class CcShowInstancesTableMap extends TableMap
|
|||
$this->setPrimaryKeyMethodInfo('cc_show_instances_id_seq');
|
||||
// columns
|
||||
$this->addPrimaryKey('id', 'DbId', 'INTEGER', true, null, null);
|
||||
$this->addColumn('description', 'DbDescription', 'VARCHAR', false, 512, '');
|
||||
$this->addColumn('description', 'DbDescription', 'VARCHAR', false, 8192, '');
|
||||
$this->addColumn('starts', 'DbStarts', 'TIMESTAMP', true, null, null);
|
||||
$this->addColumn('ends', 'DbEnds', 'TIMESTAMP', true, null, null);
|
||||
$this->addForeignKey('show_id', 'DbShowId', 'INTEGER', 'cc_show', 'id', true, null, null);
|
||||
|
|
|
@ -43,7 +43,7 @@ class CcShowTableMap extends TableMap
|
|||
$this->addColumn('name', 'DbName', 'VARCHAR', true, 255, '');
|
||||
$this->addColumn('url', 'DbUrl', 'VARCHAR', false, 255, '');
|
||||
$this->addColumn('genre', 'DbGenre', 'VARCHAR', false, 255, '');
|
||||
$this->addColumn('description', 'DbDescription', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('description', 'DbDescription', 'VARCHAR', false, 8192, null);
|
||||
$this->addColumn('color', 'DbColor', 'VARCHAR', false, 6, null);
|
||||
$this->addColumn('background_color', 'DbBackgroundColor', 'VARCHAR', false, 6, null);
|
||||
$this->addColumn('live_stream_using_airtime_auth', 'DbLiveStreamUsingAirtimeAuth', 'BOOLEAN', false, null, false);
|
||||
|
|
|
@ -0,0 +1,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
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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"),
|
||||
|
|
|
@ -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("");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
|
@ -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') ?>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#Note: project.home is automatically generated by the propel-install script.
|
||||
#Any manual changes to this value will be overwritten.
|
||||
project.home = /home/sourcefabric/dev/Airtime-SaaS/Airtime/airtime_mvc
|
||||
project.home = /home/sourcefabric/dev/Airtime/airtime_mvc
|
||||
project.build = ${project.home}/build
|
||||
|
||||
#Database driver
|
||||
|
|
|
@ -531,4 +531,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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -1,114 +0,0 @@
|
|||
# SoundCloud PHP API Wrapper
|
||||
|
||||
## Introduction
|
||||
|
||||
A wrapper for the SoundCloud API written in PHP with support for authentication using [OAuth 2.0](http://oauth.net/2/).
|
||||
|
||||
The wrapper got a real overhaul with version 2.0. The current version was written with [PEAR](http://pear.php.net/) in mind and can easily by distributed as a PEAR package.
|
||||
|
||||
## Getting started
|
||||
|
||||
Check out the [getting started](https://github.com/mptre/php-soundcloud/wiki/OAuth-2) wiki entry for further reference on how to get started. Also make sure to check out the [demo application](https://github.com/mptre/ci-soundcloud) for some example code.
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
The wrapper includes convenient methods used to perform HTTP requests on behalf of the authenticated user. Below you'll find a few quick examples.
|
||||
|
||||
Ofcourse you need to handle the authentication first before being able to request and modify protect resources as demonstrated below. Therefor I refer to the [demo application](https://github.com/mptre/ci-soundcloud) which got some example code on how to handle authentication.
|
||||
|
||||
### GET
|
||||
|
||||
<pre><code>try {
|
||||
$response = json_decode($soundcloud->get('me'), true);
|
||||
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
|
||||
exit($e->getMessage());
|
||||
}</code></pre>
|
||||
|
||||
### POST
|
||||
|
||||
<pre><code>$comment = <<<EOH
|
||||
<comment>
|
||||
<body>Yeah!</body>
|
||||
</comment>
|
||||
EOH;
|
||||
|
||||
try {
|
||||
$response = json_decode(
|
||||
$soundcloud->post(
|
||||
'tracks/1/comments',
|
||||
$comment,
|
||||
array(CURLOPT_HTTPHEADER => array('Content-Type: application/xml'))
|
||||
),
|
||||
true
|
||||
);
|
||||
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
|
||||
exit($e->getMessage());
|
||||
}</code></pre>
|
||||
|
||||
### PUT
|
||||
|
||||
<pre><code>$track = <<<EOH
|
||||
<track>
|
||||
<downloadable>true</downloadable>
|
||||
</track>
|
||||
EOH;
|
||||
|
||||
try {
|
||||
$response = json_decode(
|
||||
$soundcloud->put(
|
||||
'tracks/1',
|
||||
$track,
|
||||
array(CURLOPT_HTTPHEADER => array('Content-Type: application/xml'))
|
||||
),
|
||||
true
|
||||
);
|
||||
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
|
||||
exit($e->getMessage());
|
||||
}</code></pre>
|
||||
|
||||
### DELETE
|
||||
|
||||
<pre><code>try {
|
||||
$response = json_decode($soundcloud->delete('tracks/1'), true);
|
||||
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
|
||||
exit($e->getMessage());
|
||||
}</code></pre>
|
||||
|
||||
### DOWNLOAD TRACK
|
||||
|
||||
<pre><code>try {
|
||||
$track = $soundcloud->download(1337);
|
||||
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
|
||||
exit($e->getMessage());
|
||||
}
|
||||
|
||||
// do something clever with $track. Save to file perhaps?</code></pre>
|
||||
|
||||
## Feedback and questions
|
||||
|
||||
Found a bug or missing a feature? Don't hesitate to create a new issue here on GitHub. Or contact me [directly](https://github.com/mptre).
|
||||
|
||||
Also make sure to check out the official [documentation](https://github.com/soundcloud/api/wiki/) and the join [Google Group](https://groups.google.com/group/soundcloudapi?pli=1) in order to stay updated.
|
||||
|
||||
## License
|
||||
|
||||
Copyright (c) 2011 Anton Lindqvist
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
|
@ -1,737 +0,0 @@
|
|||
<?php
|
||||
require_once 'Soundcloud/Exception.php';
|
||||
require_once 'Soundcloud/Version.php';
|
||||
|
||||
/**
|
||||
* SoundCloud API wrapper with support for authentication using OAuth 2.
|
||||
*
|
||||
* @category Services
|
||||
* @package Services_Soundcloud
|
||||
* @author Anton Lindqvist <anton@qvister.se>
|
||||
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
||||
* @link http://github.com/mptre/php-soundcloud
|
||||
*/
|
||||
class Services_Soundcloud {
|
||||
|
||||
/**
|
||||
* Custom cURL option.
|
||||
*
|
||||
* @access public
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
const CURLOPT_OAUTH_TOKEN = 173;
|
||||
|
||||
/**
|
||||
* Access token returned by the service provider after a successful authentication.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_accessToken;
|
||||
|
||||
/**
|
||||
* Version of the API to use.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
private static $_apiVersion = 1;
|
||||
|
||||
/**
|
||||
* Supported audio MIME types.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_audioMimeTypes = array(
|
||||
'aac' => 'video/mp4',
|
||||
'aiff' => 'audio/x-aiff',
|
||||
'flac' => 'audio/flac',
|
||||
'mp3' => 'audio/mpeg',
|
||||
'ogg' => 'audio/ogg',
|
||||
'wav' => 'audio/x-wav'
|
||||
);
|
||||
|
||||
/**
|
||||
* OAuth client id.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_clientId;
|
||||
|
||||
/**
|
||||
* OAuth client secret.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_clientSecret;
|
||||
|
||||
/**
|
||||
* Development mode.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
private $_development;
|
||||
|
||||
/**
|
||||
* Available API domains.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_domains = array(
|
||||
'development' => 'sandbox-soundcloud.com',
|
||||
'production' => 'soundcloud.com'
|
||||
);
|
||||
|
||||
/**
|
||||
* HTTP response body from the last request.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_lastHttpResponseBody;
|
||||
|
||||
/**
|
||||
* HTTP response code from the last request.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
private $_lastHttpResponseCode;
|
||||
|
||||
/**
|
||||
* HTTP response headers from last request.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $_lastHttpResponseHeaders;
|
||||
|
||||
/**
|
||||
* OAuth paths.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_paths = array(
|
||||
'authorize' => 'connect',
|
||||
'access_token' => 'oauth2/token',
|
||||
);
|
||||
|
||||
/**
|
||||
* OAuth redirect uri.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_redirectUri;
|
||||
|
||||
/**
|
||||
* API response format MIME type.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_requestFormat;
|
||||
|
||||
/**
|
||||
* Available response formats.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private static $_responseFormats = array(
|
||||
'*' => '*/*',
|
||||
'json' => 'application/json',
|
||||
'xml' => 'application/xml'
|
||||
);
|
||||
|
||||
/**
|
||||
* HTTP user agent.
|
||||
*
|
||||
* @access private
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private static $_userAgent = 'PHP-SoundCloud';
|
||||
|
||||
/**
|
||||
* Class version.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $version;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $clientId OAuth client id
|
||||
* @param string $clientSecret OAuth client secret
|
||||
* @param string $redirectUri OAuth redirect uri
|
||||
* @param boolean $development Sandbox mode
|
||||
*
|
||||
* @throws Services_Soundcloud_Missing_Client_Id_Exception when missing client id
|
||||
* @return void
|
||||
*/
|
||||
function __construct($clientId, $clientSecret, $redirectUri = null, $development = false) {
|
||||
if (empty($clientId)) {
|
||||
throw new Services_Soundcloud_Missing_Client_Id_Exception();
|
||||
}
|
||||
|
||||
$this->_clientId = $clientId;
|
||||
$this->_clientSecret = $clientSecret;
|
||||
$this->_redirectUri = $redirectUri;
|
||||
$this->_development = $development;
|
||||
$this->_responseFormat = self::$_responseFormats['json'];
|
||||
$this->version = Services_Soundcloud_Version::get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get authorization URL.
|
||||
*
|
||||
* @param array $params Optional query string parameters
|
||||
*
|
||||
* @return string
|
||||
* @see Soundcloud::_buildUrl()
|
||||
*/
|
||||
function getAuthorizeUrl($params = array()) {
|
||||
$defaultParams = array(
|
||||
'client_id' => $this->_clientId,
|
||||
'redirect_uri' => $this->_redirectUri,
|
||||
'response_type' => 'code'
|
||||
);
|
||||
$params = array_merge($defaultParams, $params);
|
||||
|
||||
return $this->_buildUrl(self::$_paths['authorize'], $params, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get access token URL.
|
||||
*
|
||||
* @param array $params Optional query string parameters
|
||||
*
|
||||
* @return string
|
||||
* @see Soundcloud::_buildUrl()
|
||||
*/
|
||||
function getAccessTokenUrl($params = array()) {
|
||||
return $this->_buildUrl(self::$_paths['access_token'], $params, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve access token.
|
||||
*
|
||||
* @param string $code OAuth code returned from the service provider
|
||||
* @param array $postData Optional post data
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
* @see Soundcloud::_getAccessToken()
|
||||
*/
|
||||
function accessToken($code, $postData = array(), $curlOptions = array()) {
|
||||
$defaultPostData = array(
|
||||
'code' => $code,
|
||||
'client_id' => $this->_clientId,
|
||||
'client_secret' => $this->_clientSecret,
|
||||
'redirect_uri' => $this->_redirectUri,
|
||||
'grant_type' => 'authorization_code'
|
||||
);
|
||||
$postData = array_merge($defaultPostData, $postData);
|
||||
|
||||
return $this->_getAccessToken($postData, $curlOptions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve access token.
|
||||
*
|
||||
* @param string $username
|
||||
* @param string $password
|
||||
* @param array $postData Optional post data
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
* @see Soundcloud::_getAccessToken()
|
||||
*/
|
||||
function accessTokenResourceOwner($username, $password, $postData = array(), $curlOptions = array()) {
|
||||
$defaultPostData = array(
|
||||
'client_id' => $this->_clientId,
|
||||
'client_secret' => $this->_clientSecret,
|
||||
'grant_type' => 'password',
|
||||
'username' => $username,
|
||||
'password' => $password
|
||||
);
|
||||
$postData = array_merge($defaultPostData, $postData);
|
||||
|
||||
return $this->_getAccessToken($postData, $curlOptions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh access token.
|
||||
*
|
||||
* @param string $refreshToken
|
||||
* @param array $postData Optional post data
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
* @see Soundcloud::_getAccessToken()
|
||||
*/
|
||||
function accessTokenRefresh($refreshToken, $postData = array(), $curlOptions = array()) {
|
||||
$defaultPostData = array(
|
||||
'refresh_token' => $refreshToken,
|
||||
'client_id' => $this->_clientId,
|
||||
'client_secret' => $this->_clientSecret,
|
||||
'redirect_uri' => $this->_redirectUri,
|
||||
'grant_type' => 'refresh_token'
|
||||
);
|
||||
$postData = array_merge($defaultPostData, $postData);
|
||||
|
||||
return $this->_getAccessToken($postData, $curlOptions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get access token.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function getAccessToken() {
|
||||
return $this->_accessToken;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get API version.
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
function getApiVersion() {
|
||||
return self::$_apiVersion;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the corresponding MIME type for a given file extension.
|
||||
*
|
||||
* @param string $extension
|
||||
*
|
||||
* @return string
|
||||
* @throws Services_Soundcloud_Unsupported_Audio_Format_Exception if the format is unsupported
|
||||
*/
|
||||
function getAudioMimeType($extension) {
|
||||
if (array_key_exists($extension, self::$_audioMimeTypes)) {
|
||||
return self::$_audioMimeTypes[$extension];
|
||||
} else {
|
||||
throw new Services_Soundcloud_Unsupported_Audio_Format_Exception();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get development mode.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
function getDevelopment() {
|
||||
return $this->_development;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get HTTP response header.
|
||||
*
|
||||
* @param string $header Name of the header
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function getHttpHeader($header) {
|
||||
if (is_array($this->_lastHttpResponseHeaders)
|
||||
&& array_key_exists($header, $this->_lastHttpResponseHeaders)
|
||||
) {
|
||||
return $this->_lastHttpResponseHeaders[$header];
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get redirect uri.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function getRedirectUri() {
|
||||
return $this->_redirectUri;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get response format.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getResponseFormat() {
|
||||
return $this->_responseFormat;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set access token.
|
||||
*
|
||||
* @param string $accessToken
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
function setAccessToken($accessToken) {
|
||||
$this->_accessToken = $accessToken;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set redirect uri.
|
||||
*
|
||||
* @param string $redirectUri
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
function setRedirectUri($redirectUri) {
|
||||
$this->_redirectUri = $redirectUri;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set response format.
|
||||
*
|
||||
* @param string $format Could either be xml or json
|
||||
*
|
||||
* @throws Services_Soundcloud_Unsupported_Response_Format_Exception if the given response format isn't supported
|
||||
* @return object
|
||||
*/
|
||||
function setResponseFormat($format) {
|
||||
if (array_key_exists($format, self::$_responseFormats)) {
|
||||
$this->_responseFormat = self::$_responseFormats[$format];
|
||||
} else {
|
||||
throw new Services_Soundcloud_Unsupported_Response_Format_Exception();
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set development mode.
|
||||
*
|
||||
* @param boolean $development
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
function setDevelopment($development) {
|
||||
$this->_development = $development;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a GET HTTP request.
|
||||
*
|
||||
* @param string $path URI to request
|
||||
* @param array $params Optional query string parameters
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
* @see Soundcloud::_request()
|
||||
*/
|
||||
function get($path, $params = array(), $curlOptions = array()) {
|
||||
$url = $this->_buildUrl($path, $params);
|
||||
|
||||
return $this->_request($url, $curlOptions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a POST HTTP request.
|
||||
*
|
||||
* @param string $path URI to request
|
||||
* @param array $postData Optional post data
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
* @see Soundcloud::_request()
|
||||
*/
|
||||
function post($path, $postData = array(), $curlOptions = array()) {
|
||||
$url = $this->_buildUrl($path);
|
||||
$options = array(CURLOPT_POST => true, CURLOPT_POSTFIELDS => $postData);
|
||||
$options += $curlOptions;
|
||||
|
||||
return $this->_request($url, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a PUT HTTP request.
|
||||
*
|
||||
* @param string $path URI to request
|
||||
* @param array $postData Optional post data
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
* @see Soundcloud::_request()
|
||||
*/
|
||||
function put($path, $postData, $curlOptions = array()) {
|
||||
$url = $this->_buildUrl($path);
|
||||
$options = array(
|
||||
CURLOPT_CUSTOMREQUEST => 'PUT',
|
||||
CURLOPT_POSTFIELDS => $postData
|
||||
);
|
||||
$options += $curlOptions;
|
||||
|
||||
return $this->_request($url, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a DELETE HTTP request.
|
||||
*
|
||||
* @param string $path URI to request
|
||||
* @param array $params Optional query string parameters
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
* @see Soundcloud::_request()
|
||||
*/
|
||||
function delete($path, $params = array(), $curlOptions = array()) {
|
||||
$url = $this->_buildUrl($path, $params);
|
||||
$options = array(CURLOPT_CUSTOMREQUEST => 'DELETE');
|
||||
$options += $curlOptions;
|
||||
|
||||
return $this->_request($url, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Download track.
|
||||
*
|
||||
* @param integer $trackId
|
||||
* @param array Optional query string parameters
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
* @see Soundcloud::_request()
|
||||
*/
|
||||
function download($trackId, $params = array(), $curlOptions = array()) {
|
||||
$lastResponseFormat = array_pop(
|
||||
preg_split('/\//', $this->getResponseFormat())
|
||||
);
|
||||
$defaultParams = array('oauth_token' => $this->getAccessToken());
|
||||
$defaultCurlOptions = array(
|
||||
CURLOPT_FOLLOWLOCATION => true,
|
||||
self::CURLOPT_OAUTH_TOKEN => false
|
||||
);
|
||||
$url = $this->_buildUrl(
|
||||
'tracks/' . $trackId . '/download',
|
||||
array_merge($defaultParams, $params)
|
||||
);
|
||||
$options = $defaultCurlOptions + $curlOptions;
|
||||
|
||||
$this->setResponseFormat('*');
|
||||
|
||||
$response = $this->_request($url, $options);
|
||||
|
||||
// rollback to the previously defined response format.
|
||||
$this->setResponseFormat($lastResponseFormat);
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct default HTTP headers including response format and authorization.
|
||||
*
|
||||
* @param boolean Include access token or not
|
||||
*
|
||||
* @return array $headers
|
||||
*/
|
||||
protected function _buildDefaultHeaders($includeAccessToken = true) {
|
||||
$headers = array();
|
||||
|
||||
if ($this->_responseFormat) {
|
||||
array_push($headers, 'Accept: ' . $this->_responseFormat);
|
||||
}
|
||||
|
||||
if ($includeAccessToken && $this->_accessToken) {
|
||||
array_push($headers, 'Authorization: OAuth ' . $this->_accessToken);
|
||||
}
|
||||
|
||||
return $headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a URL.
|
||||
*
|
||||
* @param string $path Relative or absolute URI
|
||||
* @param array $params Optional query string parameters
|
||||
* @param boolean $includeVersion Include API version
|
||||
*
|
||||
* @return string $url
|
||||
*/
|
||||
protected function _buildUrl($path, $params = null, $includeVersion = true) {
|
||||
if (preg_match('/^https?\:\/\//', $path)) {
|
||||
$url = $path;
|
||||
} else {
|
||||
$url = 'https://';
|
||||
$url .= (!preg_match('/connect/', $path)) ? 'api.' : '';
|
||||
$url .= ($this->_development)
|
||||
? self::$_domains['development']
|
||||
: self::$_domains['production'];
|
||||
$url .= '/';
|
||||
$url .= ($includeVersion) ? 'v' . self::$_apiVersion . '/' : '';
|
||||
$url .= $path;
|
||||
}
|
||||
|
||||
$url .= (count($params)) ? '?' . http_build_query($params) : '';
|
||||
|
||||
return $url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve access token.
|
||||
*
|
||||
* @param array $postData Post data
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
protected function _getAccessToken($postData, $curlOptions = array()) {
|
||||
$options = array(CURLOPT_POST => true, CURLOPT_POSTFIELDS => $postData);
|
||||
$options += $curlOptions;
|
||||
$response = json_decode(
|
||||
$this->_request($this->getAccessTokenUrl(), $options),
|
||||
true
|
||||
);
|
||||
|
||||
if (array_key_exists('access_token', $response)) {
|
||||
$this->_accessToken = $response['access_token'];
|
||||
|
||||
return $response;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get HTTP user agent.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function _getUserAgent() {
|
||||
return self::$_userAgent . '/' . $this->version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse HTTP response headers.
|
||||
*
|
||||
* @param string $headers
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function _parseHttpHeaders($headers) {
|
||||
$headers = preg_split('/\n/', trim($headers));
|
||||
$parsedHeaders = array();
|
||||
|
||||
foreach ($headers as $header) {
|
||||
if (!preg_match('/\:\s/', $header)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
list($key, $val) = preg_split('/\:\s/', $header, 2);
|
||||
$key = str_replace('-', '_', strtolower($key));
|
||||
$val = trim($val);
|
||||
|
||||
$parsedHeaders[$key] = $val;
|
||||
}
|
||||
|
||||
return $parsedHeaders;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates HTTP response code.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
protected function _validResponseCode($code) {
|
||||
return (bool)preg_match('/^20[0-9]{1}$/', $code);
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs the actual HTTP request using curl. Can be overwritten by extending classes.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @param string $url
|
||||
* @param array $curlOptions Optional cURL options
|
||||
*
|
||||
* @throws Services_Soundcloud_Invalid_Http_Response_Code_Exception if the response code isn't valid
|
||||
* @return mixed
|
||||
*/
|
||||
protected function _request($url, $curlOptions = array()) {
|
||||
$ch = curl_init();
|
||||
$options = array(
|
||||
CURLOPT_URL => $url,
|
||||
CURLOPT_HEADER => true,
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_USERAGENT => $this->_getUserAgent()
|
||||
);
|
||||
$options += $curlOptions;
|
||||
|
||||
if (array_key_exists(self::CURLOPT_OAUTH_TOKEN, $options)) {
|
||||
$includeAccessToken = $options[self::CURLOPT_OAUTH_TOKEN];
|
||||
unset($options[self::CURLOPT_OAUTH_TOKEN]);
|
||||
} else {
|
||||
$includeAccessToken = true;
|
||||
}
|
||||
|
||||
if (array_key_exists(CURLOPT_HTTPHEADER, $options)) {
|
||||
$options[CURLOPT_HTTPHEADER] = array_merge(
|
||||
$this->_buildDefaultHeaders(),
|
||||
$curlOptions[CURLOPT_HTTPHEADER]
|
||||
);
|
||||
} else {
|
||||
$options[CURLOPT_HTTPHEADER] = $this->_buildDefaultHeaders($includeAccessToken);
|
||||
}
|
||||
|
||||
curl_setopt_array($ch, $options);
|
||||
|
||||
$data = curl_exec($ch);
|
||||
$info = curl_getinfo($ch);
|
||||
|
||||
curl_close($ch);
|
||||
|
||||
$this->_lastHttpResponseHeaders = $this->_parseHttpHeaders(
|
||||
substr($data, 0, $info['header_size'])
|
||||
);
|
||||
$this->_lastHttpResponseBody = substr($data, $info['header_size']);
|
||||
$this->_lastHttpResponseCode = $info['http_code'];
|
||||
|
||||
if ($this->_validResponseCode($this->_lastHttpResponseCode)) {
|
||||
return $this->_lastHttpResponseBody;
|
||||
} else {
|
||||
throw new Services_Soundcloud_Invalid_Http_Response_Code_Exception(
|
||||
null,
|
||||
0,
|
||||
$this->_lastHttpResponseBody,
|
||||
$this->_lastHttpResponseCode
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,146 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Soundcloud missing client id exception.
|
||||
*
|
||||
* @category Services
|
||||
* @package Services_Soundcloud
|
||||
* @author Anton Lindqvist <anton@qvister.se>
|
||||
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
||||
* @link http://github.com/mptre/php-soundcloud
|
||||
*/
|
||||
class Services_Soundcloud_Missing_Client_Id_Exception extends Exception {
|
||||
|
||||
/**
|
||||
* Default message.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $message = 'All requests must include a consumer key. Referred to as client_id in OAuth2.';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Soundcloud invalid HTTP response code exception.
|
||||
*
|
||||
* @category Services
|
||||
* @package Services_Soundcloud
|
||||
* @author Anton Lindqvist <anton@qvister.se>
|
||||
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
||||
* @link http://github.com/mptre/php-soundcloud
|
||||
*/
|
||||
class Services_Soundcloud_Invalid_Http_Response_Code_Exception extends Exception {
|
||||
|
||||
/**
|
||||
* HTTP response body.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $httpBody;
|
||||
|
||||
/**
|
||||
* HTTP response code.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
protected $httpCode;
|
||||
|
||||
/**
|
||||
* Default message.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $message = 'The requested URL responded with HTTP code %d.';
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $message
|
||||
* @param string $code
|
||||
* @param string $httpBody
|
||||
* @param integer $httpCode
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
function __construct($message = null, $code = 0, $httpBody = null, $httpCode = 0) {
|
||||
$this->httpBody = $httpBody;
|
||||
$this->httpCode = $httpCode;
|
||||
$message = sprintf($this->message, $httpCode);
|
||||
|
||||
parent::__construct($message, $code);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get HTTP response body.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function getHttpBody() {
|
||||
return $this->httpBody;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get HTTP response code.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
function getHttpCode() {
|
||||
return $this->httpCode;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Soundcloud unsupported response format exception.
|
||||
*
|
||||
* @category Services
|
||||
* @package Services_Soundcloud
|
||||
* @author Anton Lindqvist <anton@qvister.se>
|
||||
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
||||
* @link http://github.com/mptre/php-soundcloud
|
||||
*/
|
||||
class Services_Soundcloud_Unsupported_Response_Format_Exception extends Exception {
|
||||
|
||||
/**
|
||||
* Default message.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $message = 'The given response format is unsupported.';
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Soundcloud unsupported audio format exception.
|
||||
*
|
||||
* @category Services
|
||||
* @package Services_Soundcloud
|
||||
* @author Anton Lindqvist <anton@qvister.se>
|
||||
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
||||
* @link http://github.com/mptre/php-soundcloud
|
||||
*/
|
||||
class Services_Soundcloud_Unsupported_Audio_Format_Exception extends Exception {
|
||||
|
||||
/**
|
||||
* Default message.
|
||||
*
|
||||
* @access protected
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $message = 'The given audio format is unsupported.';
|
||||
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Soundcloud package version.
|
||||
*
|
||||
* @category Services
|
||||
* @package Services_Soundcloud
|
||||
* @author Anton Lindqvist <anton@qvister.se>
|
||||
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
||||
* @link http://github.com/mptre/php-soundcloud
|
||||
*/
|
||||
class Services_Soundcloud_Version {
|
||||
|
||||
const MAJOR = 2;
|
||||
const MINOR = 1;
|
||||
const PATCH = 1;
|
||||
|
||||
public static function get() {
|
||||
return implode('.', array(self::MAJOR, self::MINOR, self::PATCH));
|
||||
}
|
||||
|
||||
}
|
|
@ -1,310 +0,0 @@
|
|||
<?php
|
||||
require_once 'Soundcloud_Test_Helper.php';
|
||||
|
||||
class Soundcloud_Test extends PHPUnit_Framework_TestCase {
|
||||
|
||||
protected $soundcloud;
|
||||
|
||||
function setUp() {
|
||||
$this->soundcloud = new Services_Soundcloud_Expose(
|
||||
'1337',
|
||||
'1337',
|
||||
'http://soundcloud.local/callback'
|
||||
);
|
||||
}
|
||||
|
||||
function tearDown() {
|
||||
$this->soundcloud = null;
|
||||
}
|
||||
|
||||
function testVersionFormat() {
|
||||
$this->assertRegExp(
|
||||
'/^[0-9]+\.[0-9]+\.[0-9]+$/',
|
||||
Services_Soundcloud_Version::get()
|
||||
);
|
||||
}
|
||||
|
||||
function testGetUserAgent() {
|
||||
$this->assertRegExp(
|
||||
'/^PHP\-SoundCloud\/[0-9]+\.[0-9]+\.[0-9]+$/',
|
||||
$this->soundcloud->getUserAgent()
|
||||
);
|
||||
}
|
||||
|
||||
function testApiVersion() {
|
||||
$this->assertEquals(1, $this->soundcloud->getApiVersion());
|
||||
}
|
||||
|
||||
function testGetAudioMimeTypes() {
|
||||
$supportedExtensions = array(
|
||||
'aac' => 'video/mp4',
|
||||
'aiff' => 'audio/x-aiff',
|
||||
'flac' => 'audio/flac',
|
||||
'mp3' => 'audio/mpeg',
|
||||
'ogg' => 'audio/ogg',
|
||||
'wav' => 'audio/x-wav'
|
||||
);
|
||||
$unsupportedExtensions = array('gif', 'html', 'jpg', 'mp4', 'xml', 'xspf');
|
||||
|
||||
foreach ($supportedExtensions as $extension => $mimeType) {
|
||||
$this->assertEquals(
|
||||
$mimeType,
|
||||
$this->soundcloud->getAudioMimeType($extension)
|
||||
);
|
||||
}
|
||||
|
||||
foreach ($unsupportedExtensions as $extension => $mimeType) {
|
||||
$this->setExpectedException('Services_Soundcloud_Unsupported_Audio_Format_Exception');
|
||||
|
||||
$this->soundcloud->getAudioMimeType($extension);
|
||||
}
|
||||
}
|
||||
|
||||
function testGetAuthorizeUrl() {
|
||||
$this->assertEquals(
|
||||
'https://soundcloud.com/connect?client_id=1337&redirect_uri=http%3A%2F%2Fsoundcloud.local%2Fcallback&response_type=code',
|
||||
$this->soundcloud->getAuthorizeUrl()
|
||||
);
|
||||
}
|
||||
|
||||
function testGetAuthorizeUrlWithCustomQueryParameters() {
|
||||
$this->assertEquals(
|
||||
'https://soundcloud.com/connect?client_id=1337&redirect_uri=http%3A%2F%2Fsoundcloud.local%2Fcallback&response_type=code&foo=bar',
|
||||
$this->soundcloud->getAuthorizeUrl(array('foo' => 'bar'))
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
'https://soundcloud.com/connect?client_id=1337&redirect_uri=http%3A%2F%2Fsoundcloud.local%2Fcallback&response_type=code&foo=bar&bar=foo',
|
||||
$this->soundcloud->getAuthorizeUrl(array('foo' => 'bar', 'bar' => 'foo'))
|
||||
);
|
||||
}
|
||||
|
||||
function testGetAccessTokenUrl() {
|
||||
$this->assertEquals(
|
||||
'https://api.soundcloud.com/oauth2/token',
|
||||
$this->soundcloud->getAccessTokenUrl()
|
||||
);
|
||||
}
|
||||
|
||||
function testSetAccessToken() {
|
||||
$this->soundcloud->setAccessToken('1337');
|
||||
|
||||
$this->assertEquals('1337', $this->soundcloud->getAccessToken());
|
||||
}
|
||||
|
||||
function testSetDevelopment() {
|
||||
$this->soundcloud->setDevelopment(true);
|
||||
|
||||
$this->assertTrue($this->soundcloud->getDevelopment());
|
||||
}
|
||||
|
||||
function testSetRedirectUri() {
|
||||
$this->soundcloud->setRedirectUri('http://soundcloud.local/callback');
|
||||
|
||||
$this->assertEquals(
|
||||
'http://soundcloud.local/callback',
|
||||
$this->soundcloud->getRedirectUri()
|
||||
);
|
||||
}
|
||||
|
||||
function testDefaultResponseFormat() {
|
||||
$this->assertEquals(
|
||||
'application/json',
|
||||
$this->soundcloud->getResponseFormat()
|
||||
);
|
||||
}
|
||||
|
||||
function testSetResponseFormatHtml() {
|
||||
$this->setExpectedException('Services_Soundcloud_Unsupported_Response_Format_Exception');
|
||||
|
||||
$this->soundcloud->setResponseFormat('html');
|
||||
}
|
||||
|
||||
function testSetResponseFormatAll() {
|
||||
$this->soundcloud->setResponseFormat('*');
|
||||
|
||||
$this->assertEquals(
|
||||
'*/*',
|
||||
$this->soundcloud->getResponseFormat()
|
||||
);
|
||||
}
|
||||
|
||||
function testSetResponseFormatJson() {
|
||||
$this->soundcloud->setResponseFormat('json');
|
||||
|
||||
$this->assertEquals(
|
||||
'application/json',
|
||||
$this->soundcloud->getResponseFormat()
|
||||
);
|
||||
}
|
||||
|
||||
function testSetResponseFormatXml() {
|
||||
$this->soundcloud->setResponseFormat('xml');
|
||||
|
||||
$this->assertEquals(
|
||||
'application/xml',
|
||||
$this->soundcloud->getResponseFormat()
|
||||
);
|
||||
}
|
||||
|
||||
function testResponseCodeSuccess() {
|
||||
$this->assertTrue($this->soundcloud->validResponseCode(200));
|
||||
}
|
||||
|
||||
function testResponseCodeRedirect() {
|
||||
$this->assertFalse($this->soundcloud->validResponseCode(301));
|
||||
}
|
||||
|
||||
function testResponseCodeClientError() {
|
||||
$this->assertFalse($this->soundcloud->validResponseCode(400));
|
||||
}
|
||||
|
||||
function testResponseCodeServerError() {
|
||||
$this->assertFalse($this->soundcloud->validResponseCode(500));
|
||||
}
|
||||
|
||||
function testBuildDefaultHeaders() {
|
||||
$this->assertEquals(
|
||||
array('Accept: application/json'),
|
||||
$this->soundcloud->buildDefaultHeaders()
|
||||
);
|
||||
}
|
||||
|
||||
function testBuildDefaultHeadersWithAccessToken() {
|
||||
$this->soundcloud->setAccessToken('1337');
|
||||
|
||||
$this->assertEquals(
|
||||
array('Accept: application/json', 'Authorization: OAuth 1337'),
|
||||
$this->soundcloud->buildDefaultHeaders()
|
||||
);
|
||||
}
|
||||
|
||||
function testBuildUrl() {
|
||||
$this->assertEquals(
|
||||
'https://api.soundcloud.com/v1/me',
|
||||
$this->soundcloud->buildUrl('me')
|
||||
);
|
||||
}
|
||||
|
||||
function testBuildUrlWithQueryParameters() {
|
||||
$this->assertEquals(
|
||||
'https://api.soundcloud.com/v1/tracks?q=rofl+dubstep',
|
||||
$this->soundcloud->buildUrl(
|
||||
'tracks',
|
||||
array('q' => 'rofl dubstep')
|
||||
)
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
'https://api.soundcloud.com/v1/tracks?q=rofl+dubstep&filter=public',
|
||||
$this->soundcloud->buildUrl(
|
||||
'tracks',
|
||||
array('q' => 'rofl dubstep', 'filter' => 'public')
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
function testBuildUrlWithDevelopmentDomain() {
|
||||
$this->soundcloud->setDevelopment(true);
|
||||
|
||||
$this->assertEquals(
|
||||
'https://api.sandbox-soundcloud.com/v1/me',
|
||||
$this->soundcloud->buildUrl('me')
|
||||
);
|
||||
}
|
||||
|
||||
function testBuildUrlWithoutApiVersion() {
|
||||
$this->assertEquals(
|
||||
'https://api.soundcloud.com/me',
|
||||
$this->soundcloud->buildUrl('me', null, false)
|
||||
);
|
||||
}
|
||||
|
||||
function testBuildUrlWithAbsoluteUrl() {
|
||||
$this->assertEquals(
|
||||
'https://api.soundcloud.com/me',
|
||||
$this->soundcloud->buildUrl('https://api.soundcloud.com/me')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataProviderHttpHeaders
|
||||
*/
|
||||
function testParseHttpHeaders($rawHeaders, $expectedHeaders) {
|
||||
$parsedHeaders = $this->soundcloud->parseHttpHeaders($rawHeaders);
|
||||
|
||||
foreach ($parsedHeaders as $key => $val) {
|
||||
$this->assertEquals($val, $expectedHeaders[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
function testSoundcloudMissingConsumerKeyException() {
|
||||
$this->setExpectedException('Services_Soundcloud_Missing_Client_Id_Exception');
|
||||
|
||||
$soundcloud = new Services_Soundcloud('', '');
|
||||
}
|
||||
|
||||
function testSoundcloudInvalidHttpResponseCodeException() {
|
||||
$this->setExpectedException('Services_Soundcloud_Invalid_Http_Response_Code_Exception');
|
||||
|
||||
$this->soundcloud->get('me');
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataProviderSoundcloudInvalidHttpResponseCode
|
||||
*/
|
||||
function testSoundcloudInvalidHttpResponseCode($expectedHeaders) {
|
||||
try {
|
||||
$this->soundcloud->get('me');
|
||||
} catch (Services_Soundcloud_Invalid_Http_Response_Code_Exception $e) {
|
||||
$this->assertEquals(
|
||||
'{"error":"401 - Unauthorized"}',
|
||||
$e->getHttpBody()
|
||||
);
|
||||
|
||||
$this->assertEquals(401, $e->getHttpCode());
|
||||
|
||||
foreach ($expectedHeaders as $key => $val) {
|
||||
$this->assertEquals(
|
||||
$val,
|
||||
$this->soundcloud->getHttpHeader($key)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static function dataProviderHttpHeaders() {
|
||||
$rawHeaders = <<<HEADERS
|
||||
HTTP/1.1 200 OK
|
||||
Date: Wed, 17 Nov 2010 15:39:52 GMT
|
||||
Cache-Control: public
|
||||
Content-Type: text/html; charset=utf-8
|
||||
Content-Encoding: gzip
|
||||
Server: foobar
|
||||
Content-Length: 1337
|
||||
HEADERS;
|
||||
$expectedHeaders = array(
|
||||
'date' => 'Wed, 17 Nov 2010 15:39:52 GMT',
|
||||
'cache_control' => 'public',
|
||||
'content_type' => 'text/html; charset=utf-8',
|
||||
'content_encoding' => 'gzip',
|
||||
'server' => 'foobar',
|
||||
'content_length' => '1337'
|
||||
);
|
||||
|
||||
return array(array($rawHeaders, $expectedHeaders));
|
||||
}
|
||||
|
||||
static function dataProviderSoundcloudInvalidHttpResponseCode() {
|
||||
$expectedHeaders = array(
|
||||
'server' => 'nginx',
|
||||
'content_type' => 'application/json; charset=utf-8',
|
||||
'connection' => 'keep-alive',
|
||||
'cache_control' => 'no-cache',
|
||||
'content_length' => '30'
|
||||
);
|
||||
|
||||
return array(array($expectedHeaders));
|
||||
}
|
||||
|
||||
}
|
|
@ -1,94 +0,0 @@
|
|||
<?php
|
||||
set_include_path(
|
||||
get_include_path()
|
||||
. PATH_SEPARATOR
|
||||
. realpath(dirname(__FILE__) . '/../')
|
||||
);
|
||||
|
||||
require_once 'Services/Soundcloud.php';
|
||||
|
||||
/**
|
||||
* Extended class of the Soundcloud class in order to expose protected methods
|
||||
* for testing.
|
||||
*
|
||||
* @category Services
|
||||
* @package Services_Soundcloud
|
||||
* @author Anton Lindqvist <anton@qvister.se>
|
||||
* @copyright 2010 Anton Lindqvist <anton@qvister.se>
|
||||
* @license http://www.opensource.org/licenses/mit-license.php MIT
|
||||
* @link http://github.com/mptre/php-soundcloud
|
||||
*/
|
||||
class Services_Soundcloud_Expose extends Services_Soundcloud {
|
||||
|
||||
/**
|
||||
* Class constructor. See parent constructor for further reference.
|
||||
*
|
||||
* @param string $clientId Application client id
|
||||
* @param string $clientSecret Application client secret
|
||||
* @param string $redirectUri Application redirect uri
|
||||
* @param boolean $development Sandbox mode
|
||||
*
|
||||
* @return void
|
||||
* @see Soundcloud
|
||||
*/
|
||||
function __construct($clientId, $clientSecret, $redirectUri = null, $development = false) {
|
||||
parent::__construct($clientId, $clientSecret, $redirectUri, $development);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct default http headers including response format and authorization.
|
||||
*
|
||||
* @return array
|
||||
* @see Soundcloud::_buildDefaultHeaders()
|
||||
*/
|
||||
function buildDefaultHeaders() {
|
||||
return $this->_buildDefaultHeaders();
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a url.
|
||||
*
|
||||
* @param string $path Relative or absolute uri
|
||||
* @param array $params Optional query string parameters
|
||||
* @param boolean $includeVersion Include the api version
|
||||
*
|
||||
* @return string
|
||||
* @see Soundcloud::_buildUrl()
|
||||
*/
|
||||
function buildUrl($path, $params = null, $includeVersion = true) {
|
||||
return $this->_buildUrl($path, $params, $includeVersion);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get http user agent.
|
||||
*
|
||||
* @return string
|
||||
* @see Soundcloud::_getUserAgent()
|
||||
*/
|
||||
function getUserAgent() {
|
||||
return $this->_getUserAgent();
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse HTTP response headers.
|
||||
*
|
||||
* @param string $headers
|
||||
*
|
||||
* @return array
|
||||
* @see Soundcloud::_parseHttpHeaders()
|
||||
*/
|
||||
function parseHttpHeaders($headers) {
|
||||
return $this->_parseHttpHeaders($headers);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates http response code.
|
||||
*
|
||||
* @return boolean
|
||||
* @see Soundcloud::_validResponseCode()
|
||||
*/
|
||||
function validResponseCode($code) {
|
||||
return $this->_validResponseCode($code);
|
||||
}
|
||||
|
||||
}
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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();
|
||||
});
|
||||
|
|
|
@ -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') {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
|
|
@ -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();
|
||||
|
Loading…
Reference in New Issue