"", "cliplength" => "", "cuein" => "00:00:00", "cueout" => "00:00:00", "fadein" => "00:00:00", "fadeout" => "00:00:00", "sched_id" => null, "type" => 0 //default type of '0' to represent files. type '1' represents a webstream ); private $epochNow; private $nowDT; private $currentUser; private $checkUserPermissions = true; public function __construct() { $this->con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME); //subtracting one because sometimes when we cancel a track, we set its end time //to epochNow and then send the new schedule to pypo. Sometimes the currently cancelled //track can still be included in the new schedule because it may have a few ms left to play. //subtracting 1 second from epochNow resolves this issue. $this->epochNow = microtime(true)-1; $this->nowDT = DateTime::createFromFormat("U.u", $this->epochNow, new DateTimeZone("UTC")); if ($this->nowDT === false) { // DateTime::createFromFormat does not support millisecond string formatting in PHP 5.3.2 (Ubuntu 10.04). // In PHP 5.3.3 (Ubuntu 10.10), this has been fixed. $this->nowDT = DateTime::createFromFormat("U", time(), new DateTimeZone("UTC")); } $user_service = new Application_Service_UserService(); $this->currentUser = $user_service->getCurrentUser(); } /** * * Applies the show start difference to any scheduled items * * @param $instanceIds * @param $diff * @param $newStart */ public static function updateScheduleStartTime($instanceIds, $diff=null, $newStart=null) { $con = Propel::getConnection(); if (count($instanceIds) > 0) { $showIdList = implode(",", $instanceIds); if (is_null($diff)) { $ccSchedule = CcScheduleQuery::create() ->filterByDbInstanceId($instanceIds, Criteria::IN) ->orderByDbStarts() ->limit(1) ->findOne(); if (!is_null($ccSchedule)) { $scheduleStartsEpoch = strtotime($ccSchedule->getDbStarts()); $showStartsEpoch = strtotime($newStart->format("Y-m-d H:i:s")); $diff = $showStartsEpoch - $scheduleStartsEpoch; } } $ccSchedules = CcScheduleQuery::create() ->filterByDbInstanceId($instanceIds, Criteria::IN) ->find(); $interval = new DateInterval("PT".abs($diff)."S"); if ($diff < 0) { $interval->invert = 1; } foreach ($ccSchedules as $ccSchedule) { $start = new DateTime($ccSchedule->getDbStarts()); $newStart = $start->add($interval); $end = new DateTime($ccSchedule->getDbEnds()); $newEnd = $end->add($interval); $ccSchedule ->setDbStarts($newStart->format("Y-m-d H:i:s")) ->setDbEnds($newEnd->format("Y-m-d H:i:s")) ->save(); } } } /** * * Removes any time gaps in shows * * @param array $schedIds schedule ids to exclude */ public function removeGaps($showId, $schedIds=null) { $ccShowInstances = CcShowInstancesQuery::create()->filterByDbShowId($showId)->find(); foreach ($ccShowInstances as $instance) { Logging::info("Removing gaps from show instance #".$instance->getDbId()); //DateTime object $itemStart = $instance->getDbStarts(null); $ccScheduleItems = CcScheduleQuery::create() ->filterByDbInstanceId($instance->getDbId()) ->filterByDbId($schedIds, Criteria::NOT_IN) ->orderByDbStarts() ->find(); foreach ($ccScheduleItems as $ccSchedule) { //DateTime object $itemEnd = $this->findEndTime($itemStart, $ccSchedule->getDbClipLength()); $ccSchedule->setDbStarts($itemStart) ->setDbEnds($itemEnd); $itemStart = $itemEnd; } $ccScheduleItems->save(); } } /** * * Enter description here ... * @param DateTime $instanceStart * @param string $clipLength */ private static function findEndTime($instanceStart, $clipLength) { $startEpoch = $instanceStart->format("U.u"); $durationSeconds = Application_Common_DateHelper::playlistTimeToSeconds($clipLength); //add two float numbers to 6 subsecond precision //DateTime::createFromFormat("U.u") will have a problem if there is no decimal in the resulting number. $endEpoch = bcadd($startEpoch , (string) $durationSeconds, 6); $dt = DateTime::createFromFormat("U.u", $endEpoch, new DateTimeZone("UTC")); if ($dt === false) { //PHP 5.3.2 problem $dt = DateTime::createFromFormat("U", intval($endEpoch), new DateTimeZone("UTC")); } return $dt; } public static function fillNewLinkedInstances($ccShow) { /* First check if any linked instances have content * If all instances are empty then we don't need to fill * any other instances with content */ $instanceIds = $ccShow->getInstanceIds(); $ccSchedules = CcScheduleQuery::create() ->filterByDbInstanceId($instanceIds, Criteria::IN) ->find(); if (!$ccSchedules->isEmpty()) { /* Find the show contents of just one of the instances. It doesn't * matter which instance we use since all the content is the same */ $ccSchedule = $ccSchedules->getFirst(); $showStamp = CcScheduleQuery::create() ->filterByDbInstanceId($ccSchedule->getDbInstanceId()) ->orderByDbStarts() ->find(); //get time_filled so we can update cc_show_instances $timeFilled = $ccSchedule->getCcShowInstances()->getDbTimeFilled(); //need to find out which linked instances are empty foreach ($ccShow->getCcShowInstancess() as $ccShowInstance) { $ccSchedules = CcScheduleQuery::create() ->filterByDbInstanceId($ccShowInstance->getDbId()) ->find(); /* If the show instance is empty OR it has different content than * the first instance, we cant to fill/replace with the show stamp * (The show stamp is taken from the first show instance's content) */ if ($ccSchedules->isEmpty() || self::replaceInstanceContentCheck($ccShowInstance, $showStamp)) { $nextStartDT = $ccShowInstance->getDbStarts(null); foreach ($showStamp as $item) { $endTimeDT = self::findEndTime($nextStartDT, $item->getDbClipLength()); $ccSchedule = new CcSchedule(); $ccSchedule ->setDbStarts($nextStartDT) ->setDbEnds($endTimeDT) ->setDbFileId($item->getDbFileId()) ->setDbStreamId($item->getDbStreamId()) ->setDbClipLength($item->getDbClipLength()) ->setDbFadeIn($item->getDbFadeIn()) ->setDbFadeOut($item->getDbFadeOut()) ->setDbCuein($item->getDbCueIn()) ->setDbCueOut($item->getDbCueOut()) ->setDbInstanceId($ccShowInstance->getDbId()) ->setDbPosition($item->getDbPosition()) ->save(); $nextStartDT = $endTimeDT; } //foreach show item //update time_filled in cc_show_instances $ccShowInstance ->setDbTimeFilled($timeFilled) ->setDbLastScheduled(gmdate("Y-m-d H:i:s")) ->save(); } } //foreach linked instance } //if at least one linked instance has content } public static function fillPreservedLinkedShowContent($ccShow, $showStamp) { $item = $showStamp->getFirst(); $timeFilled = $item->getCcShowInstances()->getDbTimeFilled(); foreach ($ccShow->getCcShowInstancess() as $ccShowInstance) { $ccSchedules = CcScheduleQuery::create() ->filterByDbInstanceId($ccShowInstance->getDbId()) ->find(); if ($ccSchedules->isEmpty()) { $nextStartDT = $ccShowInstance->getDbStarts(null); foreach ($showStamp as $item) { $endTimeDT = self::findEndTime($nextStartDT, $item->getDbClipLength()); $ccSchedule = new CcSchedule(); $ccSchedule ->setDbStarts($nextStartDT) ->setDbEnds($endTimeDT) ->setDbFileId($item->getDbFileId()) ->setDbStreamId($item->getDbStreamId()) ->setDbClipLength($item->getDbClipLength()) ->setDbFadeIn($item->getDbFadeIn()) ->setDbFadeOut($item->getDbFadeOut()) ->setDbCuein($item->getDbCueIn()) ->setDbCueOut($item->getDbCueOut()) ->setDbInstanceId($ccShowInstance->getDbId()) ->setDbPosition($item->getDbPosition()) ->save(); $nextStartDT = $endTimeDT; } //foreach show item $ccShowInstance ->setDbTimeFilled($timeFilled) ->setDbLastScheduled(gmdate("Y-m-d H:i:s")) ->save(); } } } private static function replaceInstanceContentCheck($ccShowInstance, $showStamp) { $currentShowStamp = CcScheduleQuery::create() ->filterByDbInstanceId($ccShowInstance->getDbId()) ->orderByDbStarts() ->find(); $counter = 0; foreach ($showStamp as $item) { if ($item->getDbFileId() != $currentShowStamp[$counter]->getDbFileId() || $item->getDbStreamId() != $currentShowStamp[$counter]->getDbStreamId()) { CcScheduleQuery::create() ->filterByDbInstanceId($ccShowInstance->getDbId()) ->delete(); return true; } } /* If we get here, the content in the show instance is the same * as what we want to replace it with, so we can leave as is */ return false; } public function emptyShowContent($instanceId) { try { $ccShowInstance = CcShowInstancesQuery::create()->findPk($instanceId); $instances = array(); $instanceIds = array(); if ($ccShowInstance->getCcShow()->isLinked()) { foreach ($ccShowInstance->getCcShow()->getCcShowInstancess() as $instance) { $instanceIds[] = $instance->getDbId(); $instances[] = $instance; } } else { $instanceIds[] = $ccShowInstance->getDbId(); $instances[] = $ccShowInstance; } /* Update the is_scheduled flag in cc_files to false * We need to do this before we delete the scheduled items */ $ccSchedules = CcScheduleQuery::create() ->filterByDbInstanceId($instanceIds, Criteria::IN) ->find(); $fileIds = array(); foreach ($ccSchedules as $ccSchedule) { $fileIds[] = $ccSchedule->getDbFileId(); } $selectCriteria = new Criteria(); $selectCriteria->add(CcFilesPeer::ID, $fileIds, Criteria::IN); $updateCriteria = new Criteria(); $updateCriteria->add(CcFilesPeer::IS_SCHEDULED, false); BasePeer::doUpdate($selectCriteria, $updateCriteria, Propel::getConnection()); /* Clear out the schedule */ CcScheduleQuery::create() ->filterByDbInstanceId($instanceIds, Criteria::IN) ->delete(); Application_Model_RabbitMq::PushSchedule(); $con = Propel::getConnection(CcShowInstancesPeer::DATABASE_NAME); foreach ($instances as $instance) { $instance->updateDbTimeFilled($con); } return true; } catch (Exception $e) { Logging::info($e->getMessage()); return false; } } }