diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php index 3e17b594c..8026388b8 100644 --- a/airtime_mvc/application/controllers/ApiController.php +++ b/airtime_mvc/application/controllers/ApiController.php @@ -85,7 +85,7 @@ class ApiController extends Zend_Controller_Action // Make sure we don't have some wrong result beecause of caching clearstatcache(); - if ($media->getPropelOrm()->isValidFile()) { + if ($media->getPropelOrm()->isValidPhysicalFile()) { $filename = $media->getPropelOrm()->getFilename(); //Download user left clicks a track and selects Download. @@ -168,15 +168,9 @@ class ApiController extends Zend_Controller_Action //http://www.php.net/manual/en/function.ob-end-flush.php while (@ob_end_flush()); - /*$cur = $begin; - fseek($fm, $begin, 0); - - while (!feof($fm) && $cur <= $end && (connection_status() == 0)) { - echo fread($fm, min(1024 * 16, ($end - $cur) + 1)); - $cur += 1024 * 16; - }*/ - - while(!feof($fm)) { + // NOTE: We can't use fseek here because it does not work with streams + // (a.k.a. Files stored on Amazon S3) + while(!feof($fm) && (connection_status() == 0)) { echo fread($fm, 1024 * 8); } } diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index ecbbe887d..996462336 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -768,7 +768,19 @@ SQL; } } - private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, $object_name=null) + /** + * + * Appends schedule "events" to an array of schedule events that gets + * sent to PYPO. Each schedule event contains information PYPO and + * Liquidsoap need for playout. + * + * @param Array $data array to be filled with schedule info - $item(s) + * @param Array $item schedule info about one track + * @param Integer $media_id scheduled item's cc_files id + * @param String $uri path to the scheduled item's physical location + * @param String $amazonS3ResourceId scheduled item's Amazon S3 resource id, if applicable + */ + private static function createFileScheduleEvent(&$data, $item, $media_id, $uri, $amazonS3ResourceId) { $start = self::AirtimeTimeToPypoTime($item["start"]); $end = self::AirtimeTimeToPypoTime($item["end"]); @@ -804,8 +816,8 @@ SQL; 'replay_gain' => $replay_gain, 'independent_event' => $independent_event ); - if (!is_null($object_name)) { - $schedule_item["object_name"] = $object_name; + if (!is_null($amazonS3ResourceId)) { + $schedule_item["amazonS3_resource_id"] = $amazonS3ResourceId; } if ($schedule_item['cue_in'] > $schedule_item['cue_out']) { @@ -938,15 +950,11 @@ SQL; //row is from "file" $media_id = $item['file_id']; $storedFile = Application_Model_StoredFile::RecallById($media_id); - $file = $storedFile->getPropelOrm(); $uri = $file->getAbsoluteFilePath(); + $amazonS3ResourceId = $file->getResourceId(); - $object_name = null; - if ($file instanceof CloudFile) { - $object_name = $storedFile->getResourceId(); - } - self::createFileScheduleEvent($data, $item, $media_id, $uri, $object_name); + self::createFileScheduleEvent($data, $item, $media_id, $uri, $amazonS3ResourceId); } elseif (!is_null($item['stream_id'])) { //row is type "webstream" diff --git a/airtime_mvc/application/models/airtime/CcFiles.php b/airtime_mvc/application/models/airtime/CcFiles.php index 01eed8d55..b13eb05ce 100644 --- a/airtime_mvc/application/models/airtime/CcFiles.php +++ b/airtime_mvc/application/models/airtime/CcFiles.php @@ -111,7 +111,7 @@ class CcFiles extends BaseCcFiles { /** * Checks if the file is a regular file that can be previewed and downloaded. */ - public function isValidFile() + public function isValidPhysicalFile() { return is_file($this->getAbsoluteFilePath()); } @@ -130,4 +130,14 @@ class CcFiles extends BaseCcFiles { } } + /** + * + * This function refers to the file's Amazon S3 resource id. + * Returns null because cc_files are stored on local disk. + */ + public function getResourceId() + { + return null; + } + } // CcFiles diff --git a/airtime_mvc/application/models/airtime/CloudFile.php b/airtime_mvc/application/models/airtime/CloudFile.php index a30eedc6c..c1d5b3b7a 100644 --- a/airtime_mvc/application/models/airtime/CloudFile.php +++ b/airtime_mvc/application/models/airtime/CloudFile.php @@ -93,7 +93,7 @@ class CloudFile extends BaseCloudFile /** * Checks if the file is a regular file that can be previewed and downloaded. */ - public function isValidFile() + public function isValidPhysicalFile() { $ch = curl_init(); curl_setopt_array($ch, array( diff --git a/airtime_mvc/application/modules/rest/controllers/MediaController.php b/airtime_mvc/application/modules/rest/controllers/MediaController.php index 56fe06e2f..77a3830f3 100644 --- a/airtime_mvc/application/modules/rest/controllers/MediaController.php +++ b/airtime_mvc/application/modules/rest/controllers/MediaController.php @@ -232,7 +232,7 @@ class Rest_MediaController extends Zend_Rest_Controller $file->setDbFilepath($requestData["filename"]); $fileSizeBytes = $requestData["filesize"]; - if ($fileSizeBytes === false) + if (!isset($fileSizeBytes) || $fileSizeBytes === false) { $file->setDbImportStatus(2)->save(); $this->fileNotFoundResponse(); @@ -247,7 +247,7 @@ class Rest_MediaController extends Zend_Rest_Controller //we should get rid of this since we're removing local file storage } else if (isset($requestData["full_path"])) { $fileSizeBytes = filesize($requestData["full_path"]); - if ($fileSizeBytes === false) + if (!isset($fileSizeBytes) || $fileSizeBytes === false) { $file->setDbImportStatus(2)->save(); $this->fileNotFoundResponse(); diff --git a/python_apps/airtime_analyzer/setup.py b/python_apps/airtime_analyzer/setup.py index 7b27df24f..61bbd55b2 100644 --- a/python_apps/airtime_analyzer/setup.py +++ b/python_apps/airtime_analyzer/setup.py @@ -30,6 +30,11 @@ setup(name='airtime_analyzer', 'python-daemon', 'requests', 'apache-libcloud', + # These next 3 are required for requests to support SSL with SNI. Learned this the hard way... + # What sucks is that GCC is required to pip install these. + #'ndg-httpsclient', + #'pyasn1', + #'pyopenssl' ], zip_safe=False, data_files=data_files) diff --git a/python_apps/pypo/pypofile.py b/python_apps/pypo/pypofile.py index d0667a58f..2c14bbbf5 100644 --- a/python_apps/pypo/pypofile.py +++ b/python_apps/pypo/pypofile.py @@ -136,9 +136,9 @@ class PypoFile(Thread): """ If an object_name exists the file is stored on Amazon S3 """ - if 'object_name' in media_item: + if 'amazonS3_resource_id' in media_item: csd = CloudStorageDownloader() - csd.download_obj(media_item['dst'], media_item['object_name']) + csd.download_obj(media_item['dst'], media_item['amazonS3_resource_id']) media_item['file_ready'] = True else: self.copy_file(media_item)