SAAS-223: Airtime Usage Metric: Amount of time spent broadcasting

-calculated scheduled broadcasting
This commit is contained in:
denise 2012-05-11 14:50:38 -04:00
parent 195d0d8311
commit 746e55de32

View file

@ -2,112 +2,189 @@
class Application_Model_LiveLog class Application_Model_LiveLog
{ {
public static function GetLiveShowDuration() { public static function GetLiveShowDuration() {
try { try {
$con = Propel::getConnection(); $con = Propel::getConnection();
$sql = "SELECT * FROM CC_LIVE_LOG" $sql = "SELECT * FROM CC_LIVE_LOG"
." WHERE state = 'L'" ." WHERE state = 'L'"
." and (start_time >= (now() - INTERVAL '1 day'))" ." and (start_time >= (now() - INTERVAL '1 day'))"
." ORDER BY id"; ." ORDER BY id";
$rows = $con->query($sql)->fetchAll(); $rows = $con->query($sql)->fetchAll();
/* Check if last log has end time. /* Check if last log has end time.
* If not, set end time to current time * If not, set end time to current time
*/ */
if ($rows != null) { if ($rows != null) {
$last_row = self::UpdateLastLogEndTime(array_pop($rows)); $last_row = self::UpdateLastLogEndTime(array_pop($rows));
array_push($rows, $last_row); array_push($rows, $last_row);
} }
$duration = self::GetDuration($rows); //$duration = self::GetDuration($rows);
$hours = 0;
$minutes = 0;
$seconds = 0;
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);
// Trim milliseconds (DateInteral does not support)
$sec = explode(".", $intervals[2]);
$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];
// Delete data we just used to start a new log history
$sql_delete = "DELETE FROM CC_LIVE_LOG"
." WHERE id = '{$row['id']}'";
$con->exec($sql_delete);
}
$seconds = explode(".", $seconds);
$duration = new DateInterval("PT". $hours . "H" . $minutes . "M" . $seconds[0] ."S");
return $duration->format("%H:%i:%s");
return $duration; return $duration;
} catch (Exception $e) { } catch (Exception $e) {
header('HTTP/1.0 503 Service Unavailable'); header('HTTP/1.0 503 Service Unavailable');
Logging::log("GetLiveShowDuration - Could not connect to database."); Logging::log("GetLiveShowDuration - Could not connect to database.");
exit; exit;
} }
} }
public static function GetScheduledDuration() { public static function GetScheduledDuration() {
try { try {
$con = Propel::getConnection(); $con = Propel::getConnection();
$sql_get_logs = "SELECT * FROM CC_LIVE_LOG" $sql_get_logs = "SELECT * FROM CC_LIVE_LOG"
." WHERE state = 'S'" ." WHERE state = 'S'"
." and (start_time >= (now() - INTERVAL '1 day'))" ." and (start_time >= (now() - INTERVAL '1 day'))"
." ORDER BY id"; ." ORDER BY id";
$rows = $con->query($sql_get_logs)->fetchAll(); $rows = $con->query($sql_get_logs)->fetchAll();
/* Check if last log has end time. /* Check if last log has end time.
* If not, set end time to current time * If not, set end time to current time
*/ */
if ($rows != null) { if ($rows != null) {
$last_row = self::UpdateLastLogEndTime(array_pop($rows)); $last_row = self::UpdateLastLogEndTime(array_pop($rows));
array_push($rows, $last_row); array_push($rows, $last_row);
} }
$duration = new DateTime("00:00:00"); $hours = 0;
$minutes = 0;
/* Get all tracks from cc_schedule that played $seconds = 0;
/* Get all shows and tracks from cc_schedule that played
* during a scheduled state * during a scheduled state
*/ */
foreach ($rows as $row) { foreach ($rows as $row) {
//Get all show instances $sql_get_tracks = "SELECT * FROM cc_schedule"
$sql_get_shows = "SELECT * FROM cc_show_instances" ." WHERE starts >= '{$row['start_time']}'"
." WHERE starts >= '{$row['start_time']}'" ." AND starts < '{$row['end_time']}'"
." AND ends < '{$row['end_time']}'"; ." AND file_id IS NOT NULL"
$shows = $con->query($sql_get_shows)->fetchAll(); ." AND media_item_played IS TRUE";
$tracks = $con->query($sql_get_tracks)->fetchAll();
//Get all tracks from each show and calculate total duration foreach ($tracks as $track) {
foreach ($shows as $show) { if ($track['ends'] > $row['end_time']) {
$sql_get_tracks = "SELECT * FROM cc_schedule" $scheduled_ends = new DateTime($row['end_time']);
." WHERE starts >= '{$show['starts']}'" $track_ends = new DateTime($track['ends']);
." AND starts < '{$show['ends']}'" $extra_time = $scheduled_ends->diff($track_ends);
." AND file_id IS NOT NULL"
." AND media_item_played IS TRUE" /* Get difference between clip_length
." AND instance_id = '{$show['show_id']}'"; * and the extra time. We need to subtract
$tracks = $con->query($sql_get_tracks)->fetchAll(); * this difference from the track's
$last_track = array_pop($tracks); * clip length.
foreach ($tracks as $track) { */
$track_start = new DateTime($track['starts']); $clip_length = $track['clip_length'];
$track_end = new DateTime($track['ends']); //Convert clip_length into seconds
$duration->add($track_start->diff($track_end)); $clip_length_intervals = explode(":", $clip_length);
} $clip_length_seconds = $clip_length_intervals[0]*3600 + $clip_length_intervals[1]*60 + $clip_length_intervals[2];
if ($last_track['ends'] > $show['ends']) {
/* $extra_time = $extra_time->format("%H:%i:%s");
$show_end = new DateTime($show['ends']); //Convert extra_time into seconds;
$last_track_start = new DateTime($last_track['starts']); $extra_time_intervals = explode(":", $extra_time);
$last_track_end = new DateTime($last_track['ends']); $extra_time_seconds = $extra_time_intervals[0]*3600 + $extra_time_intervals[1]*60 + $extra_time_intervals[2];
$last_track_length = new DateTime($last_track_start->diff($last_track_end)); $clip_length_seconds -= $extra_time_seconds;
$trackdiff = new DateTime($show_end->diff($last_track_end)); //Convert new clip_length into "H-i-s" format
$clip_length_arr = array();
$new_track_length = new DateTime($trackdiff->diff($last_track_length)); if ($clip_length_seconds / 3600 >= 1) {
array_push($clip_length_arr, str_pad(floor($clip_length_seconds / 3600), 2, "0", STR_PAD_LEFT));
$duration->add($new_track_length); $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 { else {
$last_track_start = new DateTime($last_track['starts']); $clip_length = $track['clip_length'];
$last_track_end = new DateTime($last_track['ends']); }
$duration->add($last_track_start->diff($last_track_end));
} $intervals = explode(":", $clip_length);
// Trim milliseconds (DateInteral does not support)
$sec = explode(".", $intervals[2]);
$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];
} }
$duration = $duration->format("H:i:s");
return $duration; //Delete row because we do not need data anymore
$sql_delete = "DELETE FROM CC_LIVE_LOG"
." WHERE id = '{$row['id']}'";
$con->exec($sql_delete);
} }
$seconds = explode(".", $seconds);
$duration = new DateInterval("PT". $hours . "H" . $minutes . "M" . $seconds[0] ."S");
return $duration->format("%H:%i:%s");
} catch (Exception $e) { } catch (Exception $e) {
header('HTTP/1.0 503 Service Unavailable'); header('HTTP/1.0 503 Service Unavailable');
Logging::log("GetScheduledDuration - Could not connect to database."); Logging::log("GetScheduledDuration - Could not connect to database.");
exit; exit;
} }
} }
public static function GetDuration($rows) { public static function GetDuration($rows) {
$duration = new DateTime("00:00:00"); $duration = new DateTime("00:00:00");
foreach($rows as $row) { foreach($rows as $row) {
@ -118,80 +195,80 @@ class Application_Model_LiveLog
$duration = $duration->format("H:i:s"); $duration = $duration->format("H:i:s");
return $duration; return $duration;
} }
public static function UpdateLastLogEndTime($log) { public static function UpdateLastLogEndTime($log) {
$current_time = new DateTime("now", new DateTimeZone('UTC')); if ($log['end_time'] == null) {
$log['end_time'] = $current_time; $current_time = new DateTime("now", new DateTimeZone('UTC'));
$log['end_time'] = $log['end_time']->format("Y-m-d H:i:s"); $log['end_time'] = $current_time;
self::SetEndTime($log['state'], $current_time); $log['end_time'] = $log['end_time']->format("Y-m-d H:i:s");
self::SetNewLogTime($log['state'], $current_time); self::SetEndTime($log['state'], $current_time, true);
self::SetNewLogTime($log['state'], $current_time);
}
return $log; return $log;
} }
public static function SetNewLogTime($state, $dateTime, $end_scheduled=true){ public static function SetNewLogTime($state, $dateTime){
try { try {
$con = Propel::getConnection(); $con = Propel::getConnection();
if ($state == 'L') { if ($state == 'L') {
self::SetEndTime('S', $dateTime); self::SetEndTime('S', $dateTime);
} }
/* Only insert new state if last log /* Only insert new state if last log
* has ended * has ended
*/ */
$sql_select = "SELECT max(id) from CC_LIVE_LOG" $sql_select = "SELECT max(id) from CC_LIVE_LOG"
." WHERE (state='L' and end_time is NULL) or (state='S' and end_time is NULL)"; ." WHERE (state='L' and end_time is NULL) or (state='S' and end_time is NULL)";
$id = $con->query($sql_select)->fetchColumn(0); $id = $con->query($sql_select)->fetchColumn(0);
if ($id == null) { if ($id == null) {
$sql_insert = "INSERT INTO CC_LIVE_LOG (state, start_time)" $sql_insert = "INSERT INTO CC_LIVE_LOG (state, start_time)"
." VALUES ('$state', '{$dateTime->format("Y-m-d H:i:s")}')"; ." VALUES ('$state', '{$dateTime->format("Y-m-d H:i:s")}')";
$con->exec($sql_insert); $con->exec($sql_insert);
} }
} catch (Exception $e) { } catch (Exception $e) {
header('HTTP/1.0 503 Service Unavailable'); header('HTTP/1.0 503 Service Unavailable');
Logging::log("SetNewLogTime - Could not connect to database."); Logging::log("SetNewLogTime - Could not connect to database.");
exit; exit;
} }
} }
public static function SetEndTime($state, $dateTime){ public static function SetEndTime($state, $dateTime, $override=false){
try { try {
$con = Propel::getConnection(); $con = Propel::getConnection();
//if ($state == 'L') { $dj_live = Application_Model_Preference::GetSourceSwitchStatus('live_dj');
$dj_live = Application_Model_Preference::GetSourceSwitchStatus('live_dj'); $master_live = Application_Model_Preference::GetSourceSwitchStatus('master_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"
if (($dj_live=='off' && $master_live=='off') || $state == 'S') { ." where id in (select max(id) from cc_live_log)";
$sql = "SELECT id, state from cc_live_log"
." where id in (select max(id) from cc_live_log)";
$row = $con->query($sql)->fetch(); $row = $con->query($sql)->fetch();
/* Only set end time if state recevied ($state) /* Only set end time if state recevied ($state)
* is the last row in cc_live_log * is the last row in cc_live_log
*/ */
if ($row['state'] == $state) { if ($row['state'] == $state) {
$update_sql = "UPDATE CC_LIVE_LOG" $update_sql = "UPDATE CC_LIVE_LOG"
." SET end_time = '{$dateTime->format("Y-m-d H:i:s")}'" ." SET end_time = '{$dateTime->format("Y-m-d H:i:s")}'"
." WHERE id = '$row[0]'"; ." WHERE id = '{$row['id']}'";
$con->exec($update_sql); $con->exec($update_sql);
} }
//If live broadcasting is off, turn scheduled play on //If live broadcasting is off, turn scheduled play on
$scheduled = Application_Model_Preference::GetSourceSwitchStatus('scheduled_play'); $scheduled = Application_Model_Preference::GetSourceSwitchStatus('scheduled_play');
if ($state == 'L' && $scheduled=='on') { if ($state == 'L' && $scheduled=='on' && !$override) {
self::SetNewLogTime('S', $dateTime); self::SetNewLogTime('S', $dateTime);
} }
} }
} catch (Exception $e) { } catch (Exception $e) {
header('HTTP/1.0 503 Service Unavailable'); header('HTTP/1.0 503 Service Unavailable');
Logging::log("SetEndTime - Could not connect to database."); Logging::log("SetEndTime - Could not connect to database.");
exit; exit;
} }
} }
} }