diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php index ac32ae832..c48e82b0c 100644 --- a/airtime_mvc/application/controllers/ApiController.php +++ b/airtime_mvc/application/controllers/ApiController.php @@ -1042,12 +1042,15 @@ class ApiController extends Zend_Controller_Action { $request = $this->getRequest(); $data = $request->getParam("data"); - $media_id = $request->getParam("media_id"); + $media_id = intval($request->getParam("media_id")); $data_arr = json_decode($data); + + //$media_id is -1 sometimes when a stream has stopped playing + if (!is_null($media_id) && $media_id > 0) { - if (!is_null($media_id)) { - if (isset($data_arr->title) && - strlen($data_arr->title) < 1024) { + if (isset($data_arr->title)) { + + $data_title = substr($data_arr->title, 0, 1024); $previous_metadata = CcWebstreamMetadataQuery::create() ->orderByDbStartTime('desc') @@ -1056,23 +1059,27 @@ class ApiController extends Zend_Controller_Action $do_insert = true; if ($previous_metadata) { - if ($previous_metadata->getDbLiquidsoapData() == $data_arr->title) { - Logging::debug("Duplicate found: ".$data_arr->title); + if ($previous_metadata->getDbLiquidsoapData() == $data_title) { + Logging::debug("Duplicate found: ". $data_title); $do_insert = false; } } if ($do_insert) { + + $startDT = new DateTime("now", new DateTimeZone("UTC")); + $webstream_metadata = new CcWebstreamMetadata(); $webstream_metadata->setDbInstanceId($media_id); - $webstream_metadata->setDbStartTime(new DateTime("now", new DateTimeZone("UTC"))); - $webstream_metadata->setDbLiquidsoapData($data_arr->title); + $webstream_metadata->setDbStartTime($startDT); + $webstream_metadata->setDbLiquidsoapData($data_title); $webstream_metadata->save(); + + $historyService = new Application_Service_HistoryService(); + $historyService->insertWebstreamMetadata($media_id, $startDT, $data_arr); } } - } else { - throw new Exception("Null value of media_id"); - } + } $this->view->response = $data; $this->view->media_id = $media_id; diff --git a/airtime_mvc/application/forms/EditHistoryItem.php b/airtime_mvc/application/forms/EditHistoryItem.php index 16ba5ded5..2f6f38043 100644 --- a/airtime_mvc/application/forms/EditHistoryItem.php +++ b/airtime_mvc/application/forms/EditHistoryItem.php @@ -43,7 +43,7 @@ class Application_Form_EditHistoryItem extends Application_Form_EditHistory $ends->addFilter('StringTrim'); $ends->setLabel(_('End Time')); $ends->setDecorators(array('ViewHelper')); - $ends->setRequired(true); + //$ends->setRequired(true); $this->addElement($ends); } diff --git a/airtime_mvc/application/models/airtime/CcPlayoutHistoryMetaData.php b/airtime_mvc/application/models/airtime/CcPlayoutHistoryMetaData.php index 890a4ca05..b55de6043 100644 --- a/airtime_mvc/application/models/airtime/CcPlayoutHistoryMetaData.php +++ b/airtime_mvc/application/models/airtime/CcPlayoutHistoryMetaData.php @@ -14,5 +14,21 @@ * @package propel.generator.airtime */ class CcPlayoutHistoryMetaData extends BaseCcPlayoutHistoryMetaData { + + /** + * Set the value of [value] column. + * + * @param string $v new value + * @return CcPlayoutHistoryMetaData The current object (for fluent API support) + */ + public function setDbValue($v) + { + //make sure the metadata isn't longer than the DB field. + $v = substr($v, 0, 128); + + parent::setDbValue($v); + + return $this; + } // setDbValue() } // CcPlayoutHistoryMetaData diff --git a/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryTableMap.php b/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryTableMap.php index 6c365d7bb..23696f18d 100644 --- a/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryTableMap.php +++ b/airtime_mvc/application/models/airtime/map/CcPlayoutHistoryTableMap.php @@ -41,7 +41,7 @@ class CcPlayoutHistoryTableMap extends TableMap { $this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null); $this->addForeignKey('FILE_ID', 'DbFileId', 'INTEGER', 'cc_files', 'ID', false, null, null); $this->addColumn('STARTS', 'DbStarts', 'TIMESTAMP', true, null, null); - $this->addColumn('ENDS', 'DbEnds', 'TIMESTAMP', true, null, null); + $this->addColumn('ENDS', 'DbEnds', 'TIMESTAMP', false, null, null); $this->addForeignKey('INSTANCE_ID', 'DbInstanceId', 'INTEGER', 'cc_show_instances', 'ID', false, null, null); // validators } // initialize() diff --git a/airtime_mvc/application/services/HistoryService.php b/airtime_mvc/application/services/HistoryService.php index 4477e28ff..d273e1fb9 100644 --- a/airtime_mvc/application/services/HistoryService.php +++ b/airtime_mvc/application/services/HistoryService.php @@ -290,9 +290,12 @@ class Application_Service_HistoryService $dateTime->setTimezone($timezoneLocal); $result["starts"] = $dateTime->format("Y-m-d H:i:s"); - $dateTime = new DateTime($result["ends"], $timezoneUTC); - $dateTime->setTimezone($timezoneLocal); - $result["ends"] = $dateTime->format("Y-m-d H:i:s"); + //if ends is null we don't want it to default to "now" + if (isset($result["ends"])) { + $dateTime = new DateTime($result["ends"], $timezoneUTC); + $dateTime->setTimezone($timezoneLocal); + $result["ends"] = $dateTime->format("Y-m-d H:i:s"); + } if (isset($result[MDATA_KEY_DURATION])) { $formatter = new LengthFormatter($result[MDATA_KEY_DURATION]); @@ -505,6 +508,48 @@ 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) { + $this->con->rollback(); + throw $e; + } + } public function insertPlayedItem($schedId) { @@ -611,7 +656,7 @@ class Application_Service_HistoryService } //need to convert to the station's local time first. - if ($field["type"] == TEMPLATE_DATETIME) { + if ($field["type"] == TEMPLATE_DATETIME && !is_null($value)) { $timezoneUTC = new DateTimeZone("UTC"); $timezoneLocal = new DateTimeZone($this->timezone); diff --git a/airtime_mvc/build/schema.xml b/airtime_mvc/build/schema.xml index f2a393f1f..d5ba76516 100644 --- a/airtime_mvc/build/schema.xml +++ b/airtime_mvc/build/schema.xml @@ -483,7 +483,7 @@ - + diff --git a/airtime_mvc/build/sql/schema.sql b/airtime_mvc/build/sql/schema.sql index 8269fec2a..13d1654a5 100644 --- a/airtime_mvc/build/sql/schema.sql +++ b/airtime_mvc/build/sql/schema.sql @@ -765,7 +765,7 @@ CREATE TABLE "cc_playout_history" "id" serial NOT NULL, "file_id" INTEGER, "starts" TIMESTAMP NOT NULL, - "ends" TIMESTAMP NOT NULL, + "ends" TIMESTAMP, "instance_id" INTEGER, PRIMARY KEY ("id") );