From 45dbf8475060e14a56dae4d9389ff8546a69bc09 Mon Sep 17 00:00:00 2001 From: Codenift Date: Thu, 19 Sep 2019 20:07:50 -0400 Subject: [PATCH 01/15] Generate artwork images for audio using ID3. --- LICENSE_3RD_PARTY | 39 +-- .../application/common/FileDataHelper.php | 271 ++++++++++++++++++ airtime_mvc/application/configs/constants.php | 2 + .../application/controllers/ApiController.php | 112 ++++++++ .../controllers/LibraryController.php | 12 +- .../controllers/ScheduleController.php | 66 ++--- .../plugins/PageLayoutInitPlugin.php | 4 +- .../upgrade_sql/airtime_2.5.17/upgrade.sql | 1 + airtime_mvc/application/forms/EditAudioMD.php | 15 +- airtime_mvc/application/models/Dashboard.php | 4 + airtime_mvc/application/models/StoredFile.php | 87 +++--- .../application/models/airtime/CcFiles.php | 47 ++- .../models/airtime/map/CcFilesTableMap.php | 1 + .../models/airtime/om/BaseCcFiles.php | 55 ++++ .../models/airtime/om/BaseCcFilesPeer.php | 29 +- .../models/airtime/om/BaseCcFilesQuery.php | 35 ++- airtime_mvc/application/upgrade/Upgrades.php | 19 +- .../views/scripts/library/edit-file-md.phtml | 31 +- .../library/get-file-metadata.ajax.phtml | 6 +- .../views/scripts/partialviews/header.phtml | 5 +- airtime_mvc/build/schema.xml | 9 +- airtime_mvc/build/sql/schema.sql | 1 + airtime_mvc/public/css/dashboard.css | 12 + airtime_mvc/public/css/images/no-cover.jpg | Bin 0 -> 70633 bytes airtime_mvc/public/css/styles.css | 122 +++++--- .../public/js/airtime/dashboard/dashboard.js | 75 +++-- .../public/js/airtime/library/library.js | 10 +- .../js/airtime/widgets/table-example.js | 1 + composer.json | 1 + composer.lock | 66 ++++- 30 files changed, 939 insertions(+), 199 deletions(-) create mode 100644 airtime_mvc/application/controllers/upgrade_sql/airtime_2.5.17/upgrade.sql create mode 100644 airtime_mvc/public/css/images/no-cover.jpg diff --git a/LICENSE_3RD_PARTY b/LICENSE_3RD_PARTY index 7096a6f55..0abbe77eb 100644 --- a/LICENSE_3RD_PARTY +++ b/LICENSE_3RD_PARTY @@ -22,7 +22,7 @@ Common Non-linked Code Airtime Web ----------- Linked code: - * Zend Framework 1.10.3 + * Zend Framework 1.10.3 - What is it: Framework for PHP web apps - Web site: http://framework.zend.com/ - License: New BSD license @@ -32,7 +32,7 @@ Linked code: - What is it: PHP library - Notes: We only use the PEAR base class PEAR_Error, in the "PEAR" PEAR library. - License: New BSD License - - Compatible with GPLv3? Yes. + - Compatible with GPLv3? Yes. * Propel ORM - What is it: Maps DB data into PHP objects @@ -40,7 +40,7 @@ Linked code: - License: MIT/Expat License - Compatible with the GPL: Yes. See http://www.gnu.org/licenses/license-list.html - * Phing + * Phing - What is it: PHP project build system - Web site: http://phing.info/trac/ - Note: Only used for development, not needed to run Airtime. @@ -48,22 +48,27 @@ Linked code: * PHP-AMQPLIB - What is it: PHP library to interact with RabbitMQ - - Web site: https://github.com/tnc/php-amqplib + - Web site: https://github.com/tnc/php-amqplib - License: LGPLv2.1 - Compatible with GPLv3? Yes * Soundcloud PHP API wrapper - What is it: PHP library to upload to SoundCloud - Web site: https://github.com/mptre/php-soundcloud/blob/master/Services/Soundcloud.php - - License: MIT + - License: MIT - Compatible with the GPL: Yes. See http://www.gnu.org/licenses/license-list.html + * getID3() + - What is it: PHP script that extracts useful information from MP3s & other multimedia file formats: + - Web site: https://github.com/JamesHeinrich/getID3 + - License: GPLv3 + Non-linked code: - * Apache Web Server 2.2 + * Apache Web Server 2.2 - Web site: http://httpd.apache.org/ - License: Apache 2.0. See http://httpd.apache.org/docs/2.2/license.html - * PostgreSQL 9.1 + * PostgreSQL 9.1 - Web site: http://www.postgresql.org/ - License: The PostgreSQL License. See http://www.postgresql.org/about/licence @@ -71,22 +76,22 @@ Non-linked code: - Web site: http://www.php.net/ - License: The PHP License. See http://www.php.net/license/3_01.txt - * jQuery + * jQuery - Web site: http://jquery.com/ - License: MIT and GPL. See http://jquery.org/license - jQuery components used: - * Full Calendar + * Full Calendar - Web site: http://arshaw.com/fullcalendar/ - License: Dual licensed under MIT and GPLv2 - * Colorpicker + * Colorpicker - Web site: http://www.eyecon.ro/colorpicker/ - License: Dual licensed under the MIT and GPL licenses. * Context Menu - Web site: http://jursza.net/dev/jjmenu/ - - License: MIT [http://www.opensource.org/licenses/mit-license.php] + - License: MIT [http://www.opensource.org/licenses/mit-license.php] * PLUpload - Web site: http://www.plupload.com @@ -98,8 +103,8 @@ Non-linked code: * qtip - Web site: http://craigsworks.com/projects/qtip/ - - License: MIT - + - License: MIT + * TimePicker - Web site: http://fgelinas.com/code/timepicker/ - License: Dual licensed under the MIT or GPL Version 2 licenses. @@ -120,7 +125,7 @@ Non-linked code: Media-Monitor ------------- Linked code: - * Mutagen + * Mutagen - What is it: Parser of audio file metadata - Web site: http://code.google.com/p/mutagen/ - License: GPLv2-only @@ -129,7 +134,7 @@ Linked code: - What is it: Python interface to RabbitMQ - Web site: http://pypi.python.org/pypi/kombu/ - License: New BSD - - Compatible with GPLv3? Yes. + - Compatible with GPLv3? Yes. * pyinotify - Python interface to inotify @@ -155,7 +160,7 @@ Linked code: - What is it: Python interface to RabbitMQ - Web site: http://pypi.python.org/pypi/kombu/ - License: New BSD - - Compatible with GPLv3? Yes. + - Compatible with GPLv3? Yes. Non-linked code: * Python 2.7 @@ -174,7 +179,7 @@ Linked code: * Kombu - Web site: http://pypi.python.org/pypi/kombu/ - License: New BSD - - Compatible with GPLv3? Yes. + - Compatible with GPLv3? Yes. Non-linked code: * Python 2.7 diff --git a/airtime_mvc/application/common/FileDataHelper.php b/airtime_mvc/application/common/FileDataHelper.php index 3cd9c83af..3a8ccdef6 100644 --- a/airtime_mvc/application/common/FileDataHelper.php +++ b/airtime_mvc/application/common/FileDataHelper.php @@ -68,4 +68,275 @@ class FileDataHelper { } } + /** + * Gets data URI from artwork file + * + * @param string $file + * @param int $size + * @param string $filepath + * + * @return string Data URI for artwork + */ + public static function getArtworkData($file, $size, $filepath = false) + { + $baseUrl = Application_Common_HTTPHelper::getStationUrl(); + $default = $baseUrl . "css/images/no-cover.jpg"; + + if ($filepath != false) { + $path = $filepath . $file . "-" . $size; + if (!file_exists($path)) { + $get_file_content = $default; + } else { + $get_file_content = file_get_contents($path); + } + } else { + $storDir = Application_Model_MusicDir::getStorDir(); + $path = $storDir->getDirectory() . $file . "-" . $size; + if (!file_exists($path)) { + $get_file_content = $default; + } else { + $get_file_content = file_get_contents($path); + } + } + return $get_file_content; + } + + /** + * Add artwork file + * + * @param string $analyzeFile + * @param string $filename + * @param string $importDir + * @param string $DbPath + * + * @return string Path to artwork + */ + public static function saveArtworkData($analyzeFile, $filename, $importDir = null, $DbPath = null) + { + $getID3 = new \getID3(); + $getFileInfo = $getID3->analyze($analyzeFile); + + if(isset($getFileInfo['comments']['picture'][0])) { + + $get_img = ""; + $timestamp = time(); + $mime = $getFileInfo['comments']['picture'][0]['image_mime']; + $Image = 'data:'.$mime.';charset=utf-8;base64,'.base64_encode($getFileInfo['comments']['picture'][0]['data']); + $base64 = @$Image; + + if (!file_exists($importDir . "/" . "artwork/")) { + if (!mkdir($importDir . "/" . "artwork/", 0777, true)) { + Logging::error("Failed to create artwork directory."); + throw new Exception("Failed to create artwork directory."); + } + } + + $path_parts = pathinfo($filename); + $file = $importDir . "artwork/" . $path_parts['filename']; + + //Save Data URI + if (file_put_contents($file, $base64)) { + $get_img = $DbPath . "artwork/". $path_parts['filename']; + } else { + Logging::error("Could not save Data URI"); + } + + if ($mime == "image/png") { + $ext = 'png'; + } elseif ($mime == "image/gif") { + $ext = 'gif'; + } elseif ($mime == "image/bmp") { + $ext = 'bmp'; + } else { + $ext = 'jpg'; + } + + if (file_exists($file)) { + self::resizeImage($file, $file . '-32.jpg', $ext, 32, 100); + self::resizeImage($file, $file . '-64.jpg', $ext, 64, 100); + self::resizeImage($file, $file . '-128.jpg', $ext, 128, 100); + self::resizeImage($file, $file . '-256.jpg', $ext, 256, 100); + self::resizeImage($file, $file . '-512.jpg', $ext, 512, 100); + self::imgToDataURI($file . '-32.jpg', $file . '-32'); + self::imgToDataURI($file . '-64.jpg', $file . '-64'); + self::imgToDataURI($file . '-128.jpg', $file . '-128'); + self::imgToDataURI($file . '-256.jpg', $file . '-256'); + } else { + Logging::error("The file $file does not exist"); + } + } else { + $get_img = ''; + } + return $get_img; + } + + /** + * Reset artwork + * + * @param string $trackid + * + * @return string $get_img Path to artwork + */ + public static function resetArtwork($trackid) + { + $file = Application_Model_StoredFile::RecallById($trackid); + $md = $file->getMetadata(); + + $storDir = Application_Model_MusicDir::getStorDir(); + $fp = $storDir->getDirectory(); + + $dbAudioPath = $md["MDATA_KEY_FILEPATH"]; + $fullpath = $fp . $dbAudioPath; + + $getID3 = new \getID3(); + $getFileInfo = $getID3->analyze($fullpath); + + if(isset($getFileInfo['comments']['picture'][0])) { + + $get_img = ""; + $mime = $getFileInfo['comments']['picture'][0]['image_mime']; + $Image = 'data:'.$getFileInfo['comments']['picture'][0]['image_mime'].';charset=utf-8;base64,'.base64_encode($getFileInfo['comments']['picture'][0]['data']); + $base64 = @$Image; + + $audioPath = dirname($fullpath); + $dbPath = dirname($dbAudioPath); + $path_parts = pathinfo($fullpath); + $file = $path_parts['filename']; + + //Save Data URI + if (file_put_contents($audioPath . "/" . $file, $base64)) { + $get_img = $dbPath . "/" . $file; + } else { + Logging::error("Could not save Data URI"); + } + + $rfile = $audioPath . "/" . $file; + + if ($mime == "image/png") { + $ext = 'png'; + } elseif ($mime == "image/gif") { + $ext = 'gif'; + } elseif ($mime == "image/bmp") { + $ext = 'bmp'; + } else { + $ext = 'jpg'; + } + + if (file_exists($rfile)) { + self::resizeImage($rfile, $rfile . '-32.jpg', $ext, 32, 100); + self::resizeImage($rfile, $rfile . '-64.jpg', $ext, 64, 100); + self::resizeImage($rfile, $rfile . '-128.jpg', $ext, 128, 100); + self::resizeImage($rfile, $rfile . '-256.jpg', $ext, 256, 100); + self::resizeImage($rfile, $rfile . '-512.jpg', $ext, 512, 100); + self::imgToDataURI($rfile . '-32.jpg', $rfile . '-32'); + self::imgToDataURI($rfile . '-64.jpg', $rfile . '-64'); + self::imgToDataURI($rfile . '-128.jpg', $rfile . '-128'); + self::imgToDataURI($rfile . '-256.jpg', $rfile . '-256'); + } else { + Logging::error("The file $rfile does not exist"); + } + } else { + $get_img = ""; + } + return $get_img; + } + + /** + * Render image + * Used in API to render JPEG + * + * @param string $file + */ + public static function renderImage($file) + { + $im = @imagecreatefromjpeg($file); + header('Content-Type: image/jpeg'); + $img = $im; + imagejpeg($img); + imagedestroy($img); + } + + /** + * Render Data URI + * Used in API to render Data URI + * + * @param string $dataFile + */ + public static function renderDataURI($dataFile) + { + if($filecontent = file_get_contents($dataFile) !== false){ + $image = @file_get_contents($dataFile); + $image = base64_encode($image); + if (!$image || $image === '') { + return; + } + $blob = base64_decode($image); + $f = finfo_open(); + $mime_type = finfo_buffer($f, $blob, FILEINFO_MIME_TYPE); + finfo_close($f); + header("Content-Type: " . $mime_type); + echo $blob; + } else { + return; + } + } + + /** + * Resize Image + * + * @param string $orig_filename + * @param string $converted_filename + * @param string $ext + * @param string $size Default: 500 + * @param string $quality Default: 75 + * + */ + public static function resizeImage($orig_filename, $converted_filename, $ext, $size=500, $quality=75) + { + $get_cont = file_get_contents($orig_filename); + if ($ext == "png") { + $im = @imagecreatefrompng($get_cont); + } elseif ($ext == "gif") { + $im = @imagecreatefromgif($get_cont); + } else { + $im = @imagecreatefromjpeg($get_cont); + } + + if ($size){ + $im = imagescale($im , $size); + } + + if(!$im) { + $im = imagecreatetruecolor(150, 30); + $bgc = imagecolorallocate($im, 255, 255, 255); + $tc = imagecolorallocate($im, 0, 0, 0); + imagefilledrectangle($im, 0, 0, 150, 30, $bgc); + imagestring($im, 1, 5, 5, 'Error loading ' . $imgname, $tc); + } + + $img = $im; + imagejpeg($img, $converted_filename, $quality); + imagedestroy($img); + } + + /** + * Convert image to Data URI + * + * @param string $orig_filename + * @param string $conv_filename + */ + public static function imgToDataURI($orig_filename, $conv_filename) + { + $file = file_get_contents($orig_filename); + $Image = 'data:image/jpeg;charset=utf-8;base64,'.base64_encode($file); + $base64 = @$Image; + + //Save Data URI + if (file_put_contents($conv_filename, $base64)) { + + } else { + Logging::error("Could not save Data URI"); + } + } + } diff --git a/airtime_mvc/application/configs/constants.php b/airtime_mvc/application/configs/constants.php index 7e02d1196..a56a908b5 100644 --- a/airtime_mvc/application/configs/constants.php +++ b/airtime_mvc/application/configs/constants.php @@ -81,6 +81,8 @@ define('MDATA_KEY_REPLAYGAIN' , 'replay_gain'); define('MDATA_KEY_OWNER_ID' , 'owner_id'); define('MDATA_KEY_CUE_IN' , 'cuein'); define('MDATA_KEY_CUE_OUT' , 'cueout'); +define('MDATA_KEY_ARTWORK' , 'artwork'); +define('MDATA_KEY_ARTWORK_DATA', 'artwork_data'); define('UI_MDATA_VALUE_FORMAT_FILE' , 'File'); define('UI_MDATA_VALUE_FORMAT_STREAM' , 'live stream'); diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php index 1d070f1f4..ed0e7c852 100644 --- a/airtime_mvc/application/controllers/ApiController.php +++ b/airtime_mvc/application/controllers/ApiController.php @@ -26,6 +26,7 @@ class ApiController extends Zend_Controller_Action "show-tracks", "show-schedules", "show-logo", + "track", "stream-m3u" ); @@ -294,6 +295,20 @@ class ApiController extends Zend_Controller_Action $result = Application_Model_Schedule::GetPlayOrderRangeOld($limit); } + $stationUrl = Application_Common_HTTPHelper::getStationUrl(); + + $previousID = $result["previous"]["metadata"]["id"]; + $get_prev_artwork_url = $stationUrl . 'api/track?id='. $previousID .'&return=artwork'; + $result["previous"]["metadata"]["artwork_url"] = $get_prev_artwork_url; + + $currID = $result["current"]["metadata"]["id"]; + $get_curr_artwork_url = $stationUrl . 'api/track?id='. $currID .'&return=artwork'; + $result["current"]["metadata"]["artwork_url"] = $get_curr_artwork_url; + + $nextID = $result["previous"]["metadata"]["id"]; + $get_next_artwork_url = $stationUrl . 'api/track?id='. $nextID .'&return=artwork'; + $result["previous"]["metadata"]["artwork_url"] = $get_next_artwork_url; + // apply user-defined timezone, or default to station Application_Common_DateHelper::convertTimestampsToTimezone( $result['currentShow'], @@ -523,6 +538,103 @@ class ApiController extends Zend_Controller_Action } } + /** + * New API endpoint to display metadata from any single track + * + * Find metadata to any track imported (eg. id=1&return=json) + * + * @param int $id track ID + * @param string $return json, artwork_data, or artwork + * + */ + public function trackAction() + { + // Disable the view and the layout + $this->view->layout()->disableLayout(); + $this->_helper->viewRenderer->setNoRender(true); + + if (Application_Model_Preference::GetAllow3rdPartyApi() || $this->checkAuth()) { + + $request = $this->getRequest(); + $trackid = $request->getParam('id'); + $return = $request->getParam('return'); + + if (empty($return)) { + throw new ZendActionHttpException($this, 400, "ERROR: No return was given."); + } + + if (empty($trackid)) { + throw new ZendActionHttpException($this, 400, "ERROR: No ID was given."); + } + + $storDir = Application_Model_MusicDir::getStorDir(); + $fp = $storDir->getDirectory(); + + //$this->view->type = $type; + $file = Application_Model_StoredFile::RecallById($trackid); + $md = $file->getMetadata(); + + if ($return === "artwork-data") { + foreach ($md as $key => $value) { + if ($key == 'MDATA_KEY_ARTWORK' && !is_null($value)) { + FileDataHelper::renderDataURI($fp . $md['MDATA_KEY_ARTWORK']); + } + } + } elseif ($return === "artwork-data-32") { + foreach ($md as $key => $value) { + if ($key == 'MDATA_KEY_ARTWORK' && !is_null($value)) { + FileDataHelper::renderDataURI($fp . $md['MDATA_KEY_ARTWORK']. '-32'); + } + } + } elseif ($return === "artwork") { + //default + foreach ($md as $key => $value) { + if ($key == 'MDATA_KEY_ARTWORK' && !is_null($value)) { + FileDataHelper::renderImage($fp . $md['MDATA_KEY_ARTWORK'].'-1024.jpg'); + } + } + } elseif ($return === "artwork-32") { + foreach ($md as $key => $value) { + if ($key == 'MDATA_KEY_ARTWORK' && !is_null($value)) { + FileDataHelper::renderImage($fp . $md['MDATA_KEY_ARTWORK'].'-32.jpg'); + } + } + } elseif ($return === "artwork-64") { + foreach ($md as $key => $value) { + if ($key == 'MDATA_KEY_ARTWORK' && !is_null($value)) { + FileDataHelper::renderImage($fp . $md['MDATA_KEY_ARTWORK'].'-64.jpg'); + } + } + } elseif ($return === "artwork-128") { + foreach ($md as $key => $value) { + if ($key == 'MDATA_KEY_ARTWORK' && !is_null($value)) { + FileDataHelper::renderImage($fp . $md['MDATA_KEY_ARTWORK'].'-128.jpg'); + } + } + } elseif ($return === "artwork-512") { + foreach ($md as $key => $value) { + if ($key == 'MDATA_KEY_ARTWORK' && !is_null($value)) { + FileDataHelper::renderImage($fp . $md['MDATA_KEY_ARTWORK'].'-512.jpg'); + } + } + } elseif ($return === "artwork-1024") { + foreach ($md as $key => $value) { + if ($key == 'MDATA_KEY_ARTWORK' && !is_null($value)) { + FileDataHelper::renderImage($fp . $md['MDATA_KEY_ARTWORK'].'-1024.jpg'); + } + } + } elseif ($return === "json") { + $data =json_encode($md); + echo $data; + } + + } else { + header('HTTP/1.0 401 Unauthorized'); + print _('You are not allowed to access this resource. '); + exit; + } + } + /** * API endpoint to provide station metadata */ diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php index 21543e24e..28c5f02bb 100644 --- a/airtime_mvc/application/controllers/LibraryController.php +++ b/airtime_mvc/application/controllers/LibraryController.php @@ -392,7 +392,14 @@ class LibraryController extends Zend_Controller_Action $serialized = array(); //need to convert from serialized jQuery array. foreach ($js as $j) { - $serialized[$j["name"]] = $j["value"]; + //on edit, if no artwork is set and audiofile has image, automatically add it + if ($j["name"] == "artwork") { + if ($j["value"] == null || $j["value"] == ''){ + $serialized["artwork"] = FileDataHelper::resetArtwork($file_id); + } + } else { + $serialized[$j["name"]] = $j["value"]; + } } // Sanitize any wildly incorrect metadata before it goes to be validated. @@ -409,6 +416,9 @@ class LibraryController extends Zend_Controller_Action $this->view->form = $form; $this->view->id = $file_id; $this->view->title = $file->getPropelOrm()->getDbTrackTitle(); + $this->view->artist_name = $file->getPropelOrm()->getDbArtistName(); + $this->view->filePath = $file->getPropelOrm()->getDbFilepath(); + $this->view->artwork = $file->getPropelOrm()->getDbArtwork(); $this->view->html = $this->view->render('library/edit-file-md.phtml'); } diff --git a/airtime_mvc/application/controllers/ScheduleController.php b/airtime_mvc/application/controllers/ScheduleController.php index 33044b4ec..bf9d0fa63 100644 --- a/airtime_mvc/application/controllers/ScheduleController.php +++ b/airtime_mvc/application/controllers/ScheduleController.php @@ -122,7 +122,7 @@ class ScheduleController extends Zend_Controller_Action $currentUser = $service_user->getCurrentUser(); $userTimezone = new DateTimeZone(Application_Model_Preference::GetUserTimezone()); - + $start = new DateTime($this->_getParam('start', null), $userTimezone); $start->setTimezone(new DateTimeZone("UTC")); $end = new DateTime($this->_getParam('end', null), $userTimezone); @@ -187,7 +187,7 @@ class ScheduleController extends Zend_Controller_Action $this->view->show_error = true; return false; } - + $error = $service_calendar->moveShow($deltaDay, $deltaMin); if (isset($error)) { $this->view->error = $error; @@ -209,7 +209,7 @@ class ScheduleController extends Zend_Controller_Action $log_vars["params"]["delta day"] = $deltaDay; $log_vars["params"]["delta minute"] = $deltaMin; Logging::info($log_vars); - + $userInfo = Zend_Auth::getInstance()->getStorage()->read(); $user = new Application_Model_User($userInfo->id); @@ -239,7 +239,7 @@ class ScheduleController extends Zend_Controller_Action $log_vars["params"] = array(); $log_vars["params"]["instance id"] = $instanceId; Logging::info($log_vars); - + $service_show = new Application_Service_ShowService(); $showId = $service_show->deleteShow($instanceId, true); @@ -261,7 +261,7 @@ class ScheduleController extends Zend_Controller_Action public function clearShowAction() { $instanceId = $this->_getParam('id'); - + $log_vars = array(); $log_vars["url"] = $_SERVER['HTTP_HOST']; $log_vars["action"] = "schedule/clear-show"; @@ -296,12 +296,14 @@ class ScheduleController extends Zend_Controller_Action /* Convert all UTC times to localtime before sending back to user. */ $range["schedulerTime"] = Application_Common_DateHelper::UTCStringToUserTimezoneString($range["schedulerTime"]); - + if (isset($range["previous"])) { $range["previous"]["starts"] = Application_Common_DateHelper::UTCStringToUserTimezoneString($range["previous"]["starts"]); $range["previous"]["ends"] = Application_Common_DateHelper::UTCStringToUserTimezoneString($range["previous"]["ends"]); } if (isset($range["current"])) { + $get_artwork = FileDataHelper::getArtworkData($range["current"]["metadata"]["artwork"], 256); + $range["current"]["metadata"]["artwork_data"] = $get_artwork; $range["current"]["starts"] = Application_Common_DateHelper::UTCStringToUserTimezoneString($range["current"]["starts"]); $range["current"]["ends"] = Application_Common_DateHelper::UTCStringToUserTimezoneString($range["current"]["ends"]); } @@ -309,14 +311,14 @@ class ScheduleController extends Zend_Controller_Action $range["next"]["starts"] = Application_Common_DateHelper::UTCStringToUserTimezoneString($range["next"]["starts"]); $range["next"]["ends"] = Application_Common_DateHelper::UTCStringToUserTimezoneString($range["next"]["ends"]); } - + Application_Common_DateHelper::convertTimestamps( - $range["currentShow"], + $range["currentShow"], array("starts", "ends", "start_timestamp", "end_timestamp"), "user" ); Application_Common_DateHelper::convertTimestamps( - $range["nextShow"], + $range["nextShow"], array("starts", "ends", "start_timestamp", "end_timestamp"), "user" ); @@ -324,7 +326,7 @@ class ScheduleController extends Zend_Controller_Action //TODO: Add timezone and timezoneOffset back into the ApiController's results. $range["timezone"] = Application_Common_DateHelper::getUserTimezoneAbbreviation(); $range["timezoneOffset"] = Application_Common_DateHelper::getUserTimezoneOffset(); - + $source_status = array(); $switch_status = array(); $live_dj = Application_Model_Preference::GetSourceStatus("live_dj"); @@ -358,7 +360,7 @@ class ScheduleController extends Zend_Controller_Action return false; } - + $originalShowId = $show->isRebroadcast(); if (!is_null($originalShowId)) { try { @@ -375,7 +377,7 @@ class ScheduleController extends Zend_Controller_Action $displayTimeZone = new DateTimeZone(Application_Model_Preference::GetTimezone()); $originalDateTime = new DateTime($originalShowStart, new DateTimeZone("UTC")); $originalDateTime->setTimezone($displayTimeZone); - + $this->view->additionalShowInfo = sprintf(_("Rebroadcast of show %s from %s at %s"), $originalShowName, @@ -461,7 +463,7 @@ class ScheduleController extends Zend_Controller_Action $log_vars["params"] = array(); $log_vars["params"]["form_data"] = $data; Logging::info($log_vars); - + $service_showForm = new Application_Service_ShowFormService( $data["add_show_id"], $data["add_show_instance_id"]); $service_show = new Application_Service_ShowService(null, $data); @@ -513,7 +515,7 @@ class ScheduleController extends Zend_Controller_Action if ($data['add_show_day_check'] == "") { $data['add_show_day_check'] = null; } - + $log_vars = array(); $log_vars["url"] = $_SERVER['HTTP_HOST']; $log_vars["action"] = "schedule/edit-show"; @@ -525,12 +527,12 @@ class ScheduleController extends Zend_Controller_Action list($data, $validateStartDate, $validateStartTime, $originalShowStartDateTime) = $service_showForm->preEditShowValidationCheck($data); - + if ($service_showForm->validateShowForms($forms, $data, $validateStartDate, $originalShowStartDateTime, true, $data["add_show_instance_id"])) { // Get the show ID from the show service to pass as a parameter to the RESTful ShowImageController $this->view->showId = $service_show->addUpdateShow($data); - + $this->view->addNewShow = true; $this->view->newForm = $this->view->render('schedule/add-show-form.phtml'); } else { @@ -541,7 +543,7 @@ class ScheduleController extends Zend_Controller_Action $this->view->when->getElement('add_show_start_time')->setOptions(array('disabled' => true)); } //$this->view->rr->getElement('add_show_record')->setOptions(array('disabled' => true)); - + $this->view->addNewShow = false; $this->view->action = "edit-show"; $this->view->form = $this->view->render('schedule/add-show-form.phtml'); @@ -551,7 +553,7 @@ class ScheduleController extends Zend_Controller_Action public function addShowAction() { $service_showForm = new Application_Service_ShowFormService(null); - + $js = $this->_getParam('data'); $data = array(); @@ -565,20 +567,20 @@ class ScheduleController extends Zend_Controller_Action // TODO: move this to js $data['add_show_hosts'] = $this->_getParam('hosts'); $data['add_show_day_check'] = $this->_getParam('days'); - + if ($data['add_show_day_check'] == "") { $data['add_show_day_check'] = null; } - + $log_vars = array(); $log_vars["url"] = $_SERVER['HTTP_HOST']; $log_vars["action"] = "schedule/add-show"; $log_vars["params"] = array(); $log_vars["params"]["form_data"] = $data; Logging::info($log_vars); - + $forms = $this->createShowFormAction(); - + $this->view->addNewShow = true; if ($data['add_show_start_now'] == "now") { @@ -597,18 +599,18 @@ class ScheduleController extends Zend_Controller_Action if ($service_showForm->validateShowForms($forms, $data)) { // Get the show ID from the show service to pass as a parameter to the RESTful ShowImageController $this->view->showId = $service_show->addUpdateShow($data); - + //send new show forms to the user $this->createShowFormAction(true); $this->view->newForm = $this->view->render('schedule/add-show-form.phtml'); - + Logging::debug("Show creation succeeded"); } else { $this->view->form = $this->view->render('schedule/add-show-form.phtml'); Logging::debug("Show creation failed"); } } - + public function createShowFormAction($populateDefaults=false) { $service_showForm = new Application_Service_ShowFormService(); @@ -638,7 +640,7 @@ class ScheduleController extends Zend_Controller_Action public function deleteShowAction() { $instanceId = $this->_getParam('id'); - + $log_vars = array(); $log_vars["url"] = $_SERVER['HTTP_HOST']; $log_vars["action"] = "schedule/delete-show"; @@ -648,7 +650,7 @@ class ScheduleController extends Zend_Controller_Action $service_show = new Application_Service_ShowService(); $showId = $service_show->deleteShow($instanceId); - + if (!$showId) { $this->view->show_error = true; } @@ -663,7 +665,7 @@ class ScheduleController extends Zend_Controller_Action $log_vars["params"] = array(); $log_vars["params"]["instance id"] = $this->_getParam('id'); Logging::info($log_vars); - + $user = Application_Model_User::getCurrentUser(); if ($user->isUserType(array(UTYPE_SUPERADMIN, UTYPE_ADMIN, UTYPE_PROGRAM_MANAGER))) { @@ -730,7 +732,7 @@ class ScheduleController extends Zend_Controller_Action $start = $this->_getParam('startTime'); $end = $this->_getParam('endTime'); $timezone = $this->_getParam('timezone'); - + $service_showForm = new Application_Service_ShowFormService(); $result = $service_showForm->calculateDuration($start, $end, $timezone); @@ -741,10 +743,10 @@ class ScheduleController extends Zend_Controller_Action public function updateFutureIsScheduledAction() { $schedId = $this->_getParam('schedId'); - + $scheduleService = new Application_Service_SchedulerService(); $redrawLibTable = $scheduleService->updateFutureIsScheduled($schedId, false); - + $this->_helper->json->sendJson(array("redrawLibTable" => $redrawLibTable)); } @@ -762,5 +764,5 @@ class ScheduleController extends Zend_Controller_Action $this->_helper->json->sendJson($localTime); } - + } diff --git a/airtime_mvc/application/controllers/plugins/PageLayoutInitPlugin.php b/airtime_mvc/application/controllers/plugins/PageLayoutInitPlugin.php index f6a46be5d..444f82f96 100644 --- a/airtime_mvc/application/controllers/plugins/PageLayoutInitPlugin.php +++ b/airtime_mvc/application/controllers/plugins/PageLayoutInitPlugin.php @@ -91,7 +91,7 @@ class PageLayoutInitPlugin extends Zend_Controller_Plugin_Abstract $userType = ""; } $view->headScript()->appendScript("var userType = '$userType';"); - + // Dropzone also accept file extensions and doesn't correctly extract certain mimetypes (eg. FLAC - try it), // so we append the file extensions to the list of mimetypes and that makes it work. $mimeTypes = FileDataHelper::getAudioMimeTypeArray(); @@ -139,6 +139,8 @@ class PageLayoutInitPlugin extends Zend_Controller_Plugin_Abstract $view->headScript()->appendScript("var PRODUCT_NAME = '" . PRODUCT_NAME . "';"); $view->headScript()->appendScript("var USER_MANUAL_URL = '" . USER_MANUAL_URL . "';"); $view->headScript()->appendScript("var COMPANY_NAME = '" . COMPANY_NAME . "';"); + //Each page refresh or tab open has uniqID, not to be used for security + $view->headScript()->appendScript("var UNIQID = '" . uniqid() . "';"); } protected function _initHeadLink() diff --git a/airtime_mvc/application/controllers/upgrade_sql/airtime_2.5.17/upgrade.sql b/airtime_mvc/application/controllers/upgrade_sql/airtime_2.5.17/upgrade.sql new file mode 100644 index 000000000..3d92007aa --- /dev/null +++ b/airtime_mvc/application/controllers/upgrade_sql/airtime_2.5.17/upgrade.sql @@ -0,0 +1 @@ +ALTER TABLE cc_files ADD COLUMN artwork TYPE character varying(255); \ No newline at end of file diff --git a/airtime_mvc/application/forms/EditAudioMD.php b/airtime_mvc/application/forms/EditAudioMD.php index e4e6768f9..62a83f66c 100644 --- a/airtime_mvc/application/forms/EditAudioMD.php +++ b/airtime_mvc/application/forms/EditAudioMD.php @@ -2,9 +2,9 @@ class Application_Form_EditAudioMD extends Zend_Form { - + public function init() {} - + public function startForm($p_id) { $baseUrl = Application_Common_OsPath::getBaseDir(); @@ -18,6 +18,17 @@ class Application_Form_EditAudioMD extends Zend_Form $file_id->setAttrib('class', 'obj_id'); $this->addElement($file_id); + // Add artwork hidden field + $artwork = new Zend_Form_Element_Hidden('artwork'); + $artwork->setFilters(array('StringTrim')) + ->setValidators(array( + new Zend_Validate_StringLength(array('max' => 512)) + )); + $file_id->addDecorator('HtmlTag', array('tag' => 'div', 'style' => 'display:none')); + $file_id->removeDecorator('Label'); + $file_id->setAttrib('class', 'artwork'); + $this->addElement($artwork); + // Add title field $track_title = new Zend_Form_Element_Text('track_title'); $track_title->class = 'input_text'; diff --git a/airtime_mvc/application/models/Dashboard.php b/airtime_mvc/application/models/Dashboard.php index 47265a922..4a2c4acaf 100644 --- a/airtime_mvc/application/models/Dashboard.php +++ b/airtime_mvc/application/models/Dashboard.php @@ -70,6 +70,7 @@ class Application_Model_Dashboard */ return array("name"=>$row[0]["artist_name"]." - ".$row[0]["track_title"], + "artwork_data"=>$row[0]["artwork_data"], "starts"=>$row[0]["starts"], "ends"=>$row[0]["ends"]); } @@ -87,6 +88,7 @@ class Application_Model_Dashboard } } else { return array("name"=>$row[0]["artist_name"]." - ".$row[0]["track_title"], + "artwork_data"=>$row[0]["artwork_data"], "starts"=>$row[0]["starts"], "ends"=>$row[0]["ends"], "media_item_played"=>$row[0]["media_item_played"], @@ -110,6 +112,7 @@ class Application_Model_Dashboard return null; } else { return array("name"=>$row[0]["artist_name"]." - ".$row[0]["track_title"], + "artwork_data"=>$row[0]["artwork_data"], "starts"=>$row[0]["starts"], "ends"=>$row[0]["ends"]); } @@ -128,6 +131,7 @@ class Application_Model_Dashboard if ($row[0]["starts"] <= $showInstance->getShowInstanceStart()) { return array("name"=>$row[0]["artist_name"]." - ".$row[0]["track_title"], + "artwork_data"=>$row[0]["artwork_data"], "starts"=>$row[0]["starts"], "ends"=>$row[0]["ends"]); } else { diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 25d692c12..8e8211378 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -53,7 +53,8 @@ class Application_Model_StoredFile "owner_id" => "DbOwnerId", "cuein" => "DbCueIn", "cueout" => "DbCueOut", - "description" => "DbDescription" + "description" => "DbDescription", + "artwork" => "DbArtwork" ); function __construct($file, $con) { @@ -209,7 +210,7 @@ class Application_Model_StoredFile if ($dbColumn == "track_title" && (is_null($mdValue) || $mdValue == "")) { continue; } - + // Bpm gets POSTed as a string type. With Propel 1.6 this value // was casted to an integer type before saving it to the db. But // Propel 1.7 does not do this @@ -352,8 +353,8 @@ SQL; return array(); } } - - /** + + /** * Check if the file (on disk) corresponding to this class exists or not. * @return boolean true if the file exists, false otherwise. */ @@ -415,11 +416,11 @@ SQL; //Update the user's disk usage Application_Model_Preference::updateDiskUsage(-1 * $filesize); - + //Explicitly update any playlist's and block's length that contain //the file getting deleted self::updateBlockAndPlaylistLength($this->_file->getDbId()); - + //delete the file record from cc_files (and cloud_file, if applicable) $this->_file->delete(); } @@ -427,7 +428,7 @@ SQL; /* * This function is meant to be called when a file is getting * deleted from the library. It re-calculates the length of - * all blocks and playlists that contained the deleted file. + * all blocks and playlists that contained the deleted file. */ private static function updateBlockAndPlaylistLength($fileId) { @@ -471,7 +472,7 @@ SQL; public function getFilePaths() { assert($this->_file); - + return $this->_file->getURLsForTrackPreviewOrDownload(); } @@ -528,7 +529,7 @@ SQL; { return $baseUrl."api/get-media/file/".$this->getId(); } - + public function getResourceId() { return $this->_file->getResourceId(); @@ -545,7 +546,7 @@ SQL; } return $filesize; } - + public static function Insert($md, $con) { // save some work by checking if filepath is given right away @@ -592,17 +593,17 @@ SQL; if (isset($p_id)) { $p_id = intval($p_id); - + $storedFile = CcFilesQuery::create()->findPK($p_id, $con); if (is_null($storedFile)) { throw new Exception("Could not recall file with id: ".$p_id); } - + //Attempt to get the cloud file object and return it. If no cloud //file object is found then we are dealing with a regular stored //object so return that $cloudFile = CloudFileQuery::create()->findOneByCcFileId($p_id); - + if (is_null($cloudFile)) { return self::createWithFile($storedFile, $con); } else { @@ -671,7 +672,7 @@ SQL; "bit_rate", "sample_rate", "isrc_number", "encoded_by", "label", "copyright", "mime", "language", "filepath", "owner_id", "conductor", "replay_gain", "lptime", "is_playlist", "is_scheduled", - "cuein", "cueout", "description" ); + "cuein", "cueout", "description", "artwork" ); } public static function searchLibraryFiles($datatables) @@ -693,49 +694,49 @@ SQL; $blSelect[] = "BL.id AS ".$key; $fileSelect[] = "FILES.id AS $key"; $streamSelect[] = "ws.id AS ".$key; - } + } elseif ($key === "track_title") { $plSelect[] = "name AS ".$key; $blSelect[] = "name AS ".$key; $fileSelect[] = $key; $streamSelect[] = "name AS ".$key; - } + } elseif ($key === "ftype") { $plSelect[] = "'playlist'::varchar AS ".$key; $blSelect[] = "'block'::varchar AS ".$key; $fileSelect[] = $key; $streamSelect[] = "'stream'::varchar AS ".$key; - } + } elseif ($key === "artist_name") { $plSelect[] = "login AS ".$key; $blSelect[] = "login AS ".$key; $fileSelect[] = $key; $streamSelect[] = "login AS ".$key; - } + } elseif ($key === "owner_id") { $plSelect[] = "login AS ".$key; $blSelect[] = "login AS ".$key; $fileSelect[] = "sub.login AS $key"; $streamSelect[] = "login AS ".$key; - } + } elseif ($key === "replay_gain") { $plSelect[] = "NULL::NUMERIC AS ".$key; $blSelect[] = "NULL::NUMERIC AS ".$key; $fileSelect[] = $key; $streamSelect[] = "NULL::NUMERIC AS ".$key; - } + } elseif ($key === "lptime") { $plSelect[] = "NULL::TIMESTAMP AS ".$key; $blSelect[] = "NULL::TIMESTAMP AS ".$key; $fileSelect[] = $key; $streamSelect[] = $key; - } + } elseif ($key === "is_scheduled" || $key === "is_playlist") { $plSelect[] = "NULL::boolean AS ".$key; $blSelect[] = "NULL::boolean AS ".$key; $fileSelect[] = $key; $streamSelect[] = "NULL::boolean AS ".$key; - } + } elseif ($key === "cuein" || $key === "cueout") { $plSelect[] = "NULL::INTERVAL AS ".$key; $blSelect[] = "NULL::INTERVAL AS ".$key; @@ -755,7 +756,7 @@ SQL; $blSelect[] = $key; $fileSelect[] = $key; $streamSelect[] = $key; - } + } elseif ($key === "year") { $plSelect[] = "EXTRACT(YEAR FROM utime)::varchar AS ".$key; $blSelect[] = "EXTRACT(YEAR FROM utime)::varchar AS ".$key; @@ -768,13 +769,13 @@ SQL; $blSelect[] = "NULL::int AS ".$key; $fileSelect[] = $key; $streamSelect[] = "NULL::int AS ".$key; - } + } elseif ($key === "filepath") { $plSelect[] = "NULL::VARCHAR AS ".$key; $blSelect[] = "NULL::VARCHAR AS ".$key; $fileSelect[] = $key; $streamSelect[] = "url AS ".$key; - } + } else if ($key == "mime") { $plSelect[] = "NULL::VARCHAR AS ".$key; $blSelect[] = "NULL::VARCHAR AS ".$key; @@ -828,7 +829,10 @@ SQL; $displayTimezone = new DateTimeZone(Application_Model_Preference::GetUserTimezone()); $utcTimezone = new DateTimeZone("UTC"); - + + $storDir = Application_Model_MusicDir::getStorDir(); + $fp = $storDir->getDirectory(); + foreach ($results['aaData'] as &$row) { $row['id'] = intval($row['id']); @@ -862,6 +866,9 @@ SQL; $formatter = new BitrateFormatter($row['bit_rate']); $row['bit_rate'] = $formatter->format(); + $get_artwork = FileDataHelper::getArtworkData($row['artwork'], 32, $fp); + $row['artwork_data'] = $get_artwork; + // for audio preview $row['audioFile'] = $row['id'].".".pathinfo($row['filepath'], PATHINFO_EXTENSION); @@ -874,7 +881,7 @@ SQL; $len_formatter = new LengthFormatter($row_length); $row['length'] = $len_formatter->format(); - + //convert mtime and utime to localtime $row['mtime'] = new DateTime($row['mtime'], $utcTimezone); $row['mtime']->setTimeZone($displayTimezone); @@ -882,7 +889,7 @@ SQL; $row['utime'] = new DateTime($row['utime'], $utcTimezone); $row['utime']->setTimeZone($displayTimezone); $row['utime'] = $row['utime']->format(DEFAULT_TIMESTAMP_FORMAT); - + //need to convert last played to localtime if it exists. if (isset($row['lptime'])) { $row['lptime'] = new DateTime($row['lptime'], $utcTimezone); @@ -904,16 +911,16 @@ SQL; } /** - * Copy a newly uploaded audio file from its temporary upload directory - * on the local disk (like /tmp) over to Airtime's "stor" directory, + * Copy a newly uploaded audio file from its temporary upload directory + * on the local disk (like /tmp) over to Airtime's "stor" directory, * which is where all ingested music/media live. - * + * * This is done in PHP here on the web server rather than in airtime_analyzer because * the airtime_analyzer might be running on a different physical computer than the web server, * and it probably won't have access to the web server's /tmp folder. The stor/organize directory - * is, however, both accessible to the machines running airtime_analyzer and the web server + * is, however, both accessible to the machines running airtime_analyzer and the web server * on Airtime Pro. - * + * * The file is actually copied to "stor/organize", which is a staging directory where files go * before they're processed by airtime_analyzer, which then moves them to "stor/imported" in the final * step. @@ -936,11 +943,11 @@ SQL; throw new Exception("Failed to create organize directory."); } } - + if (chmod($audio_file, 0644) === false) { Logging::info("Warning: couldn't change permissions of $audio_file to 0644"); } - + // Did all the checks for real, now trying to copy $audio_stor = Application_Common_OsPath::join($stor, "organize", $originalFilename); @@ -976,7 +983,7 @@ SQL; } return $audio_stor; } - + /* * Pass the file through Liquidsoap and test if it is readable. Return True if readable, and False otherwise. */ @@ -1157,7 +1164,7 @@ SQL; } /** - * + * * Updates the is_scheduled flag to false for tracks that are no longer * scheduled in the future. We do this by checking the difference between * all files scheduled in the future and all files with is_scheduled = true. @@ -1171,15 +1178,15 @@ SQL; $futureScheduledFilesSelectCriteria->add(CcSchedulePeer::ENDS, gmdate(DEFAULT_TIMESTAMP_FORMAT), Criteria::GREATER_THAN); $stmt = CcSchedulePeer::doSelectStmt($futureScheduledFilesSelectCriteria); $filesScheduledInFuture = $stmt->fetchAll(PDO::FETCH_COLUMN, 0); - + $filesCurrentlySetWithIsScheduledSelectCriteria = new Criteria(); $filesCurrentlySetWithIsScheduledSelectCriteria->addSelectColumn(CcFilesPeer::ID); $filesCurrentlySetWithIsScheduledSelectCriteria->add(CcFilesPeer::IS_SCHEDULED, true); $stmt = CcFilesPeer::doSelectStmt($filesCurrentlySetWithIsScheduledSelectCriteria); $filesCurrentlySetWithIsScheduled = $stmt->fetchAll(PDO::FETCH_COLUMN, 0); - + $diff = array_diff($filesCurrentlySetWithIsScheduled, $filesScheduledInFuture); - + $con = Propel::getConnection(CcFilesPeer::DATABASE_NAME); $selectCriteria = new Criteria(); $selectCriteria->add(CcFilesPeer::ID, $diff, Criteria::IN); diff --git a/airtime_mvc/application/models/airtime/CcFiles.php b/airtime_mvc/application/models/airtime/CcFiles.php index 9a7ebd88a..fcc390a46 100644 --- a/airtime_mvc/application/models/airtime/CcFiles.php +++ b/airtime_mvc/application/models/airtime/CcFiles.php @@ -146,10 +146,16 @@ class CcFiles extends BaseCcFiles { self::validateFileArray($fileArray); + $storDir = Application_Model_MusicDir::getStorDir(); + $importedStorageDir = $storDir->getDirectory() . "imported/" . self::getOwnerId() . "/"; + $importedDbPath = "imported/" . self::getOwnerId() . "/"; + $artwork = FileDataHelper::saveArtworkData($filePath, $originalFilename, $importedStorageDir, $importedDbPath); + $file->fromArray($fileArray); $file->setDbOwnerId(self::getOwnerId()); $now = new DateTime("now", new DateTimeZone("UTC")); $file->setDbTrackTitle($originalFilename); + $file->setDbArtwork($artwork); $file->setDbUtime($now); $file->setDbHidden(true); $file->save(); @@ -319,13 +325,13 @@ class CcFiles extends BaseCcFiles { { $cuein = $this->getDbCuein(); $cueout = $this->getDbCueout(); - + $cueinSec = Application_Common_DateHelper::calculateLengthInSeconds($cuein); $cueoutSec = Application_Common_DateHelper::calculateLengthInSeconds($cueout); $lengthSec = bcsub($cueoutSec, $cueinSec, 6); - + $length = Application_Common_DateHelper::secondsToPlaylistTime($lengthSec); - + return $length; } @@ -342,7 +348,7 @@ class CcFiles extends BaseCcFiles { return $this->getDbFileExists() && !$this->getDbHidden(); } - public function reassignTo($user) + public function reassignTo($user) { $this->setDbOwnerId( $user->getDbId() ); $this->save(); @@ -408,6 +414,21 @@ class CcFiles extends BaseCcFiles { return Application_Common_OsPath::join($directory, $filepath); } + /** + * Returns the artwork's absolute file path stored on disk. + */ + public function getAbsoluteArtworkPath() + { + $music_dir = Application_Model_MusicDir::getDirByPK($this->getDbDirectory()); + if (!$music_dir) { + throw new Exception("Invalid music_dir for file " . $this->getDbId() . " in database."); + } + $directory = $music_dir->getDirectory(); + $filepath = $this->getDbArtwork(); + + return Application_Common_OsPath::join($directory, $filepath); + } + /** * * Strips out fields from incoming request data that should never be modified @@ -495,23 +516,29 @@ class CcFiles extends BaseCcFiles { { return is_file($this->getAbsoluteFilePath()); } - + /** - * + * * Deletes the file from the stor directory on disk. */ public function deletePhysicalFile() { $filepath = $this->getAbsoluteFilePath(); + $artworkpath = $this->getAbsoluteArtworkPath(); if (file_exists($filepath)) { unlink($filepath); + // also delete related images (dataURI and jpeg files) + foreach (glob("$artworkpath*", GLOB_NOSORT) as $filename) { + unlink($filename); + } + unlink($artworkpath); } else { throw new Exception("Could not locate file ".$filepath); } } - + /** - * + * * This function refers to the file's Amazon S3 resource id. * Returns null because cc_files are stored on local disk. */ @@ -519,10 +546,10 @@ class CcFiles extends BaseCcFiles { { return null; } - + public function getCcFileId() { return $this->id; } - + } // CcFiles diff --git a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php index a6c91bf09..e68a15637 100644 --- a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php @@ -111,6 +111,7 @@ class CcFilesTableMap extends TableMap $this->addColumn('is_playlist', 'DbIsPlaylist', 'BOOLEAN', false, null, false); $this->addColumn('filesize', 'DbFilesize', 'INTEGER', true, null, 0); $this->addColumn('description', 'DbDescription', 'VARCHAR', false, 512, null); + $this->addColumn('artwork', 'DbArtwork', 'VARCHAR', false, 512, null); // validators } // initialize() diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php index 92ce18cf4..7cf46f514 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php @@ -288,6 +288,12 @@ abstract class BaseCcFiles extends BaseObject implements Persistent */ protected $info_url; + /** + * The value for the artwork field. + * @var string + */ + protected $artwork; + /** * The value for the artist_url field. * @var string @@ -1176,6 +1182,17 @@ abstract class BaseCcFiles extends BaseObject implements Persistent return $this->info_url; } + /** + * Get the [artwork] column value. + * + * @return string + */ + public function getDbArtwork() + { + + return $this->artwork; + } + /** * Get the [artist_url] column value. * @@ -1838,6 +1855,26 @@ abstract class BaseCcFiles extends BaseObject implements Persistent return $this; } // setDbTrackTitle() + /** + * Set the value of [artwork] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbArtwork($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->artwork !== $v) { + $this->artwork = $v; + $this->modifiedColumns[] = CcFilesPeer::ARTWORK; + } + + return $this; + } // setDbArtwork() + /** * Set the value of [artist_name] column. * @@ -3266,6 +3303,7 @@ abstract class BaseCcFiles extends BaseObject implements Persistent $this->is_playlist = ($row[$startcol + 69] !== null) ? (boolean) $row[$startcol + 69] : null; $this->filesize = ($row[$startcol + 70] !== null) ? (int) $row[$startcol + 70] : null; $this->description = ($row[$startcol + 71] !== null) ? (string) $row[$startcol + 71] : null; + $this->artwork = ($row[$startcol + 72] !== null) ? (string) $row[$startcol + 72] : null; $this->resetModified(); $this->setNew(false); @@ -3903,6 +3941,9 @@ abstract class BaseCcFiles extends BaseObject implements Persistent if ($this->isColumnModified(CcFilesPeer::DESCRIPTION)) { $modifiedColumns[':p' . $index++] = '"description"'; } + if ($this->isColumnModified(CcFilesPeer::ARTWORK)) { + $modifiedColumns[':p' . $index++] = '"artwork"'; + } $sql = sprintf( 'INSERT INTO "cc_files" (%s) VALUES (%s)', @@ -4130,6 +4171,9 @@ abstract class BaseCcFiles extends BaseObject implements Persistent case '"description"': $stmt->bindValue($identifier, $this->description, PDO::PARAM_STR); break; + case '"artwork"': + $stmt->bindValue($identifier, $this->artwork, PDO::PARAM_STR); + break; } } $stmt->execute(); @@ -4561,6 +4605,9 @@ abstract class BaseCcFiles extends BaseObject implements Persistent case 71: return $this->getDbDescription(); break; + case 72: + return $this->getDbArtwork(); + break; default: return null; break; @@ -4662,6 +4709,7 @@ abstract class BaseCcFiles extends BaseObject implements Persistent $keys[69] => $this->getDbIsPlaylist(), $keys[70] => $this->getDbFilesize(), $keys[71] => $this->getDbDescription(), + $keys[72] => $this->getDbArtwork(), ); $virtualColumns = $this->virtualColumns; foreach ($virtualColumns as $key => $virtualColumn) { @@ -4952,6 +5000,9 @@ abstract class BaseCcFiles extends BaseObject implements Persistent case 71: $this->setDbDescription($value); break; + case 72: + $this->setDbArtwork($value); + break; } // switch() } @@ -5048,6 +5099,7 @@ abstract class BaseCcFiles extends BaseObject implements Persistent if (array_key_exists($keys[69], $arr)) $this->setDbIsPlaylist($arr[$keys[69]]); if (array_key_exists($keys[70], $arr)) $this->setDbFilesize($arr[$keys[70]]); if (array_key_exists($keys[71], $arr)) $this->setDbDescription($arr[$keys[71]]); + if (array_key_exists($keys[72], $arr)) $this->setDbArtwork($arr[$keys[72]]); } /** @@ -5131,6 +5183,7 @@ abstract class BaseCcFiles extends BaseObject implements Persistent if ($this->isColumnModified(CcFilesPeer::IS_PLAYLIST)) $criteria->add(CcFilesPeer::IS_PLAYLIST, $this->is_playlist); if ($this->isColumnModified(CcFilesPeer::FILESIZE)) $criteria->add(CcFilesPeer::FILESIZE, $this->filesize); if ($this->isColumnModified(CcFilesPeer::DESCRIPTION)) $criteria->add(CcFilesPeer::DESCRIPTION, $this->description); + if ($this->isColumnModified(CcFilesPeer::ARTWORK)) $criteria->add(CcFilesPeer::ARTWORK, $this->artwork); return $criteria; } @@ -5265,6 +5318,7 @@ abstract class BaseCcFiles extends BaseObject implements Persistent $copyObj->setDbIsPlaylist($this->getDbIsPlaylist()); $copyObj->setDbFilesize($this->getDbFilesize()); $copyObj->setDbDescription($this->getDbDescription()); + $copyObj->setDbArtwork($this->getDbArtwork()); if ($deepCopy && !$this->startCopy) { // important: temporarily setNew(false) because this affects the behavior of @@ -7666,6 +7720,7 @@ abstract class BaseCcFiles extends BaseObject implements Persistent $this->is_playlist = null; $this->filesize = null; $this->description = null; + $this->artwork = null; $this->alreadyInSave = false; $this->alreadyInValidation = false; $this->alreadyInClearAllReferencesDeep = false; diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php index f7e2a5fd6..8b61968b2 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php @@ -248,6 +248,9 @@ abstract class BaseCcFilesPeer /** the column name for the description field */ const DESCRIPTION = 'cc_files.description'; + /** the column name for the artwork field */ + const ARTWORK = 'cc_files.artwork'; + /** The default string format for model objects of the related table **/ const DEFAULT_STRING_FORMAT = 'YAML'; @@ -267,12 +270,12 @@ abstract class BaseCcFilesPeer * e.g. CcFilesPeer::$fieldNames[CcFilesPeer::TYPE_PHPNAME][0] = 'Id' */ protected static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMime', 'DbFtype', 'DbDirectory', 'DbFilepath', 'DbImportStatus', 'DbCurrentlyaccessing', 'DbEditedby', 'DbMtime', 'DbUtime', 'DbLPtime', 'DbMd5', 'DbTrackTitle', 'DbArtistName', 'DbBitRate', 'DbSampleRate', 'DbFormat', 'DbLength', 'DbAlbumTitle', 'DbGenre', 'DbComments', 'DbYear', 'DbTrackNumber', 'DbChannels', 'DbUrl', 'DbBpm', 'DbRating', 'DbEncodedBy', 'DbDiscNumber', 'DbMood', 'DbLabel', 'DbComposer', 'DbEncoder', 'DbChecksum', 'DbLyrics', 'DbOrchestra', 'DbConductor', 'DbLyricist', 'DbOriginalLyricist', 'DbRadioStationName', 'DbInfoUrl', 'DbArtistUrl', 'DbAudioSourceUrl', 'DbRadioStationUrl', 'DbBuyThisUrl', 'DbIsrcNumber', 'DbCatalogNumber', 'DbOriginalArtist', 'DbCopyright', 'DbReportDatetime', 'DbReportLocation', 'DbReportOrganization', 'DbSubject', 'DbContributor', 'DbLanguage', 'DbFileExists', 'DbSoundcloudId', 'DbSoundcloudErrorCode', 'DbSoundcloudErrorMsg', 'DbSoundcloudLinkToFile', 'DbSoundCloundUploadTime', 'DbReplayGain', 'DbOwnerId', 'DbCuein', 'DbCueout', 'DbSilanCheck', 'DbHidden', 'DbIsScheduled', 'DbIsPlaylist', 'DbFilesize', 'DbDescription', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMime', 'dbFtype', 'dbDirectory', 'dbFilepath', 'dbImportStatus', 'dbCurrentlyaccessing', 'dbEditedby', 'dbMtime', 'dbUtime', 'dbLPtime', 'dbMd5', 'dbTrackTitle', 'dbArtistName', 'dbBitRate', 'dbSampleRate', 'dbFormat', 'dbLength', 'dbAlbumTitle', 'dbGenre', 'dbComments', 'dbYear', 'dbTrackNumber', 'dbChannels', 'dbUrl', 'dbBpm', 'dbRating', 'dbEncodedBy', 'dbDiscNumber', 'dbMood', 'dbLabel', 'dbComposer', 'dbEncoder', 'dbChecksum', 'dbLyrics', 'dbOrchestra', 'dbConductor', 'dbLyricist', 'dbOriginalLyricist', 'dbRadioStationName', 'dbInfoUrl', 'dbArtistUrl', 'dbAudioSourceUrl', 'dbRadioStationUrl', 'dbBuyThisUrl', 'dbIsrcNumber', 'dbCatalogNumber', 'dbOriginalArtist', 'dbCopyright', 'dbReportDatetime', 'dbReportLocation', 'dbReportOrganization', 'dbSubject', 'dbContributor', 'dbLanguage', 'dbFileExists', 'dbSoundcloudId', 'dbSoundcloudErrorCode', 'dbSoundcloudErrorMsg', 'dbSoundcloudLinkToFile', 'dbSoundCloundUploadTime', 'dbReplayGain', 'dbOwnerId', 'dbCuein', 'dbCueout', 'dbSilanCheck', 'dbHidden', 'dbIsScheduled', 'dbIsPlaylist', 'dbFilesize', 'dbDescription', ), - BasePeer::TYPE_COLNAME => array (CcFilesPeer::ID, CcFilesPeer::NAME, CcFilesPeer::MIME, CcFilesPeer::FTYPE, CcFilesPeer::DIRECTORY, CcFilesPeer::FILEPATH, CcFilesPeer::IMPORT_STATUS, CcFilesPeer::CURRENTLYACCESSING, CcFilesPeer::EDITEDBY, CcFilesPeer::MTIME, CcFilesPeer::UTIME, CcFilesPeer::LPTIME, CcFilesPeer::MD5, CcFilesPeer::TRACK_TITLE, CcFilesPeer::ARTIST_NAME, CcFilesPeer::BIT_RATE, CcFilesPeer::SAMPLE_RATE, CcFilesPeer::FORMAT, CcFilesPeer::LENGTH, CcFilesPeer::ALBUM_TITLE, CcFilesPeer::GENRE, CcFilesPeer::COMMENTS, CcFilesPeer::YEAR, CcFilesPeer::TRACK_NUMBER, CcFilesPeer::CHANNELS, CcFilesPeer::URL, CcFilesPeer::BPM, CcFilesPeer::RATING, CcFilesPeer::ENCODED_BY, CcFilesPeer::DISC_NUMBER, CcFilesPeer::MOOD, CcFilesPeer::LABEL, CcFilesPeer::COMPOSER, CcFilesPeer::ENCODER, CcFilesPeer::CHECKSUM, CcFilesPeer::LYRICS, CcFilesPeer::ORCHESTRA, CcFilesPeer::CONDUCTOR, CcFilesPeer::LYRICIST, CcFilesPeer::ORIGINAL_LYRICIST, CcFilesPeer::RADIO_STATION_NAME, CcFilesPeer::INFO_URL, CcFilesPeer::ARTIST_URL, CcFilesPeer::AUDIO_SOURCE_URL, CcFilesPeer::RADIO_STATION_URL, CcFilesPeer::BUY_THIS_URL, CcFilesPeer::ISRC_NUMBER, CcFilesPeer::CATALOG_NUMBER, CcFilesPeer::ORIGINAL_ARTIST, CcFilesPeer::COPYRIGHT, CcFilesPeer::REPORT_DATETIME, CcFilesPeer::REPORT_LOCATION, CcFilesPeer::REPORT_ORGANIZATION, CcFilesPeer::SUBJECT, CcFilesPeer::CONTRIBUTOR, CcFilesPeer::LANGUAGE, CcFilesPeer::FILE_EXISTS, CcFilesPeer::SOUNDCLOUD_ID, CcFilesPeer::SOUNDCLOUD_ERROR_CODE, CcFilesPeer::SOUNDCLOUD_ERROR_MSG, CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE, CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, CcFilesPeer::REPLAY_GAIN, CcFilesPeer::OWNER_ID, CcFilesPeer::CUEIN, CcFilesPeer::CUEOUT, CcFilesPeer::SILAN_CHECK, CcFilesPeer::HIDDEN, CcFilesPeer::IS_SCHEDULED, CcFilesPeer::IS_PLAYLIST, CcFilesPeer::FILESIZE, CcFilesPeer::DESCRIPTION, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MIME', 'FTYPE', 'DIRECTORY', 'FILEPATH', 'IMPORT_STATUS', 'CURRENTLYACCESSING', 'EDITEDBY', 'MTIME', 'UTIME', 'LPTIME', 'MD5', 'TRACK_TITLE', 'ARTIST_NAME', 'BIT_RATE', 'SAMPLE_RATE', 'FORMAT', 'LENGTH', 'ALBUM_TITLE', 'GENRE', 'COMMENTS', 'YEAR', 'TRACK_NUMBER', 'CHANNELS', 'URL', 'BPM', 'RATING', 'ENCODED_BY', 'DISC_NUMBER', 'MOOD', 'LABEL', 'COMPOSER', 'ENCODER', 'CHECKSUM', 'LYRICS', 'ORCHESTRA', 'CONDUCTOR', 'LYRICIST', 'ORIGINAL_LYRICIST', 'RADIO_STATION_NAME', 'INFO_URL', 'ARTIST_URL', 'AUDIO_SOURCE_URL', 'RADIO_STATION_URL', 'BUY_THIS_URL', 'ISRC_NUMBER', 'CATALOG_NUMBER', 'ORIGINAL_ARTIST', 'COPYRIGHT', 'REPORT_DATETIME', 'REPORT_LOCATION', 'REPORT_ORGANIZATION', 'SUBJECT', 'CONTRIBUTOR', 'LANGUAGE', 'FILE_EXISTS', 'SOUNDCLOUD_ID', 'SOUNDCLOUD_ERROR_CODE', 'SOUNDCLOUD_ERROR_MSG', 'SOUNDCLOUD_LINK_TO_FILE', 'SOUNDCLOUD_UPLOAD_TIME', 'REPLAY_GAIN', 'OWNER_ID', 'CUEIN', 'CUEOUT', 'SILAN_CHECK', 'HIDDEN', 'IS_SCHEDULED', 'IS_PLAYLIST', 'FILESIZE', 'DESCRIPTION', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mime', 'ftype', 'directory', 'filepath', 'import_status', 'currentlyaccessing', 'editedby', 'mtime', 'utime', 'lptime', 'md5', 'track_title', 'artist_name', 'bit_rate', 'sample_rate', 'format', 'length', 'album_title', 'genre', 'comments', 'year', 'track_number', 'channels', 'url', 'bpm', 'rating', 'encoded_by', 'disc_number', 'mood', 'label', 'composer', 'encoder', 'checksum', 'lyrics', 'orchestra', 'conductor', 'lyricist', 'original_lyricist', 'radio_station_name', 'info_url', 'artist_url', 'audio_source_url', 'radio_station_url', 'buy_this_url', 'isrc_number', 'catalog_number', 'original_artist', 'copyright', 'report_datetime', 'report_location', 'report_organization', 'subject', 'contributor', 'language', 'file_exists', 'soundcloud_id', 'soundcloud_error_code', 'soundcloud_error_msg', 'soundcloud_link_to_file', 'soundcloud_upload_time', 'replay_gain', 'owner_id', 'cuein', 'cueout', 'silan_check', 'hidden', 'is_scheduled', 'is_playlist', 'filesize', 'description', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, ) + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMime', 'DbFtype', 'DbDirectory', 'DbFilepath', 'DbImportStatus', 'DbCurrentlyaccessing', 'DbEditedby', 'DbMtime', 'DbUtime', 'DbLPtime', 'DbMd5', 'DbTrackTitle', 'DbArtistName', 'DbBitRate', 'DbSampleRate', 'DbFormat', 'DbLength', 'DbAlbumTitle', 'DbGenre', 'DbComments', 'DbYear', 'DbTrackNumber', 'DbChannels', 'DbUrl', 'DbBpm', 'DbRating', 'DbEncodedBy', 'DbDiscNumber', 'DbMood', 'DbLabel', 'DbComposer', 'DbEncoder', 'DbChecksum', 'DbLyrics', 'DbOrchestra', 'DbConductor', 'DbLyricist', 'DbOriginalLyricist', 'DbRadioStationName', 'DbInfoUrl', 'DbArtistUrl', 'DbAudioSourceUrl', 'DbRadioStationUrl', 'DbBuyThisUrl', 'DbIsrcNumber', 'DbCatalogNumber', 'DbOriginalArtist', 'DbCopyright', 'DbReportDatetime', 'DbReportLocation', 'DbReportOrganization', 'DbSubject', 'DbContributor', 'DbLanguage', 'DbFileExists', 'DbSoundcloudId', 'DbSoundcloudErrorCode', 'DbSoundcloudErrorMsg', 'DbSoundcloudLinkToFile', 'DbSoundCloundUploadTime', 'DbReplayGain', 'DbOwnerId', 'DbCuein', 'DbCueout', 'DbSilanCheck', 'DbHidden', 'DbIsScheduled', 'DbIsPlaylist', 'DbFilesize', 'DbDescription', 'DbArtwork', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMime', 'dbFtype', 'dbDirectory', 'dbFilepath', 'dbImportStatus', 'dbCurrentlyaccessing', 'dbEditedby', 'dbMtime', 'dbUtime', 'dbLPtime', 'dbMd5', 'dbTrackTitle', 'dbArtistName', 'dbBitRate', 'dbSampleRate', 'dbFormat', 'dbLength', 'dbAlbumTitle', 'dbGenre', 'dbComments', 'dbYear', 'dbTrackNumber', 'dbChannels', 'dbUrl', 'dbBpm', 'dbRating', 'dbEncodedBy', 'dbDiscNumber', 'dbMood', 'dbLabel', 'dbComposer', 'dbEncoder', 'dbChecksum', 'dbLyrics', 'dbOrchestra', 'dbConductor', 'dbLyricist', 'dbOriginalLyricist', 'dbRadioStationName', 'dbInfoUrl', 'dbArtistUrl', 'dbAudioSourceUrl', 'dbRadioStationUrl', 'dbBuyThisUrl', 'dbIsrcNumber', 'dbCatalogNumber', 'dbOriginalArtist', 'dbCopyright', 'dbReportDatetime', 'dbReportLocation', 'dbReportOrganization', 'dbSubject', 'dbContributor', 'dbLanguage', 'dbFileExists', 'dbSoundcloudId', 'dbSoundcloudErrorCode', 'dbSoundcloudErrorMsg', 'dbSoundcloudLinkToFile', 'dbSoundCloundUploadTime', 'dbReplayGain', 'dbOwnerId', 'dbCuein', 'dbCueout', 'dbSilanCheck', 'dbHidden', 'dbIsScheduled', 'dbIsPlaylist', 'dbFilesize', 'dbDescription', 'dbArtwork', ), + BasePeer::TYPE_COLNAME => array (CcFilesPeer::ID, CcFilesPeer::NAME, CcFilesPeer::MIME, CcFilesPeer::FTYPE, CcFilesPeer::DIRECTORY, CcFilesPeer::FILEPATH, CcFilesPeer::IMPORT_STATUS, CcFilesPeer::CURRENTLYACCESSING, CcFilesPeer::EDITEDBY, CcFilesPeer::MTIME, CcFilesPeer::UTIME, CcFilesPeer::LPTIME, CcFilesPeer::MD5, CcFilesPeer::TRACK_TITLE, CcFilesPeer::ARTIST_NAME, CcFilesPeer::BIT_RATE, CcFilesPeer::SAMPLE_RATE, CcFilesPeer::FORMAT, CcFilesPeer::LENGTH, CcFilesPeer::ALBUM_TITLE, CcFilesPeer::GENRE, CcFilesPeer::COMMENTS, CcFilesPeer::YEAR, CcFilesPeer::TRACK_NUMBER, CcFilesPeer::CHANNELS, CcFilesPeer::URL, CcFilesPeer::BPM, CcFilesPeer::RATING, CcFilesPeer::ENCODED_BY, CcFilesPeer::DISC_NUMBER, CcFilesPeer::MOOD, CcFilesPeer::LABEL, CcFilesPeer::COMPOSER, CcFilesPeer::ENCODER, CcFilesPeer::CHECKSUM, CcFilesPeer::LYRICS, CcFilesPeer::ORCHESTRA, CcFilesPeer::CONDUCTOR, CcFilesPeer::LYRICIST, CcFilesPeer::ORIGINAL_LYRICIST, CcFilesPeer::RADIO_STATION_NAME, CcFilesPeer::INFO_URL, CcFilesPeer::ARTIST_URL, CcFilesPeer::AUDIO_SOURCE_URL, CcFilesPeer::RADIO_STATION_URL, CcFilesPeer::BUY_THIS_URL, CcFilesPeer::ISRC_NUMBER, CcFilesPeer::CATALOG_NUMBER, CcFilesPeer::ORIGINAL_ARTIST, CcFilesPeer::COPYRIGHT, CcFilesPeer::REPORT_DATETIME, CcFilesPeer::REPORT_LOCATION, CcFilesPeer::REPORT_ORGANIZATION, CcFilesPeer::SUBJECT, CcFilesPeer::CONTRIBUTOR, CcFilesPeer::LANGUAGE, CcFilesPeer::FILE_EXISTS, CcFilesPeer::SOUNDCLOUD_ID, CcFilesPeer::SOUNDCLOUD_ERROR_CODE, CcFilesPeer::SOUNDCLOUD_ERROR_MSG, CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE, CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, CcFilesPeer::REPLAY_GAIN, CcFilesPeer::OWNER_ID, CcFilesPeer::CUEIN, CcFilesPeer::CUEOUT, CcFilesPeer::SILAN_CHECK, CcFilesPeer::HIDDEN, CcFilesPeer::IS_SCHEDULED, CcFilesPeer::IS_PLAYLIST, CcFilesPeer::FILESIZE, CcFilesPeer::DESCRIPTION, CcFilesPeer::ARTWORK, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MIME', 'FTYPE', 'DIRECTORY', 'FILEPATH', 'IMPORT_STATUS', 'CURRENTLYACCESSING', 'EDITEDBY', 'MTIME', 'UTIME', 'LPTIME', 'MD5', 'TRACK_TITLE', 'ARTIST_NAME', 'BIT_RATE', 'SAMPLE_RATE', 'FORMAT', 'LENGTH', 'ALBUM_TITLE', 'GENRE', 'COMMENTS', 'YEAR', 'TRACK_NUMBER', 'CHANNELS', 'URL', 'BPM', 'RATING', 'ENCODED_BY', 'DISC_NUMBER', 'MOOD', 'LABEL', 'COMPOSER', 'ENCODER', 'CHECKSUM', 'LYRICS', 'ORCHESTRA', 'CONDUCTOR', 'LYRICIST', 'ORIGINAL_LYRICIST', 'RADIO_STATION_NAME', 'INFO_URL', 'ARTIST_URL', 'AUDIO_SOURCE_URL', 'RADIO_STATION_URL', 'BUY_THIS_URL', 'ISRC_NUMBER', 'CATALOG_NUMBER', 'ORIGINAL_ARTIST', 'COPYRIGHT', 'REPORT_DATETIME', 'REPORT_LOCATION', 'REPORT_ORGANIZATION', 'SUBJECT', 'CONTRIBUTOR', 'LANGUAGE', 'FILE_EXISTS', 'SOUNDCLOUD_ID', 'SOUNDCLOUD_ERROR_CODE', 'SOUNDCLOUD_ERROR_MSG', 'SOUNDCLOUD_LINK_TO_FILE', 'SOUNDCLOUD_UPLOAD_TIME', 'REPLAY_GAIN', 'OWNER_ID', 'CUEIN', 'CUEOUT', 'SILAN_CHECK', 'HIDDEN', 'IS_SCHEDULED', 'IS_PLAYLIST', 'FILESIZE', 'DESCRIPTION', 'ARTWORK', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mime', 'ftype', 'directory', 'filepath', 'import_status', 'currentlyaccessing', 'editedby', 'mtime', 'utime', 'lptime', 'md5', 'track_title', 'artist_name', 'bit_rate', 'sample_rate', 'format', 'length', 'album_title', 'genre', 'comments', 'year', 'track_number', 'channels', 'url', 'bpm', 'rating', 'encoded_by', 'disc_number', 'mood', 'label', 'composer', 'encoder', 'checksum', 'lyrics', 'orchestra', 'conductor', 'lyricist', 'original_lyricist', 'radio_station_name', 'info_url', 'artist_url', 'audio_source_url', 'radio_station_url', 'buy_this_url', 'isrc_number', 'catalog_number', 'original_artist', 'copyright', 'report_datetime', 'report_location', 'report_organization', 'subject', 'contributor', 'language', 'file_exists', 'soundcloud_id', 'soundcloud_error_code', 'soundcloud_error_msg', 'soundcloud_link_to_file', 'soundcloud_upload_time', 'replay_gain', 'owner_id', 'cuein', 'cueout', 'silan_check', 'hidden', 'is_scheduled', 'is_playlist', 'filesize', 'description', 'artwork', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, ) ); /** @@ -282,12 +285,12 @@ abstract class BaseCcFilesPeer * e.g. CcFilesPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ protected static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMime' => 2, 'DbFtype' => 3, 'DbDirectory' => 4, 'DbFilepath' => 5, 'DbImportStatus' => 6, 'DbCurrentlyaccessing' => 7, 'DbEditedby' => 8, 'DbMtime' => 9, 'DbUtime' => 10, 'DbLPtime' => 11, 'DbMd5' => 12, 'DbTrackTitle' => 13, 'DbArtistName' => 14, 'DbBitRate' => 15, 'DbSampleRate' => 16, 'DbFormat' => 17, 'DbLength' => 18, 'DbAlbumTitle' => 19, 'DbGenre' => 20, 'DbComments' => 21, 'DbYear' => 22, 'DbTrackNumber' => 23, 'DbChannels' => 24, 'DbUrl' => 25, 'DbBpm' => 26, 'DbRating' => 27, 'DbEncodedBy' => 28, 'DbDiscNumber' => 29, 'DbMood' => 30, 'DbLabel' => 31, 'DbComposer' => 32, 'DbEncoder' => 33, 'DbChecksum' => 34, 'DbLyrics' => 35, 'DbOrchestra' => 36, 'DbConductor' => 37, 'DbLyricist' => 38, 'DbOriginalLyricist' => 39, 'DbRadioStationName' => 40, 'DbInfoUrl' => 41, 'DbArtistUrl' => 42, 'DbAudioSourceUrl' => 43, 'DbRadioStationUrl' => 44, 'DbBuyThisUrl' => 45, 'DbIsrcNumber' => 46, 'DbCatalogNumber' => 47, 'DbOriginalArtist' => 48, 'DbCopyright' => 49, 'DbReportDatetime' => 50, 'DbReportLocation' => 51, 'DbReportOrganization' => 52, 'DbSubject' => 53, 'DbContributor' => 54, 'DbLanguage' => 55, 'DbFileExists' => 56, 'DbSoundcloudId' => 57, 'DbSoundcloudErrorCode' => 58, 'DbSoundcloudErrorMsg' => 59, 'DbSoundcloudLinkToFile' => 60, 'DbSoundCloundUploadTime' => 61, 'DbReplayGain' => 62, 'DbOwnerId' => 63, 'DbCuein' => 64, 'DbCueout' => 65, 'DbSilanCheck' => 66, 'DbHidden' => 67, 'DbIsScheduled' => 68, 'DbIsPlaylist' => 69, 'DbFilesize' => 70, 'DbDescription' => 71, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMime' => 2, 'dbFtype' => 3, 'dbDirectory' => 4, 'dbFilepath' => 5, 'dbImportStatus' => 6, 'dbCurrentlyaccessing' => 7, 'dbEditedby' => 8, 'dbMtime' => 9, 'dbUtime' => 10, 'dbLPtime' => 11, 'dbMd5' => 12, 'dbTrackTitle' => 13, 'dbArtistName' => 14, 'dbBitRate' => 15, 'dbSampleRate' => 16, 'dbFormat' => 17, 'dbLength' => 18, 'dbAlbumTitle' => 19, 'dbGenre' => 20, 'dbComments' => 21, 'dbYear' => 22, 'dbTrackNumber' => 23, 'dbChannels' => 24, 'dbUrl' => 25, 'dbBpm' => 26, 'dbRating' => 27, 'dbEncodedBy' => 28, 'dbDiscNumber' => 29, 'dbMood' => 30, 'dbLabel' => 31, 'dbComposer' => 32, 'dbEncoder' => 33, 'dbChecksum' => 34, 'dbLyrics' => 35, 'dbOrchestra' => 36, 'dbConductor' => 37, 'dbLyricist' => 38, 'dbOriginalLyricist' => 39, 'dbRadioStationName' => 40, 'dbInfoUrl' => 41, 'dbArtistUrl' => 42, 'dbAudioSourceUrl' => 43, 'dbRadioStationUrl' => 44, 'dbBuyThisUrl' => 45, 'dbIsrcNumber' => 46, 'dbCatalogNumber' => 47, 'dbOriginalArtist' => 48, 'dbCopyright' => 49, 'dbReportDatetime' => 50, 'dbReportLocation' => 51, 'dbReportOrganization' => 52, 'dbSubject' => 53, 'dbContributor' => 54, 'dbLanguage' => 55, 'dbFileExists' => 56, 'dbSoundcloudId' => 57, 'dbSoundcloudErrorCode' => 58, 'dbSoundcloudErrorMsg' => 59, 'dbSoundcloudLinkToFile' => 60, 'dbSoundCloundUploadTime' => 61, 'dbReplayGain' => 62, 'dbOwnerId' => 63, 'dbCuein' => 64, 'dbCueout' => 65, 'dbSilanCheck' => 66, 'dbHidden' => 67, 'dbIsScheduled' => 68, 'dbIsPlaylist' => 69, 'dbFilesize' => 70, 'dbDescription' => 71, ), - BasePeer::TYPE_COLNAME => array (CcFilesPeer::ID => 0, CcFilesPeer::NAME => 1, CcFilesPeer::MIME => 2, CcFilesPeer::FTYPE => 3, CcFilesPeer::DIRECTORY => 4, CcFilesPeer::FILEPATH => 5, CcFilesPeer::IMPORT_STATUS => 6, CcFilesPeer::CURRENTLYACCESSING => 7, CcFilesPeer::EDITEDBY => 8, CcFilesPeer::MTIME => 9, CcFilesPeer::UTIME => 10, CcFilesPeer::LPTIME => 11, CcFilesPeer::MD5 => 12, CcFilesPeer::TRACK_TITLE => 13, CcFilesPeer::ARTIST_NAME => 14, CcFilesPeer::BIT_RATE => 15, CcFilesPeer::SAMPLE_RATE => 16, CcFilesPeer::FORMAT => 17, CcFilesPeer::LENGTH => 18, CcFilesPeer::ALBUM_TITLE => 19, CcFilesPeer::GENRE => 20, CcFilesPeer::COMMENTS => 21, CcFilesPeer::YEAR => 22, CcFilesPeer::TRACK_NUMBER => 23, CcFilesPeer::CHANNELS => 24, CcFilesPeer::URL => 25, CcFilesPeer::BPM => 26, CcFilesPeer::RATING => 27, CcFilesPeer::ENCODED_BY => 28, CcFilesPeer::DISC_NUMBER => 29, CcFilesPeer::MOOD => 30, CcFilesPeer::LABEL => 31, CcFilesPeer::COMPOSER => 32, CcFilesPeer::ENCODER => 33, CcFilesPeer::CHECKSUM => 34, CcFilesPeer::LYRICS => 35, CcFilesPeer::ORCHESTRA => 36, CcFilesPeer::CONDUCTOR => 37, CcFilesPeer::LYRICIST => 38, CcFilesPeer::ORIGINAL_LYRICIST => 39, CcFilesPeer::RADIO_STATION_NAME => 40, CcFilesPeer::INFO_URL => 41, CcFilesPeer::ARTIST_URL => 42, CcFilesPeer::AUDIO_SOURCE_URL => 43, CcFilesPeer::RADIO_STATION_URL => 44, CcFilesPeer::BUY_THIS_URL => 45, CcFilesPeer::ISRC_NUMBER => 46, CcFilesPeer::CATALOG_NUMBER => 47, CcFilesPeer::ORIGINAL_ARTIST => 48, CcFilesPeer::COPYRIGHT => 49, CcFilesPeer::REPORT_DATETIME => 50, CcFilesPeer::REPORT_LOCATION => 51, CcFilesPeer::REPORT_ORGANIZATION => 52, CcFilesPeer::SUBJECT => 53, CcFilesPeer::CONTRIBUTOR => 54, CcFilesPeer::LANGUAGE => 55, CcFilesPeer::FILE_EXISTS => 56, CcFilesPeer::SOUNDCLOUD_ID => 57, CcFilesPeer::SOUNDCLOUD_ERROR_CODE => 58, CcFilesPeer::SOUNDCLOUD_ERROR_MSG => 59, CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE => 60, CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME => 61, CcFilesPeer::REPLAY_GAIN => 62, CcFilesPeer::OWNER_ID => 63, CcFilesPeer::CUEIN => 64, CcFilesPeer::CUEOUT => 65, CcFilesPeer::SILAN_CHECK => 66, CcFilesPeer::HIDDEN => 67, CcFilesPeer::IS_SCHEDULED => 68, CcFilesPeer::IS_PLAYLIST => 69, CcFilesPeer::FILESIZE => 70, CcFilesPeer::DESCRIPTION => 71, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MIME' => 2, 'FTYPE' => 3, 'DIRECTORY' => 4, 'FILEPATH' => 5, 'IMPORT_STATUS' => 6, 'CURRENTLYACCESSING' => 7, 'EDITEDBY' => 8, 'MTIME' => 9, 'UTIME' => 10, 'LPTIME' => 11, 'MD5' => 12, 'TRACK_TITLE' => 13, 'ARTIST_NAME' => 14, 'BIT_RATE' => 15, 'SAMPLE_RATE' => 16, 'FORMAT' => 17, 'LENGTH' => 18, 'ALBUM_TITLE' => 19, 'GENRE' => 20, 'COMMENTS' => 21, 'YEAR' => 22, 'TRACK_NUMBER' => 23, 'CHANNELS' => 24, 'URL' => 25, 'BPM' => 26, 'RATING' => 27, 'ENCODED_BY' => 28, 'DISC_NUMBER' => 29, 'MOOD' => 30, 'LABEL' => 31, 'COMPOSER' => 32, 'ENCODER' => 33, 'CHECKSUM' => 34, 'LYRICS' => 35, 'ORCHESTRA' => 36, 'CONDUCTOR' => 37, 'LYRICIST' => 38, 'ORIGINAL_LYRICIST' => 39, 'RADIO_STATION_NAME' => 40, 'INFO_URL' => 41, 'ARTIST_URL' => 42, 'AUDIO_SOURCE_URL' => 43, 'RADIO_STATION_URL' => 44, 'BUY_THIS_URL' => 45, 'ISRC_NUMBER' => 46, 'CATALOG_NUMBER' => 47, 'ORIGINAL_ARTIST' => 48, 'COPYRIGHT' => 49, 'REPORT_DATETIME' => 50, 'REPORT_LOCATION' => 51, 'REPORT_ORGANIZATION' => 52, 'SUBJECT' => 53, 'CONTRIBUTOR' => 54, 'LANGUAGE' => 55, 'FILE_EXISTS' => 56, 'SOUNDCLOUD_ID' => 57, 'SOUNDCLOUD_ERROR_CODE' => 58, 'SOUNDCLOUD_ERROR_MSG' => 59, 'SOUNDCLOUD_LINK_TO_FILE' => 60, 'SOUNDCLOUD_UPLOAD_TIME' => 61, 'REPLAY_GAIN' => 62, 'OWNER_ID' => 63, 'CUEIN' => 64, 'CUEOUT' => 65, 'SILAN_CHECK' => 66, 'HIDDEN' => 67, 'IS_SCHEDULED' => 68, 'IS_PLAYLIST' => 69, 'FILESIZE' => 70, 'DESCRIPTION' => 71, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mime' => 2, 'ftype' => 3, 'directory' => 4, 'filepath' => 5, 'import_status' => 6, 'currentlyaccessing' => 7, 'editedby' => 8, 'mtime' => 9, 'utime' => 10, 'lptime' => 11, 'md5' => 12, 'track_title' => 13, 'artist_name' => 14, 'bit_rate' => 15, 'sample_rate' => 16, 'format' => 17, 'length' => 18, 'album_title' => 19, 'genre' => 20, 'comments' => 21, 'year' => 22, 'track_number' => 23, 'channels' => 24, 'url' => 25, 'bpm' => 26, 'rating' => 27, 'encoded_by' => 28, 'disc_number' => 29, 'mood' => 30, 'label' => 31, 'composer' => 32, 'encoder' => 33, 'checksum' => 34, 'lyrics' => 35, 'orchestra' => 36, 'conductor' => 37, 'lyricist' => 38, 'original_lyricist' => 39, 'radio_station_name' => 40, 'info_url' => 41, 'artist_url' => 42, 'audio_source_url' => 43, 'radio_station_url' => 44, 'buy_this_url' => 45, 'isrc_number' => 46, 'catalog_number' => 47, 'original_artist' => 48, 'copyright' => 49, 'report_datetime' => 50, 'report_location' => 51, 'report_organization' => 52, 'subject' => 53, 'contributor' => 54, 'language' => 55, 'file_exists' => 56, 'soundcloud_id' => 57, 'soundcloud_error_code' => 58, 'soundcloud_error_msg' => 59, 'soundcloud_link_to_file' => 60, 'soundcloud_upload_time' => 61, 'replay_gain' => 62, 'owner_id' => 63, 'cuein' => 64, 'cueout' => 65, 'silan_check' => 66, 'hidden' => 67, 'is_scheduled' => 68, 'is_playlist' => 69, 'filesize' => 70, 'description' => 71, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, ) + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMime' => 2, 'DbFtype' => 3, 'DbDirectory' => 4, 'DbFilepath' => 5, 'DbImportStatus' => 6, 'DbCurrentlyaccessing' => 7, 'DbEditedby' => 8, 'DbMtime' => 9, 'DbUtime' => 10, 'DbLPtime' => 11, 'DbMd5' => 12, 'DbTrackTitle' => 13, 'DbArtistName' => 14, 'DbBitRate' => 15, 'DbSampleRate' => 16, 'DbFormat' => 17, 'DbLength' => 18, 'DbAlbumTitle' => 19, 'DbGenre' => 20, 'DbComments' => 21, 'DbYear' => 22, 'DbTrackNumber' => 23, 'DbChannels' => 24, 'DbUrl' => 25, 'DbBpm' => 26, 'DbRating' => 27, 'DbEncodedBy' => 28, 'DbDiscNumber' => 29, 'DbMood' => 30, 'DbLabel' => 31, 'DbComposer' => 32, 'DbEncoder' => 33, 'DbChecksum' => 34, 'DbLyrics' => 35, 'DbOrchestra' => 36, 'DbConductor' => 37, 'DbLyricist' => 38, 'DbOriginalLyricist' => 39, 'DbRadioStationName' => 40, 'DbInfoUrl' => 41, 'DbArtistUrl' => 42, 'DbAudioSourceUrl' => 43, 'DbRadioStationUrl' => 44, 'DbBuyThisUrl' => 45, 'DbIsrcNumber' => 46, 'DbCatalogNumber' => 47, 'DbOriginalArtist' => 48, 'DbCopyright' => 49, 'DbReportDatetime' => 50, 'DbReportLocation' => 51, 'DbReportOrganization' => 52, 'DbSubject' => 53, 'DbContributor' => 54, 'DbLanguage' => 55, 'DbFileExists' => 56, 'DbSoundcloudId' => 57, 'DbSoundcloudErrorCode' => 58, 'DbSoundcloudErrorMsg' => 59, 'DbSoundcloudLinkToFile' => 60, 'DbSoundCloundUploadTime' => 61, 'DbReplayGain' => 62, 'DbOwnerId' => 63, 'DbCuein' => 64, 'DbCueout' => 65, 'DbSilanCheck' => 66, 'DbHidden' => 67, 'DbIsScheduled' => 68, 'DbIsPlaylist' => 69, 'DbFilesize' => 70, 'DbDescription' => 71, 'DbArtwork' => 72, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMime' => 2, 'dbFtype' => 3, 'dbDirectory' => 4, 'dbFilepath' => 5, 'dbImportStatus' => 6, 'dbCurrentlyaccessing' => 7, 'dbEditedby' => 8, 'dbMtime' => 9, 'dbUtime' => 10, 'dbLPtime' => 11, 'dbMd5' => 12, 'dbTrackTitle' => 13, 'dbArtistName' => 14, 'dbBitRate' => 15, 'dbSampleRate' => 16, 'dbFormat' => 17, 'dbLength' => 18, 'dbAlbumTitle' => 19, 'dbGenre' => 20, 'dbComments' => 21, 'dbYear' => 22, 'dbTrackNumber' => 23, 'dbChannels' => 24, 'dbUrl' => 25, 'dbBpm' => 26, 'dbRating' => 27, 'dbEncodedBy' => 28, 'dbDiscNumber' => 29, 'dbMood' => 30, 'dbLabel' => 31, 'dbComposer' => 32, 'dbEncoder' => 33, 'dbChecksum' => 34, 'dbLyrics' => 35, 'dbOrchestra' => 36, 'dbConductor' => 37, 'dbLyricist' => 38, 'dbOriginalLyricist' => 39, 'dbRadioStationName' => 40, 'dbInfoUrl' => 41, 'dbArtistUrl' => 42, 'dbAudioSourceUrl' => 43, 'dbRadioStationUrl' => 44, 'dbBuyThisUrl' => 45, 'dbIsrcNumber' => 46, 'dbCatalogNumber' => 47, 'dbOriginalArtist' => 48, 'dbCopyright' => 49, 'dbReportDatetime' => 50, 'dbReportLocation' => 51, 'dbReportOrganization' => 52, 'dbSubject' => 53, 'dbContributor' => 54, 'dbLanguage' => 55, 'dbFileExists' => 56, 'dbSoundcloudId' => 57, 'dbSoundcloudErrorCode' => 58, 'dbSoundcloudErrorMsg' => 59, 'dbSoundcloudLinkToFile' => 60, 'dbSoundCloundUploadTime' => 61, 'dbReplayGain' => 62, 'dbOwnerId' => 63, 'dbCuein' => 64, 'dbCueout' => 65, 'dbSilanCheck' => 66, 'dbHidden' => 67, 'dbIsScheduled' => 68, 'dbIsPlaylist' => 69, 'dbFilesize' => 70, 'dbDescription' => 71, 'dbArtwork' => 72, ), + BasePeer::TYPE_COLNAME => array (CcFilesPeer::ID => 0, CcFilesPeer::NAME => 1, CcFilesPeer::MIME => 2, CcFilesPeer::FTYPE => 3, CcFilesPeer::DIRECTORY => 4, CcFilesPeer::FILEPATH => 5, CcFilesPeer::IMPORT_STATUS => 6, CcFilesPeer::CURRENTLYACCESSING => 7, CcFilesPeer::EDITEDBY => 8, CcFilesPeer::MTIME => 9, CcFilesPeer::UTIME => 10, CcFilesPeer::LPTIME => 11, CcFilesPeer::MD5 => 12, CcFilesPeer::TRACK_TITLE => 13, CcFilesPeer::ARTIST_NAME => 14, CcFilesPeer::BIT_RATE => 15, CcFilesPeer::SAMPLE_RATE => 16, CcFilesPeer::FORMAT => 17, CcFilesPeer::LENGTH => 18, CcFilesPeer::ALBUM_TITLE => 19, CcFilesPeer::GENRE => 20, CcFilesPeer::COMMENTS => 21, CcFilesPeer::YEAR => 22, CcFilesPeer::TRACK_NUMBER => 23, CcFilesPeer::CHANNELS => 24, CcFilesPeer::URL => 25, CcFilesPeer::BPM => 26, CcFilesPeer::RATING => 27, CcFilesPeer::ENCODED_BY => 28, CcFilesPeer::DISC_NUMBER => 29, CcFilesPeer::MOOD => 30, CcFilesPeer::LABEL => 31, CcFilesPeer::COMPOSER => 32, CcFilesPeer::ENCODER => 33, CcFilesPeer::CHECKSUM => 34, CcFilesPeer::LYRICS => 35, CcFilesPeer::ORCHESTRA => 36, CcFilesPeer::CONDUCTOR => 37, CcFilesPeer::LYRICIST => 38, CcFilesPeer::ORIGINAL_LYRICIST => 39, CcFilesPeer::RADIO_STATION_NAME => 40, CcFilesPeer::INFO_URL => 41, CcFilesPeer::ARTIST_URL => 42, CcFilesPeer::AUDIO_SOURCE_URL => 43, CcFilesPeer::RADIO_STATION_URL => 44, CcFilesPeer::BUY_THIS_URL => 45, CcFilesPeer::ISRC_NUMBER => 46, CcFilesPeer::CATALOG_NUMBER => 47, CcFilesPeer::ORIGINAL_ARTIST => 48, CcFilesPeer::COPYRIGHT => 49, CcFilesPeer::REPORT_DATETIME => 50, CcFilesPeer::REPORT_LOCATION => 51, CcFilesPeer::REPORT_ORGANIZATION => 52, CcFilesPeer::SUBJECT => 53, CcFilesPeer::CONTRIBUTOR => 54, CcFilesPeer::LANGUAGE => 55, CcFilesPeer::FILE_EXISTS => 56, CcFilesPeer::SOUNDCLOUD_ID => 57, CcFilesPeer::SOUNDCLOUD_ERROR_CODE => 58, CcFilesPeer::SOUNDCLOUD_ERROR_MSG => 59, CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE => 60, CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME => 61, CcFilesPeer::REPLAY_GAIN => 62, CcFilesPeer::OWNER_ID => 63, CcFilesPeer::CUEIN => 64, CcFilesPeer::CUEOUT => 65, CcFilesPeer::SILAN_CHECK => 66, CcFilesPeer::HIDDEN => 67, CcFilesPeer::IS_SCHEDULED => 68, CcFilesPeer::IS_PLAYLIST => 69, CcFilesPeer::FILESIZE => 70, CcFilesPeer::DESCRIPTION => 71, CcFilesPeer::DESCRIPTION => 72, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MIME' => 2, 'FTYPE' => 3, 'DIRECTORY' => 4, 'FILEPATH' => 5, 'IMPORT_STATUS' => 6, 'CURRENTLYACCESSING' => 7, 'EDITEDBY' => 8, 'MTIME' => 9, 'UTIME' => 10, 'LPTIME' => 11, 'MD5' => 12, 'TRACK_TITLE' => 13, 'ARTIST_NAME' => 14, 'BIT_RATE' => 15, 'SAMPLE_RATE' => 16, 'FORMAT' => 17, 'LENGTH' => 18, 'ALBUM_TITLE' => 19, 'GENRE' => 20, 'COMMENTS' => 21, 'YEAR' => 22, 'TRACK_NUMBER' => 23, 'CHANNELS' => 24, 'URL' => 25, 'BPM' => 26, 'RATING' => 27, 'ENCODED_BY' => 28, 'DISC_NUMBER' => 29, 'MOOD' => 30, 'LABEL' => 31, 'COMPOSER' => 32, 'ENCODER' => 33, 'CHECKSUM' => 34, 'LYRICS' => 35, 'ORCHESTRA' => 36, 'CONDUCTOR' => 37, 'LYRICIST' => 38, 'ORIGINAL_LYRICIST' => 39, 'RADIO_STATION_NAME' => 40, 'INFO_URL' => 41, 'ARTIST_URL' => 42, 'AUDIO_SOURCE_URL' => 43, 'RADIO_STATION_URL' => 44, 'BUY_THIS_URL' => 45, 'ISRC_NUMBER' => 46, 'CATALOG_NUMBER' => 47, 'ORIGINAL_ARTIST' => 48, 'COPYRIGHT' => 49, 'REPORT_DATETIME' => 50, 'REPORT_LOCATION' => 51, 'REPORT_ORGANIZATION' => 52, 'SUBJECT' => 53, 'CONTRIBUTOR' => 54, 'LANGUAGE' => 55, 'FILE_EXISTS' => 56, 'SOUNDCLOUD_ID' => 57, 'SOUNDCLOUD_ERROR_CODE' => 58, 'SOUNDCLOUD_ERROR_MSG' => 59, 'SOUNDCLOUD_LINK_TO_FILE' => 60, 'SOUNDCLOUD_UPLOAD_TIME' => 61, 'REPLAY_GAIN' => 62, 'OWNER_ID' => 63, 'CUEIN' => 64, 'CUEOUT' => 65, 'SILAN_CHECK' => 66, 'HIDDEN' => 67, 'IS_SCHEDULED' => 68, 'IS_PLAYLIST' => 69, 'FILESIZE' => 70, 'DESCRIPTION' => 71, 'ARTWORK' => 72, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mime' => 2, 'ftype' => 3, 'directory' => 4, 'filepath' => 5, 'import_status' => 6, 'currentlyaccessing' => 7, 'editedby' => 8, 'mtime' => 9, 'utime' => 10, 'lptime' => 11, 'md5' => 12, 'track_title' => 13, 'artist_name' => 14, 'bit_rate' => 15, 'sample_rate' => 16, 'format' => 17, 'length' => 18, 'album_title' => 19, 'genre' => 20, 'comments' => 21, 'year' => 22, 'track_number' => 23, 'channels' => 24, 'url' => 25, 'bpm' => 26, 'rating' => 27, 'encoded_by' => 28, 'disc_number' => 29, 'mood' => 30, 'label' => 31, 'composer' => 32, 'encoder' => 33, 'checksum' => 34, 'lyrics' => 35, 'orchestra' => 36, 'conductor' => 37, 'lyricist' => 38, 'original_lyricist' => 39, 'radio_station_name' => 40, 'info_url' => 41, 'artist_url' => 42, 'audio_source_url' => 43, 'radio_station_url' => 44, 'buy_this_url' => 45, 'isrc_number' => 46, 'catalog_number' => 47, 'original_artist' => 48, 'copyright' => 49, 'report_datetime' => 50, 'report_location' => 51, 'report_organization' => 52, 'subject' => 53, 'contributor' => 54, 'language' => 55, 'file_exists' => 56, 'soundcloud_id' => 57, 'soundcloud_error_code' => 58, 'soundcloud_error_msg' => 59, 'soundcloud_link_to_file' => 60, 'soundcloud_upload_time' => 61, 'replay_gain' => 62, 'owner_id' => 63, 'cuein' => 64, 'cueout' => 65, 'silan_check' => 66, 'hidden' => 67, 'is_scheduled' => 68, 'is_playlist' => 69, 'filesize' => 70, 'description' => 71, 'artwork' => 72, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, ) ); /** @@ -433,6 +436,7 @@ abstract class BaseCcFilesPeer $criteria->addSelectColumn(CcFilesPeer::IS_PLAYLIST); $criteria->addSelectColumn(CcFilesPeer::FILESIZE); $criteria->addSelectColumn(CcFilesPeer::DESCRIPTION); + $criteria->addSelectColumn(CcFilesPeer::ARTWORK); } else { $criteria->addSelectColumn($alias . '.id'); $criteria->addSelectColumn($alias . '.name'); @@ -506,6 +510,7 @@ abstract class BaseCcFilesPeer $criteria->addSelectColumn($alias . '.is_playlist'); $criteria->addSelectColumn($alias . '.filesize'); $criteria->addSelectColumn($alias . '.description'); + $criteria->addSelectColumn($alias . '.artwork'); } } diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php index 80fe0a5ba..6c5afc688 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php @@ -78,6 +78,7 @@ * @method CcFilesQuery orderByDbIsPlaylist($order = Criteria::ASC) Order by the is_playlist column * @method CcFilesQuery orderByDbFilesize($order = Criteria::ASC) Order by the filesize column * @method CcFilesQuery orderByDbDescription($order = Criteria::ASC) Order by the description column + * @method CcFilesQuery orderByDbArtwork($order = Criteria::ASC) Order by the artwork column * * @method CcFilesQuery groupByDbId() Group by the id column * @method CcFilesQuery groupByDbName() Group by the name column @@ -151,6 +152,7 @@ * @method CcFilesQuery groupByDbIsPlaylist() Group by the is_playlist column * @method CcFilesQuery groupByDbFilesize() Group by the filesize column * @method CcFilesQuery groupByDbDescription() Group by the description column + * @method CcFilesQuery groupByDbArtwork() Group by the artwork column * * @method CcFilesQuery leftJoin($relation) Adds a LEFT JOIN clause to the query * @method CcFilesQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query @@ -274,6 +276,7 @@ * @method CcFiles findOneByDbIsPlaylist(boolean $is_playlist) Return the first CcFiles filtered by the is_playlist column * @method CcFiles findOneByDbFilesize(int $filesize) Return the first CcFiles filtered by the filesize column * @method CcFiles findOneByDbDescription(string $description) Return the first CcFiles filtered by the description column + * @method CcFiles findOneByDbArtwork(string $artwork) Return the first CcFiles filtered by the artwork column * * @method array findByDbId(int $id) Return CcFiles objects filtered by the id column * @method array findByDbName(string $name) Return CcFiles objects filtered by the name column @@ -347,6 +350,7 @@ * @method array findByDbIsPlaylist(boolean $is_playlist) Return CcFiles objects filtered by the is_playlist column * @method array findByDbFilesize(int $filesize) Return CcFiles objects filtered by the filesize column * @method array findByDbDescription(string $description) Return CcFiles objects filtered by the description column + * @method array findByDbArtwork(string $artwork) Return CcFiles objects filtered by the artwork column * * @package propel.generator.airtime.om */ @@ -454,7 +458,7 @@ abstract class BaseCcFilesQuery extends ModelCriteria */ protected function findPkSimple($key, $con) { - $sql = 'SELECT "id", "name", "mime", "ftype", "directory", "filepath", "import_status", "currentlyaccessing", "editedby", "mtime", "utime", "lptime", "md5", "track_title", "artist_name", "bit_rate", "sample_rate", "format", "length", "album_title", "genre", "comments", "year", "track_number", "channels", "url", "bpm", "rating", "encoded_by", "disc_number", "mood", "label", "composer", "encoder", "checksum", "lyrics", "orchestra", "conductor", "lyricist", "original_lyricist", "radio_station_name", "info_url", "artist_url", "audio_source_url", "radio_station_url", "buy_this_url", "isrc_number", "catalog_number", "original_artist", "copyright", "report_datetime", "report_location", "report_organization", "subject", "contributor", "language", "file_exists", "soundcloud_id", "soundcloud_error_code", "soundcloud_error_msg", "soundcloud_link_to_file", "soundcloud_upload_time", "replay_gain", "owner_id", "cuein", "cueout", "silan_check", "hidden", "is_scheduled", "is_playlist", "filesize", "description" FROM "cc_files" WHERE "id" = :p0'; + $sql = 'SELECT "id", "name", "mime", "ftype", "directory", "filepath", "import_status", "currentlyaccessing", "editedby", "mtime", "utime", "lptime", "md5", "track_title", "artist_name", "bit_rate", "sample_rate", "format", "length", "album_title", "genre", "comments", "year", "track_number", "channels", "url", "bpm", "rating", "encoded_by", "disc_number", "mood", "label", "composer", "encoder", "checksum", "lyrics", "orchestra", "conductor", "lyricist", "original_lyricist", "radio_station_name", "info_url", "artist_url", "audio_source_url", "radio_station_url", "buy_this_url", "isrc_number", "catalog_number", "original_artist", "copyright", "report_datetime", "report_location", "report_organization", "subject", "contributor", "language", "file_exists", "soundcloud_id", "soundcloud_error_code", "soundcloud_error_msg", "soundcloud_link_to_file", "soundcloud_upload_time", "replay_gain", "owner_id", "cuein", "cueout", "silan_check", "hidden", "is_scheduled", "is_playlist", "filesize", "description", "artwork" FROM "cc_files" WHERE "id" = :p0'; try { $stmt = $con->prepare($sql); $stmt->bindValue(':p0', $key, PDO::PARAM_INT); @@ -1937,6 +1941,35 @@ abstract class BaseCcFilesQuery extends ModelCriteria return $this->addUsingAlias(CcFilesPeer::INFO_URL, $dbInfoUrl, $comparison); } + /** + * Filter the query on the artwork column + * + * Example usage: + * + * $query->filterByDbArtwork('fooValue'); // WHERE artwork = 'fooValue' + * $query->filterByDbArtwork('%fooValue%'); // WHERE artwork LIKE '%fooValue%' + * + * + * @param string $dbArtwork 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 CcFilesQuery The current query, for fluid interface + */ + public function filterByDbArtwork($dbArtwork = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbArtwork)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbArtwork)) { + $dbArtwork = str_replace('*', '%', $dbArtwork); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::ARTWORK, $dbArtwork, $comparison); + } + /** * Filter the query on the artist_url column * diff --git a/airtime_mvc/application/upgrade/Upgrades.php b/airtime_mvc/application/upgrade/Upgrades.php index 02887dadc..b8b822421 100644 --- a/airtime_mvc/application/upgrade/Upgrades.php +++ b/airtime_mvc/application/upgrade/Upgrades.php @@ -284,7 +284,7 @@ class AirtimeUpgrader254 extends AirtimeUpgrader { return '2.5.4'; } - + protected function _runUpgrade() { //First, ensure there are no superadmins already. @@ -350,7 +350,7 @@ class AirtimeUpgrader259 extends AirtimeUpgrader { '2.5.5' ); } - + public function getNewVersion() { return '2.5.9'; } @@ -494,6 +494,19 @@ class AirtimeUpgrader2516 extends AirtimeUpgrader } } +class AirtimeUpgrader2517 extends AirtimeUpgrader +{ + protected function getSupportedSchemaVersions() { + return array( + '2.5.16' + ); + } + + public function getNewVersion() { + return '2.5.17'; + } +} + class AirtimeUpgrader300alpha extends AirtimeUpgrader { protected function getSupportedSchemaVersions() { @@ -569,7 +582,7 @@ class AirtimeUpgrader300alpha7_1 extends AirtimeUpgrader return '3.0.0-alpha.7.1'; } -} +} /** * Class AirtimeUpgrader300alpha7-2 * diff --git a/airtime_mvc/application/views/scripts/library/edit-file-md.phtml b/airtime_mvc/application/views/scripts/library/edit-file-md.phtml index e8016aaae..4f09f9db4 100644 --- a/airtime_mvc/application/views/scripts/library/edit-file-md.phtml +++ b/airtime_mvc/application/views/scripts/library/edit-file-md.phtml @@ -1,12 +1,27 @@ +artwork, 256); ?>
-
+
permissionDenied) { ?>

-

permissionDenied) { - echo(_("Viewing ")); - } else { - echo(_("Editing ")); - }?>"title); ?>"

+ permissionDenied) { + echo(_("Viewing ")); + } else { + echo(_("Editing ")); + } */ + ?> +
+
+
+

title); ?>

+

artist_name); ?>

+
+
+
+
+ '; ?> +
+
form; ?> -
+
\ No newline at end of file diff --git a/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml b/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml index d45dd8766..31d873803 100644 --- a/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml +++ b/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml @@ -1,4 +1,4 @@ -md as $key => &$value) { $value = $this->escape($value); @@ -23,6 +23,8 @@ foreach ($this->md as $key => &$value) { md["MDATA_KEY_COPYRIGHT"]);?> md["MDATA_KEY_ISRC"]);?> md["MDATA_KEY_URL"]);?> +md["MDATA_KEY_ARTWORK"]);?> +md["MDATA_KEY_ARTWORK_DATA"]);?> md["MDATA_KEY_LANGUAGE"]);?> md["MDATA_KEY_FILEPATH"]);?> @@ -99,7 +101,7 @@ foreach ($this->md as $key => &$value) { - + blType == "Dynamic") { ?>
diff --git a/airtime_mvc/application/views/scripts/partialviews/header.phtml b/airtime_mvc/application/views/scripts/partialviews/header.phtml index b3fd9f430..80430e25f 100644 --- a/airtime_mvc/application/views/scripts/partialviews/header.phtml +++ b/airtime_mvc/application/views/scripts/partialviews/header.phtml @@ -2,6 +2,9 @@
+
+
+
diff --git a/airtime_mvc/build/schema.xml b/airtime_mvc/build/schema.xml index cf082c065..acf54453b 100644 --- a/airtime_mvc/build/schema.xml +++ b/airtime_mvc/build/schema.xml @@ -84,6 +84,7 @@ + @@ -152,7 +153,7 @@ - @@ -249,7 +250,7 @@ - diff --git a/airtime_mvc/build/sql/schema.sql b/airtime_mvc/build/sql/schema.sql index 2a9dd672c..a148a56da 100644 --- a/airtime_mvc/build/sql/schema.sql +++ b/airtime_mvc/build/sql/schema.sql @@ -96,6 +96,7 @@ CREATE TABLE "cc_files" "is_playlist" BOOLEAN DEFAULT 'f', "filesize" INTEGER DEFAULT 0 NOT NULL, "description" VARCHAR(512), + "artwork" VARCHAR(512), PRIMARY KEY ("id") ); diff --git a/airtime_mvc/public/css/dashboard.css b/airtime_mvc/public/css/dashboard.css index 596d9514e..8ab97e084 100644 --- a/airtime_mvc/public/css/dashboard.css +++ b/airtime_mvc/public/css/dashboard.css @@ -574,6 +574,18 @@ li.ui-state-default { line-height: inherit; } +.inner_track_editor_title h2 { + margin: 10px 0 0 0; + width: 80%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.inner_track_editor_title span { + font-size: inherit; + line-height: inherit; +} + .clearfix:after, .side_playlist li:after { display: none !important; } diff --git a/airtime_mvc/public/css/images/no-cover.jpg b/airtime_mvc/public/css/images/no-cover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd38cfc0d3b73cdbeee4cb1c0fdfc338a7254098 GIT binary patch literal 70633 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 literal 0 HcmV?d00001 diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css index 18674172a..981ac5f92 100644 --- a/airtime_mvc/public/css/styles.css +++ b/airtime_mvc/public/css/styles.css @@ -268,7 +268,7 @@ img.logo overflow:hidden; } -.now-playing-block, .show-block, .on-air-block, .time-info-block, .listen-control-block { +.now-playing-block, .now-playing-artwork, .show-block, .on-air-block, .time-info-block, .listen-control-block { height:100px; float:left; margin-right:10px; @@ -280,15 +280,45 @@ img.logo min-width:170px; } +.now-playing-artwork { + background: url(images/masterpanel_spacer.png) no-repeat 0 0; + margin-left: 152px; + padding: 12px 3px 13px 14px; + +} +div.now-playing-artwork +{ + width: 75px; + height: 100px; + text-align: center; +} +div.now-playing-artwork_containter{ + background: #3a3a3a url(images/playinfo_bg.png) repeat-x 0 0; + height: 75px; + weight: 75px; + border: 1px solid #242424; + border-bottom-color:#727272; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + line-height:22px; + overflow:hidden; +} +img.artwork +{ + max-width: 100%; + max-height: 100%; + padding: 3em; + box-sizing: border-box; +} + .now-playing-block { -webkit-flex: 1 0; -moz-flex: 1 0; -ms-flex: 1 0; -o-flex: 1 0; flex: 1 0; - background: url(images/masterpanel_spacer.png) no-repeat 0 0; - margin-left: 152px; - padding-left: 14px; + margin-left: 0; } .show-block { -webkit-flex: 1 0; @@ -331,7 +361,7 @@ img.logo color:#fff; font-size:15px; line-height:22px; - text-indent:5px; + text-indent:5px; overflow:hidden; margin-bottom:3px; } @@ -361,12 +391,12 @@ img.logo } .now-playing-info .show-length { color:#c4c4c4; - padding-left:6px; + padding-left:6px; } .now-playing-info .song-length { color:#9b9b9b; - padding-right:6px; + padding-right:6px; } .on-air-block { @@ -384,7 +414,7 @@ ol.navigation { } } @media screen and (max-width: 875px) { - .now-playing-block { + .now-playing-block, .now-playing-artwork { display: none; } .source-info-block { @@ -415,7 +445,7 @@ ol.navigation { margin-top:34px; display:block; text-align:center; - + } .listen-control-button { margin-top:6px; @@ -573,7 +603,7 @@ table.library-track-md{ width: 280px; } -.ui-tooltip-dark.file-md-long{ +.ui-tooltip-dark.file-md-long{ max-width: 415px !important; overflow-y: unset; } @@ -653,7 +683,7 @@ table.library-get-file-md.table-small{ .webstream { color: #4eba70; } - + /***** LIBRARY QTIP METADATA SPECIFIC STYLES END *****/ @@ -786,11 +816,11 @@ label { dl.inline-list { float: left; margin: 0; - padding: 0; + padding: 0; } -dl.inline-list dt { +dl.inline-list dt { clear: left; float: left; margin: 0; @@ -802,7 +832,7 @@ dl.inline-list dt { text-align:left; min-width:70px; } -dl.inline-list dd { +dl.inline-list dd { float: left; margin: 0; padding: 0px 0 4px 15px; @@ -862,7 +892,7 @@ dl.inline-list dd { .even { background-color: #2f2f2f; } - + .datatable tr .selected td { background-color: #abcfe2; } @@ -920,13 +950,13 @@ dl.inline-list dd { .dataTables_type { float:right; margin:0 8px 0 0; - + } .dataTables_length { float:left; margin:0; - + } .dataTables_length label { padding:0; @@ -1008,7 +1038,7 @@ div.blockOverlay { .dataTables_empty { cursor: auto; } -table.dataTable tbody tr, +table.dataTable tbody tr, table.dataTable span.DataTables_sort_icon { cursor: pointer; @@ -1050,6 +1080,10 @@ button.ColVis_Button.ColVis_ShowAll { text-align: right; } +.library_artwork { + line-height: 1 !important; +} + /*----END Data Table----*/ fieldset { @@ -1391,7 +1425,7 @@ ful /** Extremely nasty workaround for a fullcalendar bug, where clicking "Add Show" would cause this large space under the table header. The CSS to get to that is ridiculously complicated and set in the HTML (!) dynamically with JS, - which makes it a pain in the ass to fix. That's why we're overriding it + which makes it a pain in the ass to fix. That's why we're overriding it with !important here. */ @@ -1558,11 +1592,11 @@ h2#scheduled_playlist_name { font-weight:normal; margin:0; padding:8px 0 0px 12px; - color:#1c1c1c; + color:#1c1c1c; } h2#scheduled_playlist_name span { - color:#656565; + color:#656565; } .time { @@ -1589,7 +1623,7 @@ h2#scheduled_playlist_name span { #schedule_calendar .ui-progressbar { width: 46%; height: 5px; - margin: 9px 9px 0 0; + margin: 9px 9px 0 0; } #schedule_calendar .ui-progressbar.ui-widget-content { @@ -1687,7 +1721,7 @@ h2#scheduled_playlist_name span { width: 100%; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; - box-sizing: border-box; + box-sizing: border-box; padding: 4px 0 8px; } @@ -1752,7 +1786,7 @@ h2#scheduled_playlist_name span { .ui-state-default .ui-icon.crossfade-main-icon { background:url(images/crossfade_main.png) no-repeat 0 2px; - width:25px; + width:25px; } .btn.crossfade-main-button span { @@ -1771,7 +1805,7 @@ h2#scheduled_playlist_name span { line-height: 14px; vertical-align: text-top; margin-top: 1px; - margin-right: -5px; + margin-right: -5px; } .ui-button-icon-only.crossfade-main-button .ui-icon { @@ -1988,7 +2022,7 @@ div.errors, span.errors{ span.errors.sp-errors{ width: 429px; - display: block; + display: block; } .collapsible-header, .collapsible-header-disabled { @@ -2015,7 +2049,7 @@ span.errors.sp-errors{ position:absolute; left:5px; top:12px; - + } .collapsible-header.closed .arrow-icon, .collapsible-header-disabled.close .arrow-icon { background-position: 0 -11px !important; @@ -2409,7 +2443,7 @@ dd.radio-inline-list, .preferences dd.radio-inline-list, .stream-config dd.radio .preferences dd.block-display .input_select, .stream-config dd.block-display .input_select { width: 100%; } -.preferences dd.block-display .input_text_area, .preferences dd.block-display .input_text +.preferences dd.block-display .input_text_area, .preferences dd.block-display .input_text .stream-config dd.block-display .input_text_area, .stream-config dd.block-display .input_text, .stream-config dd.block-display input[type="text"], .stream-config dd.block-display input[type="password"] { width: 98.5%; @@ -2650,7 +2684,7 @@ label span { #watched-folder-section dd.block-display { clear:both; min-height:25px; - + } #watched-folder-section dd.block-display.selected-item { clear:both; @@ -2832,7 +2866,7 @@ dt.block-display.info-block { width: 99.5%; height: 110px; } - + .input-info { font-size:12px; padding:0 0 0 5px; @@ -2970,8 +3004,8 @@ tfoot tr th { font-weight:bold; text-align:left; } - - + + /*---//////////////////// STATUS TABLE ////////////////////---*/ .statustable { background-color: #D8D8D8; @@ -3147,7 +3181,7 @@ dd .stream-status { .qtip div > span { padding: 5px; } - + .pull-left { float:left; } @@ -3182,12 +3216,12 @@ dd .stream-status { } -/*---//////////////////// NEW BUTTONS //////////////////// +/*---//////////////////// NEW BUTTONS //////////////////// .btn { display: inline-block; *display: inline; - + *zoom: 1; padding: 4px 10px 4px; margin-bottom: 0; @@ -4232,3 +4266,21 @@ li .ui-state-hover { text-decoration: none; color: #f0f0f0; } + +/* Library - Tracks Edit */ +.track-edit-header{ + padding: 5px 0 20px 5px; +} +.track-edit-left { + float: left; + width: 100px; + margin-left: -100%; +} +.track-edit-right-wrapper { + /*background-color: #333333;*/ + float: left; + width: 100%; +} +.track-edit-right { + margin-left: 160px; +} diff --git a/airtime_mvc/public/js/airtime/dashboard/dashboard.js b/airtime_mvc/public/js/airtime/dashboard/dashboard.js index 5ceadf6a2..5a894d82a 100644 --- a/airtime_mvc/public/js/airtime/dashboard/dashboard.js +++ b/airtime_mvc/public/js/airtime/dashboard/dashboard.js @@ -41,7 +41,7 @@ var nextSongPrepare = true; var nextShowPrepare = true; function secondsTimer(){ - /* This function constantly calls itself every 'uiUpdateInterval' + /* This function constantly calls itself every 'uiUpdateInterval' * micro-seconds and is responsible for updating the UI. */ if (localRemoteTimeOffset !== null){ var date = new Date(); @@ -59,7 +59,7 @@ function newSongStart(){ if (nextSong.type == 'track') { currentSong = nextSong; nextSong = null; - } + } } function nextShowStart(){ @@ -83,13 +83,13 @@ function updateProgressBarValue(){ var songPercentDone = 0; var scheduled_play_div = $("#scheduled_play_div"); var scheduled_play_line_to_switch = scheduled_play_div.parent().find(".line-to-switch"); - + if (currentSong !== null){ var songElapsedTime = 0; songPercentDone = (approximateServerTime - currentSong.songStartPosixTime)/currentSong.songLengthMs*100; songElapsedTime = approximateServerTime - currentSong.songStartPosixTime; if (songPercentDone < 0) { - songPercentDone = 0; + songPercentDone = 0; //currentSong = null; } else if (songPercentDone > 100) { songPercentDone = 100; @@ -126,10 +126,29 @@ function updatePlaybar(){ } if (currentSong !== null && !master_dj_on_air && !live_dj_on_air){ - if (currentSong.record == "1") + if (currentSong.record == "1") { $('#current').html(""+$.i18n._("Recording:")+""+currentSong.name+","); - else + } else { $('#current').text(currentSong.name+","); + + if (currentSong.metadata.artwork_data) { + + var check_current_song = Cookies.get('current_track'); + var loaded = Cookies.get('loaded'); + + if (check_current_song != currentSong.name) { + $('#now-playing-artwork_containter').html(""); + Cookies.remove('current_track'); + Cookies.set('current_track', currentSong.name); + } + // makes sure it stays updated with current track if page loads + if (loaded != UNIQID) { + Cookies.remove('current_track'); + Cookies.remove('loaded'); + Cookies.set('loaded', UNIQID); + } + } + } }else{ if (master_dj_on_air) { if (showName) { @@ -211,12 +230,12 @@ function calculateTimeToNextSong() { if (approximateServerTime === null) { return; } - + if (newSongTimeoutId !== null) { /* We have a previous timeout set, let's unset it */ clearTimeout(newSongTimeoutId); newSongTimeoutId = null; - } + } var diff = nextSong.songStartPosixTime - approximateServerTime; if (diff < 0) diff=0; @@ -233,7 +252,7 @@ function calculateTimeToNextShow() { /* We have a previous timeout set, let's unset it */ clearTimeout(newShowTimeoutId); newShowTimeoutId = null; - } + } var diff = nextShow[0].showStartPosixTime - approximateServerTime; if (diff < 0) diff=0; @@ -256,7 +275,7 @@ function parseItems(obj){ calcAdditionalData(nextSong); calculateTimeToNextSong(); } - + currentShow = new Array(); if (obj.currentShow.length > 0) { calcAdditionalShowData(obj.currentShow); @@ -269,7 +288,7 @@ function parseItems(obj){ nextShow = obj.nextShow; calculateTimeToNextShow(); } - + var schedulePosixTime = convertDateToPosixTime(obj.schedulerTime); var date = new Date(); @@ -281,7 +300,7 @@ function parseSourceStatus(obj){ var master_div = $("#master_dj_div"); var live_li = live_div.parent(); var master_li = master_div.parent(); - + if(obj.live_dj_source == false){ live_li.find(".line-to-switch").attr("class", "line-to-switch off"); live_div.removeClass("ready"); @@ -289,7 +308,7 @@ function parseSourceStatus(obj){ live_li.find(".line-to-switch").attr("class", "line-to-switch on"); live_div.addClass("ready"); } - + if(obj.master_dj_source == false){ master_li.find(".line-to-switch").attr("class", "line-to-switch off"); master_div.removeClass("ready"); @@ -300,43 +319,43 @@ function parseSourceStatus(obj){ } function parseSwitchStatus(obj){ - + if(obj.live_dj_source == "on"){ live_dj_on_air = true; }else{ live_dj_on_air = false; } - + if(obj.master_dj_source == "on"){ master_dj_on_air = true; }else{ master_dj_on_air = false; } - + if(obj.scheduled_play == "on"){ scheduled_play_on_air = true; }else{ scheduled_play_on_air = false; } - + var scheduled_play_switch = $("#scheduled_play.source-switch-button"); var live_dj_switch = $("#live_dj.source-switch-button"); var master_dj_switch = $("#master_dj.source-switch-button"); - + scheduled_play_switch.find("span").html(obj.scheduled_play); if(scheduled_play_on_air){ scheduled_play_switch.addClass("active"); }else{ scheduled_play_switch.removeClass("active"); } - + live_dj_switch.find("span").html(obj.live_dj_source); if(live_dj_on_air){ live_dj_switch.addClass("active"); }else{ live_dj_switch.removeClass("active"); } - + master_dj_switch.find("span").html(obj.master_dj_source) if(master_dj_on_air){ master_dj_switch.addClass("active"); @@ -351,7 +370,7 @@ function controlOnAirLight(){ onAirOffIterations = 0; } else if (onAirOffIterations < 20) { //if less than 4 seconds have gone by (< 20 executions of this function) - //then keep the ON-AIR light on. Only after at least 3 seconds have gone by, + //then keep the ON-AIR light on. Only after at least 3 seconds have gone by, //should we be allowed to turn it off. This is to stop the light from temporarily turning //off between tracks: CC-3725 onAirOffIterations++; @@ -364,7 +383,7 @@ function controlSwitchLight(){ var live_li= $("#live_dj_div").parent(); var master_li = $("#master_dj_div").parent(); var scheduled_play_li = $("#scheduled_play_div").parent(); - + if((scheduled_play_on_air && scheduled_play_source) && !live_dj_on_air && !master_dj_on_air){ scheduled_play_li.find(".line-to-on-air").attr("class", "line-to-on-air on"); live_li.find(".line-to-on-air").attr("class", "line-to-on-air off"); @@ -385,8 +404,8 @@ function controlSwitchLight(){ } function getScheduleFromServer(){ - $.ajax({ url: baseUrl+"Schedule/get-current-playlist/format/json", - dataType:"json", + $.ajax({ url: baseUrl+"Schedule/get-current-playlist/format/json", + dataType:"json", success:function(data){ parseItems(data.entries); parseSourceStatus(data.source_status); @@ -440,7 +459,7 @@ function setSwitchListener(ele){ function kickSource(ele){ var sourcename = $(ele).attr('id'); - + $.get(baseUrl+"Dashboard/disconnect-source/format/json/sourcename/"+sourcename, function(data){ if(data.error){ alert(data.error); @@ -458,7 +477,7 @@ function init() { secondsTimer(); setupQtip(); - + $('.listen-control-button').click(function() { if (stream_window == null || stream_window.closed) stream_window=window.open(baseUrl+"Dashboard/stream-player", 'name', 'width=400,height=158'); @@ -490,13 +509,13 @@ $(document).ready(function() { if ($('.errors').length === 0) { setCurrentUserPseudoPassword(); } - + $('body').on('click','#current-user', function() { $.ajax({ url: baseUrl+'user/edit-user/format/json' }); }); - + $('body').on('click', '#cu_save_user', function() { $.cookie("airtime_locale", $('#cu_locale').val(), {path: '/'}); }); diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index f04e60ba8..43b8359a8 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -53,7 +53,8 @@ var AIRTIME = (function(AIRTIME) { "year" : "n", "owner_id" : "s", "info_url" : "s", - "replay_gain" : "n" + "replay_gain" : "n", + "artwork" : "s" }; if (AIRTIME.library === undefined) { @@ -575,6 +576,7 @@ var AIRTIME = (function(AIRTIME) { /* ftype */ { "sTitle" : "" , "mDataProp" : "ftype" , "bSearchable" : false , "bVisible" : false }, /* Checkbox */ { "sTitle" : "" , "mDataProp" : "checkbox" , "bSortable" : false , "bSearchable" : false , "sWidth" : "16px" , "sClass" : "library_checkbox" }, /* Type */ { "sTitle" : "" , "mDataProp" : "image" , "bSortable" : false , "bSearchable" : false , "sWidth" : "16px" , "sClass" : "library_type" , "iDataSort" : 0 }, + /* Artwork */ { "sTitle" : "" , "mDataProp" : "artwork" , "bSortable" : false , "bSearchable" : false , "sWidth" : "28px" , "sClass" : "library_artwork" , "iDataSort" : 0 }, /* Is Scheduled */ { "sTitle" : $.i18n._("Scheduled") , "mDataProp" : "is_scheduled" , "bVisible" : false , "bSearchable" : false , "sWidth" : "90px" , "sClass" : "library_is_scheduled" }, ///* Is Playlist */ { "sTitle" : $.i18n._("Playlist / Block") , "mDataProp" : "is_playlist" , "bSearchable" : false , "sWidth" : "110px" , "sClass" : "library_is_playlist"} , /* Title */ { "sTitle" : $.i18n._("Title") , "mDataProp" : "track_title" , "sClass" : "library_title" , "sWidth" : "170px" }, @@ -767,6 +769,11 @@ var AIRTIME = (function(AIRTIME) { // add audio preview image/button if (aData.ftype === "audioclip") { $(nRow).find('td.library_type').html(''); + if (aData.artwork_data) { + $(nRow).find('td.library_artwork').html(''); + } else { + $(nRow).find('td.library_artwork').html(''); + } } else if (aData.ftype === "playlist") { $(nRow).find('td.library_type').html(''); } else if (aData.ftype === "block") { @@ -1589,6 +1596,7 @@ var validationTypes = { "track_title" : "s", "track_number" : "i", "info_url" : "s", + "artwork" : "s", "year" : "i" }; diff --git a/airtime_mvc/public/js/airtime/widgets/table-example.js b/airtime_mvc/public/js/airtime/widgets/table-example.js index 800416e81..ba1066837 100644 --- a/airtime_mvc/public/js/airtime/widgets/table-example.js +++ b/airtime_mvc/public/js/airtime/widgets/table-example.js @@ -5,6 +5,7 @@ $(document).ready(function() { var aoColumns = [ + /* Artwork */ { "sTitle" : $.i18n._("Artwork") , "mDataProp" : "artwork" , "bVisible" : false , "sClass" : "library_artwork" , "sWidth" : "150px" }, /* Title */ { "sTitle" : $.i18n._("Title") , "mDataProp" : "track_title" , "sClass" : "library_title" , "sWidth" : "170px" }, /* Creator */ { "sTitle" : $.i18n._("Creator") , "mDataProp" : "artist_name" , "sClass" : "library_creator" , "sWidth" : "160px" }, /* Upload Time */ { "sTitle" : $.i18n._("Uploaded") , "mDataProp" : "utime" , "bVisible" : false , "sClass" : "library_upload_time" , "sWidth" : "155px" }, diff --git a/composer.json b/composer.json index abcbef095..a5cae5d09 100644 --- a/composer.json +++ b/composer.json @@ -6,6 +6,7 @@ "classmap": ["airtime_mvc/tests/application/", "vendor/phpunit/dbunit/src/"] }, "require": { + "james-heinrich/getid3": "dev-master", "propel/propel1": "1.7.0-stable", "aws/aws-sdk-php": "2.7.9", "raven/raven": "0.12.0", diff --git a/composer.lock b/composer.lock index 466070370..571b3df24 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d60326985fa7371adf17493a929e961c", + "content-hash": "f77b688ef532e689ba85602a6faff987", "packages": [ { "name": "aws/aws-sdk-php", @@ -279,6 +279,69 @@ ], "time": "2014-02-03T15:49:00+00:00" }, + { + "name": "james-heinrich/getid3", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/JamesHeinrich/getID3.git", + "reference": "0723b77cafe9278618cfb6bc91b75e73705d3de8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JamesHeinrich/getID3/zipball/0723b77cafe9278618cfb6bc91b75e73705d3de8", + "reference": "0723b77cafe9278618cfb6bc91b75e73705d3de8", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "jakub-onderka/php-parallel-lint": "^0.9 || ^1.0" + }, + "suggest": { + "ext-SimpleXML": "SimpleXML extension is required to analyze RIFF/WAV/BWF audio files (also requires `ext-libxml`).", + "ext-com_dotnet": "COM extension is required when loading files larger than 2GB on Windows.", + "ext-ctype": "ctype extension is required when loading files larger than 2GB on 32-bit PHP (also on 64-bit PHP on Windows) or executing `getid3_lib::CopyTagsToComments`.", + "ext-dba": "DBA extension is required to use the DBA database as a cache storage.", + "ext-exif": "EXIF extension is required for graphic modules.", + "ext-iconv": "iconv extension is required to work with different character sets (when `ext-mbstring` is not available).", + "ext-json": "JSON extension is required to analyze Apple Quicktime videos.", + "ext-libxml": "libxml extension is required to analyze RIFF/WAV/BWF audio files.", + "ext-mbstring": "mbstring extension is required to work with different character sets.", + "ext-mysql": "MySQL extension is required to use the MySQL database as a cache storage (deprecated in PHP 5.5, removed in PHP >= 7.0, use `ext-mysqli` instead).", + "ext-mysqli": "MySQLi extension is required to use the MySQL database as a cache storage.", + "ext-rar": "RAR extension is required for RAR archive module.", + "ext-sqlite3": "SQLite3 extension is required to use the SQLite3 database as a cache storage.", + "ext-xml": "XML extension is required for graphic modules to analyze the XML metadata.", + "ext-zlib": "Zlib extension is required for archive modules and compressed metadata." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9.x-dev" + } + }, + "autoload": { + "classmap": [ + "getid3/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-1.0-or-later", + "LGPL-3.0-only", + "MPL-2.0" + ], + "description": "PHP script that extracts useful information from popular multimedia file formats", + "homepage": "https://www.getid3.org/", + "keywords": [ + "codecs", + "php", + "tags" + ], + "time": "2019-09-16T19:08:47+00:00" + }, { "name": "massivescale/celery-php", "version": "dev-master", @@ -3445,6 +3508,7 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { + "james-heinrich/getid3": 20, "massivescale/celery-php": 20, "simplepie/simplepie": 20, "zf1s/zend-rest": 20, From 4b59e75d2b0b019bd092fb324d3360b6a3588fc0 Mon Sep 17 00:00:00 2001 From: Codenift Date: Thu, 19 Sep 2019 23:07:22 -0400 Subject: [PATCH 02/15] Needed to change 32 to 33 on var colExclude for column reordering. --- airtime_mvc/public/js/airtime/library/library.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index 43b8359a8..38a675e81 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -615,7 +615,7 @@ var AIRTIME = (function(AIRTIME) { ); } - var colExclude = onDashboard ? [0, 1, 2, 32] : [0, 1, 2]; + var colExclude = onDashboard ? [0, 1, 2, 33] : [0, 1, 2]; /* ############################################ DATATABLES From 2e23238f2c39872c313c46b1aa84e5c7c84c4171 Mon Sep 17 00:00:00 2001 From: Codenift Date: Fri, 20 Sep 2019 00:29:31 -0400 Subject: [PATCH 03/15] JS Cookie update --- .../plugins/PageLayoutInitPlugin.php | 2 +- .../public/js/airtime/dashboard/dashboard.js | 2 +- airtime_mvc/public/js/cookie/jquery.cookie.js | 72 -------- airtime_mvc/public/js/cookie/js.cookie.js | 163 ++++++++++++++++++ 4 files changed, 165 insertions(+), 74 deletions(-) delete mode 100644 airtime_mvc/public/js/cookie/jquery.cookie.js create mode 100644 airtime_mvc/public/js/cookie/js.cookie.js diff --git a/airtime_mvc/application/controllers/plugins/PageLayoutInitPlugin.php b/airtime_mvc/application/controllers/plugins/PageLayoutInitPlugin.php index 444f82f96..bbb538fdd 100644 --- a/airtime_mvc/application/controllers/plugins/PageLayoutInitPlugin.php +++ b/airtime_mvc/application/controllers/plugins/PageLayoutInitPlugin.php @@ -183,7 +183,7 @@ class PageLayoutInitPlugin extends Zend_Controller_Plugin_Abstract ->appendFile($baseUrl . 'js/qtip/jquery.qtip.js?' . $CC_CONFIG['airtime_version'], 'text/javascript') ->appendFile($baseUrl . 'js/jplayer/jquery.jplayer.min.js?' . $CC_CONFIG['airtime_version'], 'text/javascript') ->appendFile($baseUrl . 'js/sprintf/sprintf-0.7-beta1.js?' . $CC_CONFIG['airtime_version'], 'text/javascript') - ->appendFile($baseUrl . 'js/cookie/jquery.cookie.js?' . $CC_CONFIG['airtime_version'], 'text/javascript') + ->appendFile($baseUrl . 'js/cookie/js.cookie.js?' . $CC_CONFIG['airtime_version'], 'text/javascript') ->appendFile($baseUrl . 'js/i18n/jquery.i18n.js?' . $CC_CONFIG['airtime_version'], 'text/javascript') ->appendFile($baseUrl . 'locale/general-translation-table?' . $CC_CONFIG['airtime_version'], 'text/javascript') ->appendFile($baseUrl . 'locale/datatables-translation-table?' . $CC_CONFIG['airtime_version'], 'text/javascript') diff --git a/airtime_mvc/public/js/airtime/dashboard/dashboard.js b/airtime_mvc/public/js/airtime/dashboard/dashboard.js index 5a894d82a..1b4d1c468 100644 --- a/airtime_mvc/public/js/airtime/dashboard/dashboard.js +++ b/airtime_mvc/public/js/airtime/dashboard/dashboard.js @@ -517,7 +517,7 @@ $(document).ready(function() { }); $('body').on('click', '#cu_save_user', function() { - $.cookie("airtime_locale", $('#cu_locale').val(), {path: '/'}); + Cookies.set('airtime_locale', $('#cu_locale').val(), {path: '/'}); }); // When the 'Listen' button is clicked we set the width diff --git a/airtime_mvc/public/js/cookie/jquery.cookie.js b/airtime_mvc/public/js/cookie/jquery.cookie.js deleted file mode 100644 index d151b7f31..000000000 --- a/airtime_mvc/public/js/cookie/jquery.cookie.js +++ /dev/null @@ -1,72 +0,0 @@ -/*! - * jQuery Cookie Plugin v1.3 - * https://github.com/carhartl/jquery-cookie - * - * Copyright 2011, Klaus Hartl - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://www.opensource.org/licenses/mit-license.php - * http://www.opensource.org/licenses/GPL-2.0 - */ -(function ($, document, undefined) { - - var pluses = /\+/g; - - function raw(s) { - return s; - } - - function decoded(s) { - return decodeURIComponent(s.replace(pluses, ' ')); - } - - var config = $.cookie = function (key, value, options) { - - // write - if (value !== undefined) { - options = $.extend({}, config.defaults, options); - - if (value === null) { - options.expires = -1; - } - - if (typeof options.expires === 'number') { - var days = options.expires, t = options.expires = new Date(); - t.setDate(t.getDate() + days); - } - - value = config.json ? JSON.stringify(value) : String(value); - - return (document.cookie = [ - encodeURIComponent(key), '=', config.raw ? value : encodeURIComponent(value), - options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE - options.path ? '; path=' + options.path : '', - options.domain ? '; domain=' + options.domain : '', - options.secure ? '; secure' : '' - ].join('')); - } - - // read - var decode = config.raw ? raw : decoded; - var cookies = document.cookie.split('; '); - for (var i = 0, l = cookies.length; i < l; i++) { - var parts = cookies[i].split('='); - if (decode(parts.shift()) === key) { - var cookie = decode(parts.join('=')); - return config.json ? JSON.parse(cookie) : cookie; - } - } - - return null; - }; - - config.defaults = {}; - - $.removeCookie = function (key, options) { - if ($.cookie(key) !== null) { - $.cookie(key, null, options); - return true; - } - return false; - }; - -})(jQuery, document); \ No newline at end of file diff --git a/airtime_mvc/public/js/cookie/js.cookie.js b/airtime_mvc/public/js/cookie/js.cookie.js new file mode 100644 index 000000000..1d83ea447 --- /dev/null +++ b/airtime_mvc/public/js/cookie/js.cookie.js @@ -0,0 +1,163 @@ +/*! + * JavaScript Cookie v2.2.1 + * https://github.com/js-cookie/js-cookie + * + * Copyright 2006, 2015 Klaus Hartl & Fagner Brack + * Released under the MIT license + */ +;(function (factory) { + var registeredInModuleLoader; + if (typeof define === 'function' && define.amd) { + define(factory); + registeredInModuleLoader = true; + } + if (typeof exports === 'object') { + module.exports = factory(); + registeredInModuleLoader = true; + } + if (!registeredInModuleLoader) { + var OldCookies = window.Cookies; + var api = window.Cookies = factory(); + api.noConflict = function () { + window.Cookies = OldCookies; + return api; + }; + } +}(function () { + function extend () { + var i = 0; + var result = {}; + for (; i < arguments.length; i++) { + var attributes = arguments[ i ]; + for (var key in attributes) { + result[key] = attributes[key]; + } + } + return result; + } + + function decode (s) { + return s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent); + } + + function init (converter) { + function api() {} + + function set (key, value, attributes) { + if (typeof document === 'undefined') { + return; + } + + attributes = extend({ + path: '/' + }, api.defaults, attributes); + + if (typeof attributes.expires === 'number') { + attributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5); + } + + // We're using "expires" because "max-age" is not supported by IE + attributes.expires = attributes.expires ? attributes.expires.toUTCString() : ''; + + try { + var result = JSON.stringify(value); + if (/^[\{\[]/.test(result)) { + value = result; + } + } catch (e) {} + + value = converter.write ? + converter.write(value, key) : + encodeURIComponent(String(value)) + .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent); + + key = encodeURIComponent(String(key)) + .replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent) + .replace(/[\(\)]/g, escape); + + var stringifiedAttributes = ''; + for (var attributeName in attributes) { + if (!attributes[attributeName]) { + continue; + } + stringifiedAttributes += '; ' + attributeName; + if (attributes[attributeName] === true) { + continue; + } + + // Considers RFC 6265 section 5.2: + // ... + // 3. If the remaining unparsed-attributes contains a %x3B (";") + // character: + // Consume the characters of the unparsed-attributes up to, + // not including, the first %x3B (";") character. + // ... + stringifiedAttributes += '=' + attributes[attributeName].split(';')[0]; + } + + return (document.cookie = key + '=' + value + stringifiedAttributes); + } + + function get (key, json) { + if (typeof document === 'undefined') { + return; + } + + var jar = {}; + // To prevent the for loop in the first place assign an empty array + // in case there are no cookies at all. + var cookies = document.cookie ? document.cookie.split('; ') : []; + var i = 0; + + for (; i < cookies.length; i++) { + var parts = cookies[i].split('='); + var cookie = parts.slice(1).join('='); + + if (!json && cookie.charAt(0) === '"') { + cookie = cookie.slice(1, -1); + } + + try { + var name = decode(parts[0]); + cookie = (converter.read || converter)(cookie, name) || + decode(cookie); + + if (json) { + try { + cookie = JSON.parse(cookie); + } catch (e) {} + } + + jar[name] = cookie; + + if (key === name) { + break; + } + } catch (e) {} + } + + return key ? jar[key] : jar; + } + + api.set = set; + api.get = function (key) { + return get(key, false /* read as raw */); + }; + api.getJSON = function (key) { + return get(key, true /* read as json */); + }; + api.remove = function (key, attributes) { + set(key, '', extend(attributes, { + expires: -1 + })); + }; + + api.defaults = {}; + + api.withConverter = init; + + return api; + } + + return init(function () {}); +})); \ No newline at end of file From b411d6d6f25c780706d8a9ebd5feee977ad43f3b Mon Sep 17 00:00:00 2001 From: Codenift Date: Fri, 20 Sep 2019 03:09:41 -0400 Subject: [PATCH 04/15] Added option to set media type for tracks. --- airtime_mvc/application/configs/constants.php | 1 + .../upgrade_sql/airtime_2.5.18/upgrade.sql | 1 + airtime_mvc/application/forms/EditAudioMD.php | 28 ++++++ .../application/forms/SmartBlockCriteria.php | 21 +++-- airtime_mvc/application/models/Block.php | 79 ++++++++-------- airtime_mvc/application/models/StoredFile.php | 5 +- .../models/airtime/map/CcFilesTableMap.php | 1 + .../models/airtime/om/BaseCcFiles.php | 55 +++++++++++ .../models/airtime/om/BaseCcFilesPeer.php | 27 +++--- .../models/airtime/om/BaseCcFilesQuery.php | 35 ++++++- .../application/services/HistoryService.php | 43 ++++----- airtime_mvc/application/upgrade/Upgrades.php | 13 +++ .../library/get-file-metadata.ajax.phtml | 1 + airtime_mvc/build/schema.xml | 1 + airtime_mvc/build/sql/schema.sql | 1 + .../public/js/airtime/library/library.js | 7 +- .../js/airtime/playlist/smart_blockbuilder.js | 91 ++++++++++--------- 17 files changed, 281 insertions(+), 129 deletions(-) create mode 100644 airtime_mvc/application/controllers/upgrade_sql/airtime_2.5.18/upgrade.sql diff --git a/airtime_mvc/application/configs/constants.php b/airtime_mvc/application/configs/constants.php index a56a908b5..29157c556 100644 --- a/airtime_mvc/application/configs/constants.php +++ b/airtime_mvc/application/configs/constants.php @@ -83,6 +83,7 @@ define('MDATA_KEY_CUE_IN' , 'cuein'); define('MDATA_KEY_CUE_OUT' , 'cueout'); define('MDATA_KEY_ARTWORK' , 'artwork'); define('MDATA_KEY_ARTWORK_DATA', 'artwork_data'); +define('MDATA_KEY_MEDIA_TYPE' , 'media_type'); define('UI_MDATA_VALUE_FORMAT_FILE' , 'File'); define('UI_MDATA_VALUE_FORMAT_STREAM' , 'live stream'); diff --git a/airtime_mvc/application/controllers/upgrade_sql/airtime_2.5.18/upgrade.sql b/airtime_mvc/application/controllers/upgrade_sql/airtime_2.5.18/upgrade.sql new file mode 100644 index 000000000..20fdd2dc4 --- /dev/null +++ b/airtime_mvc/application/controllers/upgrade_sql/airtime_2.5.18/upgrade.sql @@ -0,0 +1 @@ +ALTER TABLE cc_files ADD COLUMN media_type VARCHAR(4); \ No newline at end of file diff --git a/airtime_mvc/application/forms/EditAudioMD.php b/airtime_mvc/application/forms/EditAudioMD.php index 62a83f66c..ecc1ec135 100644 --- a/airtime_mvc/application/forms/EditAudioMD.php +++ b/airtime_mvc/application/forms/EditAudioMD.php @@ -74,6 +74,34 @@ class Application_Form_EditAudioMD extends Zend_Form $owner_id->setMultiOptions($user_options); $this->addelement($owner_id); + // Add media type dropdown + $media_type_options = array(); + $media_types = array( + '' => '--- Select Media Type ---', + 'MUS' => 'Music (MUS)', + 'SID' => 'Station ID (SID)', + 'INT' => 'Intro (INT)', + 'OUT' => 'Outro (OUT)', + 'SWP' => 'Sweeper (SWP)', + 'JIN' => 'Jingle (JIN)', + 'PRO' => 'Promo (PRO)', + 'SHO' => 'Shout Out (SHO)', + 'NWS' => 'News (NWS)', + 'COM' => 'Commercial (COM)', + 'ITV' => 'Interview (ITV)', + 'VTR' => 'Voice Tracking (VTR)', + ); + + foreach ($media_types as $key => $mt) { + $media_type_options[$key] = $mt; + } + + $media_type = new Zend_Form_Element_Select('media_type'); + $media_type->class = 'input_text'; + $media_type->setLabel(_('Media Type:')); + $media_type->setMultiOptions($media_type_options); + $this->addelement($media_type); + // Description field $description = new Zend_Form_Element_Textarea('description'); $description->class = 'input_text'; diff --git a/airtime_mvc/application/forms/SmartBlockCriteria.php b/airtime_mvc/application/forms/SmartBlockCriteria.php index e539c551c..ac55947f2 100644 --- a/airtime_mvc/application/forms/SmartBlockCriteria.php +++ b/airtime_mvc/application/forms/SmartBlockCriteria.php @@ -42,7 +42,8 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm "track_title" => "s", "track_number" => "n", "info_url" => "s", - "year" => "n" + "year" => "n", + "media_type" => "s" ); private function getCriteriaOptions($option = null) @@ -77,7 +78,8 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm "track_number" => _("Track Number"), "utime" => _("Uploaded"), "info_url" => _("Website"), - "year" => _("Year") + "year" => _("Year"), + "media_type" => _("Media Type") ); } @@ -183,18 +185,18 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm public function init() { } - + /* * converts UTC timestamp citeria into user timezone strings. */ private function convertTimestamps(&$criteria) { $columns = array("utime", "mtime", "lptime"); - + foreach ($columns as $column) { - + if (isset($criteria[$column])) { - + foreach ($criteria[$column] as &$constraint) { // convert to appropriate timezone timestamps only if the modifier is not a relative time if (!in_array($constraint['modifier'], array('before','after','between'))) { @@ -246,7 +248,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm $bl = new Application_Model_Block($p_blockId); $storedCrit = $bl->getCriteriaGrouped(); Logging::info($storedCrit); - + //need to convert criteria to be displayed in the user's timezone if there's some timestamp type. self::convertTimestamps($storedCrit["crit"]); @@ -470,7 +472,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm $sort->setValue($storedCrit["sort"]["value"]); } $this->addElement($sort); - + $limit = new Zend_Form_Element_Select('sp_limit_options'); $limit->setAttrib('class', 'sp_input_select') ->setDecorators(array('viewHelper')) @@ -721,7 +723,8 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm "sample_rate" => "DbSampleRate", "track_title" => "DbTrackTitle", "track_number" => "DbTrackNumber", - "year" => "DbYear" + "year" => "DbYear", + "media_type" => "DbMediaType" ); // things we need to check diff --git a/airtime_mvc/application/models/Block.php b/airtime_mvc/application/models/Block.php index f40945742..3d3b273bb 100644 --- a/airtime_mvc/application/models/Block.php +++ b/airtime_mvc/application/models/Block.php @@ -85,7 +85,8 @@ class Application_Model_Block implements Application_Model_LibraryEditable "sample_rate" => "DbSampleRate", "track_title" => "DbTrackTitle", "track_number" => "DbTrackNumber", - "year" => "DbYear" + "year" => "DbYear", + "media_type" => "DbMediaType" ); public function __construct($id=null, $con=null) @@ -232,12 +233,12 @@ SQL; foreach ($rows as &$row) { $clipSec = Application_Common_DateHelper::playlistTimeToSeconds($row['length']); - + $row['trackSec'] = $clipSec; - + $row['cueInSec'] = Application_Common_DateHelper::playlistTimeToSeconds($row['cuein']); $row['cueOutSec'] = Application_Common_DateHelper::playlistTimeToSeconds($row['cueout']); - + $trackoffset = $row['trackoffset']; $offset += $clipSec; $offset -= $trackoffset; @@ -254,7 +255,7 @@ SQL; $fades = $this->getFadeInfo($row['position']); $row['fadein'] = $fades[0]; $row['fadeout'] = $fades[1]; - + // format the cues in format 00:00:00(.0) // we need to add the '.0' for cues and not fades // because propel takes care of this for us @@ -488,7 +489,7 @@ SQL; Logging::info("Adding to block"); Logging::info("at position {$pos}"); } - + foreach ($p_items as $ac) { //Logging::info("Adding audio file {$ac[0]}"); try { @@ -677,7 +678,7 @@ SQL; return array($fadeIn, $fadeOut); } - + /* * create a crossfade from item in cc_playlist_contents with $id1 to item $id2. * @@ -688,11 +689,11 @@ SQL; public function createCrossfade($id1, $fadeOut, $id2, $fadeIn, $offset) { $this->con->beginTransaction(); - + if (!isset($offset)) { $offset = Application_Model_Preference::GetDefaultCrossfadeDuration(); } - + try { if (isset($id1)) { $this->changeFadeInfo($id1, null, $fadeOut); @@ -700,9 +701,9 @@ SQL; if (isset($id2)) { $this->changeFadeInfo($id2, $fadeIn, null, $offset); } - + $this->con->commit(); - + } catch (Exception $e) { $this->con->rollback(); throw $e; @@ -746,20 +747,20 @@ SQL; ':fade_in' => $fadeIn, ':clip_length' => $clipLength ); - + $result = Application_Common_Database::prepareAndExecute($sql, $params, 'column'); if ($result) { //"Fade In can't be larger than overall playlength."; $fadeIn = $clipLength; } $row->setDbFadein($fadeIn); - + if (!is_null($offset)) { $row->setDbTrackOffset($offset); Logging::info("Setting offset {$offset} on item {$id}"); $row->save($this->con); } - + } if (!is_null($fadeOut)) { @@ -768,7 +769,7 @@ SQL; ':fade_out' => $fadeOut, ':clip_length' => $clipLength ); - + $result = Application_Common_Database::prepareAndExecute($sql, $params, 'column'); if ($result) { //"Fade Out can't be larger than overall playlength."; @@ -909,7 +910,7 @@ SQL; $row->setDbCuein($cueIn); $row->setDBCliplength($cliplength); - + } elseif (!is_null($cueOut)) { if ($cueOut === "") { @@ -1016,8 +1017,8 @@ SQL; public static function getBlockCount() { $sql = 'SELECT count(*) as cnt FROM cc_playlist'; - - $res = Application_Common_Database::prepareAndExecute($sql, array(), + + $res = Application_Common_Database::prepareAndExecute($sql, array(), Application_Common_Database::COLUMN); return $res; @@ -1064,7 +1065,7 @@ SQL; CcBlockQuery::create()->findPKs($p_ids)->delete(); $updateIsPlaylistFlag = true; } - + if ($updateIsPlaylistFlag) { // update is_playlist flag in cc_files Application_Model_StoredFile::setIsPlaylist( @@ -1163,7 +1164,7 @@ SQL; $blockType = $data['etc']['sp_type'] == 0 ? 'dynamic':'static'; $this->saveType($blockType); $this->storeCriteriaIntoDb($data); - + // if the block is dynamic, put null to the length // as it cannot be calculated if ($blockType == 'dynamic') { @@ -1208,7 +1209,7 @@ SQL; if (isset($d['sp_criteria_extra'])) { $extra = $d['sp_criteria_extra']; } if (isset($d['sp_criteria_datetime_select'])) { $datetimeunit = $d['sp_criteria_datetime_select']; } if (isset($d['sp_criteria_extra_datetime_select'])) {$extradatetimeunit = $d['sp_criteria_extra_datetime_select'];} - + if ($field == 'utime' || $field == 'mtime' || $field == 'lptime') { // if the date isn't relative we want to convert the value to a specific UTC date if (!(in_array($modifier,array('before','after','between')))) { @@ -1220,7 +1221,7 @@ SQL; } } - + $qry = new CcBlockcriteria(); $qry->setDbCriteria($field) ->setDbModifier($d['sp_criteria_modifier']) @@ -1228,7 +1229,7 @@ SQL; ->setDbBlockId($this->id); if (isset($d['sp_criteria_extra'])) { - + if ($field == 'utime' || $field == 'mtime' || $field == 'lptime') { // if the date isn't relative we want to convert the value to a specific UTC date if (!(in_array($modifier,array('before','after','between')))) { @@ -1239,7 +1240,7 @@ SQL; } } - + $qry->setDbExtra($extra); } // save the criteria group so separation via new modifiers AND can be preserved vs. lumping @@ -1269,8 +1270,8 @@ SQL; ->setDbValue($p_criteriaData['etc']['sp_limit_value']) ->setDbBlockId($this->id) ->save(); - - + + // insert repeat track option $qry = new CcBlockcriteria(); $qry->setDbCriteria("repeat_tracks") @@ -1347,11 +1348,11 @@ SQL; // this moves the pointer to the first element in the collection $files->getFirst(); $iterator = $files->getIterator(); - + $isBlockFull = false; - + while ($iterator->valid()) { - + $id = $iterator->current()->getDbId(); $fileLength = $iterator->current()->getCueLength(); $length = Application_Common_DateHelper::calculateLengthInSeconds($fileLength); @@ -1384,15 +1385,15 @@ SQL; $iterator->next(); } - + $sizeOfInsert = count($insertList); - + // if block is not full and repeat_track is check, fill up more // additionally still don't overflow the limit while (!$isBlockFull && $repeat == 1 && $sizeOfInsert > 0) { Logging::debug("adding repeated tracks."); Logging::debug("total time = " . $totalTime); - + $randomEleKey = array_rand(array_slice($insertList, 0, $sizeOfInsert)); // this will also allow the overflow of tracks so that time limited smart blocks will schedule until they // are longer than the time limit rather than never scheduling past the time limit @@ -1412,7 +1413,7 @@ SQL; $totalItems++; } } - + if ((!is_null($limit['items']) && $limit['items'] == count($insertList)) || $totalItems > 500 || $totalTime > $limit['time']) { break; } @@ -1460,7 +1461,8 @@ SQL; "track_number" => _("Track Number"), "utime" => _("Uploaded"), "info_url" => _("Website"), - "year" => _("Year") + "year" => _("Year"), + "media_type" => _("Media Type") ); $modifierOptions = array( @@ -1559,7 +1561,8 @@ SQL; "track_number" => _("Track Number"), "utime" => _("Uploaded"), "info_url" => _("Website"), - "year" => _("Year") + "year" => _("Year"), + "media_type" => _("Media Type") ); $modifierOptions = array( @@ -1796,7 +1799,7 @@ SQL; $limits['items'] = null; } } - + $repeatTracks = 0; $overflowTracks = 0; @@ -1865,9 +1868,9 @@ SQL; SELECT distinct(file_id) FROM cc_blockcontents SQL; - + $files = Application_Common_Database::prepareAndExecute($sql, array()); - + $real_files = array(); foreach ($files as $f) { $real_files[] = $f['file_id']; diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index 8e8211378..ac0736278 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -54,7 +54,8 @@ class Application_Model_StoredFile "cuein" => "DbCueIn", "cueout" => "DbCueOut", "description" => "DbDescription", - "artwork" => "DbArtwork" + "artwork" => "DbArtwork", + "media_type" => "DbMediaType" ); function __construct($file, $con) { @@ -672,7 +673,7 @@ SQL; "bit_rate", "sample_rate", "isrc_number", "encoded_by", "label", "copyright", "mime", "language", "filepath", "owner_id", "conductor", "replay_gain", "lptime", "is_playlist", "is_scheduled", - "cuein", "cueout", "description", "artwork" ); + "cuein", "cueout", "description", "artwork", "media_type" ); } public static function searchLibraryFiles($datatables) diff --git a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php index e68a15637..325d59151 100644 --- a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php @@ -112,6 +112,7 @@ class CcFilesTableMap extends TableMap $this->addColumn('filesize', 'DbFilesize', 'INTEGER', true, null, 0); $this->addColumn('description', 'DbDescription', 'VARCHAR', false, 512, null); $this->addColumn('artwork', 'DbArtwork', 'VARCHAR', false, 512, null); + $this->addColumn('media_type', 'DbMediaType', 'VARCHAR', false, 4, null); // validators } // initialize() diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php index 7cf46f514..7dca9e23a 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php @@ -294,6 +294,12 @@ abstract class BaseCcFiles extends BaseObject implements Persistent */ protected $artwork; + /** + * The value for the media_type field. + * @var string + */ + protected $media_type; + /** * The value for the artist_url field. * @var string @@ -1193,6 +1199,17 @@ abstract class BaseCcFiles extends BaseObject implements Persistent return $this->artwork; } + /** + * Get the [media_type] column value. + * + * @return string + */ + public function getDbMediaType() + { + + return $this->media_type; + } + /** * Get the [artist_url] column value. * @@ -1875,6 +1892,26 @@ abstract class BaseCcFiles extends BaseObject implements Persistent return $this; } // setDbArtwork() + /** + * Set the value of [media_type] column. + * + * @param string $v new value + * @return CcFiles The current object (for fluent API support) + */ + public function setDbMediaType($v) + { + if ($v !== null && is_numeric($v)) { + $v = (string) $v; + } + + if ($this->media_type !== $v) { + $this->media_type = $v; + $this->modifiedColumns[] = CcFilesPeer::MEDIA_TYPE; + } + + return $this; + } // setDbMediaType() + /** * Set the value of [artist_name] column. * @@ -3304,6 +3341,7 @@ abstract class BaseCcFiles extends BaseObject implements Persistent $this->filesize = ($row[$startcol + 70] !== null) ? (int) $row[$startcol + 70] : null; $this->description = ($row[$startcol + 71] !== null) ? (string) $row[$startcol + 71] : null; $this->artwork = ($row[$startcol + 72] !== null) ? (string) $row[$startcol + 72] : null; + $this->media_type = ($row[$startcol + 73] !== null) ? (string) $row[$startcol + 73] : null; $this->resetModified(); $this->setNew(false); @@ -3944,6 +3982,9 @@ abstract class BaseCcFiles extends BaseObject implements Persistent if ($this->isColumnModified(CcFilesPeer::ARTWORK)) { $modifiedColumns[':p' . $index++] = '"artwork"'; } + if ($this->isColumnModified(CcFilesPeer::MEDIA_TYPE)) { + $modifiedColumns[':p' . $index++] = '"media_type"'; + } $sql = sprintf( 'INSERT INTO "cc_files" (%s) VALUES (%s)', @@ -4174,6 +4215,9 @@ abstract class BaseCcFiles extends BaseObject implements Persistent case '"artwork"': $stmt->bindValue($identifier, $this->artwork, PDO::PARAM_STR); break; + case '"media_type"': + $stmt->bindValue($identifier, $this->media_type, PDO::PARAM_STR); + break; } } $stmt->execute(); @@ -4608,6 +4652,9 @@ abstract class BaseCcFiles extends BaseObject implements Persistent case 72: return $this->getDbArtwork(); break; + case 73: + return $this->getDbMediaType(); + break; default: return null; break; @@ -4710,6 +4757,7 @@ abstract class BaseCcFiles extends BaseObject implements Persistent $keys[70] => $this->getDbFilesize(), $keys[71] => $this->getDbDescription(), $keys[72] => $this->getDbArtwork(), + $keys[73] => $this->getDbMediaType(), ); $virtualColumns = $this->virtualColumns; foreach ($virtualColumns as $key => $virtualColumn) { @@ -5003,6 +5051,9 @@ abstract class BaseCcFiles extends BaseObject implements Persistent case 72: $this->setDbArtwork($value); break; + case 73: + $this->setDbMediaType($value); + break; } // switch() } @@ -5100,6 +5151,7 @@ abstract class BaseCcFiles extends BaseObject implements Persistent if (array_key_exists($keys[70], $arr)) $this->setDbFilesize($arr[$keys[70]]); if (array_key_exists($keys[71], $arr)) $this->setDbDescription($arr[$keys[71]]); if (array_key_exists($keys[72], $arr)) $this->setDbArtwork($arr[$keys[72]]); + if (array_key_exists($keys[73], $arr)) $this->setDbMediaType($arr[$keys[73]]); } /** @@ -5184,6 +5236,7 @@ abstract class BaseCcFiles extends BaseObject implements Persistent if ($this->isColumnModified(CcFilesPeer::FILESIZE)) $criteria->add(CcFilesPeer::FILESIZE, $this->filesize); if ($this->isColumnModified(CcFilesPeer::DESCRIPTION)) $criteria->add(CcFilesPeer::DESCRIPTION, $this->description); if ($this->isColumnModified(CcFilesPeer::ARTWORK)) $criteria->add(CcFilesPeer::ARTWORK, $this->artwork); + if ($this->isColumnModified(CcFilesPeer::MEDIA_TYPE)) $criteria->add(CcFilesPeer::MEDIA_TYPE, $this->media_type); return $criteria; } @@ -5319,6 +5372,7 @@ abstract class BaseCcFiles extends BaseObject implements Persistent $copyObj->setDbFilesize($this->getDbFilesize()); $copyObj->setDbDescription($this->getDbDescription()); $copyObj->setDbArtwork($this->getDbArtwork()); + $copyObj->setDbMediaType($this->getDbMediaType()); if ($deepCopy && !$this->startCopy) { // important: temporarily setNew(false) because this affects the behavior of @@ -7721,6 +7775,7 @@ abstract class BaseCcFiles extends BaseObject implements Persistent $this->filesize = null; $this->description = null; $this->artwork = null; + $this->media_type = null; $this->alreadyInSave = false; $this->alreadyInValidation = false; $this->alreadyInClearAllReferencesDeep = false; diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php index 8b61968b2..635d6a99a 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php @@ -251,6 +251,9 @@ abstract class BaseCcFilesPeer /** the column name for the artwork field */ const ARTWORK = 'cc_files.artwork'; + /** the column name for the media_type field */ + const MEDIA_TYPE = 'cc_files.media_type'; + /** The default string format for model objects of the related table **/ const DEFAULT_STRING_FORMAT = 'YAML'; @@ -270,12 +273,12 @@ abstract class BaseCcFilesPeer * e.g. CcFilesPeer::$fieldNames[CcFilesPeer::TYPE_PHPNAME][0] = 'Id' */ protected static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMime', 'DbFtype', 'DbDirectory', 'DbFilepath', 'DbImportStatus', 'DbCurrentlyaccessing', 'DbEditedby', 'DbMtime', 'DbUtime', 'DbLPtime', 'DbMd5', 'DbTrackTitle', 'DbArtistName', 'DbBitRate', 'DbSampleRate', 'DbFormat', 'DbLength', 'DbAlbumTitle', 'DbGenre', 'DbComments', 'DbYear', 'DbTrackNumber', 'DbChannels', 'DbUrl', 'DbBpm', 'DbRating', 'DbEncodedBy', 'DbDiscNumber', 'DbMood', 'DbLabel', 'DbComposer', 'DbEncoder', 'DbChecksum', 'DbLyrics', 'DbOrchestra', 'DbConductor', 'DbLyricist', 'DbOriginalLyricist', 'DbRadioStationName', 'DbInfoUrl', 'DbArtistUrl', 'DbAudioSourceUrl', 'DbRadioStationUrl', 'DbBuyThisUrl', 'DbIsrcNumber', 'DbCatalogNumber', 'DbOriginalArtist', 'DbCopyright', 'DbReportDatetime', 'DbReportLocation', 'DbReportOrganization', 'DbSubject', 'DbContributor', 'DbLanguage', 'DbFileExists', 'DbSoundcloudId', 'DbSoundcloudErrorCode', 'DbSoundcloudErrorMsg', 'DbSoundcloudLinkToFile', 'DbSoundCloundUploadTime', 'DbReplayGain', 'DbOwnerId', 'DbCuein', 'DbCueout', 'DbSilanCheck', 'DbHidden', 'DbIsScheduled', 'DbIsPlaylist', 'DbFilesize', 'DbDescription', 'DbArtwork', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMime', 'dbFtype', 'dbDirectory', 'dbFilepath', 'dbImportStatus', 'dbCurrentlyaccessing', 'dbEditedby', 'dbMtime', 'dbUtime', 'dbLPtime', 'dbMd5', 'dbTrackTitle', 'dbArtistName', 'dbBitRate', 'dbSampleRate', 'dbFormat', 'dbLength', 'dbAlbumTitle', 'dbGenre', 'dbComments', 'dbYear', 'dbTrackNumber', 'dbChannels', 'dbUrl', 'dbBpm', 'dbRating', 'dbEncodedBy', 'dbDiscNumber', 'dbMood', 'dbLabel', 'dbComposer', 'dbEncoder', 'dbChecksum', 'dbLyrics', 'dbOrchestra', 'dbConductor', 'dbLyricist', 'dbOriginalLyricist', 'dbRadioStationName', 'dbInfoUrl', 'dbArtistUrl', 'dbAudioSourceUrl', 'dbRadioStationUrl', 'dbBuyThisUrl', 'dbIsrcNumber', 'dbCatalogNumber', 'dbOriginalArtist', 'dbCopyright', 'dbReportDatetime', 'dbReportLocation', 'dbReportOrganization', 'dbSubject', 'dbContributor', 'dbLanguage', 'dbFileExists', 'dbSoundcloudId', 'dbSoundcloudErrorCode', 'dbSoundcloudErrorMsg', 'dbSoundcloudLinkToFile', 'dbSoundCloundUploadTime', 'dbReplayGain', 'dbOwnerId', 'dbCuein', 'dbCueout', 'dbSilanCheck', 'dbHidden', 'dbIsScheduled', 'dbIsPlaylist', 'dbFilesize', 'dbDescription', 'dbArtwork', ), - BasePeer::TYPE_COLNAME => array (CcFilesPeer::ID, CcFilesPeer::NAME, CcFilesPeer::MIME, CcFilesPeer::FTYPE, CcFilesPeer::DIRECTORY, CcFilesPeer::FILEPATH, CcFilesPeer::IMPORT_STATUS, CcFilesPeer::CURRENTLYACCESSING, CcFilesPeer::EDITEDBY, CcFilesPeer::MTIME, CcFilesPeer::UTIME, CcFilesPeer::LPTIME, CcFilesPeer::MD5, CcFilesPeer::TRACK_TITLE, CcFilesPeer::ARTIST_NAME, CcFilesPeer::BIT_RATE, CcFilesPeer::SAMPLE_RATE, CcFilesPeer::FORMAT, CcFilesPeer::LENGTH, CcFilesPeer::ALBUM_TITLE, CcFilesPeer::GENRE, CcFilesPeer::COMMENTS, CcFilesPeer::YEAR, CcFilesPeer::TRACK_NUMBER, CcFilesPeer::CHANNELS, CcFilesPeer::URL, CcFilesPeer::BPM, CcFilesPeer::RATING, CcFilesPeer::ENCODED_BY, CcFilesPeer::DISC_NUMBER, CcFilesPeer::MOOD, CcFilesPeer::LABEL, CcFilesPeer::COMPOSER, CcFilesPeer::ENCODER, CcFilesPeer::CHECKSUM, CcFilesPeer::LYRICS, CcFilesPeer::ORCHESTRA, CcFilesPeer::CONDUCTOR, CcFilesPeer::LYRICIST, CcFilesPeer::ORIGINAL_LYRICIST, CcFilesPeer::RADIO_STATION_NAME, CcFilesPeer::INFO_URL, CcFilesPeer::ARTIST_URL, CcFilesPeer::AUDIO_SOURCE_URL, CcFilesPeer::RADIO_STATION_URL, CcFilesPeer::BUY_THIS_URL, CcFilesPeer::ISRC_NUMBER, CcFilesPeer::CATALOG_NUMBER, CcFilesPeer::ORIGINAL_ARTIST, CcFilesPeer::COPYRIGHT, CcFilesPeer::REPORT_DATETIME, CcFilesPeer::REPORT_LOCATION, CcFilesPeer::REPORT_ORGANIZATION, CcFilesPeer::SUBJECT, CcFilesPeer::CONTRIBUTOR, CcFilesPeer::LANGUAGE, CcFilesPeer::FILE_EXISTS, CcFilesPeer::SOUNDCLOUD_ID, CcFilesPeer::SOUNDCLOUD_ERROR_CODE, CcFilesPeer::SOUNDCLOUD_ERROR_MSG, CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE, CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, CcFilesPeer::REPLAY_GAIN, CcFilesPeer::OWNER_ID, CcFilesPeer::CUEIN, CcFilesPeer::CUEOUT, CcFilesPeer::SILAN_CHECK, CcFilesPeer::HIDDEN, CcFilesPeer::IS_SCHEDULED, CcFilesPeer::IS_PLAYLIST, CcFilesPeer::FILESIZE, CcFilesPeer::DESCRIPTION, CcFilesPeer::ARTWORK, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MIME', 'FTYPE', 'DIRECTORY', 'FILEPATH', 'IMPORT_STATUS', 'CURRENTLYACCESSING', 'EDITEDBY', 'MTIME', 'UTIME', 'LPTIME', 'MD5', 'TRACK_TITLE', 'ARTIST_NAME', 'BIT_RATE', 'SAMPLE_RATE', 'FORMAT', 'LENGTH', 'ALBUM_TITLE', 'GENRE', 'COMMENTS', 'YEAR', 'TRACK_NUMBER', 'CHANNELS', 'URL', 'BPM', 'RATING', 'ENCODED_BY', 'DISC_NUMBER', 'MOOD', 'LABEL', 'COMPOSER', 'ENCODER', 'CHECKSUM', 'LYRICS', 'ORCHESTRA', 'CONDUCTOR', 'LYRICIST', 'ORIGINAL_LYRICIST', 'RADIO_STATION_NAME', 'INFO_URL', 'ARTIST_URL', 'AUDIO_SOURCE_URL', 'RADIO_STATION_URL', 'BUY_THIS_URL', 'ISRC_NUMBER', 'CATALOG_NUMBER', 'ORIGINAL_ARTIST', 'COPYRIGHT', 'REPORT_DATETIME', 'REPORT_LOCATION', 'REPORT_ORGANIZATION', 'SUBJECT', 'CONTRIBUTOR', 'LANGUAGE', 'FILE_EXISTS', 'SOUNDCLOUD_ID', 'SOUNDCLOUD_ERROR_CODE', 'SOUNDCLOUD_ERROR_MSG', 'SOUNDCLOUD_LINK_TO_FILE', 'SOUNDCLOUD_UPLOAD_TIME', 'REPLAY_GAIN', 'OWNER_ID', 'CUEIN', 'CUEOUT', 'SILAN_CHECK', 'HIDDEN', 'IS_SCHEDULED', 'IS_PLAYLIST', 'FILESIZE', 'DESCRIPTION', 'ARTWORK', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mime', 'ftype', 'directory', 'filepath', 'import_status', 'currentlyaccessing', 'editedby', 'mtime', 'utime', 'lptime', 'md5', 'track_title', 'artist_name', 'bit_rate', 'sample_rate', 'format', 'length', 'album_title', 'genre', 'comments', 'year', 'track_number', 'channels', 'url', 'bpm', 'rating', 'encoded_by', 'disc_number', 'mood', 'label', 'composer', 'encoder', 'checksum', 'lyrics', 'orchestra', 'conductor', 'lyricist', 'original_lyricist', 'radio_station_name', 'info_url', 'artist_url', 'audio_source_url', 'radio_station_url', 'buy_this_url', 'isrc_number', 'catalog_number', 'original_artist', 'copyright', 'report_datetime', 'report_location', 'report_organization', 'subject', 'contributor', 'language', 'file_exists', 'soundcloud_id', 'soundcloud_error_code', 'soundcloud_error_msg', 'soundcloud_link_to_file', 'soundcloud_upload_time', 'replay_gain', 'owner_id', 'cuein', 'cueout', 'silan_check', 'hidden', 'is_scheduled', 'is_playlist', 'filesize', 'description', 'artwork', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, ) + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMime', 'DbFtype', 'DbDirectory', 'DbFilepath', 'DbImportStatus', 'DbCurrentlyaccessing', 'DbEditedby', 'DbMtime', 'DbUtime', 'DbLPtime', 'DbMd5', 'DbTrackTitle', 'DbArtistName', 'DbBitRate', 'DbSampleRate', 'DbFormat', 'DbLength', 'DbAlbumTitle', 'DbGenre', 'DbComments', 'DbYear', 'DbTrackNumber', 'DbChannels', 'DbUrl', 'DbBpm', 'DbRating', 'DbEncodedBy', 'DbDiscNumber', 'DbMood', 'DbLabel', 'DbComposer', 'DbEncoder', 'DbChecksum', 'DbLyrics', 'DbOrchestra', 'DbConductor', 'DbLyricist', 'DbOriginalLyricist', 'DbRadioStationName', 'DbInfoUrl', 'DbArtistUrl', 'DbAudioSourceUrl', 'DbRadioStationUrl', 'DbBuyThisUrl', 'DbIsrcNumber', 'DbCatalogNumber', 'DbOriginalArtist', 'DbCopyright', 'DbReportDatetime', 'DbReportLocation', 'DbReportOrganization', 'DbSubject', 'DbContributor', 'DbLanguage', 'DbFileExists', 'DbSoundcloudId', 'DbSoundcloudErrorCode', 'DbSoundcloudErrorMsg', 'DbSoundcloudLinkToFile', 'DbSoundCloundUploadTime', 'DbReplayGain', 'DbOwnerId', 'DbCuein', 'DbCueout', 'DbSilanCheck', 'DbHidden', 'DbIsScheduled', 'DbIsPlaylist', 'DbFilesize', 'DbDescription', 'DbArtwork', 'DbMediaType', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMime', 'dbFtype', 'dbDirectory', 'dbFilepath', 'dbImportStatus', 'dbCurrentlyaccessing', 'dbEditedby', 'dbMtime', 'dbUtime', 'dbLPtime', 'dbMd5', 'dbTrackTitle', 'dbArtistName', 'dbBitRate', 'dbSampleRate', 'dbFormat', 'dbLength', 'dbAlbumTitle', 'dbGenre', 'dbComments', 'dbYear', 'dbTrackNumber', 'dbChannels', 'dbUrl', 'dbBpm', 'dbRating', 'dbEncodedBy', 'dbDiscNumber', 'dbMood', 'dbLabel', 'dbComposer', 'dbEncoder', 'dbChecksum', 'dbLyrics', 'dbOrchestra', 'dbConductor', 'dbLyricist', 'dbOriginalLyricist', 'dbRadioStationName', 'dbInfoUrl', 'dbArtistUrl', 'dbAudioSourceUrl', 'dbRadioStationUrl', 'dbBuyThisUrl', 'dbIsrcNumber', 'dbCatalogNumber', 'dbOriginalArtist', 'dbCopyright', 'dbReportDatetime', 'dbReportLocation', 'dbReportOrganization', 'dbSubject', 'dbContributor', 'dbLanguage', 'dbFileExists', 'dbSoundcloudId', 'dbSoundcloudErrorCode', 'dbSoundcloudErrorMsg', 'dbSoundcloudLinkToFile', 'dbSoundCloundUploadTime', 'dbReplayGain', 'dbOwnerId', 'dbCuein', 'dbCueout', 'dbSilanCheck', 'dbHidden', 'dbIsScheduled', 'dbIsPlaylist', 'dbFilesize', 'dbDescription', 'dbArtwork', 'dbMediaType', ), + BasePeer::TYPE_COLNAME => array (CcFilesPeer::ID, CcFilesPeer::NAME, CcFilesPeer::MIME, CcFilesPeer::FTYPE, CcFilesPeer::DIRECTORY, CcFilesPeer::FILEPATH, CcFilesPeer::IMPORT_STATUS, CcFilesPeer::CURRENTLYACCESSING, CcFilesPeer::EDITEDBY, CcFilesPeer::MTIME, CcFilesPeer::UTIME, CcFilesPeer::LPTIME, CcFilesPeer::MD5, CcFilesPeer::TRACK_TITLE, CcFilesPeer::ARTIST_NAME, CcFilesPeer::BIT_RATE, CcFilesPeer::SAMPLE_RATE, CcFilesPeer::FORMAT, CcFilesPeer::LENGTH, CcFilesPeer::ALBUM_TITLE, CcFilesPeer::GENRE, CcFilesPeer::COMMENTS, CcFilesPeer::YEAR, CcFilesPeer::TRACK_NUMBER, CcFilesPeer::CHANNELS, CcFilesPeer::URL, CcFilesPeer::BPM, CcFilesPeer::RATING, CcFilesPeer::ENCODED_BY, CcFilesPeer::DISC_NUMBER, CcFilesPeer::MOOD, CcFilesPeer::LABEL, CcFilesPeer::COMPOSER, CcFilesPeer::ENCODER, CcFilesPeer::CHECKSUM, CcFilesPeer::LYRICS, CcFilesPeer::ORCHESTRA, CcFilesPeer::CONDUCTOR, CcFilesPeer::LYRICIST, CcFilesPeer::ORIGINAL_LYRICIST, CcFilesPeer::RADIO_STATION_NAME, CcFilesPeer::INFO_URL, CcFilesPeer::ARTIST_URL, CcFilesPeer::AUDIO_SOURCE_URL, CcFilesPeer::RADIO_STATION_URL, CcFilesPeer::BUY_THIS_URL, CcFilesPeer::ISRC_NUMBER, CcFilesPeer::CATALOG_NUMBER, CcFilesPeer::ORIGINAL_ARTIST, CcFilesPeer::COPYRIGHT, CcFilesPeer::REPORT_DATETIME, CcFilesPeer::REPORT_LOCATION, CcFilesPeer::REPORT_ORGANIZATION, CcFilesPeer::SUBJECT, CcFilesPeer::CONTRIBUTOR, CcFilesPeer::LANGUAGE, CcFilesPeer::FILE_EXISTS, CcFilesPeer::SOUNDCLOUD_ID, CcFilesPeer::SOUNDCLOUD_ERROR_CODE, CcFilesPeer::SOUNDCLOUD_ERROR_MSG, CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE, CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, CcFilesPeer::REPLAY_GAIN, CcFilesPeer::OWNER_ID, CcFilesPeer::CUEIN, CcFilesPeer::CUEOUT, CcFilesPeer::SILAN_CHECK, CcFilesPeer::HIDDEN, CcFilesPeer::IS_SCHEDULED, CcFilesPeer::IS_PLAYLIST, CcFilesPeer::FILESIZE, CcFilesPeer::DESCRIPTION, CcFilesPeer::ARTWORK, CcFilesPeer::MEDIA_TYPE, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MIME', 'FTYPE', 'DIRECTORY', 'FILEPATH', 'IMPORT_STATUS', 'CURRENTLYACCESSING', 'EDITEDBY', 'MTIME', 'UTIME', 'LPTIME', 'MD5', 'TRACK_TITLE', 'ARTIST_NAME', 'BIT_RATE', 'SAMPLE_RATE', 'FORMAT', 'LENGTH', 'ALBUM_TITLE', 'GENRE', 'COMMENTS', 'YEAR', 'TRACK_NUMBER', 'CHANNELS', 'URL', 'BPM', 'RATING', 'ENCODED_BY', 'DISC_NUMBER', 'MOOD', 'LABEL', 'COMPOSER', 'ENCODER', 'CHECKSUM', 'LYRICS', 'ORCHESTRA', 'CONDUCTOR', 'LYRICIST', 'ORIGINAL_LYRICIST', 'RADIO_STATION_NAME', 'INFO_URL', 'ARTIST_URL', 'AUDIO_SOURCE_URL', 'RADIO_STATION_URL', 'BUY_THIS_URL', 'ISRC_NUMBER', 'CATALOG_NUMBER', 'ORIGINAL_ARTIST', 'COPYRIGHT', 'REPORT_DATETIME', 'REPORT_LOCATION', 'REPORT_ORGANIZATION', 'SUBJECT', 'CONTRIBUTOR', 'LANGUAGE', 'FILE_EXISTS', 'SOUNDCLOUD_ID', 'SOUNDCLOUD_ERROR_CODE', 'SOUNDCLOUD_ERROR_MSG', 'SOUNDCLOUD_LINK_TO_FILE', 'SOUNDCLOUD_UPLOAD_TIME', 'REPLAY_GAIN', 'OWNER_ID', 'CUEIN', 'CUEOUT', 'SILAN_CHECK', 'HIDDEN', 'IS_SCHEDULED', 'IS_PLAYLIST', 'FILESIZE', 'DESCRIPTION', 'ARTWORK', 'MEDIA_TYPE', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mime', 'ftype', 'directory', 'filepath', 'import_status', 'currentlyaccessing', 'editedby', 'mtime', 'utime', 'lptime', 'md5', 'track_title', 'artist_name', 'bit_rate', 'sample_rate', 'format', 'length', 'album_title', 'genre', 'comments', 'year', 'track_number', 'channels', 'url', 'bpm', 'rating', 'encoded_by', 'disc_number', 'mood', 'label', 'composer', 'encoder', 'checksum', 'lyrics', 'orchestra', 'conductor', 'lyricist', 'original_lyricist', 'radio_station_name', 'info_url', 'artist_url', 'audio_source_url', 'radio_station_url', 'buy_this_url', 'isrc_number', 'catalog_number', 'original_artist', 'copyright', 'report_datetime', 'report_location', 'report_organization', 'subject', 'contributor', 'language', 'file_exists', 'soundcloud_id', 'soundcloud_error_code', 'soundcloud_error_msg', 'soundcloud_link_to_file', 'soundcloud_upload_time', 'replay_gain', 'owner_id', 'cuein', 'cueout', 'silan_check', 'hidden', 'is_scheduled', 'is_playlist', 'filesize', 'description', 'artwork', 'media_type', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ) ); /** @@ -285,12 +288,12 @@ abstract class BaseCcFilesPeer * e.g. CcFilesPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ protected static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMime' => 2, 'DbFtype' => 3, 'DbDirectory' => 4, 'DbFilepath' => 5, 'DbImportStatus' => 6, 'DbCurrentlyaccessing' => 7, 'DbEditedby' => 8, 'DbMtime' => 9, 'DbUtime' => 10, 'DbLPtime' => 11, 'DbMd5' => 12, 'DbTrackTitle' => 13, 'DbArtistName' => 14, 'DbBitRate' => 15, 'DbSampleRate' => 16, 'DbFormat' => 17, 'DbLength' => 18, 'DbAlbumTitle' => 19, 'DbGenre' => 20, 'DbComments' => 21, 'DbYear' => 22, 'DbTrackNumber' => 23, 'DbChannels' => 24, 'DbUrl' => 25, 'DbBpm' => 26, 'DbRating' => 27, 'DbEncodedBy' => 28, 'DbDiscNumber' => 29, 'DbMood' => 30, 'DbLabel' => 31, 'DbComposer' => 32, 'DbEncoder' => 33, 'DbChecksum' => 34, 'DbLyrics' => 35, 'DbOrchestra' => 36, 'DbConductor' => 37, 'DbLyricist' => 38, 'DbOriginalLyricist' => 39, 'DbRadioStationName' => 40, 'DbInfoUrl' => 41, 'DbArtistUrl' => 42, 'DbAudioSourceUrl' => 43, 'DbRadioStationUrl' => 44, 'DbBuyThisUrl' => 45, 'DbIsrcNumber' => 46, 'DbCatalogNumber' => 47, 'DbOriginalArtist' => 48, 'DbCopyright' => 49, 'DbReportDatetime' => 50, 'DbReportLocation' => 51, 'DbReportOrganization' => 52, 'DbSubject' => 53, 'DbContributor' => 54, 'DbLanguage' => 55, 'DbFileExists' => 56, 'DbSoundcloudId' => 57, 'DbSoundcloudErrorCode' => 58, 'DbSoundcloudErrorMsg' => 59, 'DbSoundcloudLinkToFile' => 60, 'DbSoundCloundUploadTime' => 61, 'DbReplayGain' => 62, 'DbOwnerId' => 63, 'DbCuein' => 64, 'DbCueout' => 65, 'DbSilanCheck' => 66, 'DbHidden' => 67, 'DbIsScheduled' => 68, 'DbIsPlaylist' => 69, 'DbFilesize' => 70, 'DbDescription' => 71, 'DbArtwork' => 72, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMime' => 2, 'dbFtype' => 3, 'dbDirectory' => 4, 'dbFilepath' => 5, 'dbImportStatus' => 6, 'dbCurrentlyaccessing' => 7, 'dbEditedby' => 8, 'dbMtime' => 9, 'dbUtime' => 10, 'dbLPtime' => 11, 'dbMd5' => 12, 'dbTrackTitle' => 13, 'dbArtistName' => 14, 'dbBitRate' => 15, 'dbSampleRate' => 16, 'dbFormat' => 17, 'dbLength' => 18, 'dbAlbumTitle' => 19, 'dbGenre' => 20, 'dbComments' => 21, 'dbYear' => 22, 'dbTrackNumber' => 23, 'dbChannels' => 24, 'dbUrl' => 25, 'dbBpm' => 26, 'dbRating' => 27, 'dbEncodedBy' => 28, 'dbDiscNumber' => 29, 'dbMood' => 30, 'dbLabel' => 31, 'dbComposer' => 32, 'dbEncoder' => 33, 'dbChecksum' => 34, 'dbLyrics' => 35, 'dbOrchestra' => 36, 'dbConductor' => 37, 'dbLyricist' => 38, 'dbOriginalLyricist' => 39, 'dbRadioStationName' => 40, 'dbInfoUrl' => 41, 'dbArtistUrl' => 42, 'dbAudioSourceUrl' => 43, 'dbRadioStationUrl' => 44, 'dbBuyThisUrl' => 45, 'dbIsrcNumber' => 46, 'dbCatalogNumber' => 47, 'dbOriginalArtist' => 48, 'dbCopyright' => 49, 'dbReportDatetime' => 50, 'dbReportLocation' => 51, 'dbReportOrganization' => 52, 'dbSubject' => 53, 'dbContributor' => 54, 'dbLanguage' => 55, 'dbFileExists' => 56, 'dbSoundcloudId' => 57, 'dbSoundcloudErrorCode' => 58, 'dbSoundcloudErrorMsg' => 59, 'dbSoundcloudLinkToFile' => 60, 'dbSoundCloundUploadTime' => 61, 'dbReplayGain' => 62, 'dbOwnerId' => 63, 'dbCuein' => 64, 'dbCueout' => 65, 'dbSilanCheck' => 66, 'dbHidden' => 67, 'dbIsScheduled' => 68, 'dbIsPlaylist' => 69, 'dbFilesize' => 70, 'dbDescription' => 71, 'dbArtwork' => 72, ), + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMime' => 2, 'DbFtype' => 3, 'DbDirectory' => 4, 'DbFilepath' => 5, 'DbImportStatus' => 6, 'DbCurrentlyaccessing' => 7, 'DbEditedby' => 8, 'DbMtime' => 9, 'DbUtime' => 10, 'DbLPtime' => 11, 'DbMd5' => 12, 'DbTrackTitle' => 13, 'DbArtistName' => 14, 'DbBitRate' => 15, 'DbSampleRate' => 16, 'DbFormat' => 17, 'DbLength' => 18, 'DbAlbumTitle' => 19, 'DbGenre' => 20, 'DbComments' => 21, 'DbYear' => 22, 'DbTrackNumber' => 23, 'DbChannels' => 24, 'DbUrl' => 25, 'DbBpm' => 26, 'DbRating' => 27, 'DbEncodedBy' => 28, 'DbDiscNumber' => 29, 'DbMood' => 30, 'DbLabel' => 31, 'DbComposer' => 32, 'DbEncoder' => 33, 'DbChecksum' => 34, 'DbLyrics' => 35, 'DbOrchestra' => 36, 'DbConductor' => 37, 'DbLyricist' => 38, 'DbOriginalLyricist' => 39, 'DbRadioStationName' => 40, 'DbInfoUrl' => 41, 'DbArtistUrl' => 42, 'DbAudioSourceUrl' => 43, 'DbRadioStationUrl' => 44, 'DbBuyThisUrl' => 45, 'DbIsrcNumber' => 46, 'DbCatalogNumber' => 47, 'DbOriginalArtist' => 48, 'DbCopyright' => 49, 'DbReportDatetime' => 50, 'DbReportLocation' => 51, 'DbReportOrganization' => 52, 'DbSubject' => 53, 'DbContributor' => 54, 'DbLanguage' => 55, 'DbFileExists' => 56, 'DbSoundcloudId' => 57, 'DbSoundcloudErrorCode' => 58, 'DbSoundcloudErrorMsg' => 59, 'DbSoundcloudLinkToFile' => 60, 'DbSoundCloundUploadTime' => 61, 'DbReplayGain' => 62, 'DbOwnerId' => 63, 'DbCuein' => 64, 'DbCueout' => 65, 'DbSilanCheck' => 66, 'DbHidden' => 67, 'DbIsScheduled' => 68, 'DbIsPlaylist' => 69, 'DbFilesize' => 70, 'DbDescription' => 71, 'DbArtwork' => 72, 'DbMediaType' => 73, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMime' => 2, 'dbFtype' => 3, 'dbDirectory' => 4, 'dbFilepath' => 5, 'dbImportStatus' => 6, 'dbCurrentlyaccessing' => 7, 'dbEditedby' => 8, 'dbMtime' => 9, 'dbUtime' => 10, 'dbLPtime' => 11, 'dbMd5' => 12, 'dbTrackTitle' => 13, 'dbArtistName' => 14, 'dbBitRate' => 15, 'dbSampleRate' => 16, 'dbFormat' => 17, 'dbLength' => 18, 'dbAlbumTitle' => 19, 'dbGenre' => 20, 'dbComments' => 21, 'dbYear' => 22, 'dbTrackNumber' => 23, 'dbChannels' => 24, 'dbUrl' => 25, 'dbBpm' => 26, 'dbRating' => 27, 'dbEncodedBy' => 28, 'dbDiscNumber' => 29, 'dbMood' => 30, 'dbLabel' => 31, 'dbComposer' => 32, 'dbEncoder' => 33, 'dbChecksum' => 34, 'dbLyrics' => 35, 'dbOrchestra' => 36, 'dbConductor' => 37, 'dbLyricist' => 38, 'dbOriginalLyricist' => 39, 'dbRadioStationName' => 40, 'dbInfoUrl' => 41, 'dbArtistUrl' => 42, 'dbAudioSourceUrl' => 43, 'dbRadioStationUrl' => 44, 'dbBuyThisUrl' => 45, 'dbIsrcNumber' => 46, 'dbCatalogNumber' => 47, 'dbOriginalArtist' => 48, 'dbCopyright' => 49, 'dbReportDatetime' => 50, 'dbReportLocation' => 51, 'dbReportOrganization' => 52, 'dbSubject' => 53, 'dbContributor' => 54, 'dbLanguage' => 55, 'dbFileExists' => 56, 'dbSoundcloudId' => 57, 'dbSoundcloudErrorCode' => 58, 'dbSoundcloudErrorMsg' => 59, 'dbSoundcloudLinkToFile' => 60, 'dbSoundCloundUploadTime' => 61, 'dbReplayGain' => 62, 'dbOwnerId' => 63, 'dbCuein' => 64, 'dbCueout' => 65, 'dbSilanCheck' => 66, 'dbHidden' => 67, 'dbIsScheduled' => 68, 'dbIsPlaylist' => 69, 'dbFilesize' => 70, 'dbDescription' => 71, 'dbArtwork' => 72, 'dbMediaType' => 73, ), BasePeer::TYPE_COLNAME => array (CcFilesPeer::ID => 0, CcFilesPeer::NAME => 1, CcFilesPeer::MIME => 2, CcFilesPeer::FTYPE => 3, CcFilesPeer::DIRECTORY => 4, CcFilesPeer::FILEPATH => 5, CcFilesPeer::IMPORT_STATUS => 6, CcFilesPeer::CURRENTLYACCESSING => 7, CcFilesPeer::EDITEDBY => 8, CcFilesPeer::MTIME => 9, CcFilesPeer::UTIME => 10, CcFilesPeer::LPTIME => 11, CcFilesPeer::MD5 => 12, CcFilesPeer::TRACK_TITLE => 13, CcFilesPeer::ARTIST_NAME => 14, CcFilesPeer::BIT_RATE => 15, CcFilesPeer::SAMPLE_RATE => 16, CcFilesPeer::FORMAT => 17, CcFilesPeer::LENGTH => 18, CcFilesPeer::ALBUM_TITLE => 19, CcFilesPeer::GENRE => 20, CcFilesPeer::COMMENTS => 21, CcFilesPeer::YEAR => 22, CcFilesPeer::TRACK_NUMBER => 23, CcFilesPeer::CHANNELS => 24, CcFilesPeer::URL => 25, CcFilesPeer::BPM => 26, CcFilesPeer::RATING => 27, CcFilesPeer::ENCODED_BY => 28, CcFilesPeer::DISC_NUMBER => 29, CcFilesPeer::MOOD => 30, CcFilesPeer::LABEL => 31, CcFilesPeer::COMPOSER => 32, CcFilesPeer::ENCODER => 33, CcFilesPeer::CHECKSUM => 34, CcFilesPeer::LYRICS => 35, CcFilesPeer::ORCHESTRA => 36, CcFilesPeer::CONDUCTOR => 37, CcFilesPeer::LYRICIST => 38, CcFilesPeer::ORIGINAL_LYRICIST => 39, CcFilesPeer::RADIO_STATION_NAME => 40, CcFilesPeer::INFO_URL => 41, CcFilesPeer::ARTIST_URL => 42, CcFilesPeer::AUDIO_SOURCE_URL => 43, CcFilesPeer::RADIO_STATION_URL => 44, CcFilesPeer::BUY_THIS_URL => 45, CcFilesPeer::ISRC_NUMBER => 46, CcFilesPeer::CATALOG_NUMBER => 47, CcFilesPeer::ORIGINAL_ARTIST => 48, CcFilesPeer::COPYRIGHT => 49, CcFilesPeer::REPORT_DATETIME => 50, CcFilesPeer::REPORT_LOCATION => 51, CcFilesPeer::REPORT_ORGANIZATION => 52, CcFilesPeer::SUBJECT => 53, CcFilesPeer::CONTRIBUTOR => 54, CcFilesPeer::LANGUAGE => 55, CcFilesPeer::FILE_EXISTS => 56, CcFilesPeer::SOUNDCLOUD_ID => 57, CcFilesPeer::SOUNDCLOUD_ERROR_CODE => 58, CcFilesPeer::SOUNDCLOUD_ERROR_MSG => 59, CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE => 60, CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME => 61, CcFilesPeer::REPLAY_GAIN => 62, CcFilesPeer::OWNER_ID => 63, CcFilesPeer::CUEIN => 64, CcFilesPeer::CUEOUT => 65, CcFilesPeer::SILAN_CHECK => 66, CcFilesPeer::HIDDEN => 67, CcFilesPeer::IS_SCHEDULED => 68, CcFilesPeer::IS_PLAYLIST => 69, CcFilesPeer::FILESIZE => 70, CcFilesPeer::DESCRIPTION => 71, CcFilesPeer::DESCRIPTION => 72, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MIME' => 2, 'FTYPE' => 3, 'DIRECTORY' => 4, 'FILEPATH' => 5, 'IMPORT_STATUS' => 6, 'CURRENTLYACCESSING' => 7, 'EDITEDBY' => 8, 'MTIME' => 9, 'UTIME' => 10, 'LPTIME' => 11, 'MD5' => 12, 'TRACK_TITLE' => 13, 'ARTIST_NAME' => 14, 'BIT_RATE' => 15, 'SAMPLE_RATE' => 16, 'FORMAT' => 17, 'LENGTH' => 18, 'ALBUM_TITLE' => 19, 'GENRE' => 20, 'COMMENTS' => 21, 'YEAR' => 22, 'TRACK_NUMBER' => 23, 'CHANNELS' => 24, 'URL' => 25, 'BPM' => 26, 'RATING' => 27, 'ENCODED_BY' => 28, 'DISC_NUMBER' => 29, 'MOOD' => 30, 'LABEL' => 31, 'COMPOSER' => 32, 'ENCODER' => 33, 'CHECKSUM' => 34, 'LYRICS' => 35, 'ORCHESTRA' => 36, 'CONDUCTOR' => 37, 'LYRICIST' => 38, 'ORIGINAL_LYRICIST' => 39, 'RADIO_STATION_NAME' => 40, 'INFO_URL' => 41, 'ARTIST_URL' => 42, 'AUDIO_SOURCE_URL' => 43, 'RADIO_STATION_URL' => 44, 'BUY_THIS_URL' => 45, 'ISRC_NUMBER' => 46, 'CATALOG_NUMBER' => 47, 'ORIGINAL_ARTIST' => 48, 'COPYRIGHT' => 49, 'REPORT_DATETIME' => 50, 'REPORT_LOCATION' => 51, 'REPORT_ORGANIZATION' => 52, 'SUBJECT' => 53, 'CONTRIBUTOR' => 54, 'LANGUAGE' => 55, 'FILE_EXISTS' => 56, 'SOUNDCLOUD_ID' => 57, 'SOUNDCLOUD_ERROR_CODE' => 58, 'SOUNDCLOUD_ERROR_MSG' => 59, 'SOUNDCLOUD_LINK_TO_FILE' => 60, 'SOUNDCLOUD_UPLOAD_TIME' => 61, 'REPLAY_GAIN' => 62, 'OWNER_ID' => 63, 'CUEIN' => 64, 'CUEOUT' => 65, 'SILAN_CHECK' => 66, 'HIDDEN' => 67, 'IS_SCHEDULED' => 68, 'IS_PLAYLIST' => 69, 'FILESIZE' => 70, 'DESCRIPTION' => 71, 'ARTWORK' => 72, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mime' => 2, 'ftype' => 3, 'directory' => 4, 'filepath' => 5, 'import_status' => 6, 'currentlyaccessing' => 7, 'editedby' => 8, 'mtime' => 9, 'utime' => 10, 'lptime' => 11, 'md5' => 12, 'track_title' => 13, 'artist_name' => 14, 'bit_rate' => 15, 'sample_rate' => 16, 'format' => 17, 'length' => 18, 'album_title' => 19, 'genre' => 20, 'comments' => 21, 'year' => 22, 'track_number' => 23, 'channels' => 24, 'url' => 25, 'bpm' => 26, 'rating' => 27, 'encoded_by' => 28, 'disc_number' => 29, 'mood' => 30, 'label' => 31, 'composer' => 32, 'encoder' => 33, 'checksum' => 34, 'lyrics' => 35, 'orchestra' => 36, 'conductor' => 37, 'lyricist' => 38, 'original_lyricist' => 39, 'radio_station_name' => 40, 'info_url' => 41, 'artist_url' => 42, 'audio_source_url' => 43, 'radio_station_url' => 44, 'buy_this_url' => 45, 'isrc_number' => 46, 'catalog_number' => 47, 'original_artist' => 48, 'copyright' => 49, 'report_datetime' => 50, 'report_location' => 51, 'report_organization' => 52, 'subject' => 53, 'contributor' => 54, 'language' => 55, 'file_exists' => 56, 'soundcloud_id' => 57, 'soundcloud_error_code' => 58, 'soundcloud_error_msg' => 59, 'soundcloud_link_to_file' => 60, 'soundcloud_upload_time' => 61, 'replay_gain' => 62, 'owner_id' => 63, 'cuein' => 64, 'cueout' => 65, 'silan_check' => 66, 'hidden' => 67, 'is_scheduled' => 68, 'is_playlist' => 69, 'filesize' => 70, 'description' => 71, 'artwork' => 72, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, ) + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MIME' => 2, 'FTYPE' => 3, 'DIRECTORY' => 4, 'FILEPATH' => 5, 'IMPORT_STATUS' => 6, 'CURRENTLYACCESSING' => 7, 'EDITEDBY' => 8, 'MTIME' => 9, 'UTIME' => 10, 'LPTIME' => 11, 'MD5' => 12, 'TRACK_TITLE' => 13, 'ARTIST_NAME' => 14, 'BIT_RATE' => 15, 'SAMPLE_RATE' => 16, 'FORMAT' => 17, 'LENGTH' => 18, 'ALBUM_TITLE' => 19, 'GENRE' => 20, 'COMMENTS' => 21, 'YEAR' => 22, 'TRACK_NUMBER' => 23, 'CHANNELS' => 24, 'URL' => 25, 'BPM' => 26, 'RATING' => 27, 'ENCODED_BY' => 28, 'DISC_NUMBER' => 29, 'MOOD' => 30, 'LABEL' => 31, 'COMPOSER' => 32, 'ENCODER' => 33, 'CHECKSUM' => 34, 'LYRICS' => 35, 'ORCHESTRA' => 36, 'CONDUCTOR' => 37, 'LYRICIST' => 38, 'ORIGINAL_LYRICIST' => 39, 'RADIO_STATION_NAME' => 40, 'INFO_URL' => 41, 'ARTIST_URL' => 42, 'AUDIO_SOURCE_URL' => 43, 'RADIO_STATION_URL' => 44, 'BUY_THIS_URL' => 45, 'ISRC_NUMBER' => 46, 'CATALOG_NUMBER' => 47, 'ORIGINAL_ARTIST' => 48, 'COPYRIGHT' => 49, 'REPORT_DATETIME' => 50, 'REPORT_LOCATION' => 51, 'REPORT_ORGANIZATION' => 52, 'SUBJECT' => 53, 'CONTRIBUTOR' => 54, 'LANGUAGE' => 55, 'FILE_EXISTS' => 56, 'SOUNDCLOUD_ID' => 57, 'SOUNDCLOUD_ERROR_CODE' => 58, 'SOUNDCLOUD_ERROR_MSG' => 59, 'SOUNDCLOUD_LINK_TO_FILE' => 60, 'SOUNDCLOUD_UPLOAD_TIME' => 61, 'REPLAY_GAIN' => 62, 'OWNER_ID' => 63, 'CUEIN' => 64, 'CUEOUT' => 65, 'SILAN_CHECK' => 66, 'HIDDEN' => 67, 'IS_SCHEDULED' => 68, 'IS_PLAYLIST' => 69, 'FILESIZE' => 70, 'DESCRIPTION' => 71, 'ARTWORK' => 72, 'MEDIA_TYPE' => 73, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mime' => 2, 'ftype' => 3, 'directory' => 4, 'filepath' => 5, 'import_status' => 6, 'currentlyaccessing' => 7, 'editedby' => 8, 'mtime' => 9, 'utime' => 10, 'lptime' => 11, 'md5' => 12, 'track_title' => 13, 'artist_name' => 14, 'bit_rate' => 15, 'sample_rate' => 16, 'format' => 17, 'length' => 18, 'album_title' => 19, 'genre' => 20, 'comments' => 21, 'year' => 22, 'track_number' => 23, 'channels' => 24, 'url' => 25, 'bpm' => 26, 'rating' => 27, 'encoded_by' => 28, 'disc_number' => 29, 'mood' => 30, 'label' => 31, 'composer' => 32, 'encoder' => 33, 'checksum' => 34, 'lyrics' => 35, 'orchestra' => 36, 'conductor' => 37, 'lyricist' => 38, 'original_lyricist' => 39, 'radio_station_name' => 40, 'info_url' => 41, 'artist_url' => 42, 'audio_source_url' => 43, 'radio_station_url' => 44, 'buy_this_url' => 45, 'isrc_number' => 46, 'catalog_number' => 47, 'original_artist' => 48, 'copyright' => 49, 'report_datetime' => 50, 'report_location' => 51, 'report_organization' => 52, 'subject' => 53, 'contributor' => 54, 'language' => 55, 'file_exists' => 56, 'soundcloud_id' => 57, 'soundcloud_error_code' => 58, 'soundcloud_error_msg' => 59, 'soundcloud_link_to_file' => 60, 'soundcloud_upload_time' => 61, 'replay_gain' => 62, 'owner_id' => 63, 'cuein' => 64, 'cueout' => 65, 'silan_check' => 66, 'hidden' => 67, 'is_scheduled' => 68, 'is_playlist' => 69, 'filesize' => 70, 'description' => 71, 'artwork' => 72, 'media_type' => 73, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ) ); /** @@ -437,6 +440,7 @@ abstract class BaseCcFilesPeer $criteria->addSelectColumn(CcFilesPeer::FILESIZE); $criteria->addSelectColumn(CcFilesPeer::DESCRIPTION); $criteria->addSelectColumn(CcFilesPeer::ARTWORK); + $criteria->addSelectColumn(CcFilesPeer::MEDIA_TYPE); } else { $criteria->addSelectColumn($alias . '.id'); $criteria->addSelectColumn($alias . '.name'); @@ -511,6 +515,7 @@ abstract class BaseCcFilesPeer $criteria->addSelectColumn($alias . '.filesize'); $criteria->addSelectColumn($alias . '.description'); $criteria->addSelectColumn($alias . '.artwork'); + $criteria->addSelectColumn($alias . '.media_type'); } } diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php index 6c5afc688..f026dee8a 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php @@ -79,6 +79,7 @@ * @method CcFilesQuery orderByDbFilesize($order = Criteria::ASC) Order by the filesize column * @method CcFilesQuery orderByDbDescription($order = Criteria::ASC) Order by the description column * @method CcFilesQuery orderByDbArtwork($order = Criteria::ASC) Order by the artwork column + * @method CcFilesQuery orderByDbMediaType($order = Criteria::ASC) Order by the media_type column * * @method CcFilesQuery groupByDbId() Group by the id column * @method CcFilesQuery groupByDbName() Group by the name column @@ -153,6 +154,7 @@ * @method CcFilesQuery groupByDbFilesize() Group by the filesize column * @method CcFilesQuery groupByDbDescription() Group by the description column * @method CcFilesQuery groupByDbArtwork() Group by the artwork column + * @method CcFilesQuery groupByDbMediaType() Group by the media_type column * * @method CcFilesQuery leftJoin($relation) Adds a LEFT JOIN clause to the query * @method CcFilesQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query @@ -277,6 +279,7 @@ * @method CcFiles findOneByDbFilesize(int $filesize) Return the first CcFiles filtered by the filesize column * @method CcFiles findOneByDbDescription(string $description) Return the first CcFiles filtered by the description column * @method CcFiles findOneByDbArtwork(string $artwork) Return the first CcFiles filtered by the artwork column + * @method CcFiles findOneByDbMediaType(string $media_type) Return the first CcFiles filtered by the media_type column * * @method array findByDbId(int $id) Return CcFiles objects filtered by the id column * @method array findByDbName(string $name) Return CcFiles objects filtered by the name column @@ -351,6 +354,7 @@ * @method array findByDbFilesize(int $filesize) Return CcFiles objects filtered by the filesize column * @method array findByDbDescription(string $description) Return CcFiles objects filtered by the description column * @method array findByDbArtwork(string $artwork) Return CcFiles objects filtered by the artwork column + * @method array findByDbMediaType(string $media_type) Return CcFiles objects filtered by the media_type column * * @package propel.generator.airtime.om */ @@ -458,7 +462,7 @@ abstract class BaseCcFilesQuery extends ModelCriteria */ protected function findPkSimple($key, $con) { - $sql = 'SELECT "id", "name", "mime", "ftype", "directory", "filepath", "import_status", "currentlyaccessing", "editedby", "mtime", "utime", "lptime", "md5", "track_title", "artist_name", "bit_rate", "sample_rate", "format", "length", "album_title", "genre", "comments", "year", "track_number", "channels", "url", "bpm", "rating", "encoded_by", "disc_number", "mood", "label", "composer", "encoder", "checksum", "lyrics", "orchestra", "conductor", "lyricist", "original_lyricist", "radio_station_name", "info_url", "artist_url", "audio_source_url", "radio_station_url", "buy_this_url", "isrc_number", "catalog_number", "original_artist", "copyright", "report_datetime", "report_location", "report_organization", "subject", "contributor", "language", "file_exists", "soundcloud_id", "soundcloud_error_code", "soundcloud_error_msg", "soundcloud_link_to_file", "soundcloud_upload_time", "replay_gain", "owner_id", "cuein", "cueout", "silan_check", "hidden", "is_scheduled", "is_playlist", "filesize", "description", "artwork" FROM "cc_files" WHERE "id" = :p0'; + $sql = 'SELECT "id", "name", "mime", "ftype", "directory", "filepath", "import_status", "currentlyaccessing", "editedby", "mtime", "utime", "lptime", "md5", "track_title", "artist_name", "bit_rate", "sample_rate", "format", "length", "album_title", "genre", "comments", "year", "track_number", "channels", "url", "bpm", "rating", "encoded_by", "disc_number", "mood", "label", "composer", "encoder", "checksum", "lyrics", "orchestra", "conductor", "lyricist", "original_lyricist", "radio_station_name", "info_url", "artist_url", "audio_source_url", "radio_station_url", "buy_this_url", "isrc_number", "catalog_number", "original_artist", "copyright", "report_datetime", "report_location", "report_organization", "subject", "contributor", "language", "file_exists", "soundcloud_id", "soundcloud_error_code", "soundcloud_error_msg", "soundcloud_link_to_file", "soundcloud_upload_time", "replay_gain", "owner_id", "cuein", "cueout", "silan_check", "hidden", "is_scheduled", "is_playlist", "filesize", "description", "artwork", "media_type" FROM "cc_files" WHERE "id" = :p0'; try { $stmt = $con->prepare($sql); $stmt->bindValue(':p0', $key, PDO::PARAM_INT); @@ -1970,6 +1974,35 @@ abstract class BaseCcFilesQuery extends ModelCriteria return $this->addUsingAlias(CcFilesPeer::ARTWORK, $dbArtwork, $comparison); } + /** + * Filter the query on the media_type column + * + * Example usage: + * + * $query->filterByDbMediaType('fooValue'); // WHERE media_type = 'fooValue' + * $query->filterByDbMediaType('%fooValue%'); // WHERE media_type LIKE '%fooValue%' + * + * + * @param string $dbMediaType 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 CcFilesQuery The current query, for fluid interface + */ + public function filterByDbMediaType($dbMediaType = null, $comparison = null) + { + if (null === $comparison) { + if (is_array($dbMediaType)) { + $comparison = Criteria::IN; + } elseif (preg_match('/[\%\*]/', $dbMediaType)) { + $dbMediaType = str_replace('*', '%', $dbMediaType); + $comparison = Criteria::LIKE; + } + } + + return $this->addUsingAlias(CcFilesPeer::MEDIA_TYPE, $dbMediaType, $comparison); + } + /** * Filter the query on the artist_url column * diff --git a/airtime_mvc/application/services/HistoryService.php b/airtime_mvc/application/services/HistoryService.php index 4ac58e2ed..9fb1d3108 100644 --- a/airtime_mvc/application/services/HistoryService.php +++ b/airtime_mvc/application/services/HistoryService.php @@ -516,41 +516,41 @@ class Application_Service_HistoryService return $filteredShows; } - + public function insertWebstreamMetadata($schedId, $startDT, $data) { - + $this->con->beginTransaction(); - + try { - + $item = CcScheduleQuery::create()->findPK($schedId, $this->con); - + //TODO figure out how to combine these all into 1 query. $showInstance = $item->getCcShowInstances($this->con); $show = $showInstance->getCcShow($this->con); - + $webstream = $item->getCcWebstream($this->con); - + $metadata = array(); $metadata["showname"] = $show->getDbName(); $metadata[MDATA_KEY_TITLE] = $data->title; $metadata[MDATA_KEY_CREATOR] = $webstream->getDbName(); - + $history = new CcPlayoutHistory(); $history->setDbStarts($startDT); $history->setDbEnds(null); $history->setDbInstanceId($item->getDbInstanceId()); - + foreach ($metadata as $key => $val) { $meta = new CcPlayoutHistoryMetaData(); $meta->setDbKey($key); $meta->setDbValue($val); - + $history->addCcPlayoutHistoryMetaData($meta); } - + $history->save($this->con); - + $this->con->commit(); } catch (Exception $e) { @@ -586,36 +586,36 @@ class Application_Service_HistoryService $itemEnd = $item->getDbEnds(null); $recordStart = $item->getDbStarts(null); $recordEnd = ($instanceEnd < $itemEnd) ? $instanceEnd : $itemEnd; - + //first check if this is a duplicate // (caused by restarting liquidsoap) - + $prevRecord = CcPlayoutHistoryQuery::create() ->filterByDbStarts($recordStart) ->filterByDbEnds($recordEnd) ->filterByDbFileId($fileId) ->findOne($this->con); - + if (empty($prevRecord)) { - + $history = new CcPlayoutHistory(); $history->setDbFileId($fileId); $history->setDbStarts($recordStart); $history->setDbEnds($recordEnd); $history->setDbInstanceId($item->getDbInstanceId()); - + foreach ($metadata as $key => $val) { $meta = new CcPlayoutHistoryMetaData(); $meta->setDbKey($key); $meta->setDbValue($val); - + $history->addCcPlayoutHistoryMetaData($meta); } - + $history->save($this->con); $this->con->commit(); - } - } + } + } } catch (Exception $e) { $this->con->rollback(); @@ -1126,6 +1126,7 @@ class Application_Service_HistoryService array("name"=> MDATA_KEY_TRACKNUMBER, "label"=> _("Track"), "type"=> TEMPLATE_INT), array("name"=> MDATA_KEY_CONDUCTOR, "label"=> _("Conductor"), "type"=> TEMPLATE_STRING), array("name"=> MDATA_KEY_LANGUAGE, "label"=> _("Language"), "type"=> TEMPLATE_STRING), + array("name"=> MDATA_KEY_MEDIA_TYPE, "label"=> _("Media Type"), "type"=> TEMPLATE_STRING), ); return $fileMD; diff --git a/airtime_mvc/application/upgrade/Upgrades.php b/airtime_mvc/application/upgrade/Upgrades.php index b8b822421..acd97daf5 100644 --- a/airtime_mvc/application/upgrade/Upgrades.php +++ b/airtime_mvc/application/upgrade/Upgrades.php @@ -507,6 +507,19 @@ class AirtimeUpgrader2517 extends AirtimeUpgrader } } +class AirtimeUpgrader2518 extends AirtimeUpgrader +{ + protected function getSupportedSchemaVersions() { + return array( + '2.5.17' + ); + } + + public function getNewVersion() { + return '2.5.18'; + } +} + class AirtimeUpgrader300alpha extends AirtimeUpgrader { protected function getSupportedSchemaVersions() { diff --git a/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml b/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml index 31d873803..e2102af55 100644 --- a/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml +++ b/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml @@ -26,6 +26,7 @@ foreach ($this->md as $key => &$value) {

+
md["MDATA_KEY_ARTWORK"]);?>
md["MDATA_KEY_ARTWORK_DATA"]);?>
md["MDATA_KEY_LANGUAGE"]);?>
md["MDATA_KEY_MEDIA_TYPE"]);?>
md["MDATA_KEY_FILEPATH"]);?>
diff --git a/airtime_mvc/build/schema.xml b/airtime_mvc/build/schema.xml index acf54453b..5e0121291 100644 --- a/airtime_mvc/build/schema.xml +++ b/airtime_mvc/build/schema.xml @@ -85,6 +85,7 @@ + diff --git a/airtime_mvc/build/sql/schema.sql b/airtime_mvc/build/sql/schema.sql index a148a56da..d1a6c1412 100644 --- a/airtime_mvc/build/sql/schema.sql +++ b/airtime_mvc/build/sql/schema.sql @@ -97,6 +97,7 @@ CREATE TABLE "cc_files" "filesize" INTEGER DEFAULT 0 NOT NULL, "description" VARCHAR(512), "artwork" VARCHAR(512), + "media_type" VARCHAR(4), PRIMARY KEY ("id") ); diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index 38a675e81..420e318a7 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -54,7 +54,8 @@ var AIRTIME = (function(AIRTIME) { "owner_id" : "s", "info_url" : "s", "replay_gain" : "n", - "artwork" : "s" + "artwork" : "s", + "media_type" : "s" }; if (AIRTIME.library === undefined) { @@ -591,6 +592,7 @@ var AIRTIME = (function(AIRTIME) { /* Cue Out */ { "sTitle" : $.i18n._("Cue Out") , "mDataProp" : "cueout" , "bVisible" : false , "sClass" : "library_length" , "sWidth" : "80px" }, /* Description */ { "sTitle" : $.i18n._("Description") , "mDataProp" : "description" , "bVisible" : false , "sClass" : "library_description" , "sWidth" : "150px" }, /* Encoded */ { "sTitle" : $.i18n._("Encoded By") , "mDataProp" : "encoded_by" , "bVisible" : false , "sClass" : "library_encoded" , "sWidth" : "150px" }, + /* Media Type */ { "sTitle" : $.i18n._("Type") , "mDataProp" : "media_type" , "bVisible" : false , "sClass" : "library_media_type" , "sWidth" : "60px" }, /* Genre */ { "sTitle" : $.i18n._("Genre") , "mDataProp" : "genre" , "sClass" : "library_genre" , "sWidth" : "100px" }, /* ISRC Number */ { "sTitle" : $.i18n._("ISRC") , "mDataProp" : "isrc_number" , "bVisible" : false , "sClass" : "library_isrc" , "sWidth" : "150px" }, /* Label */ { "sTitle" : $.i18n._("Label") , "mDataProp" : "label" , "bVisible" : false , "sClass" : "library_label" , "sWidth" : "125px" }, @@ -615,7 +617,7 @@ var AIRTIME = (function(AIRTIME) { ); } - var colExclude = onDashboard ? [0, 1, 2, 33] : [0, 1, 2]; + var colExclude = onDashboard ? [0, 1, 2, 34] : [0, 1, 2]; /* ############################################ DATATABLES @@ -1597,6 +1599,7 @@ var validationTypes = { "track_number" : "i", "info_url" : "s", "artwork" : "s", + "media_type" : "s", "year" : "i" }; diff --git a/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js b/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js index fddf6ca34..d69da00b5 100644 --- a/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js +++ b/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js @@ -8,7 +8,7 @@ function setSmartBlockEvents() { /********** ADD CRITERIA ROW **********/ form.find('#criteria_add').live('click', function(){ - + var div = $('dd[id="sp_criteria-element"]').children('div:visible:last'); if (div.length == 0) { @@ -26,7 +26,7 @@ function setSmartBlockEvents() { div.find('.db-logic-label').text('and').css('display', 'table'); div.removeClass('search-row-or').addClass('search-row-and'); - + div = div.next().show(); div.children().removeAttr('disabled'); @@ -45,11 +45,11 @@ function setSmartBlockEvents() { } }); - + /********** ADD MODIFIER ROW **********/ form.find('a[id^="modifier_add"]').live('click', function(){ var criteria_value = $(this).siblings('select[name^="sp_criteria_field"]').val(); - + //make new modifier row var newRow = $(this).parent().clone(), @@ -63,13 +63,13 @@ function setSmartBlockEvents() { if (newRow.children().hasClass('errors sp-errors')) { newRow.find('span[class="errors sp-errors"]').remove(); } - + //hide the critieria field select box newRowCrit.addClass('sp-invisible'); - + //keep criteria value the same newRowCrit.val(criteria_value); - + //reset all other values newRowMod.val('0'); newRowVal.val(''); @@ -78,12 +78,12 @@ function setSmartBlockEvents() { disableAndHideDateTimeDropdown(newRowVal); disableAndHideExtraDateTimeDropdown(newRowVal); sizeTextBoxes(newRowVal, 'sp_extra_input_text', 'sp_input_text'); - + //remove the 'criteria add' button from new modifier row newRow.find('#criteria_add').remove(); $(this).parent().after(newRow); - + // remove extra spacing from previous row newRow.prev().removeClass('search-row-and').addClass('search-row-or'); @@ -93,7 +93,7 @@ function setSmartBlockEvents() { removeButtonCheck(); groupCriteriaRows(); }); - + /********** REMOVE ROW **********/ form.find('a[id^="criteria_remove"]').live('click', function(){ var curr = $(this).parent(); @@ -128,10 +128,10 @@ function setSmartBlockEvents() { for (var i=0; i 0 && index < 26) { - + /* If the current row's criteria field is hidden we know it is * a modifier row */ @@ -444,7 +444,7 @@ function reindexElements() { index++; modIndex = 0; } - + $(div).find('select[name^="sp_criteria_field"]').attr('name', 'sp_criteria_field_'+index+'_'+modIndex); $(div).find('select[name^="sp_criteria_field"]').attr('id', 'sp_criteria_field_'+index+'_'+modIndex); $(div).find('select[name^="sp_criteria_modifier"]').attr('name', 'sp_criteria_modifier_'+index+'_'+modIndex); @@ -464,7 +464,7 @@ function reindexElements() { function buttonClickAction(clickType, url){ var data = $('.active-tab .smart-block-form').serializeArray(), obj_id = $('.active-tab .obj_id').val(); - + enableLoadingIcon(); $.post(url, {format: "json", data: data, obj_id: obj_id, obj_type: "block", modified: AIRTIME.playlist.getModified() @@ -499,7 +499,7 @@ function setupUI() { shuffleButton.addClass('ui-state-disabled'); shuffleButton.attr('disabled', 'disabled'); } - + if (activeTab.find('.obj_type').val() == 'block') { if (playlist_type == "1") { shuffleButton.removeAttr("disabled"); @@ -514,7 +514,7 @@ function setupUI() { //sortable.children().hide(); } } - + $(".playlist_type_help_icon").qtip({ content: { text: $.i18n._("A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show.")+"

" + @@ -536,7 +536,7 @@ function setupUI() { at: "right center" } }); - + $(".repeat_tracks_help_icon").qtip({ content: { text: sprintf($.i18n._("The desired block length will not be reached if %s cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block."), PRODUCT_NAME) @@ -661,7 +661,7 @@ function disableAndHideExtraField(valEle, index) { spanExtra.children('#sp_criteria_extra_'+index).val("").attr("disabled", "disabled"); spanExtra.hide(); console.log('hidden'); - + //make value input larger since we don't have extra field now var criteria_value = $('#sp_criteria_value_'+index); sizeTextBoxes(criteria_value, 'sp_extra_input_text', 'sp_input_text'); @@ -685,15 +685,15 @@ function populateModifierSelect(e, popAllMods) { var criteria_type = getCriteriaOptionType(e), index = getRowIndex($(e).parent()), divs; - + if (popAllMods) { index = index.substring(0, 1); } divs = $(e).parents().find('select[id^="sp_criteria_modifier_'+index+'"]'); - + $.each(divs, function(i, div){ $(div).children().remove(); - + if (criteria_type == 's') { $.each(stringCriteriaOptions, function(key, value){ $(div).append($('') @@ -777,7 +777,7 @@ function appendAddButton() { enabled = rows.find('select[name^="sp_criteria_field"]:enabled'); rows.find('#criteria_add').remove(); - + if (enabled.length > 1) { rows.find('select[name^="sp_criteria_field"]:enabled:last') .siblings('a[id^="criteria_remove"]') @@ -821,7 +821,7 @@ function disableLoadingIcon() { function groupCriteriaRows() { // check whether rows should be "grouped" and shown with an "or" "logic label", or separated by an "and" "logic label" - var visibleRows = $("#sp_criteria-element > div:visible"), + var visibleRows = $("#sp_criteria-element > div:visible"), prevRowGroup = "0"; visibleRows.each(function (index){ @@ -837,7 +837,7 @@ function groupCriteriaRows() { } }); - // ensure spacing below last visible row + // ensure spacing below last visible row $("#sp_criteria-element > div:visible:last").addClass("search-row-and").removeClass("search-row-or"); } @@ -874,7 +874,8 @@ var criteriaTypes = { "track_title" : "s", "track_number" : "n", "info_url" : "s", - "year" : "n" + "year" : "n", + "media_type" : "s" }; var stringCriteriaOptions = { @@ -886,7 +887,7 @@ var stringCriteriaOptions = { "starts with" : $.i18n._("starts with"), "ends with" : $.i18n._("ends with") }; - + var numericCriteriaOptions = { "0" : $.i18n._("Select modifier"), "is" : $.i18n._("is"), From 9d8def9ef777f652e8b5db871886280c2c6b66ed Mon Sep 17 00:00:00 2001 From: robbt Date: Wed, 9 Oct 2019 23:30:49 +0000 Subject: [PATCH 05/15] changed database schema versioning to fit libretime project --- .../airtime_3.0.0-alpha.9.1/upgrade.sql | 1 + airtime_mvc/application/upgrade/Upgrades.php | 26 +++++++++---------- 2 files changed, 14 insertions(+), 13 deletions(-) create mode 100644 airtime_mvc/application/controllers/upgrade_sql/airtime_3.0.0-alpha.9.1/upgrade.sql diff --git a/airtime_mvc/application/controllers/upgrade_sql/airtime_3.0.0-alpha.9.1/upgrade.sql b/airtime_mvc/application/controllers/upgrade_sql/airtime_3.0.0-alpha.9.1/upgrade.sql new file mode 100644 index 000000000..3d92007aa --- /dev/null +++ b/airtime_mvc/application/controllers/upgrade_sql/airtime_3.0.0-alpha.9.1/upgrade.sql @@ -0,0 +1 @@ +ALTER TABLE cc_files ADD COLUMN artwork TYPE character varying(255); \ No newline at end of file diff --git a/airtime_mvc/application/upgrade/Upgrades.php b/airtime_mvc/application/upgrade/Upgrades.php index b8b822421..55c4ced49 100644 --- a/airtime_mvc/application/upgrade/Upgrades.php +++ b/airtime_mvc/application/upgrade/Upgrades.php @@ -494,19 +494,6 @@ class AirtimeUpgrader2516 extends AirtimeUpgrader } } -class AirtimeUpgrader2517 extends AirtimeUpgrader -{ - protected function getSupportedSchemaVersions() { - return array( - '2.5.16' - ); - } - - public function getNewVersion() { - return '2.5.17'; - } -} - class AirtimeUpgrader300alpha extends AirtimeUpgrader { protected function getSupportedSchemaVersions() { @@ -614,4 +601,17 @@ class AirtimeUpgrader300alpha7_3 extends AirtimeUpgrader } } +class AirtimeUpgrader300alpha9_1 extends AirtimeUpgrader +{ + protected function getSupportedSchemaVersions() { + return array( + '3.0.0-alpha.7.3' + ); + } + + public function getNewVersion() { + return '3.0.0-alpha.9.1'; + } +} + From 125d10e474e626b7b08e3825b5a5e174a3f43a82 Mon Sep 17 00:00:00 2001 From: Robb Ebright Date: Wed, 9 Oct 2019 19:45:07 -0400 Subject: [PATCH 06/15] add a downgrade sql script --- .../downgrade_sql/airtime_3.0.0-alpha.9.1/downgrade.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 airtime_mvc/application/controllers/downgrade_sql/airtime_3.0.0-alpha.9.1/downgrade.sql diff --git a/airtime_mvc/application/controllers/downgrade_sql/airtime_3.0.0-alpha.9.1/downgrade.sql b/airtime_mvc/application/controllers/downgrade_sql/airtime_3.0.0-alpha.9.1/downgrade.sql new file mode 100644 index 000000000..983f34ef7 --- /dev/null +++ b/airtime_mvc/application/controllers/downgrade_sql/airtime_3.0.0-alpha.9.1/downgrade.sql @@ -0,0 +1 @@ +ALTER TABLE cc_files DROP COLUMN IF EXISTS artwork; From 8bf7427f3b4666e90d030a2a8e9be81228d6740b Mon Sep 17 00:00:00 2001 From: robbt Date: Thu, 10 Oct 2019 00:03:01 +0000 Subject: [PATCH 07/15] fixed the database upgrade script --- .../controllers/upgrade_sql/airtime_3.0.0-alpha.9.1/upgrade.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airtime_mvc/application/controllers/upgrade_sql/airtime_3.0.0-alpha.9.1/upgrade.sql b/airtime_mvc/application/controllers/upgrade_sql/airtime_3.0.0-alpha.9.1/upgrade.sql index 3d92007aa..3c47a0fee 100644 --- a/airtime_mvc/application/controllers/upgrade_sql/airtime_3.0.0-alpha.9.1/upgrade.sql +++ b/airtime_mvc/application/controllers/upgrade_sql/airtime_3.0.0-alpha.9.1/upgrade.sql @@ -1 +1 @@ -ALTER TABLE cc_files ADD COLUMN artwork TYPE character varying(255); \ No newline at end of file +ALTER TABLE cc_files ADD COLUMN artwork VARCHAR(4096); From bd328fba717cbc683cfef765b0cdb375024ba0c4 Mon Sep 17 00:00:00 2001 From: Codenift Date: Thu, 10 Oct 2019 01:55:21 -0400 Subject: [PATCH 08/15] Support for macOS Catalina (NFS sync fix) --- Vagrantfile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Vagrantfile b/Vagrantfile index b8e34a1ef..88b2b041b 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -14,7 +14,11 @@ Vagrant.configure("2") do |config| config.vm.network "forwarded_port", guest: 8888, host:8888 # make sure we are using nfs (doesn't work out of the box with debian) - config.vm.synced_folder ".", "/vagrant", type: "nfs" + nfsPath = "." + if Dir.exist?("/System/Volumes/Data") + nfsPath = "/System/Volumes/Data" + Dir.pwd + end + config.vm.synced_folder nfsPath, "/vagrant", type: "nfs" # private network for nfs config.vm.network "private_network", ip: "192.168.10.100" From 339a87900eb6324a68220150006578ed4a8f6257 Mon Sep 17 00:00:00 2001 From: Codenift Date: Thu, 10 Oct 2019 10:07:55 -0400 Subject: [PATCH 09/15] Update Vagrantfile --- Vagrantfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Vagrantfile b/Vagrantfile index 88b2b041b..073ed73dc 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -15,6 +15,7 @@ Vagrant.configure("2") do |config| # make sure we are using nfs (doesn't work out of the box with debian) nfsPath = "." + # Catalina support if Dir.exist?("/System/Volumes/Data") nfsPath = "/System/Volumes/Data" + Dir.pwd end From 5c1481167eaddc82f28e3c5d373bbdd42f866ad3 Mon Sep 17 00:00:00 2001 From: Robb Ebright Date: Sun, 13 Oct 2019 08:16:45 -0400 Subject: [PATCH 10/15] removed the media type PR from the artwork PR with revert --- airtime_mvc/application/configs/constants.php | 1 - .../upgrade_sql/airtime_2.5.18/upgrade.sql | 1 - airtime_mvc/application/forms/EditAudioMD.php | 28 ------ .../application/forms/SmartBlockCriteria.php | 21 ++--- airtime_mvc/application/models/Block.php | 79 ++++++++-------- airtime_mvc/application/models/StoredFile.php | 5 +- .../models/airtime/map/CcFilesTableMap.php | 1 - .../models/airtime/om/BaseCcFiles.php | 55 ----------- .../models/airtime/om/BaseCcFilesPeer.php | 27 +++--- .../models/airtime/om/BaseCcFilesQuery.php | 35 +------ .../application/services/HistoryService.php | 43 +++++---- airtime_mvc/application/upgrade/Upgrades.php | 1 - .../library/get-file-metadata.ajax.phtml | 1 - airtime_mvc/build/schema.xml | 1 - airtime_mvc/build/sql/schema.sql | 1 - .../public/js/airtime/library/library.js | 7 +- .../js/airtime/playlist/smart_blockbuilder.js | 91 +++++++++---------- 17 files changed, 129 insertions(+), 269 deletions(-) delete mode 100644 airtime_mvc/application/controllers/upgrade_sql/airtime_2.5.18/upgrade.sql diff --git a/airtime_mvc/application/configs/constants.php b/airtime_mvc/application/configs/constants.php index 29157c556..a56a908b5 100644 --- a/airtime_mvc/application/configs/constants.php +++ b/airtime_mvc/application/configs/constants.php @@ -83,7 +83,6 @@ define('MDATA_KEY_CUE_IN' , 'cuein'); define('MDATA_KEY_CUE_OUT' , 'cueout'); define('MDATA_KEY_ARTWORK' , 'artwork'); define('MDATA_KEY_ARTWORK_DATA', 'artwork_data'); -define('MDATA_KEY_MEDIA_TYPE' , 'media_type'); define('UI_MDATA_VALUE_FORMAT_FILE' , 'File'); define('UI_MDATA_VALUE_FORMAT_STREAM' , 'live stream'); diff --git a/airtime_mvc/application/controllers/upgrade_sql/airtime_2.5.18/upgrade.sql b/airtime_mvc/application/controllers/upgrade_sql/airtime_2.5.18/upgrade.sql deleted file mode 100644 index 20fdd2dc4..000000000 --- a/airtime_mvc/application/controllers/upgrade_sql/airtime_2.5.18/upgrade.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE cc_files ADD COLUMN media_type VARCHAR(4); \ No newline at end of file diff --git a/airtime_mvc/application/forms/EditAudioMD.php b/airtime_mvc/application/forms/EditAudioMD.php index ecc1ec135..62a83f66c 100644 --- a/airtime_mvc/application/forms/EditAudioMD.php +++ b/airtime_mvc/application/forms/EditAudioMD.php @@ -74,34 +74,6 @@ class Application_Form_EditAudioMD extends Zend_Form $owner_id->setMultiOptions($user_options); $this->addelement($owner_id); - // Add media type dropdown - $media_type_options = array(); - $media_types = array( - '' => '--- Select Media Type ---', - 'MUS' => 'Music (MUS)', - 'SID' => 'Station ID (SID)', - 'INT' => 'Intro (INT)', - 'OUT' => 'Outro (OUT)', - 'SWP' => 'Sweeper (SWP)', - 'JIN' => 'Jingle (JIN)', - 'PRO' => 'Promo (PRO)', - 'SHO' => 'Shout Out (SHO)', - 'NWS' => 'News (NWS)', - 'COM' => 'Commercial (COM)', - 'ITV' => 'Interview (ITV)', - 'VTR' => 'Voice Tracking (VTR)', - ); - - foreach ($media_types as $key => $mt) { - $media_type_options[$key] = $mt; - } - - $media_type = new Zend_Form_Element_Select('media_type'); - $media_type->class = 'input_text'; - $media_type->setLabel(_('Media Type:')); - $media_type->setMultiOptions($media_type_options); - $this->addelement($media_type); - // Description field $description = new Zend_Form_Element_Textarea('description'); $description->class = 'input_text'; diff --git a/airtime_mvc/application/forms/SmartBlockCriteria.php b/airtime_mvc/application/forms/SmartBlockCriteria.php index ac55947f2..e539c551c 100644 --- a/airtime_mvc/application/forms/SmartBlockCriteria.php +++ b/airtime_mvc/application/forms/SmartBlockCriteria.php @@ -42,8 +42,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm "track_title" => "s", "track_number" => "n", "info_url" => "s", - "year" => "n", - "media_type" => "s" + "year" => "n" ); private function getCriteriaOptions($option = null) @@ -78,8 +77,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm "track_number" => _("Track Number"), "utime" => _("Uploaded"), "info_url" => _("Website"), - "year" => _("Year"), - "media_type" => _("Media Type") + "year" => _("Year") ); } @@ -185,18 +183,18 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm public function init() { } - + /* * converts UTC timestamp citeria into user timezone strings. */ private function convertTimestamps(&$criteria) { $columns = array("utime", "mtime", "lptime"); - + foreach ($columns as $column) { - + if (isset($criteria[$column])) { - + foreach ($criteria[$column] as &$constraint) { // convert to appropriate timezone timestamps only if the modifier is not a relative time if (!in_array($constraint['modifier'], array('before','after','between'))) { @@ -248,7 +246,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm $bl = new Application_Model_Block($p_blockId); $storedCrit = $bl->getCriteriaGrouped(); Logging::info($storedCrit); - + //need to convert criteria to be displayed in the user's timezone if there's some timestamp type. self::convertTimestamps($storedCrit["crit"]); @@ -472,7 +470,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm $sort->setValue($storedCrit["sort"]["value"]); } $this->addElement($sort); - + $limit = new Zend_Form_Element_Select('sp_limit_options'); $limit->setAttrib('class', 'sp_input_select') ->setDecorators(array('viewHelper')) @@ -723,8 +721,7 @@ class Application_Form_SmartBlockCriteria extends Zend_Form_SubForm "sample_rate" => "DbSampleRate", "track_title" => "DbTrackTitle", "track_number" => "DbTrackNumber", - "year" => "DbYear", - "media_type" => "DbMediaType" + "year" => "DbYear" ); // things we need to check diff --git a/airtime_mvc/application/models/Block.php b/airtime_mvc/application/models/Block.php index 3d3b273bb..f40945742 100644 --- a/airtime_mvc/application/models/Block.php +++ b/airtime_mvc/application/models/Block.php @@ -85,8 +85,7 @@ class Application_Model_Block implements Application_Model_LibraryEditable "sample_rate" => "DbSampleRate", "track_title" => "DbTrackTitle", "track_number" => "DbTrackNumber", - "year" => "DbYear", - "media_type" => "DbMediaType" + "year" => "DbYear" ); public function __construct($id=null, $con=null) @@ -233,12 +232,12 @@ SQL; foreach ($rows as &$row) { $clipSec = Application_Common_DateHelper::playlistTimeToSeconds($row['length']); - + $row['trackSec'] = $clipSec; - + $row['cueInSec'] = Application_Common_DateHelper::playlistTimeToSeconds($row['cuein']); $row['cueOutSec'] = Application_Common_DateHelper::playlistTimeToSeconds($row['cueout']); - + $trackoffset = $row['trackoffset']; $offset += $clipSec; $offset -= $trackoffset; @@ -255,7 +254,7 @@ SQL; $fades = $this->getFadeInfo($row['position']); $row['fadein'] = $fades[0]; $row['fadeout'] = $fades[1]; - + // format the cues in format 00:00:00(.0) // we need to add the '.0' for cues and not fades // because propel takes care of this for us @@ -489,7 +488,7 @@ SQL; Logging::info("Adding to block"); Logging::info("at position {$pos}"); } - + foreach ($p_items as $ac) { //Logging::info("Adding audio file {$ac[0]}"); try { @@ -678,7 +677,7 @@ SQL; return array($fadeIn, $fadeOut); } - + /* * create a crossfade from item in cc_playlist_contents with $id1 to item $id2. * @@ -689,11 +688,11 @@ SQL; public function createCrossfade($id1, $fadeOut, $id2, $fadeIn, $offset) { $this->con->beginTransaction(); - + if (!isset($offset)) { $offset = Application_Model_Preference::GetDefaultCrossfadeDuration(); } - + try { if (isset($id1)) { $this->changeFadeInfo($id1, null, $fadeOut); @@ -701,9 +700,9 @@ SQL; if (isset($id2)) { $this->changeFadeInfo($id2, $fadeIn, null, $offset); } - + $this->con->commit(); - + } catch (Exception $e) { $this->con->rollback(); throw $e; @@ -747,20 +746,20 @@ SQL; ':fade_in' => $fadeIn, ':clip_length' => $clipLength ); - + $result = Application_Common_Database::prepareAndExecute($sql, $params, 'column'); if ($result) { //"Fade In can't be larger than overall playlength."; $fadeIn = $clipLength; } $row->setDbFadein($fadeIn); - + if (!is_null($offset)) { $row->setDbTrackOffset($offset); Logging::info("Setting offset {$offset} on item {$id}"); $row->save($this->con); } - + } if (!is_null($fadeOut)) { @@ -769,7 +768,7 @@ SQL; ':fade_out' => $fadeOut, ':clip_length' => $clipLength ); - + $result = Application_Common_Database::prepareAndExecute($sql, $params, 'column'); if ($result) { //"Fade Out can't be larger than overall playlength."; @@ -910,7 +909,7 @@ SQL; $row->setDbCuein($cueIn); $row->setDBCliplength($cliplength); - + } elseif (!is_null($cueOut)) { if ($cueOut === "") { @@ -1017,8 +1016,8 @@ SQL; public static function getBlockCount() { $sql = 'SELECT count(*) as cnt FROM cc_playlist'; - - $res = Application_Common_Database::prepareAndExecute($sql, array(), + + $res = Application_Common_Database::prepareAndExecute($sql, array(), Application_Common_Database::COLUMN); return $res; @@ -1065,7 +1064,7 @@ SQL; CcBlockQuery::create()->findPKs($p_ids)->delete(); $updateIsPlaylistFlag = true; } - + if ($updateIsPlaylistFlag) { // update is_playlist flag in cc_files Application_Model_StoredFile::setIsPlaylist( @@ -1164,7 +1163,7 @@ SQL; $blockType = $data['etc']['sp_type'] == 0 ? 'dynamic':'static'; $this->saveType($blockType); $this->storeCriteriaIntoDb($data); - + // if the block is dynamic, put null to the length // as it cannot be calculated if ($blockType == 'dynamic') { @@ -1209,7 +1208,7 @@ SQL; if (isset($d['sp_criteria_extra'])) { $extra = $d['sp_criteria_extra']; } if (isset($d['sp_criteria_datetime_select'])) { $datetimeunit = $d['sp_criteria_datetime_select']; } if (isset($d['sp_criteria_extra_datetime_select'])) {$extradatetimeunit = $d['sp_criteria_extra_datetime_select'];} - + if ($field == 'utime' || $field == 'mtime' || $field == 'lptime') { // if the date isn't relative we want to convert the value to a specific UTC date if (!(in_array($modifier,array('before','after','between')))) { @@ -1221,7 +1220,7 @@ SQL; } } - + $qry = new CcBlockcriteria(); $qry->setDbCriteria($field) ->setDbModifier($d['sp_criteria_modifier']) @@ -1229,7 +1228,7 @@ SQL; ->setDbBlockId($this->id); if (isset($d['sp_criteria_extra'])) { - + if ($field == 'utime' || $field == 'mtime' || $field == 'lptime') { // if the date isn't relative we want to convert the value to a specific UTC date if (!(in_array($modifier,array('before','after','between')))) { @@ -1240,7 +1239,7 @@ SQL; } } - + $qry->setDbExtra($extra); } // save the criteria group so separation via new modifiers AND can be preserved vs. lumping @@ -1270,8 +1269,8 @@ SQL; ->setDbValue($p_criteriaData['etc']['sp_limit_value']) ->setDbBlockId($this->id) ->save(); - - + + // insert repeat track option $qry = new CcBlockcriteria(); $qry->setDbCriteria("repeat_tracks") @@ -1348,11 +1347,11 @@ SQL; // this moves the pointer to the first element in the collection $files->getFirst(); $iterator = $files->getIterator(); - + $isBlockFull = false; - + while ($iterator->valid()) { - + $id = $iterator->current()->getDbId(); $fileLength = $iterator->current()->getCueLength(); $length = Application_Common_DateHelper::calculateLengthInSeconds($fileLength); @@ -1385,15 +1384,15 @@ SQL; $iterator->next(); } - + $sizeOfInsert = count($insertList); - + // if block is not full and repeat_track is check, fill up more // additionally still don't overflow the limit while (!$isBlockFull && $repeat == 1 && $sizeOfInsert > 0) { Logging::debug("adding repeated tracks."); Logging::debug("total time = " . $totalTime); - + $randomEleKey = array_rand(array_slice($insertList, 0, $sizeOfInsert)); // this will also allow the overflow of tracks so that time limited smart blocks will schedule until they // are longer than the time limit rather than never scheduling past the time limit @@ -1413,7 +1412,7 @@ SQL; $totalItems++; } } - + if ((!is_null($limit['items']) && $limit['items'] == count($insertList)) || $totalItems > 500 || $totalTime > $limit['time']) { break; } @@ -1461,8 +1460,7 @@ SQL; "track_number" => _("Track Number"), "utime" => _("Uploaded"), "info_url" => _("Website"), - "year" => _("Year"), - "media_type" => _("Media Type") + "year" => _("Year") ); $modifierOptions = array( @@ -1561,8 +1559,7 @@ SQL; "track_number" => _("Track Number"), "utime" => _("Uploaded"), "info_url" => _("Website"), - "year" => _("Year"), - "media_type" => _("Media Type") + "year" => _("Year") ); $modifierOptions = array( @@ -1799,7 +1796,7 @@ SQL; $limits['items'] = null; } } - + $repeatTracks = 0; $overflowTracks = 0; @@ -1868,9 +1865,9 @@ SQL; SELECT distinct(file_id) FROM cc_blockcontents SQL; - + $files = Application_Common_Database::prepareAndExecute($sql, array()); - + $real_files = array(); foreach ($files as $f) { $real_files[] = $f['file_id']; diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index ac0736278..8e8211378 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -54,8 +54,7 @@ class Application_Model_StoredFile "cuein" => "DbCueIn", "cueout" => "DbCueOut", "description" => "DbDescription", - "artwork" => "DbArtwork", - "media_type" => "DbMediaType" + "artwork" => "DbArtwork" ); function __construct($file, $con) { @@ -673,7 +672,7 @@ SQL; "bit_rate", "sample_rate", "isrc_number", "encoded_by", "label", "copyright", "mime", "language", "filepath", "owner_id", "conductor", "replay_gain", "lptime", "is_playlist", "is_scheduled", - "cuein", "cueout", "description", "artwork", "media_type" ); + "cuein", "cueout", "description", "artwork" ); } public static function searchLibraryFiles($datatables) diff --git a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php index 325d59151..e68a15637 100644 --- a/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcFilesTableMap.php @@ -112,7 +112,6 @@ class CcFilesTableMap extends TableMap $this->addColumn('filesize', 'DbFilesize', 'INTEGER', true, null, 0); $this->addColumn('description', 'DbDescription', 'VARCHAR', false, 512, null); $this->addColumn('artwork', 'DbArtwork', 'VARCHAR', false, 512, null); - $this->addColumn('media_type', 'DbMediaType', 'VARCHAR', false, 4, null); // validators } // initialize() diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php index 7dca9e23a..7cf46f514 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFiles.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFiles.php @@ -294,12 +294,6 @@ abstract class BaseCcFiles extends BaseObject implements Persistent */ protected $artwork; - /** - * The value for the media_type field. - * @var string - */ - protected $media_type; - /** * The value for the artist_url field. * @var string @@ -1199,17 +1193,6 @@ abstract class BaseCcFiles extends BaseObject implements Persistent return $this->artwork; } - /** - * Get the [media_type] column value. - * - * @return string - */ - public function getDbMediaType() - { - - return $this->media_type; - } - /** * Get the [artist_url] column value. * @@ -1892,26 +1875,6 @@ abstract class BaseCcFiles extends BaseObject implements Persistent return $this; } // setDbArtwork() - /** - * Set the value of [media_type] column. - * - * @param string $v new value - * @return CcFiles The current object (for fluent API support) - */ - public function setDbMediaType($v) - { - if ($v !== null && is_numeric($v)) { - $v = (string) $v; - } - - if ($this->media_type !== $v) { - $this->media_type = $v; - $this->modifiedColumns[] = CcFilesPeer::MEDIA_TYPE; - } - - return $this; - } // setDbMediaType() - /** * Set the value of [artist_name] column. * @@ -3341,7 +3304,6 @@ abstract class BaseCcFiles extends BaseObject implements Persistent $this->filesize = ($row[$startcol + 70] !== null) ? (int) $row[$startcol + 70] : null; $this->description = ($row[$startcol + 71] !== null) ? (string) $row[$startcol + 71] : null; $this->artwork = ($row[$startcol + 72] !== null) ? (string) $row[$startcol + 72] : null; - $this->media_type = ($row[$startcol + 73] !== null) ? (string) $row[$startcol + 73] : null; $this->resetModified(); $this->setNew(false); @@ -3982,9 +3944,6 @@ abstract class BaseCcFiles extends BaseObject implements Persistent if ($this->isColumnModified(CcFilesPeer::ARTWORK)) { $modifiedColumns[':p' . $index++] = '"artwork"'; } - if ($this->isColumnModified(CcFilesPeer::MEDIA_TYPE)) { - $modifiedColumns[':p' . $index++] = '"media_type"'; - } $sql = sprintf( 'INSERT INTO "cc_files" (%s) VALUES (%s)', @@ -4215,9 +4174,6 @@ abstract class BaseCcFiles extends BaseObject implements Persistent case '"artwork"': $stmt->bindValue($identifier, $this->artwork, PDO::PARAM_STR); break; - case '"media_type"': - $stmt->bindValue($identifier, $this->media_type, PDO::PARAM_STR); - break; } } $stmt->execute(); @@ -4652,9 +4608,6 @@ abstract class BaseCcFiles extends BaseObject implements Persistent case 72: return $this->getDbArtwork(); break; - case 73: - return $this->getDbMediaType(); - break; default: return null; break; @@ -4757,7 +4710,6 @@ abstract class BaseCcFiles extends BaseObject implements Persistent $keys[70] => $this->getDbFilesize(), $keys[71] => $this->getDbDescription(), $keys[72] => $this->getDbArtwork(), - $keys[73] => $this->getDbMediaType(), ); $virtualColumns = $this->virtualColumns; foreach ($virtualColumns as $key => $virtualColumn) { @@ -5051,9 +5003,6 @@ abstract class BaseCcFiles extends BaseObject implements Persistent case 72: $this->setDbArtwork($value); break; - case 73: - $this->setDbMediaType($value); - break; } // switch() } @@ -5151,7 +5100,6 @@ abstract class BaseCcFiles extends BaseObject implements Persistent if (array_key_exists($keys[70], $arr)) $this->setDbFilesize($arr[$keys[70]]); if (array_key_exists($keys[71], $arr)) $this->setDbDescription($arr[$keys[71]]); if (array_key_exists($keys[72], $arr)) $this->setDbArtwork($arr[$keys[72]]); - if (array_key_exists($keys[73], $arr)) $this->setDbMediaType($arr[$keys[73]]); } /** @@ -5236,7 +5184,6 @@ abstract class BaseCcFiles extends BaseObject implements Persistent if ($this->isColumnModified(CcFilesPeer::FILESIZE)) $criteria->add(CcFilesPeer::FILESIZE, $this->filesize); if ($this->isColumnModified(CcFilesPeer::DESCRIPTION)) $criteria->add(CcFilesPeer::DESCRIPTION, $this->description); if ($this->isColumnModified(CcFilesPeer::ARTWORK)) $criteria->add(CcFilesPeer::ARTWORK, $this->artwork); - if ($this->isColumnModified(CcFilesPeer::MEDIA_TYPE)) $criteria->add(CcFilesPeer::MEDIA_TYPE, $this->media_type); return $criteria; } @@ -5372,7 +5319,6 @@ abstract class BaseCcFiles extends BaseObject implements Persistent $copyObj->setDbFilesize($this->getDbFilesize()); $copyObj->setDbDescription($this->getDbDescription()); $copyObj->setDbArtwork($this->getDbArtwork()); - $copyObj->setDbMediaType($this->getDbMediaType()); if ($deepCopy && !$this->startCopy) { // important: temporarily setNew(false) because this affects the behavior of @@ -7775,7 +7721,6 @@ abstract class BaseCcFiles extends BaseObject implements Persistent $this->filesize = null; $this->description = null; $this->artwork = null; - $this->media_type = null; $this->alreadyInSave = false; $this->alreadyInValidation = false; $this->alreadyInClearAllReferencesDeep = false; diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php b/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php index 635d6a99a..8b61968b2 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFilesPeer.php @@ -251,9 +251,6 @@ abstract class BaseCcFilesPeer /** the column name for the artwork field */ const ARTWORK = 'cc_files.artwork'; - /** the column name for the media_type field */ - const MEDIA_TYPE = 'cc_files.media_type'; - /** The default string format for model objects of the related table **/ const DEFAULT_STRING_FORMAT = 'YAML'; @@ -273,12 +270,12 @@ abstract class BaseCcFilesPeer * e.g. CcFilesPeer::$fieldNames[CcFilesPeer::TYPE_PHPNAME][0] = 'Id' */ protected static $fieldNames = array ( - BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMime', 'DbFtype', 'DbDirectory', 'DbFilepath', 'DbImportStatus', 'DbCurrentlyaccessing', 'DbEditedby', 'DbMtime', 'DbUtime', 'DbLPtime', 'DbMd5', 'DbTrackTitle', 'DbArtistName', 'DbBitRate', 'DbSampleRate', 'DbFormat', 'DbLength', 'DbAlbumTitle', 'DbGenre', 'DbComments', 'DbYear', 'DbTrackNumber', 'DbChannels', 'DbUrl', 'DbBpm', 'DbRating', 'DbEncodedBy', 'DbDiscNumber', 'DbMood', 'DbLabel', 'DbComposer', 'DbEncoder', 'DbChecksum', 'DbLyrics', 'DbOrchestra', 'DbConductor', 'DbLyricist', 'DbOriginalLyricist', 'DbRadioStationName', 'DbInfoUrl', 'DbArtistUrl', 'DbAudioSourceUrl', 'DbRadioStationUrl', 'DbBuyThisUrl', 'DbIsrcNumber', 'DbCatalogNumber', 'DbOriginalArtist', 'DbCopyright', 'DbReportDatetime', 'DbReportLocation', 'DbReportOrganization', 'DbSubject', 'DbContributor', 'DbLanguage', 'DbFileExists', 'DbSoundcloudId', 'DbSoundcloudErrorCode', 'DbSoundcloudErrorMsg', 'DbSoundcloudLinkToFile', 'DbSoundCloundUploadTime', 'DbReplayGain', 'DbOwnerId', 'DbCuein', 'DbCueout', 'DbSilanCheck', 'DbHidden', 'DbIsScheduled', 'DbIsPlaylist', 'DbFilesize', 'DbDescription', 'DbArtwork', 'DbMediaType', ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMime', 'dbFtype', 'dbDirectory', 'dbFilepath', 'dbImportStatus', 'dbCurrentlyaccessing', 'dbEditedby', 'dbMtime', 'dbUtime', 'dbLPtime', 'dbMd5', 'dbTrackTitle', 'dbArtistName', 'dbBitRate', 'dbSampleRate', 'dbFormat', 'dbLength', 'dbAlbumTitle', 'dbGenre', 'dbComments', 'dbYear', 'dbTrackNumber', 'dbChannels', 'dbUrl', 'dbBpm', 'dbRating', 'dbEncodedBy', 'dbDiscNumber', 'dbMood', 'dbLabel', 'dbComposer', 'dbEncoder', 'dbChecksum', 'dbLyrics', 'dbOrchestra', 'dbConductor', 'dbLyricist', 'dbOriginalLyricist', 'dbRadioStationName', 'dbInfoUrl', 'dbArtistUrl', 'dbAudioSourceUrl', 'dbRadioStationUrl', 'dbBuyThisUrl', 'dbIsrcNumber', 'dbCatalogNumber', 'dbOriginalArtist', 'dbCopyright', 'dbReportDatetime', 'dbReportLocation', 'dbReportOrganization', 'dbSubject', 'dbContributor', 'dbLanguage', 'dbFileExists', 'dbSoundcloudId', 'dbSoundcloudErrorCode', 'dbSoundcloudErrorMsg', 'dbSoundcloudLinkToFile', 'dbSoundCloundUploadTime', 'dbReplayGain', 'dbOwnerId', 'dbCuein', 'dbCueout', 'dbSilanCheck', 'dbHidden', 'dbIsScheduled', 'dbIsPlaylist', 'dbFilesize', 'dbDescription', 'dbArtwork', 'dbMediaType', ), - BasePeer::TYPE_COLNAME => array (CcFilesPeer::ID, CcFilesPeer::NAME, CcFilesPeer::MIME, CcFilesPeer::FTYPE, CcFilesPeer::DIRECTORY, CcFilesPeer::FILEPATH, CcFilesPeer::IMPORT_STATUS, CcFilesPeer::CURRENTLYACCESSING, CcFilesPeer::EDITEDBY, CcFilesPeer::MTIME, CcFilesPeer::UTIME, CcFilesPeer::LPTIME, CcFilesPeer::MD5, CcFilesPeer::TRACK_TITLE, CcFilesPeer::ARTIST_NAME, CcFilesPeer::BIT_RATE, CcFilesPeer::SAMPLE_RATE, CcFilesPeer::FORMAT, CcFilesPeer::LENGTH, CcFilesPeer::ALBUM_TITLE, CcFilesPeer::GENRE, CcFilesPeer::COMMENTS, CcFilesPeer::YEAR, CcFilesPeer::TRACK_NUMBER, CcFilesPeer::CHANNELS, CcFilesPeer::URL, CcFilesPeer::BPM, CcFilesPeer::RATING, CcFilesPeer::ENCODED_BY, CcFilesPeer::DISC_NUMBER, CcFilesPeer::MOOD, CcFilesPeer::LABEL, CcFilesPeer::COMPOSER, CcFilesPeer::ENCODER, CcFilesPeer::CHECKSUM, CcFilesPeer::LYRICS, CcFilesPeer::ORCHESTRA, CcFilesPeer::CONDUCTOR, CcFilesPeer::LYRICIST, CcFilesPeer::ORIGINAL_LYRICIST, CcFilesPeer::RADIO_STATION_NAME, CcFilesPeer::INFO_URL, CcFilesPeer::ARTIST_URL, CcFilesPeer::AUDIO_SOURCE_URL, CcFilesPeer::RADIO_STATION_URL, CcFilesPeer::BUY_THIS_URL, CcFilesPeer::ISRC_NUMBER, CcFilesPeer::CATALOG_NUMBER, CcFilesPeer::ORIGINAL_ARTIST, CcFilesPeer::COPYRIGHT, CcFilesPeer::REPORT_DATETIME, CcFilesPeer::REPORT_LOCATION, CcFilesPeer::REPORT_ORGANIZATION, CcFilesPeer::SUBJECT, CcFilesPeer::CONTRIBUTOR, CcFilesPeer::LANGUAGE, CcFilesPeer::FILE_EXISTS, CcFilesPeer::SOUNDCLOUD_ID, CcFilesPeer::SOUNDCLOUD_ERROR_CODE, CcFilesPeer::SOUNDCLOUD_ERROR_MSG, CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE, CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, CcFilesPeer::REPLAY_GAIN, CcFilesPeer::OWNER_ID, CcFilesPeer::CUEIN, CcFilesPeer::CUEOUT, CcFilesPeer::SILAN_CHECK, CcFilesPeer::HIDDEN, CcFilesPeer::IS_SCHEDULED, CcFilesPeer::IS_PLAYLIST, CcFilesPeer::FILESIZE, CcFilesPeer::DESCRIPTION, CcFilesPeer::ARTWORK, CcFilesPeer::MEDIA_TYPE, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MIME', 'FTYPE', 'DIRECTORY', 'FILEPATH', 'IMPORT_STATUS', 'CURRENTLYACCESSING', 'EDITEDBY', 'MTIME', 'UTIME', 'LPTIME', 'MD5', 'TRACK_TITLE', 'ARTIST_NAME', 'BIT_RATE', 'SAMPLE_RATE', 'FORMAT', 'LENGTH', 'ALBUM_TITLE', 'GENRE', 'COMMENTS', 'YEAR', 'TRACK_NUMBER', 'CHANNELS', 'URL', 'BPM', 'RATING', 'ENCODED_BY', 'DISC_NUMBER', 'MOOD', 'LABEL', 'COMPOSER', 'ENCODER', 'CHECKSUM', 'LYRICS', 'ORCHESTRA', 'CONDUCTOR', 'LYRICIST', 'ORIGINAL_LYRICIST', 'RADIO_STATION_NAME', 'INFO_URL', 'ARTIST_URL', 'AUDIO_SOURCE_URL', 'RADIO_STATION_URL', 'BUY_THIS_URL', 'ISRC_NUMBER', 'CATALOG_NUMBER', 'ORIGINAL_ARTIST', 'COPYRIGHT', 'REPORT_DATETIME', 'REPORT_LOCATION', 'REPORT_ORGANIZATION', 'SUBJECT', 'CONTRIBUTOR', 'LANGUAGE', 'FILE_EXISTS', 'SOUNDCLOUD_ID', 'SOUNDCLOUD_ERROR_CODE', 'SOUNDCLOUD_ERROR_MSG', 'SOUNDCLOUD_LINK_TO_FILE', 'SOUNDCLOUD_UPLOAD_TIME', 'REPLAY_GAIN', 'OWNER_ID', 'CUEIN', 'CUEOUT', 'SILAN_CHECK', 'HIDDEN', 'IS_SCHEDULED', 'IS_PLAYLIST', 'FILESIZE', 'DESCRIPTION', 'ARTWORK', 'MEDIA_TYPE', ), - BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mime', 'ftype', 'directory', 'filepath', 'import_status', 'currentlyaccessing', 'editedby', 'mtime', 'utime', 'lptime', 'md5', 'track_title', 'artist_name', 'bit_rate', 'sample_rate', 'format', 'length', 'album_title', 'genre', 'comments', 'year', 'track_number', 'channels', 'url', 'bpm', 'rating', 'encoded_by', 'disc_number', 'mood', 'label', 'composer', 'encoder', 'checksum', 'lyrics', 'orchestra', 'conductor', 'lyricist', 'original_lyricist', 'radio_station_name', 'info_url', 'artist_url', 'audio_source_url', 'radio_station_url', 'buy_this_url', 'isrc_number', 'catalog_number', 'original_artist', 'copyright', 'report_datetime', 'report_location', 'report_organization', 'subject', 'contributor', 'language', 'file_exists', 'soundcloud_id', 'soundcloud_error_code', 'soundcloud_error_msg', 'soundcloud_link_to_file', 'soundcloud_upload_time', 'replay_gain', 'owner_id', 'cuein', 'cueout', 'silan_check', 'hidden', 'is_scheduled', 'is_playlist', 'filesize', 'description', 'artwork', 'media_type', ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ) + BasePeer::TYPE_PHPNAME => array ('DbId', 'DbName', 'DbMime', 'DbFtype', 'DbDirectory', 'DbFilepath', 'DbImportStatus', 'DbCurrentlyaccessing', 'DbEditedby', 'DbMtime', 'DbUtime', 'DbLPtime', 'DbMd5', 'DbTrackTitle', 'DbArtistName', 'DbBitRate', 'DbSampleRate', 'DbFormat', 'DbLength', 'DbAlbumTitle', 'DbGenre', 'DbComments', 'DbYear', 'DbTrackNumber', 'DbChannels', 'DbUrl', 'DbBpm', 'DbRating', 'DbEncodedBy', 'DbDiscNumber', 'DbMood', 'DbLabel', 'DbComposer', 'DbEncoder', 'DbChecksum', 'DbLyrics', 'DbOrchestra', 'DbConductor', 'DbLyricist', 'DbOriginalLyricist', 'DbRadioStationName', 'DbInfoUrl', 'DbArtistUrl', 'DbAudioSourceUrl', 'DbRadioStationUrl', 'DbBuyThisUrl', 'DbIsrcNumber', 'DbCatalogNumber', 'DbOriginalArtist', 'DbCopyright', 'DbReportDatetime', 'DbReportLocation', 'DbReportOrganization', 'DbSubject', 'DbContributor', 'DbLanguage', 'DbFileExists', 'DbSoundcloudId', 'DbSoundcloudErrorCode', 'DbSoundcloudErrorMsg', 'DbSoundcloudLinkToFile', 'DbSoundCloundUploadTime', 'DbReplayGain', 'DbOwnerId', 'DbCuein', 'DbCueout', 'DbSilanCheck', 'DbHidden', 'DbIsScheduled', 'DbIsPlaylist', 'DbFilesize', 'DbDescription', 'DbArtwork', ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId', 'dbName', 'dbMime', 'dbFtype', 'dbDirectory', 'dbFilepath', 'dbImportStatus', 'dbCurrentlyaccessing', 'dbEditedby', 'dbMtime', 'dbUtime', 'dbLPtime', 'dbMd5', 'dbTrackTitle', 'dbArtistName', 'dbBitRate', 'dbSampleRate', 'dbFormat', 'dbLength', 'dbAlbumTitle', 'dbGenre', 'dbComments', 'dbYear', 'dbTrackNumber', 'dbChannels', 'dbUrl', 'dbBpm', 'dbRating', 'dbEncodedBy', 'dbDiscNumber', 'dbMood', 'dbLabel', 'dbComposer', 'dbEncoder', 'dbChecksum', 'dbLyrics', 'dbOrchestra', 'dbConductor', 'dbLyricist', 'dbOriginalLyricist', 'dbRadioStationName', 'dbInfoUrl', 'dbArtistUrl', 'dbAudioSourceUrl', 'dbRadioStationUrl', 'dbBuyThisUrl', 'dbIsrcNumber', 'dbCatalogNumber', 'dbOriginalArtist', 'dbCopyright', 'dbReportDatetime', 'dbReportLocation', 'dbReportOrganization', 'dbSubject', 'dbContributor', 'dbLanguage', 'dbFileExists', 'dbSoundcloudId', 'dbSoundcloudErrorCode', 'dbSoundcloudErrorMsg', 'dbSoundcloudLinkToFile', 'dbSoundCloundUploadTime', 'dbReplayGain', 'dbOwnerId', 'dbCuein', 'dbCueout', 'dbSilanCheck', 'dbHidden', 'dbIsScheduled', 'dbIsPlaylist', 'dbFilesize', 'dbDescription', 'dbArtwork', ), + BasePeer::TYPE_COLNAME => array (CcFilesPeer::ID, CcFilesPeer::NAME, CcFilesPeer::MIME, CcFilesPeer::FTYPE, CcFilesPeer::DIRECTORY, CcFilesPeer::FILEPATH, CcFilesPeer::IMPORT_STATUS, CcFilesPeer::CURRENTLYACCESSING, CcFilesPeer::EDITEDBY, CcFilesPeer::MTIME, CcFilesPeer::UTIME, CcFilesPeer::LPTIME, CcFilesPeer::MD5, CcFilesPeer::TRACK_TITLE, CcFilesPeer::ARTIST_NAME, CcFilesPeer::BIT_RATE, CcFilesPeer::SAMPLE_RATE, CcFilesPeer::FORMAT, CcFilesPeer::LENGTH, CcFilesPeer::ALBUM_TITLE, CcFilesPeer::GENRE, CcFilesPeer::COMMENTS, CcFilesPeer::YEAR, CcFilesPeer::TRACK_NUMBER, CcFilesPeer::CHANNELS, CcFilesPeer::URL, CcFilesPeer::BPM, CcFilesPeer::RATING, CcFilesPeer::ENCODED_BY, CcFilesPeer::DISC_NUMBER, CcFilesPeer::MOOD, CcFilesPeer::LABEL, CcFilesPeer::COMPOSER, CcFilesPeer::ENCODER, CcFilesPeer::CHECKSUM, CcFilesPeer::LYRICS, CcFilesPeer::ORCHESTRA, CcFilesPeer::CONDUCTOR, CcFilesPeer::LYRICIST, CcFilesPeer::ORIGINAL_LYRICIST, CcFilesPeer::RADIO_STATION_NAME, CcFilesPeer::INFO_URL, CcFilesPeer::ARTIST_URL, CcFilesPeer::AUDIO_SOURCE_URL, CcFilesPeer::RADIO_STATION_URL, CcFilesPeer::BUY_THIS_URL, CcFilesPeer::ISRC_NUMBER, CcFilesPeer::CATALOG_NUMBER, CcFilesPeer::ORIGINAL_ARTIST, CcFilesPeer::COPYRIGHT, CcFilesPeer::REPORT_DATETIME, CcFilesPeer::REPORT_LOCATION, CcFilesPeer::REPORT_ORGANIZATION, CcFilesPeer::SUBJECT, CcFilesPeer::CONTRIBUTOR, CcFilesPeer::LANGUAGE, CcFilesPeer::FILE_EXISTS, CcFilesPeer::SOUNDCLOUD_ID, CcFilesPeer::SOUNDCLOUD_ERROR_CODE, CcFilesPeer::SOUNDCLOUD_ERROR_MSG, CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE, CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME, CcFilesPeer::REPLAY_GAIN, CcFilesPeer::OWNER_ID, CcFilesPeer::CUEIN, CcFilesPeer::CUEOUT, CcFilesPeer::SILAN_CHECK, CcFilesPeer::HIDDEN, CcFilesPeer::IS_SCHEDULED, CcFilesPeer::IS_PLAYLIST, CcFilesPeer::FILESIZE, CcFilesPeer::DESCRIPTION, CcFilesPeer::ARTWORK, ), + BasePeer::TYPE_RAW_COLNAME => array ('ID', 'NAME', 'MIME', 'FTYPE', 'DIRECTORY', 'FILEPATH', 'IMPORT_STATUS', 'CURRENTLYACCESSING', 'EDITEDBY', 'MTIME', 'UTIME', 'LPTIME', 'MD5', 'TRACK_TITLE', 'ARTIST_NAME', 'BIT_RATE', 'SAMPLE_RATE', 'FORMAT', 'LENGTH', 'ALBUM_TITLE', 'GENRE', 'COMMENTS', 'YEAR', 'TRACK_NUMBER', 'CHANNELS', 'URL', 'BPM', 'RATING', 'ENCODED_BY', 'DISC_NUMBER', 'MOOD', 'LABEL', 'COMPOSER', 'ENCODER', 'CHECKSUM', 'LYRICS', 'ORCHESTRA', 'CONDUCTOR', 'LYRICIST', 'ORIGINAL_LYRICIST', 'RADIO_STATION_NAME', 'INFO_URL', 'ARTIST_URL', 'AUDIO_SOURCE_URL', 'RADIO_STATION_URL', 'BUY_THIS_URL', 'ISRC_NUMBER', 'CATALOG_NUMBER', 'ORIGINAL_ARTIST', 'COPYRIGHT', 'REPORT_DATETIME', 'REPORT_LOCATION', 'REPORT_ORGANIZATION', 'SUBJECT', 'CONTRIBUTOR', 'LANGUAGE', 'FILE_EXISTS', 'SOUNDCLOUD_ID', 'SOUNDCLOUD_ERROR_CODE', 'SOUNDCLOUD_ERROR_MSG', 'SOUNDCLOUD_LINK_TO_FILE', 'SOUNDCLOUD_UPLOAD_TIME', 'REPLAY_GAIN', 'OWNER_ID', 'CUEIN', 'CUEOUT', 'SILAN_CHECK', 'HIDDEN', 'IS_SCHEDULED', 'IS_PLAYLIST', 'FILESIZE', 'DESCRIPTION', 'ARTWORK', ), + BasePeer::TYPE_FIELDNAME => array ('id', 'name', 'mime', 'ftype', 'directory', 'filepath', 'import_status', 'currentlyaccessing', 'editedby', 'mtime', 'utime', 'lptime', 'md5', 'track_title', 'artist_name', 'bit_rate', 'sample_rate', 'format', 'length', 'album_title', 'genre', 'comments', 'year', 'track_number', 'channels', 'url', 'bpm', 'rating', 'encoded_by', 'disc_number', 'mood', 'label', 'composer', 'encoder', 'checksum', 'lyrics', 'orchestra', 'conductor', 'lyricist', 'original_lyricist', 'radio_station_name', 'info_url', 'artist_url', 'audio_source_url', 'radio_station_url', 'buy_this_url', 'isrc_number', 'catalog_number', 'original_artist', 'copyright', 'report_datetime', 'report_location', 'report_organization', 'subject', 'contributor', 'language', 'file_exists', 'soundcloud_id', 'soundcloud_error_code', 'soundcloud_error_msg', 'soundcloud_link_to_file', 'soundcloud_upload_time', 'replay_gain', 'owner_id', 'cuein', 'cueout', 'silan_check', 'hidden', 'is_scheduled', 'is_playlist', 'filesize', 'description', 'artwork', ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, ) ); /** @@ -288,12 +285,12 @@ abstract class BaseCcFilesPeer * e.g. CcFilesPeer::$fieldNames[BasePeer::TYPE_PHPNAME]['Id'] = 0 */ protected static $fieldKeys = array ( - BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMime' => 2, 'DbFtype' => 3, 'DbDirectory' => 4, 'DbFilepath' => 5, 'DbImportStatus' => 6, 'DbCurrentlyaccessing' => 7, 'DbEditedby' => 8, 'DbMtime' => 9, 'DbUtime' => 10, 'DbLPtime' => 11, 'DbMd5' => 12, 'DbTrackTitle' => 13, 'DbArtistName' => 14, 'DbBitRate' => 15, 'DbSampleRate' => 16, 'DbFormat' => 17, 'DbLength' => 18, 'DbAlbumTitle' => 19, 'DbGenre' => 20, 'DbComments' => 21, 'DbYear' => 22, 'DbTrackNumber' => 23, 'DbChannels' => 24, 'DbUrl' => 25, 'DbBpm' => 26, 'DbRating' => 27, 'DbEncodedBy' => 28, 'DbDiscNumber' => 29, 'DbMood' => 30, 'DbLabel' => 31, 'DbComposer' => 32, 'DbEncoder' => 33, 'DbChecksum' => 34, 'DbLyrics' => 35, 'DbOrchestra' => 36, 'DbConductor' => 37, 'DbLyricist' => 38, 'DbOriginalLyricist' => 39, 'DbRadioStationName' => 40, 'DbInfoUrl' => 41, 'DbArtistUrl' => 42, 'DbAudioSourceUrl' => 43, 'DbRadioStationUrl' => 44, 'DbBuyThisUrl' => 45, 'DbIsrcNumber' => 46, 'DbCatalogNumber' => 47, 'DbOriginalArtist' => 48, 'DbCopyright' => 49, 'DbReportDatetime' => 50, 'DbReportLocation' => 51, 'DbReportOrganization' => 52, 'DbSubject' => 53, 'DbContributor' => 54, 'DbLanguage' => 55, 'DbFileExists' => 56, 'DbSoundcloudId' => 57, 'DbSoundcloudErrorCode' => 58, 'DbSoundcloudErrorMsg' => 59, 'DbSoundcloudLinkToFile' => 60, 'DbSoundCloundUploadTime' => 61, 'DbReplayGain' => 62, 'DbOwnerId' => 63, 'DbCuein' => 64, 'DbCueout' => 65, 'DbSilanCheck' => 66, 'DbHidden' => 67, 'DbIsScheduled' => 68, 'DbIsPlaylist' => 69, 'DbFilesize' => 70, 'DbDescription' => 71, 'DbArtwork' => 72, 'DbMediaType' => 73, ), - BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMime' => 2, 'dbFtype' => 3, 'dbDirectory' => 4, 'dbFilepath' => 5, 'dbImportStatus' => 6, 'dbCurrentlyaccessing' => 7, 'dbEditedby' => 8, 'dbMtime' => 9, 'dbUtime' => 10, 'dbLPtime' => 11, 'dbMd5' => 12, 'dbTrackTitle' => 13, 'dbArtistName' => 14, 'dbBitRate' => 15, 'dbSampleRate' => 16, 'dbFormat' => 17, 'dbLength' => 18, 'dbAlbumTitle' => 19, 'dbGenre' => 20, 'dbComments' => 21, 'dbYear' => 22, 'dbTrackNumber' => 23, 'dbChannels' => 24, 'dbUrl' => 25, 'dbBpm' => 26, 'dbRating' => 27, 'dbEncodedBy' => 28, 'dbDiscNumber' => 29, 'dbMood' => 30, 'dbLabel' => 31, 'dbComposer' => 32, 'dbEncoder' => 33, 'dbChecksum' => 34, 'dbLyrics' => 35, 'dbOrchestra' => 36, 'dbConductor' => 37, 'dbLyricist' => 38, 'dbOriginalLyricist' => 39, 'dbRadioStationName' => 40, 'dbInfoUrl' => 41, 'dbArtistUrl' => 42, 'dbAudioSourceUrl' => 43, 'dbRadioStationUrl' => 44, 'dbBuyThisUrl' => 45, 'dbIsrcNumber' => 46, 'dbCatalogNumber' => 47, 'dbOriginalArtist' => 48, 'dbCopyright' => 49, 'dbReportDatetime' => 50, 'dbReportLocation' => 51, 'dbReportOrganization' => 52, 'dbSubject' => 53, 'dbContributor' => 54, 'dbLanguage' => 55, 'dbFileExists' => 56, 'dbSoundcloudId' => 57, 'dbSoundcloudErrorCode' => 58, 'dbSoundcloudErrorMsg' => 59, 'dbSoundcloudLinkToFile' => 60, 'dbSoundCloundUploadTime' => 61, 'dbReplayGain' => 62, 'dbOwnerId' => 63, 'dbCuein' => 64, 'dbCueout' => 65, 'dbSilanCheck' => 66, 'dbHidden' => 67, 'dbIsScheduled' => 68, 'dbIsPlaylist' => 69, 'dbFilesize' => 70, 'dbDescription' => 71, 'dbArtwork' => 72, 'dbMediaType' => 73, ), + BasePeer::TYPE_PHPNAME => array ('DbId' => 0, 'DbName' => 1, 'DbMime' => 2, 'DbFtype' => 3, 'DbDirectory' => 4, 'DbFilepath' => 5, 'DbImportStatus' => 6, 'DbCurrentlyaccessing' => 7, 'DbEditedby' => 8, 'DbMtime' => 9, 'DbUtime' => 10, 'DbLPtime' => 11, 'DbMd5' => 12, 'DbTrackTitle' => 13, 'DbArtistName' => 14, 'DbBitRate' => 15, 'DbSampleRate' => 16, 'DbFormat' => 17, 'DbLength' => 18, 'DbAlbumTitle' => 19, 'DbGenre' => 20, 'DbComments' => 21, 'DbYear' => 22, 'DbTrackNumber' => 23, 'DbChannels' => 24, 'DbUrl' => 25, 'DbBpm' => 26, 'DbRating' => 27, 'DbEncodedBy' => 28, 'DbDiscNumber' => 29, 'DbMood' => 30, 'DbLabel' => 31, 'DbComposer' => 32, 'DbEncoder' => 33, 'DbChecksum' => 34, 'DbLyrics' => 35, 'DbOrchestra' => 36, 'DbConductor' => 37, 'DbLyricist' => 38, 'DbOriginalLyricist' => 39, 'DbRadioStationName' => 40, 'DbInfoUrl' => 41, 'DbArtistUrl' => 42, 'DbAudioSourceUrl' => 43, 'DbRadioStationUrl' => 44, 'DbBuyThisUrl' => 45, 'DbIsrcNumber' => 46, 'DbCatalogNumber' => 47, 'DbOriginalArtist' => 48, 'DbCopyright' => 49, 'DbReportDatetime' => 50, 'DbReportLocation' => 51, 'DbReportOrganization' => 52, 'DbSubject' => 53, 'DbContributor' => 54, 'DbLanguage' => 55, 'DbFileExists' => 56, 'DbSoundcloudId' => 57, 'DbSoundcloudErrorCode' => 58, 'DbSoundcloudErrorMsg' => 59, 'DbSoundcloudLinkToFile' => 60, 'DbSoundCloundUploadTime' => 61, 'DbReplayGain' => 62, 'DbOwnerId' => 63, 'DbCuein' => 64, 'DbCueout' => 65, 'DbSilanCheck' => 66, 'DbHidden' => 67, 'DbIsScheduled' => 68, 'DbIsPlaylist' => 69, 'DbFilesize' => 70, 'DbDescription' => 71, 'DbArtwork' => 72, ), + BasePeer::TYPE_STUDLYPHPNAME => array ('dbId' => 0, 'dbName' => 1, 'dbMime' => 2, 'dbFtype' => 3, 'dbDirectory' => 4, 'dbFilepath' => 5, 'dbImportStatus' => 6, 'dbCurrentlyaccessing' => 7, 'dbEditedby' => 8, 'dbMtime' => 9, 'dbUtime' => 10, 'dbLPtime' => 11, 'dbMd5' => 12, 'dbTrackTitle' => 13, 'dbArtistName' => 14, 'dbBitRate' => 15, 'dbSampleRate' => 16, 'dbFormat' => 17, 'dbLength' => 18, 'dbAlbumTitle' => 19, 'dbGenre' => 20, 'dbComments' => 21, 'dbYear' => 22, 'dbTrackNumber' => 23, 'dbChannels' => 24, 'dbUrl' => 25, 'dbBpm' => 26, 'dbRating' => 27, 'dbEncodedBy' => 28, 'dbDiscNumber' => 29, 'dbMood' => 30, 'dbLabel' => 31, 'dbComposer' => 32, 'dbEncoder' => 33, 'dbChecksum' => 34, 'dbLyrics' => 35, 'dbOrchestra' => 36, 'dbConductor' => 37, 'dbLyricist' => 38, 'dbOriginalLyricist' => 39, 'dbRadioStationName' => 40, 'dbInfoUrl' => 41, 'dbArtistUrl' => 42, 'dbAudioSourceUrl' => 43, 'dbRadioStationUrl' => 44, 'dbBuyThisUrl' => 45, 'dbIsrcNumber' => 46, 'dbCatalogNumber' => 47, 'dbOriginalArtist' => 48, 'dbCopyright' => 49, 'dbReportDatetime' => 50, 'dbReportLocation' => 51, 'dbReportOrganization' => 52, 'dbSubject' => 53, 'dbContributor' => 54, 'dbLanguage' => 55, 'dbFileExists' => 56, 'dbSoundcloudId' => 57, 'dbSoundcloudErrorCode' => 58, 'dbSoundcloudErrorMsg' => 59, 'dbSoundcloudLinkToFile' => 60, 'dbSoundCloundUploadTime' => 61, 'dbReplayGain' => 62, 'dbOwnerId' => 63, 'dbCuein' => 64, 'dbCueout' => 65, 'dbSilanCheck' => 66, 'dbHidden' => 67, 'dbIsScheduled' => 68, 'dbIsPlaylist' => 69, 'dbFilesize' => 70, 'dbDescription' => 71, 'dbArtwork' => 72, ), BasePeer::TYPE_COLNAME => array (CcFilesPeer::ID => 0, CcFilesPeer::NAME => 1, CcFilesPeer::MIME => 2, CcFilesPeer::FTYPE => 3, CcFilesPeer::DIRECTORY => 4, CcFilesPeer::FILEPATH => 5, CcFilesPeer::IMPORT_STATUS => 6, CcFilesPeer::CURRENTLYACCESSING => 7, CcFilesPeer::EDITEDBY => 8, CcFilesPeer::MTIME => 9, CcFilesPeer::UTIME => 10, CcFilesPeer::LPTIME => 11, CcFilesPeer::MD5 => 12, CcFilesPeer::TRACK_TITLE => 13, CcFilesPeer::ARTIST_NAME => 14, CcFilesPeer::BIT_RATE => 15, CcFilesPeer::SAMPLE_RATE => 16, CcFilesPeer::FORMAT => 17, CcFilesPeer::LENGTH => 18, CcFilesPeer::ALBUM_TITLE => 19, CcFilesPeer::GENRE => 20, CcFilesPeer::COMMENTS => 21, CcFilesPeer::YEAR => 22, CcFilesPeer::TRACK_NUMBER => 23, CcFilesPeer::CHANNELS => 24, CcFilesPeer::URL => 25, CcFilesPeer::BPM => 26, CcFilesPeer::RATING => 27, CcFilesPeer::ENCODED_BY => 28, CcFilesPeer::DISC_NUMBER => 29, CcFilesPeer::MOOD => 30, CcFilesPeer::LABEL => 31, CcFilesPeer::COMPOSER => 32, CcFilesPeer::ENCODER => 33, CcFilesPeer::CHECKSUM => 34, CcFilesPeer::LYRICS => 35, CcFilesPeer::ORCHESTRA => 36, CcFilesPeer::CONDUCTOR => 37, CcFilesPeer::LYRICIST => 38, CcFilesPeer::ORIGINAL_LYRICIST => 39, CcFilesPeer::RADIO_STATION_NAME => 40, CcFilesPeer::INFO_URL => 41, CcFilesPeer::ARTIST_URL => 42, CcFilesPeer::AUDIO_SOURCE_URL => 43, CcFilesPeer::RADIO_STATION_URL => 44, CcFilesPeer::BUY_THIS_URL => 45, CcFilesPeer::ISRC_NUMBER => 46, CcFilesPeer::CATALOG_NUMBER => 47, CcFilesPeer::ORIGINAL_ARTIST => 48, CcFilesPeer::COPYRIGHT => 49, CcFilesPeer::REPORT_DATETIME => 50, CcFilesPeer::REPORT_LOCATION => 51, CcFilesPeer::REPORT_ORGANIZATION => 52, CcFilesPeer::SUBJECT => 53, CcFilesPeer::CONTRIBUTOR => 54, CcFilesPeer::LANGUAGE => 55, CcFilesPeer::FILE_EXISTS => 56, CcFilesPeer::SOUNDCLOUD_ID => 57, CcFilesPeer::SOUNDCLOUD_ERROR_CODE => 58, CcFilesPeer::SOUNDCLOUD_ERROR_MSG => 59, CcFilesPeer::SOUNDCLOUD_LINK_TO_FILE => 60, CcFilesPeer::SOUNDCLOUD_UPLOAD_TIME => 61, CcFilesPeer::REPLAY_GAIN => 62, CcFilesPeer::OWNER_ID => 63, CcFilesPeer::CUEIN => 64, CcFilesPeer::CUEOUT => 65, CcFilesPeer::SILAN_CHECK => 66, CcFilesPeer::HIDDEN => 67, CcFilesPeer::IS_SCHEDULED => 68, CcFilesPeer::IS_PLAYLIST => 69, CcFilesPeer::FILESIZE => 70, CcFilesPeer::DESCRIPTION => 71, CcFilesPeer::DESCRIPTION => 72, ), - BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MIME' => 2, 'FTYPE' => 3, 'DIRECTORY' => 4, 'FILEPATH' => 5, 'IMPORT_STATUS' => 6, 'CURRENTLYACCESSING' => 7, 'EDITEDBY' => 8, 'MTIME' => 9, 'UTIME' => 10, 'LPTIME' => 11, 'MD5' => 12, 'TRACK_TITLE' => 13, 'ARTIST_NAME' => 14, 'BIT_RATE' => 15, 'SAMPLE_RATE' => 16, 'FORMAT' => 17, 'LENGTH' => 18, 'ALBUM_TITLE' => 19, 'GENRE' => 20, 'COMMENTS' => 21, 'YEAR' => 22, 'TRACK_NUMBER' => 23, 'CHANNELS' => 24, 'URL' => 25, 'BPM' => 26, 'RATING' => 27, 'ENCODED_BY' => 28, 'DISC_NUMBER' => 29, 'MOOD' => 30, 'LABEL' => 31, 'COMPOSER' => 32, 'ENCODER' => 33, 'CHECKSUM' => 34, 'LYRICS' => 35, 'ORCHESTRA' => 36, 'CONDUCTOR' => 37, 'LYRICIST' => 38, 'ORIGINAL_LYRICIST' => 39, 'RADIO_STATION_NAME' => 40, 'INFO_URL' => 41, 'ARTIST_URL' => 42, 'AUDIO_SOURCE_URL' => 43, 'RADIO_STATION_URL' => 44, 'BUY_THIS_URL' => 45, 'ISRC_NUMBER' => 46, 'CATALOG_NUMBER' => 47, 'ORIGINAL_ARTIST' => 48, 'COPYRIGHT' => 49, 'REPORT_DATETIME' => 50, 'REPORT_LOCATION' => 51, 'REPORT_ORGANIZATION' => 52, 'SUBJECT' => 53, 'CONTRIBUTOR' => 54, 'LANGUAGE' => 55, 'FILE_EXISTS' => 56, 'SOUNDCLOUD_ID' => 57, 'SOUNDCLOUD_ERROR_CODE' => 58, 'SOUNDCLOUD_ERROR_MSG' => 59, 'SOUNDCLOUD_LINK_TO_FILE' => 60, 'SOUNDCLOUD_UPLOAD_TIME' => 61, 'REPLAY_GAIN' => 62, 'OWNER_ID' => 63, 'CUEIN' => 64, 'CUEOUT' => 65, 'SILAN_CHECK' => 66, 'HIDDEN' => 67, 'IS_SCHEDULED' => 68, 'IS_PLAYLIST' => 69, 'FILESIZE' => 70, 'DESCRIPTION' => 71, 'ARTWORK' => 72, 'MEDIA_TYPE' => 73, ), - BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mime' => 2, 'ftype' => 3, 'directory' => 4, 'filepath' => 5, 'import_status' => 6, 'currentlyaccessing' => 7, 'editedby' => 8, 'mtime' => 9, 'utime' => 10, 'lptime' => 11, 'md5' => 12, 'track_title' => 13, 'artist_name' => 14, 'bit_rate' => 15, 'sample_rate' => 16, 'format' => 17, 'length' => 18, 'album_title' => 19, 'genre' => 20, 'comments' => 21, 'year' => 22, 'track_number' => 23, 'channels' => 24, 'url' => 25, 'bpm' => 26, 'rating' => 27, 'encoded_by' => 28, 'disc_number' => 29, 'mood' => 30, 'label' => 31, 'composer' => 32, 'encoder' => 33, 'checksum' => 34, 'lyrics' => 35, 'orchestra' => 36, 'conductor' => 37, 'lyricist' => 38, 'original_lyricist' => 39, 'radio_station_name' => 40, 'info_url' => 41, 'artist_url' => 42, 'audio_source_url' => 43, 'radio_station_url' => 44, 'buy_this_url' => 45, 'isrc_number' => 46, 'catalog_number' => 47, 'original_artist' => 48, 'copyright' => 49, 'report_datetime' => 50, 'report_location' => 51, 'report_organization' => 52, 'subject' => 53, 'contributor' => 54, 'language' => 55, 'file_exists' => 56, 'soundcloud_id' => 57, 'soundcloud_error_code' => 58, 'soundcloud_error_msg' => 59, 'soundcloud_link_to_file' => 60, 'soundcloud_upload_time' => 61, 'replay_gain' => 62, 'owner_id' => 63, 'cuein' => 64, 'cueout' => 65, 'silan_check' => 66, 'hidden' => 67, 'is_scheduled' => 68, 'is_playlist' => 69, 'filesize' => 70, 'description' => 71, 'artwork' => 72, 'media_type' => 73, ), - BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, ) + BasePeer::TYPE_RAW_COLNAME => array ('ID' => 0, 'NAME' => 1, 'MIME' => 2, 'FTYPE' => 3, 'DIRECTORY' => 4, 'FILEPATH' => 5, 'IMPORT_STATUS' => 6, 'CURRENTLYACCESSING' => 7, 'EDITEDBY' => 8, 'MTIME' => 9, 'UTIME' => 10, 'LPTIME' => 11, 'MD5' => 12, 'TRACK_TITLE' => 13, 'ARTIST_NAME' => 14, 'BIT_RATE' => 15, 'SAMPLE_RATE' => 16, 'FORMAT' => 17, 'LENGTH' => 18, 'ALBUM_TITLE' => 19, 'GENRE' => 20, 'COMMENTS' => 21, 'YEAR' => 22, 'TRACK_NUMBER' => 23, 'CHANNELS' => 24, 'URL' => 25, 'BPM' => 26, 'RATING' => 27, 'ENCODED_BY' => 28, 'DISC_NUMBER' => 29, 'MOOD' => 30, 'LABEL' => 31, 'COMPOSER' => 32, 'ENCODER' => 33, 'CHECKSUM' => 34, 'LYRICS' => 35, 'ORCHESTRA' => 36, 'CONDUCTOR' => 37, 'LYRICIST' => 38, 'ORIGINAL_LYRICIST' => 39, 'RADIO_STATION_NAME' => 40, 'INFO_URL' => 41, 'ARTIST_URL' => 42, 'AUDIO_SOURCE_URL' => 43, 'RADIO_STATION_URL' => 44, 'BUY_THIS_URL' => 45, 'ISRC_NUMBER' => 46, 'CATALOG_NUMBER' => 47, 'ORIGINAL_ARTIST' => 48, 'COPYRIGHT' => 49, 'REPORT_DATETIME' => 50, 'REPORT_LOCATION' => 51, 'REPORT_ORGANIZATION' => 52, 'SUBJECT' => 53, 'CONTRIBUTOR' => 54, 'LANGUAGE' => 55, 'FILE_EXISTS' => 56, 'SOUNDCLOUD_ID' => 57, 'SOUNDCLOUD_ERROR_CODE' => 58, 'SOUNDCLOUD_ERROR_MSG' => 59, 'SOUNDCLOUD_LINK_TO_FILE' => 60, 'SOUNDCLOUD_UPLOAD_TIME' => 61, 'REPLAY_GAIN' => 62, 'OWNER_ID' => 63, 'CUEIN' => 64, 'CUEOUT' => 65, 'SILAN_CHECK' => 66, 'HIDDEN' => 67, 'IS_SCHEDULED' => 68, 'IS_PLAYLIST' => 69, 'FILESIZE' => 70, 'DESCRIPTION' => 71, 'ARTWORK' => 72, ), + BasePeer::TYPE_FIELDNAME => array ('id' => 0, 'name' => 1, 'mime' => 2, 'ftype' => 3, 'directory' => 4, 'filepath' => 5, 'import_status' => 6, 'currentlyaccessing' => 7, 'editedby' => 8, 'mtime' => 9, 'utime' => 10, 'lptime' => 11, 'md5' => 12, 'track_title' => 13, 'artist_name' => 14, 'bit_rate' => 15, 'sample_rate' => 16, 'format' => 17, 'length' => 18, 'album_title' => 19, 'genre' => 20, 'comments' => 21, 'year' => 22, 'track_number' => 23, 'channels' => 24, 'url' => 25, 'bpm' => 26, 'rating' => 27, 'encoded_by' => 28, 'disc_number' => 29, 'mood' => 30, 'label' => 31, 'composer' => 32, 'encoder' => 33, 'checksum' => 34, 'lyrics' => 35, 'orchestra' => 36, 'conductor' => 37, 'lyricist' => 38, 'original_lyricist' => 39, 'radio_station_name' => 40, 'info_url' => 41, 'artist_url' => 42, 'audio_source_url' => 43, 'radio_station_url' => 44, 'buy_this_url' => 45, 'isrc_number' => 46, 'catalog_number' => 47, 'original_artist' => 48, 'copyright' => 49, 'report_datetime' => 50, 'report_location' => 51, 'report_organization' => 52, 'subject' => 53, 'contributor' => 54, 'language' => 55, 'file_exists' => 56, 'soundcloud_id' => 57, 'soundcloud_error_code' => 58, 'soundcloud_error_msg' => 59, 'soundcloud_link_to_file' => 60, 'soundcloud_upload_time' => 61, 'replay_gain' => 62, 'owner_id' => 63, 'cuein' => 64, 'cueout' => 65, 'silan_check' => 66, 'hidden' => 67, 'is_scheduled' => 68, 'is_playlist' => 69, 'filesize' => 70, 'description' => 71, 'artwork' => 72, ), + BasePeer::TYPE_NUM => array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, ) ); /** @@ -440,7 +437,6 @@ abstract class BaseCcFilesPeer $criteria->addSelectColumn(CcFilesPeer::FILESIZE); $criteria->addSelectColumn(CcFilesPeer::DESCRIPTION); $criteria->addSelectColumn(CcFilesPeer::ARTWORK); - $criteria->addSelectColumn(CcFilesPeer::MEDIA_TYPE); } else { $criteria->addSelectColumn($alias . '.id'); $criteria->addSelectColumn($alias . '.name'); @@ -515,7 +511,6 @@ abstract class BaseCcFilesPeer $criteria->addSelectColumn($alias . '.filesize'); $criteria->addSelectColumn($alias . '.description'); $criteria->addSelectColumn($alias . '.artwork'); - $criteria->addSelectColumn($alias . '.media_type'); } } diff --git a/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php b/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php index f026dee8a..6c5afc688 100644 --- a/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php +++ b/airtime_mvc/application/models/airtime/om/BaseCcFilesQuery.php @@ -79,7 +79,6 @@ * @method CcFilesQuery orderByDbFilesize($order = Criteria::ASC) Order by the filesize column * @method CcFilesQuery orderByDbDescription($order = Criteria::ASC) Order by the description column * @method CcFilesQuery orderByDbArtwork($order = Criteria::ASC) Order by the artwork column - * @method CcFilesQuery orderByDbMediaType($order = Criteria::ASC) Order by the media_type column * * @method CcFilesQuery groupByDbId() Group by the id column * @method CcFilesQuery groupByDbName() Group by the name column @@ -154,7 +153,6 @@ * @method CcFilesQuery groupByDbFilesize() Group by the filesize column * @method CcFilesQuery groupByDbDescription() Group by the description column * @method CcFilesQuery groupByDbArtwork() Group by the artwork column - * @method CcFilesQuery groupByDbMediaType() Group by the media_type column * * @method CcFilesQuery leftJoin($relation) Adds a LEFT JOIN clause to the query * @method CcFilesQuery rightJoin($relation) Adds a RIGHT JOIN clause to the query @@ -279,7 +277,6 @@ * @method CcFiles findOneByDbFilesize(int $filesize) Return the first CcFiles filtered by the filesize column * @method CcFiles findOneByDbDescription(string $description) Return the first CcFiles filtered by the description column * @method CcFiles findOneByDbArtwork(string $artwork) Return the first CcFiles filtered by the artwork column - * @method CcFiles findOneByDbMediaType(string $media_type) Return the first CcFiles filtered by the media_type column * * @method array findByDbId(int $id) Return CcFiles objects filtered by the id column * @method array findByDbName(string $name) Return CcFiles objects filtered by the name column @@ -354,7 +351,6 @@ * @method array findByDbFilesize(int $filesize) Return CcFiles objects filtered by the filesize column * @method array findByDbDescription(string $description) Return CcFiles objects filtered by the description column * @method array findByDbArtwork(string $artwork) Return CcFiles objects filtered by the artwork column - * @method array findByDbMediaType(string $media_type) Return CcFiles objects filtered by the media_type column * * @package propel.generator.airtime.om */ @@ -462,7 +458,7 @@ abstract class BaseCcFilesQuery extends ModelCriteria */ protected function findPkSimple($key, $con) { - $sql = 'SELECT "id", "name", "mime", "ftype", "directory", "filepath", "import_status", "currentlyaccessing", "editedby", "mtime", "utime", "lptime", "md5", "track_title", "artist_name", "bit_rate", "sample_rate", "format", "length", "album_title", "genre", "comments", "year", "track_number", "channels", "url", "bpm", "rating", "encoded_by", "disc_number", "mood", "label", "composer", "encoder", "checksum", "lyrics", "orchestra", "conductor", "lyricist", "original_lyricist", "radio_station_name", "info_url", "artist_url", "audio_source_url", "radio_station_url", "buy_this_url", "isrc_number", "catalog_number", "original_artist", "copyright", "report_datetime", "report_location", "report_organization", "subject", "contributor", "language", "file_exists", "soundcloud_id", "soundcloud_error_code", "soundcloud_error_msg", "soundcloud_link_to_file", "soundcloud_upload_time", "replay_gain", "owner_id", "cuein", "cueout", "silan_check", "hidden", "is_scheduled", "is_playlist", "filesize", "description", "artwork", "media_type" FROM "cc_files" WHERE "id" = :p0'; + $sql = 'SELECT "id", "name", "mime", "ftype", "directory", "filepath", "import_status", "currentlyaccessing", "editedby", "mtime", "utime", "lptime", "md5", "track_title", "artist_name", "bit_rate", "sample_rate", "format", "length", "album_title", "genre", "comments", "year", "track_number", "channels", "url", "bpm", "rating", "encoded_by", "disc_number", "mood", "label", "composer", "encoder", "checksum", "lyrics", "orchestra", "conductor", "lyricist", "original_lyricist", "radio_station_name", "info_url", "artist_url", "audio_source_url", "radio_station_url", "buy_this_url", "isrc_number", "catalog_number", "original_artist", "copyright", "report_datetime", "report_location", "report_organization", "subject", "contributor", "language", "file_exists", "soundcloud_id", "soundcloud_error_code", "soundcloud_error_msg", "soundcloud_link_to_file", "soundcloud_upload_time", "replay_gain", "owner_id", "cuein", "cueout", "silan_check", "hidden", "is_scheduled", "is_playlist", "filesize", "description", "artwork" FROM "cc_files" WHERE "id" = :p0'; try { $stmt = $con->prepare($sql); $stmt->bindValue(':p0', $key, PDO::PARAM_INT); @@ -1974,35 +1970,6 @@ abstract class BaseCcFilesQuery extends ModelCriteria return $this->addUsingAlias(CcFilesPeer::ARTWORK, $dbArtwork, $comparison); } - /** - * Filter the query on the media_type column - * - * Example usage: - * - * $query->filterByDbMediaType('fooValue'); // WHERE media_type = 'fooValue' - * $query->filterByDbMediaType('%fooValue%'); // WHERE media_type LIKE '%fooValue%' - * - * - * @param string $dbMediaType 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 CcFilesQuery The current query, for fluid interface - */ - public function filterByDbMediaType($dbMediaType = null, $comparison = null) - { - if (null === $comparison) { - if (is_array($dbMediaType)) { - $comparison = Criteria::IN; - } elseif (preg_match('/[\%\*]/', $dbMediaType)) { - $dbMediaType = str_replace('*', '%', $dbMediaType); - $comparison = Criteria::LIKE; - } - } - - return $this->addUsingAlias(CcFilesPeer::MEDIA_TYPE, $dbMediaType, $comparison); - } - /** * Filter the query on the artist_url column * diff --git a/airtime_mvc/application/services/HistoryService.php b/airtime_mvc/application/services/HistoryService.php index 9fb1d3108..4ac58e2ed 100644 --- a/airtime_mvc/application/services/HistoryService.php +++ b/airtime_mvc/application/services/HistoryService.php @@ -516,41 +516,41 @@ class Application_Service_HistoryService return $filteredShows; } - + public function insertWebstreamMetadata($schedId, $startDT, $data) { - + $this->con->beginTransaction(); - + try { - + $item = CcScheduleQuery::create()->findPK($schedId, $this->con); - + //TODO figure out how to combine these all into 1 query. $showInstance = $item->getCcShowInstances($this->con); $show = $showInstance->getCcShow($this->con); - + $webstream = $item->getCcWebstream($this->con); - + $metadata = array(); $metadata["showname"] = $show->getDbName(); $metadata[MDATA_KEY_TITLE] = $data->title; $metadata[MDATA_KEY_CREATOR] = $webstream->getDbName(); - + $history = new CcPlayoutHistory(); $history->setDbStarts($startDT); $history->setDbEnds(null); $history->setDbInstanceId($item->getDbInstanceId()); - + foreach ($metadata as $key => $val) { $meta = new CcPlayoutHistoryMetaData(); $meta->setDbKey($key); $meta->setDbValue($val); - + $history->addCcPlayoutHistoryMetaData($meta); } - + $history->save($this->con); - + $this->con->commit(); } catch (Exception $e) { @@ -586,36 +586,36 @@ class Application_Service_HistoryService $itemEnd = $item->getDbEnds(null); $recordStart = $item->getDbStarts(null); $recordEnd = ($instanceEnd < $itemEnd) ? $instanceEnd : $itemEnd; - + //first check if this is a duplicate // (caused by restarting liquidsoap) - + $prevRecord = CcPlayoutHistoryQuery::create() ->filterByDbStarts($recordStart) ->filterByDbEnds($recordEnd) ->filterByDbFileId($fileId) ->findOne($this->con); - + if (empty($prevRecord)) { - + $history = new CcPlayoutHistory(); $history->setDbFileId($fileId); $history->setDbStarts($recordStart); $history->setDbEnds($recordEnd); $history->setDbInstanceId($item->getDbInstanceId()); - + foreach ($metadata as $key => $val) { $meta = new CcPlayoutHistoryMetaData(); $meta->setDbKey($key); $meta->setDbValue($val); - + $history->addCcPlayoutHistoryMetaData($meta); } - + $history->save($this->con); $this->con->commit(); - } - } + } + } } catch (Exception $e) { $this->con->rollback(); @@ -1126,7 +1126,6 @@ class Application_Service_HistoryService array("name"=> MDATA_KEY_TRACKNUMBER, "label"=> _("Track"), "type"=> TEMPLATE_INT), array("name"=> MDATA_KEY_CONDUCTOR, "label"=> _("Conductor"), "type"=> TEMPLATE_STRING), array("name"=> MDATA_KEY_LANGUAGE, "label"=> _("Language"), "type"=> TEMPLATE_STRING), - array("name"=> MDATA_KEY_MEDIA_TYPE, "label"=> _("Media Type"), "type"=> TEMPLATE_STRING), ); return $fileMD; diff --git a/airtime_mvc/application/upgrade/Upgrades.php b/airtime_mvc/application/upgrade/Upgrades.php index 55c4ced49..facc3b935 100644 --- a/airtime_mvc/application/upgrade/Upgrades.php +++ b/airtime_mvc/application/upgrade/Upgrades.php @@ -493,7 +493,6 @@ class AirtimeUpgrader2516 extends AirtimeUpgrader return '2.5.16'; } } - class AirtimeUpgrader300alpha extends AirtimeUpgrader { protected function getSupportedSchemaVersions() { diff --git a/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml b/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml index e2102af55..31d873803 100644 --- a/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml +++ b/airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml @@ -26,7 +26,6 @@ foreach ($this->md as $key => &$value) { md["MDATA_KEY_ARTWORK"]);?> md["MDATA_KEY_ARTWORK_DATA"]);?> md["MDATA_KEY_LANGUAGE"]);?> -md["MDATA_KEY_MEDIA_TYPE"]);?> md["MDATA_KEY_FILEPATH"]);?> diff --git a/airtime_mvc/build/schema.xml b/airtime_mvc/build/schema.xml index 5e0121291..acf54453b 100644 --- a/airtime_mvc/build/schema.xml +++ b/airtime_mvc/build/schema.xml @@ -85,7 +85,6 @@ - diff --git a/airtime_mvc/build/sql/schema.sql b/airtime_mvc/build/sql/schema.sql index d1a6c1412..a148a56da 100644 --- a/airtime_mvc/build/sql/schema.sql +++ b/airtime_mvc/build/sql/schema.sql @@ -97,7 +97,6 @@ CREATE TABLE "cc_files" "filesize" INTEGER DEFAULT 0 NOT NULL, "description" VARCHAR(512), "artwork" VARCHAR(512), - "media_type" VARCHAR(4), PRIMARY KEY ("id") ); diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index 420e318a7..38a675e81 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -54,8 +54,7 @@ var AIRTIME = (function(AIRTIME) { "owner_id" : "s", "info_url" : "s", "replay_gain" : "n", - "artwork" : "s", - "media_type" : "s" + "artwork" : "s" }; if (AIRTIME.library === undefined) { @@ -592,7 +591,6 @@ var AIRTIME = (function(AIRTIME) { /* Cue Out */ { "sTitle" : $.i18n._("Cue Out") , "mDataProp" : "cueout" , "bVisible" : false , "sClass" : "library_length" , "sWidth" : "80px" }, /* Description */ { "sTitle" : $.i18n._("Description") , "mDataProp" : "description" , "bVisible" : false , "sClass" : "library_description" , "sWidth" : "150px" }, /* Encoded */ { "sTitle" : $.i18n._("Encoded By") , "mDataProp" : "encoded_by" , "bVisible" : false , "sClass" : "library_encoded" , "sWidth" : "150px" }, - /* Media Type */ { "sTitle" : $.i18n._("Type") , "mDataProp" : "media_type" , "bVisible" : false , "sClass" : "library_media_type" , "sWidth" : "60px" }, /* Genre */ { "sTitle" : $.i18n._("Genre") , "mDataProp" : "genre" , "sClass" : "library_genre" , "sWidth" : "100px" }, /* ISRC Number */ { "sTitle" : $.i18n._("ISRC") , "mDataProp" : "isrc_number" , "bVisible" : false , "sClass" : "library_isrc" , "sWidth" : "150px" }, /* Label */ { "sTitle" : $.i18n._("Label") , "mDataProp" : "label" , "bVisible" : false , "sClass" : "library_label" , "sWidth" : "125px" }, @@ -617,7 +615,7 @@ var AIRTIME = (function(AIRTIME) { ); } - var colExclude = onDashboard ? [0, 1, 2, 34] : [0, 1, 2]; + var colExclude = onDashboard ? [0, 1, 2, 33] : [0, 1, 2]; /* ############################################ DATATABLES @@ -1599,7 +1597,6 @@ var validationTypes = { "track_number" : "i", "info_url" : "s", "artwork" : "s", - "media_type" : "s", "year" : "i" }; diff --git a/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js b/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js index d69da00b5..fddf6ca34 100644 --- a/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js +++ b/airtime_mvc/public/js/airtime/playlist/smart_blockbuilder.js @@ -8,7 +8,7 @@ function setSmartBlockEvents() { /********** ADD CRITERIA ROW **********/ form.find('#criteria_add').live('click', function(){ - + var div = $('dd[id="sp_criteria-element"]').children('div:visible:last'); if (div.length == 0) { @@ -26,7 +26,7 @@ function setSmartBlockEvents() { div.find('.db-logic-label').text('and').css('display', 'table'); div.removeClass('search-row-or').addClass('search-row-and'); - + div = div.next().show(); div.children().removeAttr('disabled'); @@ -45,11 +45,11 @@ function setSmartBlockEvents() { } }); - + /********** ADD MODIFIER ROW **********/ form.find('a[id^="modifier_add"]').live('click', function(){ var criteria_value = $(this).siblings('select[name^="sp_criteria_field"]').val(); - + //make new modifier row var newRow = $(this).parent().clone(), @@ -63,13 +63,13 @@ function setSmartBlockEvents() { if (newRow.children().hasClass('errors sp-errors')) { newRow.find('span[class="errors sp-errors"]').remove(); } - + //hide the critieria field select box newRowCrit.addClass('sp-invisible'); - + //keep criteria value the same newRowCrit.val(criteria_value); - + //reset all other values newRowMod.val('0'); newRowVal.val(''); @@ -78,12 +78,12 @@ function setSmartBlockEvents() { disableAndHideDateTimeDropdown(newRowVal); disableAndHideExtraDateTimeDropdown(newRowVal); sizeTextBoxes(newRowVal, 'sp_extra_input_text', 'sp_input_text'); - + //remove the 'criteria add' button from new modifier row newRow.find('#criteria_add').remove(); $(this).parent().after(newRow); - + // remove extra spacing from previous row newRow.prev().removeClass('search-row-and').addClass('search-row-or'); @@ -93,7 +93,7 @@ function setSmartBlockEvents() { removeButtonCheck(); groupCriteriaRows(); }); - + /********** REMOVE ROW **********/ form.find('a[id^="criteria_remove"]').live('click', function(){ var curr = $(this).parent(); @@ -128,10 +128,10 @@ function setSmartBlockEvents() { for (var i=0; i 0 && index < 26) { - + /* If the current row's criteria field is hidden we know it is * a modifier row */ @@ -444,7 +444,7 @@ function reindexElements() { index++; modIndex = 0; } - + $(div).find('select[name^="sp_criteria_field"]').attr('name', 'sp_criteria_field_'+index+'_'+modIndex); $(div).find('select[name^="sp_criteria_field"]').attr('id', 'sp_criteria_field_'+index+'_'+modIndex); $(div).find('select[name^="sp_criteria_modifier"]').attr('name', 'sp_criteria_modifier_'+index+'_'+modIndex); @@ -464,7 +464,7 @@ function reindexElements() { function buttonClickAction(clickType, url){ var data = $('.active-tab .smart-block-form').serializeArray(), obj_id = $('.active-tab .obj_id').val(); - + enableLoadingIcon(); $.post(url, {format: "json", data: data, obj_id: obj_id, obj_type: "block", modified: AIRTIME.playlist.getModified() @@ -499,7 +499,7 @@ function setupUI() { shuffleButton.addClass('ui-state-disabled'); shuffleButton.attr('disabled', 'disabled'); } - + if (activeTab.find('.obj_type').val() == 'block') { if (playlist_type == "1") { shuffleButton.removeAttr("disabled"); @@ -514,7 +514,7 @@ function setupUI() { //sortable.children().hide(); } } - + $(".playlist_type_help_icon").qtip({ content: { text: $.i18n._("A static smart block will save the criteria and generate the block content immediately. This allows you to edit and view it in the Library before adding it to a show.")+"

" + @@ -536,7 +536,7 @@ function setupUI() { at: "right center" } }); - + $(".repeat_tracks_help_icon").qtip({ content: { text: sprintf($.i18n._("The desired block length will not be reached if %s cannot find enough unique tracks to match your criteria. Enable this option if you wish to allow tracks to be added multiple times to the smart block."), PRODUCT_NAME) @@ -661,7 +661,7 @@ function disableAndHideExtraField(valEle, index) { spanExtra.children('#sp_criteria_extra_'+index).val("").attr("disabled", "disabled"); spanExtra.hide(); console.log('hidden'); - + //make value input larger since we don't have extra field now var criteria_value = $('#sp_criteria_value_'+index); sizeTextBoxes(criteria_value, 'sp_extra_input_text', 'sp_input_text'); @@ -685,15 +685,15 @@ function populateModifierSelect(e, popAllMods) { var criteria_type = getCriteriaOptionType(e), index = getRowIndex($(e).parent()), divs; - + if (popAllMods) { index = index.substring(0, 1); } divs = $(e).parents().find('select[id^="sp_criteria_modifier_'+index+'"]'); - + $.each(divs, function(i, div){ $(div).children().remove(); - + if (criteria_type == 's') { $.each(stringCriteriaOptions, function(key, value){ $(div).append($('') @@ -777,7 +777,7 @@ function appendAddButton() { enabled = rows.find('select[name^="sp_criteria_field"]:enabled'); rows.find('#criteria_add').remove(); - + if (enabled.length > 1) { rows.find('select[name^="sp_criteria_field"]:enabled:last') .siblings('a[id^="criteria_remove"]') @@ -821,7 +821,7 @@ function disableLoadingIcon() { function groupCriteriaRows() { // check whether rows should be "grouped" and shown with an "or" "logic label", or separated by an "and" "logic label" - var visibleRows = $("#sp_criteria-element > div:visible"), + var visibleRows = $("#sp_criteria-element > div:visible"), prevRowGroup = "0"; visibleRows.each(function (index){ @@ -837,7 +837,7 @@ function groupCriteriaRows() { } }); - // ensure spacing below last visible row + // ensure spacing below last visible row $("#sp_criteria-element > div:visible:last").addClass("search-row-and").removeClass("search-row-or"); } @@ -874,8 +874,7 @@ var criteriaTypes = { "track_title" : "s", "track_number" : "n", "info_url" : "s", - "year" : "n", - "media_type" : "s" + "year" : "n" }; var stringCriteriaOptions = { @@ -887,7 +886,7 @@ var stringCriteriaOptions = { "starts with" : $.i18n._("starts with"), "ends with" : $.i18n._("ends with") }; - + var numericCriteriaOptions = { "0" : $.i18n._("Select modifier"), "is" : $.i18n._("is"), From ee439273dae30ff522b15b84a2aeff032c3d4b4d Mon Sep 17 00:00:00 2001 From: Robb Ebright Date: Sun, 13 Oct 2019 08:18:30 -0400 Subject: [PATCH 11/15] Revert "Update Vagrantfile" This reverts commit 339a87900eb6324a68220150006578ed4a8f6257. --- Vagrantfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Vagrantfile b/Vagrantfile index 073ed73dc..88b2b041b 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -15,7 +15,6 @@ Vagrant.configure("2") do |config| # make sure we are using nfs (doesn't work out of the box with debian) nfsPath = "." - # Catalina support if Dir.exist?("/System/Volumes/Data") nfsPath = "/System/Volumes/Data" + Dir.pwd end From 50450daca48a1c07f0b278446a6d879229beb675 Mon Sep 17 00:00:00 2001 From: Robb Ebright Date: Sun, 13 Oct 2019 08:18:43 -0400 Subject: [PATCH 12/15] Revert "Support for macOS Catalina (NFS sync fix)" This reverts commit bd328fba717cbc683cfef765b0cdb375024ba0c4. --- Vagrantfile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Vagrantfile b/Vagrantfile index 88b2b041b..b8e34a1ef 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -14,11 +14,7 @@ Vagrant.configure("2") do |config| config.vm.network "forwarded_port", guest: 8888, host:8888 # make sure we are using nfs (doesn't work out of the box with debian) - nfsPath = "." - if Dir.exist?("/System/Volumes/Data") - nfsPath = "/System/Volumes/Data" + Dir.pwd - end - config.vm.synced_folder nfsPath, "/vagrant", type: "nfs" + config.vm.synced_folder ".", "/vagrant", type: "nfs" # private network for nfs config.vm.network "private_network", ip: "192.168.10.100" From 88f90f33b9fde55e987877e0235d1cf71523e631 Mon Sep 17 00:00:00 2001 From: Codenift Date: Sun, 13 Oct 2019 13:07:06 -0400 Subject: [PATCH 13/15] If id3 library is not present show default image Checks for getid3 library. Prevents site from failing. No images are fetched from audio files and will just show default image instead with a message on log saying to run install. --- .../application/common/FileDataHelper.php | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/airtime_mvc/application/common/FileDataHelper.php b/airtime_mvc/application/common/FileDataHelper.php index 3a8ccdef6..ba43ca107 100644 --- a/airtime_mvc/application/common/FileDataHelper.php +++ b/airtime_mvc/application/common/FileDataHelper.php @@ -113,8 +113,13 @@ class FileDataHelper { */ public static function saveArtworkData($analyzeFile, $filename, $importDir = null, $DbPath = null) { - $getID3 = new \getID3(); - $getFileInfo = $getID3->analyze($analyzeFile); + if (class_exists('getID3')) { + $getID3 = new \getID3(); + $getFileInfo = $getID3->analyze($analyzeFile); + } else { + $getFileInfo = []; + Logging::error("Failed to load getid3 library. Please run either 'composer install' or the 'install' script."); + } if(isset($getFileInfo['comments']['picture'][0])) { @@ -188,8 +193,13 @@ class FileDataHelper { $dbAudioPath = $md["MDATA_KEY_FILEPATH"]; $fullpath = $fp . $dbAudioPath; - $getID3 = new \getID3(); - $getFileInfo = $getID3->analyze($fullpath); + if (class_exists('getID3')) { + $getID3 = new \getID3(); + $getFileInfo = $getID3->analyze($fullpath); + } else { + $getFileInfo = []; + Logging::error("Failed to load getid3 library. Please run either 'composer install' or the 'install' script."); + } if(isset($getFileInfo['comments']['picture'][0])) { From 8cc48eb47fd4c60692aead40dab0a51d444a5bb3 Mon Sep 17 00:00:00 2001 From: Codenift Date: Sun, 13 Oct 2019 15:31:21 -0400 Subject: [PATCH 14/15] Fixed description for logging if getid3 exists --- airtime_mvc/application/common/FileDataHelper.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/common/FileDataHelper.php b/airtime_mvc/application/common/FileDataHelper.php index ba43ca107..80c5308b4 100644 --- a/airtime_mvc/application/common/FileDataHelper.php +++ b/airtime_mvc/application/common/FileDataHelper.php @@ -118,7 +118,7 @@ class FileDataHelper { $getFileInfo = $getID3->analyze($analyzeFile); } else { $getFileInfo = []; - Logging::error("Failed to load getid3 library. Please run either 'composer install' or the 'install' script."); + Logging::error("Failed to load getid3 library. Please upgrade script."); } if(isset($getFileInfo['comments']['picture'][0])) { @@ -198,7 +198,7 @@ class FileDataHelper { $getFileInfo = $getID3->analyze($fullpath); } else { $getFileInfo = []; - Logging::error("Failed to load getid3 library. Please run either 'composer install' or the 'install' script."); + Logging::error("Failed to load getid3 library. Please upgrade script."); } if(isset($getFileInfo['comments']['picture'][0])) { From 7366fa60fc29def0893d6b0b6b80fb47a27df210 Mon Sep 17 00:00:00 2001 From: Codenift Date: Sun, 13 Oct 2019 16:23:06 -0400 Subject: [PATCH 15/15] Change to display a better message Replaced with a better message they can understand --- airtime_mvc/application/common/FileDataHelper.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/airtime_mvc/application/common/FileDataHelper.php b/airtime_mvc/application/common/FileDataHelper.php index 80c5308b4..3c576f685 100644 --- a/airtime_mvc/application/common/FileDataHelper.php +++ b/airtime_mvc/application/common/FileDataHelper.php @@ -118,7 +118,7 @@ class FileDataHelper { $getFileInfo = $getID3->analyze($analyzeFile); } else { $getFileInfo = []; - Logging::error("Failed to load getid3 library. Please upgrade script."); + Logging::error("Failed to load getid3 library. Please upgrade Libretime."); } if(isset($getFileInfo['comments']['picture'][0])) { @@ -198,7 +198,7 @@ class FileDataHelper { $getFileInfo = $getID3->analyze($fullpath); } else { $getFileInfo = []; - Logging::error("Failed to load getid3 library. Please upgrade script."); + Logging::error("Failed to load getid3 library. Please upgrade Libretime."); } if(isset($getFileInfo['comments']['picture'][0])) {