123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371 |
- <?php
- class Application_Model_LiveLog
- {
- public static function GetLiveShowDuration($p_keepData=false)
- {
- try {
- $sql = "SELECT * FROM CC_LIVE_LOG"
- ." WHERE state = :state"
- ." and (start_time >= (now() - INTERVAL '1 day'))"
- ." ORDER BY id";
- $rows = Application_Common_Database::prepareAndExecute($sql, array(':state'=>'L'),
- Application_Common_Database::ALL);
- /* Check if last log has end time.
- * If not, set end time to current time
- */
- if ($rows != null) {
- $last_row = self::UpdateLastLogEndTime(array_pop($rows));
- array_push($rows, $last_row);
- $skip = false;
- } else {
- $sql = "SELECT * FROM CC_LIVE_LOG"
- ." WHERE state = :state"
- ." ORDER BY id";
- $rows = Application_Common_Database::prepareAndExecute($sql, array(':state'=>'L'),
- Application_Common_Database::ALL);
- if ($rows != null) {
- $last_row = self::UpdateLastLogEndTime(array_pop($rows));
- array_push($rows, $last_row);
- foreach ($rows as $row) {
- $sql_delete = "DELETE FROM CC_LIVE_LOG"
- ." WHERE id = :id";
- Application_Common_Database::prepareAndExecute($sql_delete, array(':id'=>$row['id']),
- Application_Common_Database::EXECUTE);
- }
- }
- $skip = true;
- }
- $hours = 0;
- $minutes = 0;
- $seconds = 0;
- if (!$skip) {
- foreach ($rows as $row) {
- $end = new DateTime($row['end_time']);
- $start = new DateTime($row['start_time']);
- $duration = $start->diff($end);
- $duration = $duration->format("%H:%i:%s");
- $intervals = explode(":", $duration);
- for ($i = 0; $i < sizeof($intervals); $i++) {
- if (!isset($intervals[$i])) {
- $intervals[$i] = 0;
- }
- }
- // Trim milliseconds (DateInterval does not support)
- $sec = explode(".", $intervals[2]);
- if (isset($sec[0])) {
- $intervals[2] = $sec[0];
- }
- $seconds += $intervals[2];
- if ($seconds / 60 >= 1) {
- $minutes += 1;
- $seconds -= 60;
- }
- $minutes += $intervals[1];
- if ($minutes / 60 >= 1) {
- $hours += 1;
- $minutes -= 60;
- }
- $hours += $intervals[0];
- if (!$p_keepData) {
- // Delete data we just used to start a new log history
- $sql_delete = "DELETE FROM CC_LIVE_LOG"
- ." WHERE id = :id";
- Application_Common_Database::prepareAndExecute($sql_delete, array(':id'=>$row['id']),
- Application_Common_Database::EXECUTE);
- }
- }
- //Trim milliseconds
- $seconds = explode(".", $seconds);
- if (isset($seconds[0])) {
- $minutes = (double) (($hours*60)+$minutes . "." . $seconds[0]);
- } else {
- $minutes = (double) (($hours*60)+$minutes);
- }
- }
- return $minutes;
- } catch (Exception $e) {
- header('HTTP/1.0 503 Service Unavailable');
- Logging::info("GetLiveShowDuration - Could not connect to database.");
- exit;
- }
- }
- public static function GetScheduledDuration($p_keepData=false)
- {
- try {
- $sql_get_logs = "SELECT * FROM CC_LIVE_LOG"
- ." WHERE state = :state"
- ." and (start_time >= (now() - INTERVAL '1 day'))"
- ." ORDER BY id";
- $rows = Application_Common_Database::prepareAndExecute($sql_get_logs, array(':state'=>'S'),
- Application_Common_Database::ALL);
- /* Check if last log has end time.
- * If not, set end time to current time
- */
- if ($rows != null) {
- $last_row = self::UpdateLastLogEndTime(array_pop($rows));
- array_push($rows, $last_row);
- $skip = false;
- } else {
- $sql = "SELECT * FROM CC_LIVE_LOG"
- ." WHERE state = :state"
- ." ORDER BY id";
- $rows = Application_Common_Database::prepareAndExecute($sql, array(':state'=>'S'),
- Application_Common_Database::ALL);
- if ($rows != null) {
- $last_row = self::UpdateLastLogEndTime(array_pop($rows));
- array_push($rows, $last_row);
- foreach ($rows as $row) {
- $sql_delete = "DELETE FROM CC_LIVE_LOG"
- ." WHERE id = :id";
- Application_Common_Database::prepareAndExecute($sql_delete, array(':id'=>$row['id']),
- Application_Common_Database::EXECUTE);
- }
- }
- $skip = true;
- }
- $hours = 0;
- $minutes = 0;
- $seconds = 0;
- if (!$skip) {
- /* Get all shows and tracks from cc_schedule that played
- * during a scheduled state
- */
- foreach ($rows as $row) {
- $sql_get_tracks = "SELECT * FROM cc_schedule"
- ." WHERE starts >= :starts1"
- ." AND starts < :starts2"
- ." AND file_id IS NOT NULL"
- ." AND media_item_played IS TRUE";
- $params = array(
- ':starts1'=>$row['start_time'],
- ':starts2'=>$row['end_time']
- );
- $tracks = Application_Common_Database::prepareAndExecute($sql_get_tracks, $params,
- Application_Common_Database::ALL);
- foreach ($tracks as $track) {
- if ($track['ends'] > $row['end_time']) {
- $scheduled_ends = new DateTime($row['end_time']);
- $track_ends = new DateTime($track['ends']);
- $extra_time = $scheduled_ends->diff($track_ends);
- /* Get difference between clip_length
- * and the extra time. We need to subtract
- * this difference from the track's
- * clip length.
- */
- $clip_length = $track['clip_length'];
- //Convert clip_length into seconds
- $clip_length_intervals = explode(":", $clip_length);
- for ($i = 0; $i < sizeof($clip_length_intervals); $i++) {
- if (!isset($clip_length_intervals[$i])) {
- $clip_length_intervals[$i] = 0;
- }
- }
- $clip_length_seconds = $clip_length_intervals[0]*3600 + $clip_length_intervals[1]*60 + $clip_length_intervals[2];
- $extra_time = $extra_time->format("%H:%i:%s");
- //Convert extra_time into seconds;
- $extra_time_intervals = explode(":", $extra_time);
- for ($i = 0; $i < sizeof($extra_time_intervals); $i++) {
- if (!isset($extra_time_intervals[$i])) {
- $extra_time_intervals[$i] = 0;
- }
- }
- $extra_time_seconds = $extra_time_intervals[0]*3600 + $extra_time_intervals[1]*60 + $extra_time_intervals[2];
- $clip_length_seconds -= $extra_time_seconds;
- //Convert new clip_length into "H-i-s" format
- $clip_length_arr = array();
- if ($clip_length_seconds / 3600 >= 1) {
- array_push($clip_length_arr, str_pad(floor($clip_length_seconds / 3600), 2, "0", STR_PAD_LEFT));
- $clip_length_seconds -= floor($clip_length_seconds / 3600);
- } else {
- array_push($clip_length_arr, "00");
- }
- if ($clip_length_seconds / 60 >= 1) {
- array_push($clip_length_arr, str_pad(floor($clip_length_seconds / 60), 2, "0", STR_PAD_LEFT));
- $clip_length_seconds -= floor($clip_length_seconds / 60);
- } else {
- array_push($clip_length_arr, "00");
- }
- array_push($clip_length_arr, str_pad($clip_length_seconds, 2, "0", STR_PAD_LEFT));
- $clip_length = implode(":", $clip_length_arr);
- } else {
- $clip_length = $track['clip_length'];
- }
- $intervals = explode(":", $clip_length);
- for ($i = 0; $i < sizeof($intervals); $i++) {
- if (!isset($intervals[$i])) {
- $intervals[$i] = 0;
- }
- }
- // Trim milliseconds (DateInteral does not support)
- $sec = explode(".", $intervals[2]);
- if (isset($sec[0])) {
- $intervals[2] = $sec[0];
- }
- $seconds += $intervals[2];
- if ($seconds / 60 >= 1) {
- $minutes += 1;
- $seconds -= 60;
- }
- $minutes += $intervals[1];
- if ($minutes / 60 >= 1) {
- $hours += 1;
- $minutes -= 60;
- }
- $hours += $intervals[0];
- }
- if (!$p_keepData) {
- //Delete row because we do not need data anymore
- $sql_delete = "DELETE FROM CC_LIVE_LOG"
- ." WHERE id = :id";
- Application_Common_Database::prepareAndExecute($sql_delete, array(':id'=>$row['id']),
- Application_Common_Database::EXECUTE);
- }
- }
- $seconds = explode(".", $seconds);
- if (isset($seconds[0])) {
- $minutes = (double) (($hours*60)+$minutes . "." . $seconds[0]);
- } else {
- $minutes = (double) (($hours*60)+$minutes);
- }
- }
- return $minutes;
- } catch (Exception $e) {
- header('HTTP/1.0 503 Service Unavailable');
- Logging::info("GetScheduledDuration - Could not connect to database.");
- exit;
- }
- }
- public static function UpdateLastLogEndTime($log)
- {
- if ($log['end_time'] == null) {
- $current_time = new DateTime("now", new DateTimeZone('UTC'));
- $log['end_time'] = $current_time;
- $log['end_time'] = $log['end_time']->format("Y-m-d H:i:s");
- self::SetEndTime($log['state'], $current_time, true);
- self::SetNewLogTime($log['state'], $current_time);
- }
- return $log;
- }
- public static function SetNewLogTime($state, $dateTime)
- {
- try {
- $scheduled = Application_Model_Preference::GetSourceSwitchStatus('scheduled_play');
- if ($state == 'L' && $scheduled == 'on') {
- self::SetEndTime('S', $dateTime);
- }
- /* Only insert new state if last log
- * has ended
- */
- $sql_select = "SELECT max(id) from CC_LIVE_LOG"
- ." WHERE (state= :state1 and end_time is NULL) or (state= :state2 and end_time is NULL)";
- $params = array(
- ":state1"=> 'L',
- ":state2"=> 'S'
- );
- $id = Application_Common_Database::prepareAndExecute($sql_select, $params,
- Application_Common_Database::COLUMN);
- if ($id == null) {
- $sql_insert = "INSERT INTO CC_LIVE_LOG (state, start_time)"
- ." VALUES (:state, :start)";
- $params = array(
- ':state'=>$state,
- ':start'=>$dateTime->format("Y-m-d H:i:s")
- );
- Application_Common_Database::prepareAndExecute($sql_insert, $params,
- Application_Common_Database::EXECUTE);
- if ($state == "S") {
- // if scheduled play source is getting broadcasted
- Application_Model_Schedule::UpdateBrodcastedStatus($dateTime, 1);
- }
- }
- } catch (Exception $e) {
- header('HTTP/1.0 503 Service Unavailable');
- Logging::info("SetNewLogTime - Could not connect to database.");
- exit;
- }
- }
- public static function SetEndTime($state, $dateTime, $override=false)
- {
- try {
- $dj_live = Application_Model_Preference::GetSourceSwitchStatus('live_dj');
- $master_live = Application_Model_Preference::GetSourceSwitchStatus('master_dj');
- if (($dj_live=='off' && $master_live=='off') || $state == 'S' || $override) {
- $sql = "SELECT id, state from cc_live_log"
- ." where id in (select max(id) from cc_live_log)";
- $row = Application_Common_Database::prepareAndExecute($sql, array(),
- Application_Common_Database::SINGLE);
- /* Only set end time if state recevied ($state)
- * is the last row in cc_live_log
- */
- if ($row['state'] == $state) {
- $update_sql = "UPDATE CC_LIVE_LOG"
- ." SET end_time = :end"
- ." WHERE id = :id";
- $params = array(
- ':end'=>$dateTime->format("Y-m-d H:i:s"),
- ':id'=>$row['id']
- );
- Application_Common_Database::prepareAndExecute($update_sql, $params,
- Application_Common_Database::EXECUTE);
- }
- //If live broadcasting is off, turn scheduled play on
- $scheduled = Application_Model_Preference::GetSourceSwitchStatus('scheduled_play');
- if ($state == 'L' && $scheduled=='on' && !$override) {
- self::SetNewLogTime('S', $dateTime);
- }
- }
- } catch (Exception $e) {
- header('HTTP/1.0 503 Service Unavailable');
- Logging::info("SetEndTime - Could not connect to database.");
- exit;
- }
- }
- }
|