Merge branch '2.2.x' into 2.2.x-saas

Conflicts:
	airtime_mvc/application/forms/LiveStreamingPreferences.php
This commit is contained in:
Martin Konecny 2012-11-28 16:10:33 -05:00
commit 4983721565
27 changed files with 385 additions and 246 deletions

View file

@ -48,7 +48,7 @@ class Application_Common_DateHelper
/**
* Get the week start date of this week in the format
* YYYY-MM-DD
*
*
* @return String - week start date
*/
function getWeekStartDate()
@ -231,7 +231,7 @@ class Application_Common_DateHelper
if (2 !== substr_count($p_time, ":")){
return FALSE;
}
if (1 === substr_count($p_time, ".")){
list($hhmmss, $ms) = explode(".", $p_time);
} else {
@ -275,17 +275,17 @@ class Application_Common_DateHelper
return $dateTime;
}
/* Convenience method to return a date formatted into a String rather than a
/* Convenience method to return a date formatted into a String rather than a
* DateTime object. Note that if an empty string is provided for $p_dateString
* then the current time is provided.
*
* then the current time is provided.
*
* @param $p_dateString
* Date string in UTC timezone.
* @param $p_format
* Format which the string should be returned in.
*
* @return string
* Date String in localtime
*
* @return string
* Date String in localtime
* */
public static function ConvertToLocalDateTimeString($p_dateString, $p_format="Y-m-d H:i:s"){
if (is_null($p_dateString) || strlen($p_dateString) == 0)
@ -302,7 +302,7 @@ class Application_Common_DateHelper
/*
* Example input: "00:02:32.746562". Output is a DateInterval object
* representing that 2 minute, 32.746562 second interval.
*
*
*/
public static function getDateIntervalFromString($p_interval){
list($hour_min_sec, $subsec) = explode(".", $p_interval);
@ -335,7 +335,7 @@ class Application_Common_DateHelper
$retVal['errMsg'] = "The year '$year' must be within the range of 1753 - 9999";
} else if (!checkdate($month, $day, $year)) {
$retVal['success'] = false;
$retVal['errMsg'] = "'$year-$month-$day' is not a valid date";
$retVal['errMsg'] = "'$year-$month-$day' is not a valid date";
} else {
// check time
if (isset($timeInfo)) {

View file

@ -952,31 +952,33 @@ class ApiController extends Zend_Controller_Action
$data_arr = json_decode($data);
if (!is_null($media_id) && isset($data_arr->title) && strlen($data_arr->title) < 1024) {
if (!is_null($media_id)) {
if (isset($data_arr->title) &&
strlen($data_arr->title) < 1024) {
$previous_metadata = CcWebstreamMetadataQuery::create()
->orderByDbStartTime('desc')
->filterByDbInstanceId($media_id)
->findOne();
$previous_metadata = CcWebstreamMetadataQuery::create()
->orderByDbStartTime('desc')
->filterByDbInstanceId($media_id)
->findOne();
$do_insert = true;
if ($previous_metadata) {
if ($previous_metadata->getDbLiquidsoapData() == $data_arr->title) {
Logging::debug("Duplicate found: ".$data_arr->title);
$do_insert = false;
$do_insert = true;
if ($previous_metadata) {
if ($previous_metadata->getDbLiquidsoapData() == $data_arr->title) {
Logging::debug("Duplicate found: ".$data_arr->title);
$do_insert = false;
}
}
if ($do_insert) {
$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->save();
}
}
if ($do_insert) {
$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->save();
}
} else {
throw new Error("Unexpected error. media_id $media_id has a null stream value in cc_schedule!");
throw new Exception("Null value of media_id");
}
$this->view->response = $data;

View file

@ -107,7 +107,6 @@ class Application_Form_LiveStreamingPreferences extends Zend_Form_SubForm
public function isValid($data)
{
$isValid = parent::isValid($data);
return $isValid;
}

View file

@ -360,8 +360,10 @@ SQL;
{
$sql = <<<SQL
SELECT SUM(cliplength) AS LENGTH
FROM cc_blockcontents
FROM cc_blockcontents as bc
JOIN cc_files as f ON bc.file_id = f.id
WHERE block_id = :block_id
AND f.file_exists = true
SQL;
$result = Application_Common_Database::prepareAndExecute($sql, array(':block_id'=>$this->id), 'all', PDO::FETCH_NUM);
return $result[0][0];
@ -471,9 +473,9 @@ SQL;
Logging::info("Adding to block");
Logging::info("at position {$pos}");
}
foreach ($p_items as $ac) {
Logging::info("Adding audio file {$ac}");
Logging::info("Adding audio file {$ac[0]}");
try {
if (is_array($ac) && $ac[1] == 'audioclip') {
$res = $this->insertBlockElement($this->buildEntry($ac[0], $pos));

View file

@ -204,9 +204,9 @@ class Application_Model_Preference
$fade = $out;
}
$fade = number_format($fade, 2);
$fade = number_format($fade, 1);
//fades need 2 leading zeros for DateTime conversion
$fade = rtrim(str_pad($fade, 5, "0", STR_PAD_LEFT), "0");
$fade = str_pad($fade, 4, "0", STR_PAD_LEFT);
return $fade;
}
@ -1109,7 +1109,6 @@ class Application_Model_Preference
} else {
/*For now we just have this hack for debugging. We should not
rely on this crappy behaviour in case of failure*/
Logging::info("Pref: $pref_param");
Logging::warn("Index $x does not exist preferences");
Logging::warn("Defaulting to identity and printing preferences");
Logging::warn($ds);

View file

@ -321,7 +321,7 @@ SQL;
ws.description AS file_album_title,
ws.length AS file_length,
't'::BOOL AS file_exists,
NULL as file_mime
ws.mime as file_mime
SQL;
$streamJoin = <<<SQL
cc_schedule AS sched
@ -674,6 +674,12 @@ SQL;
$start = self::AirtimeTimeToPypoTime($item["start"]);
$end = self::AirtimeTimeToPypoTime($item["end"]);
list(,,,$start_hour,,) = explode("-", $start);
list(,,,$end_hour,,) = explode("-", $end);
$same_hour = $start_hour == $end_hour;
$independent_event = !$same_hour;
$schedule_item = array(
'id' => $media_id,
'type' => 'file',
@ -687,7 +693,7 @@ SQL;
'end' => $end,
'show_name' => $item["show_name"],
'replay_gain' => is_null($item["replay_gain"]) ? "0": $item["replay_gain"],
'independent_event' => false
'independent_event' => $independent_event,
);
self::appendScheduleItem($data, $start, $schedule_item);
}
@ -827,26 +833,60 @@ SQL;
}
}
/* Check if two events are less than or equal to 1 second apart
*/
public static function areEventsLinked($event1, $event2) {
$dt1 = DateTime::createFromFormat("Y-m-d-H-i-s", $event1['start']);
$dt2 = DateTime::createFromFormat("Y-m-d-H-i-s", $event2['start']);
$seconds = $dt2->getTimestamp() - $dt1->getTimestamp();
return $seconds <= 1;
}
/**
* Purpose of this function is to iterate through the entire
* schedule array that was just built and fix the data up a bit. For
* example, if we have two consecutive webstreams, we don't need the
* first webstream to shutdown the output, when the second one will
* just switch it back on. Preventing this behaviour stops hiccups
* in output sound.
* Streams are a 4 stage process.
* 1) start buffering stream 5 seconds ahead of its start time
* 2) at the start time tell liquidsoap to switch to this source
* 3) at the end time, tell liquidsoap to stop reading this stream
* 4) at the end time, tell liquidsoap to switch away from input.http source.
*
* When we have two streams back-to-back, some of these steps are unnecessary
* for the second stream. Instead of sending commands 1,2,3,4,1,2,3,4 we should
* send 1,2,1,2,3,4 - We don't need to tell liquidsoap to stop reading (#3), because #1
* of the next stream implies this when we pass in a new url. We also don't need #4.
*
* There's a special case here is well. When the back-to-back streams are the same, we
* can collapse the instructions 1,2,(3,4,1,2),3,4 to 1,2,3,4. We basically cut out the
* middle part. This function handles this.
*/
private static function filterData(&$data)
private static function foldData(&$data)
{
$previous_key = null;
$previous_val = null;
$previous_previous_key = null;
$previous_previous_val = null;
$previous_previous_previous_key = null;
$previous_previous_previous_val = null;
foreach ($data as $k => $v) {
if ($v["type"] == "stream_buffer_start"
&& !is_null($previous_val)
&& $previous_val["type"] == "stream_output_end") {
if ($v["type"] == "stream_output_start"
&& !is_null($previous_previous_val)
&& $previous_previous_val["type"] == "stream_output_end"
&& self::areEventsLinked($previous_previous_val, $v)) {
unset($data[$previous_previous_previous_key]);
unset($data[$previous_previous_key]);
unset($data[$previous_key]);
if ($previous_previous_val['uri'] == $v['uri']) {
unset($data[$k]);
}
}
$previous_previous_previous_key = $previous_previous_key;
$previous_previous_previous_val = $previous_previous_val;
$previous_previous_key = $previous_key;
$previous_previous_val = $previous_val;
$previous_key = $k;
$previous_val = $v;
}
@ -859,10 +899,12 @@ SQL;
$data = array();
$data["media"] = array();
//Harbor kick times *MUST* be ahead of schedule events, so that pypo
//executes them first.
self::createInputHarborKickTimes($data, $range_start, $range_end);
self::createScheduledEvents($data, $range_start, $range_end);
self::filterData($data["media"]);
self::foldData($data["media"]);
return $data;
}

View file

@ -266,8 +266,12 @@ class Application_Model_ShowBuilder
$row["instance"] = intval($p_item["si_id"]);
$row["starts"] = $schedStartDT->format("H:i:s");
$row["ends"] = $schedEndDT->format("H:i:s");
$formatter = new LengthFormatter($p_item['file_length']);
$cue_out = Application_Common_DateHelper::calculateLengthInSeconds($p_item['cue_out']);
$cue_in = Application_Common_DateHelper::calculateLengthInSeconds($p_item['cue_in']);
$run_time = $cue_out-$cue_in;
$formatter = new LengthFormatter(Application_Common_DateHelper::ConvertMSToHHMMSSmm($run_time*1000));
$row['runtime'] = $formatter->format();
$row["title"] = $p_item["file_track_title"];

View file

@ -34,7 +34,7 @@ class Application_Model_Webstream implements Application_Model_LibraryEditable
public function getCreatorId()
{
return $this->Webstream->getCcSubjs()->getDbId();
return $this->webstream->getDbCreatorId();
}
public function getLastModified($p_type)
@ -51,7 +51,7 @@ class Application_Model_Webstream implements Application_Model_LibraryEditable
$di = new DateInterval("PT{$hours}H{$min}M{$sec}S");
return $di->format("%Hh %Im");
}
}
return "";
}