Merge branch '2.4.x'
This commit is contained in:
commit
6b12dcdc2a
29 changed files with 744 additions and 410 deletions
|
@ -26,6 +26,7 @@ class Config {
|
|||
$CC_CONFIG['webServerUser'] = $values['general']['web_server_user'];
|
||||
$CC_CONFIG['rabbitmq'] = $values['rabbitmq'];
|
||||
|
||||
$CC_CONFIG['baseDir'] = $values['general']['base_dir'];
|
||||
$CC_CONFIG['baseUrl'] = $values['general']['base_url'];
|
||||
$CC_CONFIG['basePort'] = $values['general']['base_port'];
|
||||
$CC_CONFIG['phpDir'] = $values['general']['airtime_dir'];
|
||||
|
|
|
@ -383,6 +383,7 @@ class PlaylistController extends Zend_Controller_Action
|
|||
$this->createUpdateResponse($obj);
|
||||
} else {
|
||||
$this->view->cue_error = $response["error"];
|
||||
$this->view->code = $response["type"];
|
||||
}
|
||||
} catch (PlaylistOutDatedException $e) {
|
||||
$this->playlistOutdated($e);
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
|
||||
<script id="tmpl-pl-cues" type="text/template">
|
||||
<div class="waveform-cues">
|
||||
<div class="playlist-time-scale"></div>
|
||||
<div class="playlist-tracks"></div>
|
||||
<div class="playlist-controls">
|
||||
<a class="btn btn-small btn_play"><i class="icon-play icon-white"></i><?php echo _("Play"); ?></a>
|
||||
|
@ -61,10 +62,12 @@
|
|||
|
||||
<script id="tmpl-pl-fades" type="text/template">
|
||||
<div class="waveform-fades">
|
||||
<div class="playlist-time-scale"></div>
|
||||
<div class="playlist-tracks"></div>
|
||||
<div class="playlist-controls left-floated">
|
||||
<a class="btn btn-small btn_play"><i class="icon-play icon-white"></i><?php echo _("Play"); ?></a>
|
||||
<a class="btn btn-small btn_stop"><i class="icon-stop icon-white"></i><?php echo _("Stop"); ?></a>
|
||||
<label class="audio audio_pos">00:00:00.0</label>
|
||||
</div>
|
||||
<div class="set-fade left-floated">
|
||||
<a type="button" class="btn btn-small btn_cursor" data-state="cursor"><?php echo _("Cursor"); ?></a>
|
||||
|
|
|
@ -687,6 +687,10 @@ SQL;
|
|||
{
|
||||
$this->con->beginTransaction();
|
||||
|
||||
if (!isset($offset)) {
|
||||
$offset = Application_Model_Preference::GetDefaultCrossfadeDuration();
|
||||
}
|
||||
|
||||
try {
|
||||
if (isset($id1)) {
|
||||
$this->changeFadeInfo($id1, null, $fadeOut);
|
||||
|
|
|
@ -10,6 +10,10 @@ require_once 'formatters/LengthFormatter.php';
|
|||
*/
|
||||
class Application_Model_Playlist implements Application_Model_LibraryEditable
|
||||
{
|
||||
const CUE_ALL_ERROR = 0;
|
||||
const CUE_IN_ERROR = 1;
|
||||
const CUE_OUT_ERROR = 2;
|
||||
|
||||
/**
|
||||
* propel connection object.
|
||||
*/
|
||||
|
@ -669,6 +673,10 @@ SQL;
|
|||
{
|
||||
$this->con->beginTransaction();
|
||||
|
||||
if (!isset($offset)) {
|
||||
$offset = Application_Model_Preference::GetDefaultCrossfadeDuration();
|
||||
}
|
||||
|
||||
try {
|
||||
if (isset($id1)) {
|
||||
$this->changeFadeInfo($id1, null, $fadeOut);
|
||||
|
@ -792,6 +800,7 @@ SQL;
|
|||
try {
|
||||
if (is_null($cueIn) && is_null($cueOut)) {
|
||||
$errArray["error"] = _("Cue in and cue out are null.");
|
||||
$errArray["type"] = self::CUE_ALL_ERROR;
|
||||
|
||||
return $errArray;
|
||||
}
|
||||
|
@ -822,6 +831,7 @@ SQL;
|
|||
$sql = "SELECT :cueIn::INTERVAL > :cueOut::INTERVAL";
|
||||
if (Application_Common_Database::prepareAndExecute($sql, array(':cueIn'=>$cueIn, ':cueOut'=>$cueOut), 'column')) {
|
||||
$errArray["error"] = _("Can't set cue in to be larger than cue out.");
|
||||
$errArray["type"] = self::CUE_IN_ERROR;
|
||||
|
||||
return $errArray;
|
||||
}
|
||||
|
@ -829,6 +839,7 @@ SQL;
|
|||
$sql = "SELECT :cueOut::INTERVAL > :origLength::INTERVAL";
|
||||
if (Application_Common_Database::prepareAndExecute($sql, array(':cueOut'=>$cueOut, ':origLength'=>$origLength), 'column')) {
|
||||
$errArray["error"] = _("Can't set cue out to be greater than file length.");
|
||||
$errArray["type"] = self::CUE_OUT_ERROR;
|
||||
|
||||
return $errArray;
|
||||
}
|
||||
|
@ -845,6 +856,7 @@ SQL;
|
|||
$sql = "SELECT :cueIn::INTERVAL > :oldCueOut::INTERVAL";
|
||||
if (Application_Common_Database::prepareAndExecute($sql, array(':cueIn'=>$cueIn, ':oldCueOut'=>$oldCueOut), 'column')) {
|
||||
$errArray["error"] = _("Can't set cue in to be larger than cue out.");
|
||||
$errArray["type"] = self::CUE_IN_ERROR;
|
||||
|
||||
return $errArray;
|
||||
}
|
||||
|
@ -863,6 +875,7 @@ SQL;
|
|||
$sql = "SELECT :cueOut::INTERVAL < :oldCueIn::INTERVAL";
|
||||
if (Application_Common_Database::prepareAndExecute($sql, array(':cueOut'=>$cueOut, ':oldCueIn'=>$oldCueIn), 'column')) {
|
||||
$errArray["error"] = _("Can't set cue out to be smaller than cue in.");
|
||||
$errArray["type"] = self::CUE_OUT_ERROR;
|
||||
|
||||
return $errArray;
|
||||
}
|
||||
|
@ -870,6 +883,7 @@ SQL;
|
|||
$sql = "SELECT :cueOut::INTERVAL > :origLength::INTERVAL";
|
||||
if (Application_Common_Database::prepareAndExecute($sql, array(':cueOut'=>$cueOut, ':origLength'=>$origLength), 'column')) {
|
||||
$errArray["error"] = _("Can't set cue out to be greater than file length.");
|
||||
$errArray["type"] = self::CUE_OUT_ERROR;
|
||||
|
||||
return $errArray;
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@ class Application_Model_Preference
|
|||
|
||||
$result = Application_Common_Database::prepareAndExecute($sql,
|
||||
$paramMap,
|
||||
'column',
|
||||
Application_Common_Database::ROW_COUNT,
|
||||
PDO::FETCH_ASSOC,
|
||||
$con);
|
||||
|
||||
|
|
|
@ -388,7 +388,7 @@ class Application_Model_Scheduler
|
|||
return $dt;
|
||||
}
|
||||
|
||||
private function findNextStartTime($DT, $instance)
|
||||
private function findNextStartTime($DT, $instanceId)
|
||||
{
|
||||
$sEpoch = $DT->format("U.u");
|
||||
$nEpoch = $this->epochNow;
|
||||
|
@ -410,7 +410,7 @@ class Application_Model_Scheduler
|
|||
->setDbCueIn('00:00:00')
|
||||
->setDbCueOut('00:00:00')
|
||||
->setDbPlayoutStatus(-1)
|
||||
->setDbInstanceId($instance->getDbId())
|
||||
->setDbInstanceId($instanceId)
|
||||
->save($this->con);
|
||||
} else {
|
||||
$nextDT = $DT;
|
||||
|
@ -424,33 +424,39 @@ class Application_Model_Scheduler
|
|||
* This function recalculates the start/end times of items in a gapless show to
|
||||
* account for crossfade durations.
|
||||
*/
|
||||
private function calculateCrossfades($showInstance)
|
||||
private function calculateCrossfades($instanceId)
|
||||
{
|
||||
Logging::info("adjusting start, end times of scheduled items to account for crossfades show instance #".$showInstance);
|
||||
Logging::info("adjusting start, end times of scheduled items to account for crossfades show instance #".$instanceId);
|
||||
|
||||
$sql = "SELECT * FROM cc_show_instances ".
|
||||
"WHERE id = {$instanceId}";
|
||||
$instance = Application_Common_Database::prepareAndExecute(
|
||||
$sql, array(), Application_Common_Database::SINGLE);
|
||||
|
||||
$instance = CcShowInstancesQuery::create()->findPK($showInstance, $this->con);
|
||||
if (is_null($instance)) {
|
||||
throw new OutDatedScheduleException(_("The schedule you're viewing is out of date!"));
|
||||
}
|
||||
|
||||
$itemStartDT = $instance->getDbStarts(null);
|
||||
$itemStartDT = new DateTime($instance["starts"], new DateTimeZone("UTC"));
|
||||
$itemEndDT = null;
|
||||
|
||||
$schedule = CcScheduleQuery::create()
|
||||
->filterByDbInstanceId($showInstance)
|
||||
->orderByDbStarts()
|
||||
->find($this->con);
|
||||
$schedule_sql = "SELECT * FROM cc_schedule ".
|
||||
"WHERE instance_id = {$instanceId} ".
|
||||
"ORDER BY starts";
|
||||
$schedule = Application_Common_Database::prepareAndExecute($schedule_sql);
|
||||
|
||||
foreach ($schedule as $item) {
|
||||
$itemEndDT = $this->findEndTime($itemStartDT, $item->getDbClipLength());
|
||||
$itemEndDT = $this->findEndTime($itemStartDT, $item["clip_length"]);
|
||||
|
||||
$item->setDbStarts($itemStartDT)
|
||||
->setDbEnds($itemEndDT);
|
||||
$update_sql = "UPDATE cc_schedule SET ".
|
||||
"starts = '{$itemStartDT->format("Y-m-d H:i:s")}', ".
|
||||
"ends = '{$itemEndDT->format("Y-m-d H:i:s")}' ".
|
||||
"WHERE id = {$item["id"]}";
|
||||
Application_Common_Database::prepareAndExecute(
|
||||
$update_sql, array(), Application_Common_Database::EXECUTE);
|
||||
|
||||
$itemStartDT = $this->findTimeDifference($itemEndDT, $this->crossfadeDuration);
|
||||
}
|
||||
|
||||
$schedule->save($this->con);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -521,6 +527,10 @@ class Application_Model_Scheduler
|
|||
|
||||
$linked = false;
|
||||
|
||||
$dropIndex_sql = "DROP INDEX cc_schedule_instance_id_idx";
|
||||
Application_Common_Database::prepareAndExecute(
|
||||
$dropIndex_sql, array(), Application_Common_Database::EXECUTE);
|
||||
|
||||
foreach ($scheduleItems as $schedule) {
|
||||
$id = intval($schedule["id"]);
|
||||
|
||||
|
@ -531,12 +541,18 @@ class Application_Model_Scheduler
|
|||
* of inserted items
|
||||
*/
|
||||
if ($id != 0) {
|
||||
$ccSchedule = CcScheduleQuery::create()->findPk($id);
|
||||
$ccShowInstance = CcShowInstancesQuery::create()->findPk($ccSchedule->getDbInstanceId());
|
||||
$ccShow = $ccShowInstance->getCcShow();
|
||||
$linked = $ccShow->isLinked();
|
||||
$schedule_sql = "SELECT * FROM cc_schedule WHERE id = ".$id;
|
||||
$ccSchedule = Application_Common_Database::prepareAndExecute(
|
||||
$schedule_sql, array(), Application_Common_Database::SINGLE);
|
||||
|
||||
$show_sql = "SELECT * FROM cc_show WHERE id IN (".
|
||||
"SELECT show_id FROM cc_show_instances WHERE id = ".$ccSchedule["instance_id"].")";
|
||||
$ccShow = Application_Common_Database::prepareAndExecute(
|
||||
$show_sql, array(), Application_Common_Database::SINGLE);
|
||||
|
||||
$linked = $ccShow["linked"];
|
||||
if ($linked) {
|
||||
$unique = $ccShow->getDbId() . $ccSchedule->getDbPosition();
|
||||
$unique = $ccShow["id"] . $ccSchedule["position"];
|
||||
if (!in_array($unique, $temp)) {
|
||||
$temp[] = $unique;
|
||||
} else {
|
||||
|
@ -544,11 +560,14 @@ class Application_Model_Scheduler
|
|||
}
|
||||
}
|
||||
} else {
|
||||
$ccShowInstance = CcShowInstancesQuery::create()->findPk($schedule["instance"]);
|
||||
$ccShow = $ccShowInstance->getccShow();
|
||||
$linked = $ccShow->isLinked();
|
||||
$show_sql = "SELECT * FROM cc_show WHERE id IN (".
|
||||
"SELECT show_id FROM cc_show_instances WHERE id = ".$schedule["instance"].")";
|
||||
$ccShow = Application_Common_Database::prepareAndExecute(
|
||||
$show_sql, array(), Application_Common_Database::SINGLE);
|
||||
|
||||
$linked = $ccShow["linked"];
|
||||
if ($linked) {
|
||||
$unique = $ccShow->getDbId() . "a";
|
||||
$unique = $ccShow["id"] . "a";
|
||||
if (!in_array($unique, $temp)) {
|
||||
$temp[] = $unique;
|
||||
} else {
|
||||
|
@ -562,38 +581,49 @@ class Application_Model_Scheduler
|
|||
* to that show
|
||||
*/
|
||||
if ($linked) {
|
||||
$instances = $ccShow->getCcShowInstancess();
|
||||
$instance_sql = "SELECT * FROM cc_show_instances ".
|
||||
"WHERE show_id = ".$ccShow["id"];
|
||||
$instances = Application_Common_Database::prepareAndExecute(
|
||||
$instance_sql);
|
||||
} else {
|
||||
$instances = array($ccShowInstance);
|
||||
$instance_sql = "SELECT * FROM cc_show_instances ".
|
||||
"WHERE id = ".$schedule["instance"];
|
||||
$instances = Application_Common_Database::prepareAndExecute(
|
||||
$instance_sql);
|
||||
}
|
||||
|
||||
foreach($instances as &$instance) {
|
||||
$instanceId = $instance->getDbId();
|
||||
$instanceId = $instance["id"];
|
||||
if ($id !== 0) {
|
||||
/* We use the selected cursor's position to find the same
|
||||
* positions in every other linked instance
|
||||
*/
|
||||
$pos = $ccSchedule->getDbPosition();
|
||||
$pos = $ccSchedule["position"];
|
||||
|
||||
$linkCcSchedule = CcScheduleQuery::create()
|
||||
->filterByDbInstanceId($instanceId)
|
||||
->filterByDbPosition($pos)
|
||||
->findOne();
|
||||
$linkedItem_sql = "SELECT ends FROM cc_schedule ".
|
||||
"WHERE instance_id = {$instanceId} ".
|
||||
"AND position = {$pos} ".
|
||||
"AND playout_status != -1";
|
||||
$linkedItemEnds = Application_Common_Database::prepareAndExecute(
|
||||
$linkedItem_sql, array(), Application_Common_Database::COLUMN);
|
||||
|
||||
$schedItemEndDT = $linkCcSchedule->getDbEnds(null);
|
||||
$nextStartDT = $this->findNextStartTime($schedItemEndDT, $instance);
|
||||
$nextStartDT = $this->findNextStartTime(
|
||||
new DateTime($linkedItemEnds, new DateTimeZone("UTC")),
|
||||
$instanceId);
|
||||
|
||||
$pos++;
|
||||
}
|
||||
//selected empty row to add after
|
||||
else {
|
||||
$showStartDT = $instance->getDbStarts(null);
|
||||
$nextStartDT = $this->findNextStartTime($showStartDT, $instance);
|
||||
$showStartDT = new DateTime($instance["starts"], new DateTimeZone("UTC"));
|
||||
$nextStartDT = $this->findNextStartTime($showStartDT, $instanceId);
|
||||
|
||||
//show is empty so start position counter at 0
|
||||
$pos = 0;
|
||||
$adjustSched = false;
|
||||
}
|
||||
|
||||
if (!in_array($instance->getDbId(), $affectedShowInstances)) {
|
||||
if (!in_array($instanceId, $affectedShowInstances)) {
|
||||
$affectedShowInstances[] = $instanceId;
|
||||
}
|
||||
|
||||
|
@ -620,39 +650,51 @@ class Application_Model_Scheduler
|
|||
}
|
||||
}
|
||||
|
||||
$doInsert = false;
|
||||
$doUpdate = false;
|
||||
$values = array();
|
||||
|
||||
foreach ($filesToInsert as &$file) {
|
||||
//item existed previously and is being moved.
|
||||
//need to keep same id for resources if we want REST.
|
||||
if (isset($file['sched_id'])) {
|
||||
$sched = CcScheduleQuery::create()->findPk($file["sched_id"]);
|
||||
$doUpdate = true;
|
||||
|
||||
$movedItem_sql = "SELECT * FROM cc_schedule ".
|
||||
"WHERE id = ".$file["sched_id"];
|
||||
$sched = Application_Common_Database::prepareAndExecute(
|
||||
$movedItem_sql, array(), Application_Common_Database::SINGLE);
|
||||
|
||||
/* We need to keep a record of the original positon a track
|
||||
* is being moved from so we can use it to retrieve the correct
|
||||
* items in linked instances
|
||||
*/
|
||||
if (!isset($originalPosition)) {
|
||||
$originalPosition = $sched->getDbPosition();
|
||||
$originalPosition = $sched["position"];
|
||||
}
|
||||
|
||||
/* If we are moving an item in a linked show we need to get
|
||||
* the relative item to move in each instance. We know what the
|
||||
* relative item is by its position
|
||||
*/
|
||||
if ($linked && $moveAction) {
|
||||
$sched = CcScheduleQuery::create()
|
||||
->filterByDbInstanceId($instanceId)
|
||||
->filterByDbPosition($originalPosition)
|
||||
->findOne();
|
||||
}
|
||||
$excludeIds[] = intval($sched->getDbId());
|
||||
if ($linked) {
|
||||
$movedItem_sql = "SELECT * FROM cc_schedule ".
|
||||
"WHERE position = {$originalPosition} ".
|
||||
"AND instance_id = {$instanceId}";
|
||||
|
||||
$file["cliplength"] = $sched->getDbClipLength();
|
||||
$file["cuein"] = $sched->getDbCueIn();
|
||||
$file["cueout"] = $sched->getDbCueOut();
|
||||
$file["fadein"] = $sched->getDbFadeIn();
|
||||
$file["fadeout"] = $sched->getDbFadeOut();
|
||||
$sched = Application_Common_Database::prepareAndExecute(
|
||||
$movedItem_sql, array(), Application_Common_Database::SINGLE);
|
||||
}
|
||||
$excludeIds[] = intval($sched["id"]);
|
||||
|
||||
$file["cliplength"] = $sched["clip_length"];
|
||||
$file["cuein"] = $sched["cue_in"];
|
||||
$file["cueout"] = $sched["cue_out"];
|
||||
$file["fadein"] = $sched["fade_in"];
|
||||
$file["fadeout"] = $sched["fade_out"];
|
||||
} else {
|
||||
$sched = new CcSchedule();
|
||||
//$sched = new CcSchedule();
|
||||
$doInsert = true;
|
||||
}
|
||||
|
||||
$endTimeDT = $this->findEndTime($nextStartDT, $file['cliplength']);
|
||||
|
@ -661,41 +703,61 @@ class Application_Model_Scheduler
|
|||
$file['fadein'] = Application_Common_DateHelper::secondsToPlaylistTime($file['fadein']);
|
||||
$file['fadeout'] = Application_Common_DateHelper::secondsToPlaylistTime($file['fadeout']);
|
||||
|
||||
$sched->setDbStarts($nextStartDT)
|
||||
->setDbEnds($endTimeDT)
|
||||
->setDbCueIn($file['cuein'])
|
||||
->setDbCueOut($file['cueout'])
|
||||
->setDbFadeIn($file['fadein'])
|
||||
->setDbFadeOut($file['fadeout'])
|
||||
->setDbClipLength($file['cliplength'])
|
||||
->setDbPosition($pos);
|
||||
|
||||
if (!$moveAction) {
|
||||
$sched->setDbInstanceId($instanceId);
|
||||
}
|
||||
|
||||
switch ($file["type"]) {
|
||||
case 0:
|
||||
$sched->setDbFileId($file['id']);
|
||||
$fileId = $file["id"];
|
||||
$streamId = "null";
|
||||
break;
|
||||
case 1:
|
||||
$sched->setDbStreamId($file['id']);
|
||||
$streamId = $file["id"];
|
||||
$fileId = "null";
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
$sched->save($this->con);
|
||||
if ($doInsert) {
|
||||
$values[] = "(".
|
||||
"'{$nextStartDT->format("Y-m-d H:i:s")}', ".
|
||||
"'{$endTimeDT->format("Y-m-d H:i:s")}', ".
|
||||
"'{$file["cuein"]}', ".
|
||||
"'{$file["cueout"]}', ".
|
||||
"'{$file["fadein"]}', ".
|
||||
"'{$file["fadeout"]}', ".
|
||||
"'{$file["cliplength"]}', ".
|
||||
"{$pos}, ".
|
||||
"{$instanceId}, ".
|
||||
"{$fileId}, ".
|
||||
"{$streamId})";
|
||||
|
||||
$nextStartDT = $endTimeDT;
|
||||
} elseif ($doUpdate) {
|
||||
$update_sql = "UPDATE cc_schedule SET ".
|
||||
"starts = '{$nextStartDT->format("Y-m-d H:i:s")}', ".
|
||||
"ends = '{$endTimeDT->format("Y-m-d H:i:s")}', ".
|
||||
"cue_in = '{$file["cuein"]}', ".
|
||||
"cue_out = '{$file["cueout"]}', ".
|
||||
"fade_in = '{$file["fadein"]}', ".
|
||||
"fade_out = '{$file["fadeout"]}', ".
|
||||
"clip_length = '{$file["cliplength"]}', ".
|
||||
"position = {$pos} ".
|
||||
"WHERE id = {$sched["id"]}";
|
||||
|
||||
Application_Common_Database::prepareAndExecute(
|
||||
$update_sql, array(), Application_Common_Database::EXECUTE);
|
||||
}
|
||||
|
||||
$nextStartDT = $this->findTimeDifference($endTimeDT, $this->crossfadeDuration);
|
||||
$pos++;
|
||||
|
||||
/* If we are adjusting start and end times for items
|
||||
* after the insert location, we need to exclude the
|
||||
* schedule item we just inserted because it has correct
|
||||
* start and end times*/
|
||||
$excludeIds[] = $sched->getDbId();
|
||||
|
||||
}//all files have been inserted/moved
|
||||
if ($doInsert) {
|
||||
$insert_sql = "INSERT INTO cc_schedule ".
|
||||
"(starts, ends, cue_in, cue_out, fade_in, fade_out, ".
|
||||
"clip_length, position, instance_id, file_id, stream_id) VALUES ".
|
||||
implode($values, ",");
|
||||
|
||||
Application_Common_Database::prepareAndExecute(
|
||||
$insert_sql, array(), Application_Common_Database::EXECUTE);
|
||||
}
|
||||
|
||||
// update is_scheduled flag for each cc_file
|
||||
$fileIds = array();
|
||||
|
@ -717,36 +779,46 @@ class Application_Model_Scheduler
|
|||
}
|
||||
|
||||
if ($adjustSched === true) {
|
||||
$followingSchedItems = CcScheduleQuery::create()
|
||||
->filterByDBStarts($initalStartDT->format("Y-m-d H:i:s.u"), Criteria::GREATER_EQUAL)
|
||||
->filterByDbInstanceId($instance->getDbId())
|
||||
->filterByDbId($excludeIds, Criteria::NOT_IN)
|
||||
->orderByDbStarts()
|
||||
->find($this->con);
|
||||
$followingItems_sql = "SELECT * FROM cc_schedule ".
|
||||
"WHERE starts >= '{$initalStartDT->format("Y-m-d H:i:s.u")}' ".
|
||||
"AND instance_id = {$instanceId} ";
|
||||
if (count($excludeIds) > 0) {
|
||||
$followingItems_sql .= "AND id NOT IN (". implode($excludeIds, ",").") ";
|
||||
}
|
||||
$followingItems_sql .= "ORDER BY starts";
|
||||
|
||||
$followingSchedItems = Application_Common_Database::prepareAndExecute(
|
||||
$followingItems_sql);
|
||||
|
||||
$pstart = microtime(true);
|
||||
|
||||
//recalculate the start/end times after the inserted items.
|
||||
foreach ($followingSchedItems as $item) {
|
||||
$endTimeDT = $this->findEndTime($nextStartDT, $item->getDbClipLength());
|
||||
$item->setDbStarts($nextStartDT);
|
||||
$item->setDbEnds($endTimeDT);
|
||||
$item->setDbPosition($pos);
|
||||
$item->save($this->con);
|
||||
$nextStartDT = $endTimeDT;
|
||||
$endTimeDT = $this->findEndTime($nextStartDT, $item["clip_length"]);
|
||||
$update_sql = "UPDATE cc_schedule SET ".
|
||||
"starts = '{$nextStartDT->format("Y-m-d H:i:s")}', ".
|
||||
"ends = '{$endTimeDT->format("Y-m-d H:i:s")}', ".
|
||||
"position = {$pos} ".
|
||||
"WHERE id = {$item["id"]}";
|
||||
Application_Common_Database::prepareAndExecute(
|
||||
$update_sql, array(), Application_Common_Database::EXECUTE);
|
||||
|
||||
$nextStartDT = $this->findTimeDifference($endTimeDT, $this->crossfadeDuration);
|
||||
$pos++;
|
||||
}
|
||||
|
||||
$pend = microtime(true);
|
||||
Logging::debug("adjusting all following items.");
|
||||
Logging::debug(floatval($pend) - floatval($pstart));
|
||||
|
||||
$this->calculateCrossfades($instance->getDbId());
|
||||
}
|
||||
}//for each instance
|
||||
|
||||
}//for each schedule location
|
||||
|
||||
$createIndex_sql = "CREATE INDEX cc_schedule_instance_id_idx ".
|
||||
"ON cc_schedule USING btree(instance_id)";
|
||||
Application_Common_Database::prepareAndExecute(
|
||||
$createIndex_sql, array(), Application_Common_Database::EXECUTE);
|
||||
|
||||
$endProfile = microtime(true);
|
||||
Logging::debug("finished adding scheduled items.");
|
||||
Logging::debug(floatval($endProfile) - floatval($startProfile));
|
||||
|
@ -782,6 +854,11 @@ class Application_Model_Scheduler
|
|||
}
|
||||
}
|
||||
|
||||
private function updateMovedItem()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private function getInstances($instanceId)
|
||||
{
|
||||
$ccShowInstance = CcShowInstancesQuery::create()->findPk($instanceId);
|
||||
|
|
|
@ -501,44 +501,25 @@ SQL;
|
|||
}
|
||||
|
||||
/**
|
||||
* Get the URL to access this file using the server name/address that
|
||||
* this PHP script was invoked through.
|
||||
* Get the URL to access this file
|
||||
*/
|
||||
public function getFileUrl()
|
||||
{
|
||||
$serverName = $_SERVER['SERVER_NAME'];
|
||||
$serverPort = $_SERVER['SERVER_PORT'];
|
||||
|
||||
return $this->constructGetFileUrl($serverName, $serverPort);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the URL to access this file using the server name/address that
|
||||
* is specified in the airtime.conf config file. If either of these is
|
||||
* not specified, then use values provided by the $_SERVER global variable.
|
||||
*/
|
||||
public function getFileUrlUsingConfigAddress()
|
||||
{
|
||||
$CC_CONFIG = Config::getConfig();
|
||||
|
||||
if (isset($CC_CONFIG['baseUrl'])) {
|
||||
$serverName = $CC_CONFIG['baseUrl'];
|
||||
} else {
|
||||
$protocol = empty($_SERVER['HTTPS']) ? "http" : "https";
|
||||
|
||||
$serverName = $_SERVER['SERVER_NAME'];
|
||||
}
|
||||
|
||||
if (isset($CC_CONFIG['basePort'])) {
|
||||
$serverPort = $CC_CONFIG['basePort'];
|
||||
} else {
|
||||
$serverPort = $_SERVER['SERVER_PORT'];
|
||||
$subDir = $CC_CONFIG['baseDir'];
|
||||
|
||||
if ($subDir[0] === "/") {
|
||||
$subDir = substr($subDir, 1, strlen($subDir) - 1);
|
||||
}
|
||||
|
||||
return $this->constructGetFileUrl($serverName, $serverPort);
|
||||
}
|
||||
$baseUrl = "{$protocol}://{$serverName}:{$serverPort}/{$subDir}";
|
||||
|
||||
private function constructGetFileUrl($p_serverName, $p_serverPort)
|
||||
{
|
||||
return "http://$p_serverName:$p_serverPort/api/get-media/file/".$this->getId().".".$this->getFileExtension();
|
||||
return $this->getRelativeFileUrl($baseUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -155,64 +155,105 @@ class Application_Service_SchedulerService
|
|||
* any other instances with content
|
||||
*/
|
||||
$instanceIds = $ccShow->getInstanceIds();
|
||||
$ccSchedules = CcScheduleQuery::create()
|
||||
->filterByDbInstanceId($instanceIds, Criteria::IN)
|
||||
->find();
|
||||
if (!$ccSchedules->isEmpty()) {
|
||||
$schedule_sql = "SELECT * FROM cc_schedule ".
|
||||
"WHERE instance_id IN (".implode($instanceIds, ",").")";
|
||||
$ccSchedules = Application_Common_Database::prepareAndExecute(
|
||||
$schedule_sql);
|
||||
|
||||
if (count($ccSchedules) > 0) {
|
||||
/* 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();
|
||||
$ccSchedule = $ccSchedules[0];
|
||||
$showStamp_sql = "SELECT * FROM cc_schedule ".
|
||||
"WHERE instance_id = {$ccSchedule["instance_id"]} ".
|
||||
"ORDER BY starts";
|
||||
$showStamp = Application_Common_Database::prepareAndExecute(
|
||||
$showStamp_sql);
|
||||
|
||||
//get time_filled so we can update cc_show_instances
|
||||
$timeFilled = $ccSchedule->getCcShowInstances()->getDbTimeFilled();
|
||||
$timeFilled_sql = "SELECT time_filled FROM cc_show_instances ".
|
||||
"WHERE id = {$ccSchedule["instance_id"]}";
|
||||
$timeFilled = Application_Common_Database::prepareAndExecute(
|
||||
$timeFilled_sql, array(), Application_Common_Database::COLUMN);
|
||||
|
||||
$dropIndex_sql = "DROP INDEX cc_schedule_instance_id_idx";
|
||||
Application_Common_Database::prepareAndExecute(
|
||||
$dropIndex_sql, array(), Application_Common_Database::EXECUTE);
|
||||
|
||||
//need to find out which linked instances are empty
|
||||
foreach ($ccShow->getCcShowInstancess() as $ccShowInstance) {
|
||||
$ccSchedules = CcScheduleQuery::create()
|
||||
->filterByDbInstanceId($ccShowInstance->getDbId())
|
||||
->find();
|
||||
$values = array();
|
||||
foreach ($instanceIds as $id) {
|
||||
$instanceSched_sql = "SELECT * FROM cc_schedule ".
|
||||
"WHERE instance_id = {$id} ".
|
||||
"ORDER by starts";
|
||||
$ccSchedules = Application_Common_Database::prepareAndExecute(
|
||||
$instanceSched_sql);
|
||||
|
||||
/* 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 first instance, we need 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)) {
|
||||
if (count($ccSchedules) < 1 ||
|
||||
self::replaceInstanceContentCheck($ccSchedules, $showStamp)) {
|
||||
|
||||
$nextStartDT = $ccShowInstance->getDbStarts(null);
|
||||
$instanceStart_sql = "SELECT starts FROM cc_show_instances ".
|
||||
"WHERE id = {$id} ".
|
||||
"ORDER BY starts";
|
||||
$nextStartDT = new DateTime(
|
||||
Application_Common_Database::prepareAndExecute(
|
||||
$instanceStart_sql, array(), Application_Common_Database::COLUMN),
|
||||
new DateTimeZone("UTC"));
|
||||
|
||||
foreach ($showStamp as $item) {
|
||||
$endTimeDT = self::findEndTime($nextStartDT, $item->getDbClipLength());
|
||||
$endTimeDT = self::findEndTime($nextStartDT, $item["clip_length"]);
|
||||
|
||||
$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();
|
||||
if (is_null($item["file_id"])) {
|
||||
$item["file_id"] = "null";
|
||||
} elseif (is_null($item["stream_id"])) {
|
||||
$item["stream_id"] = "null";
|
||||
}
|
||||
|
||||
$values[] = "(".
|
||||
"'{$nextStartDT->format("Y-m-d H:i:s")}', ".
|
||||
"'{$endTimeDT->format("Y-m-d H:i:s")}', ".
|
||||
"'{$item["clip_length"]}', ".
|
||||
"'{$item["fade_in"]}', ".
|
||||
"'{$item["fade_out"]}', ".
|
||||
"'{$item["cue_in"]}', ".
|
||||
"'{$item["cue_out"]}', ".
|
||||
"{$item["file_id"]}, ".
|
||||
"{$item["stream_id"]}, ".
|
||||
"{$id}, ".
|
||||
"{$item["position"]})";
|
||||
|
||||
$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
|
||||
|
||||
$insert_sql = "INSERT INTO cc_schedule (starts, ends, ".
|
||||
"clip_length, fade_in, fade_out, cue_in, cue_out, ".
|
||||
"file_id, stream_id, instance_id, position) VALUES ".
|
||||
implode($values, ",");
|
||||
|
||||
Application_Common_Database::prepareAndExecute(
|
||||
$insert_sql, array(), Application_Common_Database::EXECUTE);
|
||||
|
||||
$createIndex_sql = "CREATE INDEX cc_schedule_instance_id_idx ".
|
||||
"ON cc_schedule USING btree(instance_id)";
|
||||
Application_Common_Database::prepareAndExecute(
|
||||
$createIndex_sql, array(), Application_Common_Database::EXECUTE);
|
||||
|
||||
//update time_filled in cc_show_instances
|
||||
$now = gmdate("Y-m-d H:i:s");
|
||||
$update_sql = "UPDATE cc_show_instances SET ".
|
||||
"time_filled = '{$timeFilled}', ".
|
||||
"last_scheduled = '{$now}' ".
|
||||
"WHERE show_id = {$ccShow->getDbId()}";
|
||||
Application_Common_Database::prepareAndExecute(
|
||||
$update_sql, array(), Application_Common_Database::EXECUTE);
|
||||
|
||||
} //if at least one linked instance has content
|
||||
}
|
||||
|
||||
|
@ -259,20 +300,24 @@ class Application_Service_SchedulerService
|
|||
}
|
||||
}
|
||||
|
||||
private static function replaceInstanceContentCheck($ccShowInstance, $showStamp)
|
||||
private static function replaceInstanceContentCheck($currentShowStamp, $showStamp)
|
||||
{
|
||||
$currentShowStamp = CcScheduleQuery::create()
|
||||
/*$currentShowStamp = CcScheduleQuery::create()
|
||||
->filterByDbInstanceId($ccShowInstance->getDbId())
|
||||
->orderByDbStarts()
|
||||
->find();
|
||||
->find();*/
|
||||
|
||||
$counter = 0;
|
||||
foreach ($showStamp as $item) {
|
||||
if ($item->getDbFileId() != $currentShowStamp[$counter]->getDbFileId() ||
|
||||
$item->getDbStreamId() != $currentShowStamp[$counter]->getDbStreamId()) {
|
||||
CcScheduleQuery::create()
|
||||
if ($item["file_id"] != $currentShowStamp[$counter]["file_id"] ||
|
||||
$item["stream_id"] != $currentShowStamp[$counter]["stream_id"]) {
|
||||
/*CcScheduleQuery::create()
|
||||
->filterByDbInstanceId($ccShowInstance->getDbId())
|
||||
->delete();
|
||||
->delete();*/
|
||||
$delete_sql = "DELETE FROM cc_schedule ".
|
||||
"WHERE instance_id = {$currentShowStamp[$counter]["instance_id"]}";
|
||||
Application_Common_Database::prepareAndExecute(
|
||||
$delete_sql, array(), Application_Common_Database::EXECUTE);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
Binary file not shown.
|
@ -2,16 +2,15 @@
|
|||
# Copyright (C) 2012 Sourcefabric
|
||||
# This file is distributed under the same license as the Airtime package.
|
||||
# Sourcefabric <contact@sourcefabric.org>, 2012.
|
||||
#
|
||||
#msgid ""
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Airtime 2.4\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-05-21 09:20-0400\n"
|
||||
"PO-Revision-Date: 2013-05-22 10:45+0100\n"
|
||||
"Last-Translator: Daniel James <daniel.james@sourcefabric.org>\n"
|
||||
"PO-Revision-Date: 2013-05-24 10:26-0500\n"
|
||||
"Last-Translator: Denise Rigato <denise.rigato@sourcefabric.org>\n"
|
||||
"Language-Team: German Localization <contact@sourcefabric.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
@ -67,7 +66,6 @@ msgstr "Bearbeiten"
|
|||
msgid "Edit Show"
|
||||
msgstr "Sendung bearbeiten"
|
||||
|
||||
# Translated without GUI review!
|
||||
#: airtime_mvc/application/services/CalendarService.php:133
|
||||
msgid "Edit This Instance"
|
||||
msgstr "Diese Instanz Bearbeiten"
|
||||
|
@ -258,7 +256,6 @@ msgstr "Cue Out"
|
|||
msgid "Set Cue Out"
|
||||
msgstr "Set Cue Out"
|
||||
|
||||
# Translated without GUI review!
|
||||
#: airtime_mvc/application/layouts/scripts/layout.phtml:70
|
||||
msgid "Cursor"
|
||||
msgstr "Cursor"
|
||||
|
@ -266,12 +263,12 @@ msgstr "Cursor"
|
|||
#: airtime_mvc/application/layouts/scripts/layout.phtml:71
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:281
|
||||
msgid "Fade In"
|
||||
msgstr "Einblenden"
|
||||
msgstr "Fade In"
|
||||
|
||||
#: airtime_mvc/application/layouts/scripts/layout.phtml:72
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:282
|
||||
msgid "Fade Out"
|
||||
msgstr "Ausblenden"
|
||||
msgstr "Fade Out"
|
||||
|
||||
#: airtime_mvc/application/layouts/scripts/login.phtml:16
|
||||
#, php-format
|
||||
|
@ -444,7 +441,6 @@ msgstr ""
|
|||
msgid "Airtime Password Reset"
|
||||
msgstr "Airtime Passwort zurücksetzen"
|
||||
|
||||
# Translated without GUI review!
|
||||
#: airtime_mvc/application/models/Scheduler.php:72
|
||||
msgid "Cannot move items out of linked shows"
|
||||
msgstr "Kann Inhalte aus verknüpften Sendungen nicht verschieben"
|
||||
|
@ -482,7 +478,6 @@ msgstr "Die Sendung %s ist vorbei und kann nicht verändert werden."
|
|||
msgid "The show %s has been previously updated!"
|
||||
msgstr "Die Sendung %s wurde bereits vorher aktualisiert!"
|
||||
|
||||
# Translated without GUI review!
|
||||
#: airtime_mvc/application/models/Scheduler.php:174
|
||||
msgid "Content in linked shows must be scheduled before or after any one is broadcasted"
|
||||
msgstr "Inhalte in verknüpften Sendungen können nicht während der Sendung geändert werden"
|
||||
|
@ -500,7 +495,7 @@ msgstr "Wiederholung der Sendung %s von %s"
|
|||
#: airtime_mvc/application/models/Block.php:1323
|
||||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:48
|
||||
msgid "Select criteria"
|
||||
msgstr "Wählen Sie Kriterien"
|
||||
msgstr " - Kriterien - "
|
||||
|
||||
#: airtime_mvc/application/models/Block.php:1324
|
||||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:49
|
||||
|
@ -641,7 +636,7 @@ msgstr "Titel"
|
|||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:72
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:87
|
||||
msgid "Track Number"
|
||||
msgstr "Trackingnummer:"
|
||||
msgstr "Titelnummer"
|
||||
|
||||
#: airtime_mvc/application/models/Block.php:1348
|
||||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:73
|
||||
|
@ -763,13 +758,13 @@ msgstr "Support Feedback senden"
|
|||
#: airtime_mvc/application/forms/RegisterAirtime.php:126
|
||||
#: airtime_mvc/application/forms/SupportSettings.php:122
|
||||
msgid "Promote my station on Sourcefabric.org"
|
||||
msgstr "Promote meinen Sender auf Sourcefabric.org"
|
||||
msgstr "Sender auf Sourcefabric.org veröffentlichen"
|
||||
|
||||
#: airtime_mvc/application/forms/RegisterAirtime.php:149
|
||||
#: airtime_mvc/application/forms/SupportSettings.php:148
|
||||
#, php-format
|
||||
msgid "By checking this box, I agree to Sourcefabric's %sprivacy policy%s."
|
||||
msgstr "Durch Aktivieren dieser Checkbox stimme ich den %sDatenschutzrichtlinien%s von Sourcefabric zu."
|
||||
msgstr "Ich stimme den %sDatenschutzrichtlinien%s von Sourcefabric zu."
|
||||
|
||||
#: airtime_mvc/application/forms/RegisterAirtime.php:166
|
||||
#: airtime_mvc/application/forms/SupportSettings.php:171
|
||||
|
@ -791,7 +786,7 @@ msgstr "Ein neues Passwort bekommen"
|
|||
#: airtime_mvc/application/forms/DateRange.php:16
|
||||
#: airtime_mvc/application/forms/ShowBuilder.php:18
|
||||
msgid "Date Start:"
|
||||
msgstr "Datum Anfang:"
|
||||
msgstr "Datum Beginn:"
|
||||
|
||||
#: airtime_mvc/application/forms/DateRange.php:35
|
||||
#: airtime_mvc/application/forms/DateRange.php:63
|
||||
|
@ -948,7 +943,7 @@ msgstr "Port %s ist nicht verfügbar"
|
|||
|
||||
#: airtime_mvc/application/forms/WatchedDirPreferences.php:14
|
||||
msgid "Import Folder:"
|
||||
msgstr "Import Folder:"
|
||||
msgstr "Import Ordner:"
|
||||
|
||||
#: airtime_mvc/application/forms/WatchedDirPreferences.php:25
|
||||
msgid "Watched Folders:"
|
||||
|
@ -973,7 +968,7 @@ msgstr "Passwort:"
|
|||
#: airtime_mvc/application/forms/AddUser.php:40
|
||||
#: airtime_mvc/application/forms/EditUser.php:50
|
||||
msgid "Verify Password:"
|
||||
msgstr "Passwort bestätigen"
|
||||
msgstr "Passwort bestätigen:"
|
||||
|
||||
#: airtime_mvc/application/forms/AddUser.php:48
|
||||
#: airtime_mvc/application/forms/EditUser.php:59
|
||||
|
@ -1050,7 +1045,7 @@ msgstr "Aktiviert:"
|
|||
|
||||
#: airtime_mvc/application/forms/StreamSettingSubForm.php:57
|
||||
msgid "Stream Type:"
|
||||
msgstr "Art des Streams:"
|
||||
msgstr "Stream Art:"
|
||||
|
||||
#: airtime_mvc/application/forms/StreamSettingSubForm.php:67
|
||||
#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:15
|
||||
|
@ -1186,17 +1181,14 @@ msgstr "Fr."
|
|||
msgid "Sat"
|
||||
msgstr "Sa."
|
||||
|
||||
# Translated without GUI review!
|
||||
#: airtime_mvc/application/forms/AddShowRepeats.php:45
|
||||
msgid "Repeat By:"
|
||||
msgstr "Wiederholung von:"
|
||||
|
||||
# Translated without GUI review!
|
||||
#: airtime_mvc/application/forms/AddShowRepeats.php:48
|
||||
msgid "day of the month"
|
||||
msgstr "Tag des Monats"
|
||||
|
||||
# Translated without GUI review!
|
||||
#: airtime_mvc/application/forms/AddShowRepeats.php:48
|
||||
msgid "day of the week"
|
||||
msgstr "Tag der Woche"
|
||||
|
@ -1305,7 +1297,7 @@ msgstr "'%value%' passt nicht in das Zeit-Format 'HH:mm'"
|
|||
|
||||
#: airtime_mvc/application/forms/AddShowWhen.php:22
|
||||
msgid "Date/Time Start:"
|
||||
msgstr "Datum/Zeit Anfang:"
|
||||
msgstr "Datum/Zeit Beginn:"
|
||||
|
||||
#: airtime_mvc/application/forms/AddShowWhen.php:49
|
||||
msgid "Date/Time End:"
|
||||
|
@ -1359,7 +1351,7 @@ msgstr "Album:"
|
|||
#: airtime_mvc/application/forms/EditAudioMD.php:40
|
||||
#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:12
|
||||
msgid "Track:"
|
||||
msgstr "Track:"
|
||||
msgstr "Titel:"
|
||||
|
||||
#: airtime_mvc/application/forms/EditAudioMD.php:54
|
||||
#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:18
|
||||
|
@ -1398,7 +1390,7 @@ msgstr "Copyright:"
|
|||
|
||||
#: airtime_mvc/application/forms/EditAudioMD.php:111
|
||||
msgid "ISRC Number:"
|
||||
msgstr "ISRC-Nummer:"
|
||||
msgstr "ISRC-Nr.:"
|
||||
|
||||
#: airtime_mvc/application/forms/EditAudioMD.php:118
|
||||
#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:25
|
||||
|
@ -1428,7 +1420,7 @@ msgstr "Geben Sie die Zeichen aus dem Bild unten ein."
|
|||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:376
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:141
|
||||
msgid "Select modifier"
|
||||
msgstr "Modifier auswählen"
|
||||
msgstr " - Attribut - "
|
||||
|
||||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:88
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:142
|
||||
|
@ -1487,11 +1479,11 @@ msgstr "Minuten"
|
|||
|
||||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:120
|
||||
msgid "items"
|
||||
msgstr "Elemente"
|
||||
msgstr "Titel"
|
||||
|
||||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:142
|
||||
msgid "Set smart block type:"
|
||||
msgstr "Stelle Smart Block-Typ ein:"
|
||||
msgstr "Smart Block Art:"
|
||||
|
||||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:145
|
||||
msgid "Static"
|
||||
|
@ -1503,7 +1495,7 @@ msgstr "Dynamisch"
|
|||
|
||||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:257
|
||||
msgid "Allow Repeat Tracks:"
|
||||
msgstr "Erlaube Tracks wiederholen:"
|
||||
msgstr "Titel wiederholen:"
|
||||
|
||||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:274
|
||||
msgid "Limit to"
|
||||
|
@ -1519,12 +1511,12 @@ msgstr "Generiere"
|
|||
|
||||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:304
|
||||
msgid "Shuffle playlist content"
|
||||
msgstr "Shuffle Inhalte der Playlist"
|
||||
msgstr "Inhalte der Playlist Mischen"
|
||||
|
||||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:306
|
||||
#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24
|
||||
msgid "Shuffle"
|
||||
msgstr "Shuffle"
|
||||
msgstr "Mischen"
|
||||
|
||||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:472
|
||||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:484
|
||||
|
@ -1553,8 +1545,8 @@ msgstr "'Länge' sollte im 00:00:00-Format sein"
|
|||
|
||||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:513
|
||||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:526
|
||||
msgid "The value should be in timestamp format (e.g. 0000-00-00 or 0000-00-00 00:00:00)"
|
||||
msgstr "Der Wert sollte in Zeitstempel-Format vorliegen (z.B. 0000-00-00 oder 0000-00-00 00:00:00)"
|
||||
msgid "The value should be in timestamp format(eg. 0000-00-00 or 00-00-00 00:00:00)"
|
||||
msgstr "Der Wert sollte in Zeitstempel-Format vorliegen (z.B. 0000-00-00 oder 00-00-00 00:00:00)"
|
||||
|
||||
#: airtime_mvc/application/forms/SmartBlockCriteria.php:540
|
||||
msgid "The value has to be numeric"
|
||||
|
@ -1587,11 +1579,11 @@ msgstr "Zeitzone:"
|
|||
|
||||
#: airtime_mvc/application/forms/AddShowLiveStream.php:10
|
||||
msgid "Use Airtime Authentication:"
|
||||
msgstr "Verwende Airtime-Authentifizierung:"
|
||||
msgstr "Verwende Airtime-Login:"
|
||||
|
||||
#: airtime_mvc/application/forms/AddShowLiveStream.php:16
|
||||
msgid "Use Custom Authentication:"
|
||||
msgstr "Benutzerdefinierte Authentifizierung:"
|
||||
msgstr "Benutzerdefiniertes Login:"
|
||||
|
||||
#: airtime_mvc/application/forms/AddShowLiveStream.php:26
|
||||
msgid "Custom Username"
|
||||
|
@ -1609,7 +1601,6 @@ msgstr "Das Feld Benutzername darf nicht leer sein."
|
|||
msgid "Password field cannot be empty."
|
||||
msgstr "Das Feld Passwort darf nicht leer sein."
|
||||
|
||||
# Translated without GUI review!
|
||||
#: airtime_mvc/application/forms/GeneralPreferences.php:33
|
||||
msgid "Default Crossfade Duration (s):"
|
||||
msgstr "Standard Crossfade Dauer (s):"
|
||||
|
@ -1620,12 +1611,10 @@ msgstr "Standard Crossfade Dauer (s):"
|
|||
msgid "enter a time in seconds 0{.0}"
|
||||
msgstr "Geben Sie eine Zeit in Sekunden 0 {0,0} ein"
|
||||
|
||||
# Translated without GUI review!
|
||||
#: airtime_mvc/application/forms/GeneralPreferences.php:52
|
||||
msgid "Default Fade In (s):"
|
||||
msgstr "Standard Fade In (s):"
|
||||
|
||||
# Translated without GUI review!
|
||||
#: airtime_mvc/application/forms/GeneralPreferences.php:71
|
||||
msgid "Default Fade Out (s):"
|
||||
msgstr "Standard Fade Out (s):"
|
||||
|
@ -1645,11 +1634,11 @@ msgstr "Aktiviert"
|
|||
|
||||
#: airtime_mvc/application/forms/GeneralPreferences.php:97
|
||||
msgid "Default Interface Language"
|
||||
msgstr "Standard Interface Sprache"
|
||||
msgstr "Standard Sprache"
|
||||
|
||||
#: airtime_mvc/application/forms/GeneralPreferences.php:105
|
||||
msgid "Default Interface Timezone"
|
||||
msgstr "Standard Interface Zeitzone"
|
||||
msgstr "Standard Zeitzone"
|
||||
|
||||
#: airtime_mvc/application/forms/GeneralPreferences.php:113
|
||||
msgid "Week Starts On"
|
||||
|
@ -1700,7 +1689,7 @@ msgstr "SoundCloud Uploads ermöglichen"
|
|||
|
||||
#: airtime_mvc/application/forms/SoundcloudPreferences.php:36
|
||||
msgid "Automatically Mark Files \"Downloadable\" on SoundCloud"
|
||||
msgstr "Dateien auf SoundCloud als \"Downloadable\" automatisch markieren"
|
||||
msgstr "Dateien auf SoundCloud als \"Downloadbar\" markieren"
|
||||
|
||||
#: airtime_mvc/application/forms/SoundcloudPreferences.php:47
|
||||
msgid "SoundCloud Email"
|
||||
|
@ -1943,12 +1932,12 @@ msgstr "%s Artikel hinzufügen"
|
|||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:49
|
||||
msgid "You can only add tracks to smart blocks."
|
||||
msgstr "Sie können zu Smart Blocks nur Tracks hinzufügen."
|
||||
msgstr "Sie können zu Smart Blocks nur Titel hinzufügen."
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:50
|
||||
#: airtime_mvc/application/controllers/PlaylistController.php:163
|
||||
msgid "You can only add tracks, smart blocks, and webstreams to playlists."
|
||||
msgstr "Sie können zu Playlisten nur Tracks, Smart Blocks und Webstreams hinzufügen."
|
||||
msgstr "Sie können zu Playlisten nur Titel, Smart Blocks und Webstreams hinzufügen."
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:53
|
||||
msgid "Please select a cursor position on timeline."
|
||||
|
@ -1961,7 +1950,7 @@ msgstr "Metadaten bearbeiten"
|
|||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:58
|
||||
msgid "Add to selected show"
|
||||
msgstr "Zu ausgewählten Sendungen hinzufügen"
|
||||
msgstr "Zur ausgewählten Sendungen hinzufügen"
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:59
|
||||
msgid "Select"
|
||||
|
@ -1983,14 +1972,13 @@ msgstr "Auswahl für alle aufheben"
|
|||
msgid "Are you sure you want to delete the selected item(s)?"
|
||||
msgstr "Sind Sie sicher, dass Sie die ausgewählten Punkte löschen möchten?"
|
||||
|
||||
# Translated without GUI review!
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:64
|
||||
msgid "Scheduled"
|
||||
msgstr "Geplant"
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:65
|
||||
msgid "Playlist / Block"
|
||||
msgstr ""
|
||||
msgstr "Playlist"
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:69
|
||||
msgid "Bit Rate"
|
||||
|
@ -2081,7 +2069,7 @@ msgstr "Sie laden momentan Dateien hoch. %s bei Wechsel zu einem anderen Bildsch
|
|||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:113
|
||||
msgid "Open Media Builder"
|
||||
msgstr ""
|
||||
msgstr "Medienordner"
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:114
|
||||
msgid "please put in a time '00:00:00 (.0)'"
|
||||
|
@ -2109,7 +2097,7 @@ msgstr "Playlist gespeichert"
|
|||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:120
|
||||
msgid "Playlist shuffled"
|
||||
msgstr "Playliste geshuffelt"
|
||||
msgstr "Playliste gemischt"
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:122
|
||||
msgid "Airtime is unsure about the status of this file. This can happen when the file is on a remote drive that is unaccessible or the file is in a directory that isn't 'watched' anymore."
|
||||
|
@ -2151,7 +2139,7 @@ msgstr "Die gewünschte Blocklänge wird nicht erreicht, wenn Airtime nicht genu
|
|||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:137
|
||||
msgid "Smart block shuffled"
|
||||
msgstr "Smart Block geshuffelt"
|
||||
msgstr "Smart Block gemischt"
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:138
|
||||
msgid "Smart block generated and criteria saved"
|
||||
|
@ -2208,11 +2196,10 @@ msgstr "Sind Sie sicher, dass Sie den beobachteten Ordner entfernen wollen?"
|
|||
msgid "This path is currently not accessible."
|
||||
msgstr "Zu diesem Pfad besteht momentan kein Zugang."
|
||||
|
||||
# Translated without GUI review!
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:170
|
||||
#, php-format
|
||||
msgid "Some stream types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided."
|
||||
msgstr "Einige Stream Formate erfordern weitre Einstellungen. Einzelheiten über das Aktivieren von %sAAC+ Unterstüzung%s oder %sOpus Unterstüzung%s werden bereitgestellt."
|
||||
msgid "Some steam types require extra configuration. Details about enabling %sAAC+ Support%s or %sOpus Support%s are provided."
|
||||
msgstr "Einige Stream Formate erfordern weitre Einstellungen. Einzelheiten über das Aktivieren der %sAAC+ Unterstüzung%s oder %sOpus Unterstüzung%s werden in der WIKI bereitgestellt."
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:171
|
||||
msgid "Connected to the streaming server"
|
||||
|
@ -2228,7 +2215,7 @@ msgstr "Es kann nicht mit dem Streaming Server verbunden werden"
|
|||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:176
|
||||
msgid "If Airtime is behind a router or firewall, you may need to configure port forwarding and this field information will be incorrect. In this case you will need to manually update this field so it shows the correct host/port/mount that your DJ's need to connect to. The allowed range is between 1024 and 49151."
|
||||
msgstr "Wenn Airtime hinter einem Router oder einer Firewall liegt, müssen Sie vielleicht das Port-Forwarding konfigurieren und dann wird die Informationen dieses Feldes falsch sein. In diesem Fall müssen Sie das Feld manuell aktualisieren, damit es den richtigen Host/Port/Mount anzeigt, mit dem Ihre DJs sich verbinden müssen. Der zulässige Bereich liegt zwischen 1024 und 49151."
|
||||
msgstr "Wenn Sie Airtime hinter einem Router oder einer Firewall betreiben, müssen Sie gegebenen Falls das 'Port-Forwarding' Einrichten. In diesem Fall müssen Sie die URL manuell eintragen, damit Ihren DJs der richtige Host/Port/Mount zur verbindung anzeigt wird. Der zulässige Bereich liegt zwischen 1024 und 49151."
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:177
|
||||
#, php-format
|
||||
|
@ -2241,20 +2228,20 @@ msgstr "Aktivieren Sie diese Option, um Metadaten für OGG-Streams (Stream-Metad
|
|||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:180
|
||||
msgid "Check this box to automatically switch off Master/Show source upon source disconnection."
|
||||
msgstr "Markieren Sie dieses Kästchen, um automatisch die Master/Sendung-Abschaltung der einen Source durch eine andere Source auszuschalten."
|
||||
msgstr "Aktivieren Sie dieses Kästchen, um automatisch bei Verbindungstrennung die Streameingabe umzuschalten."
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:181
|
||||
msgid "Check this box to automatically switch on Master/Show source upon source connection."
|
||||
msgstr "Markieren Sie dieses Kästchen, um automatisch zur Master/Sendung-Verbindung einer Source durch die andere Source zu wechseln."
|
||||
msgstr "Aktivieren Sie dieses Kästchen, um automatisch bei Verbindung einer Streameingabe umzuschalten."
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:182
|
||||
msgid "If your Icecast server expects a username of 'source', this field can be left blank."
|
||||
msgstr "Wenn Ihr Icecast Server einen Benutzernamen von 'source' erwartet, kann dieses Feld leer bleiben."
|
||||
msgstr "Wenn Ihr Icecast Server den Benutzernamen 'source' erwartet, kann dieses Feld leer bleiben."
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:183
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:193
|
||||
msgid "If your live streaming client does not ask for a username, this field should be 'source'."
|
||||
msgstr "Wenn Ihr Live-Streaming-Client nicht nach einem Benutzernamen fragt, sollte dieses Feld 'Source' sein."
|
||||
msgstr "Wenn Ihr Live-Streaming-Client nicht nach einem Benutzernamen fragt, sollten Sie hier 'source' eintragen."
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:185
|
||||
msgid "If you change the username or password values for an enabled stream the playout engine will be rebooted and your listeners will hear silence for 5-10 seconds. Changing the following fields will NOT cause a reboot: Stream Label (Global Settings), and Switch Transition Fade(s), Master Username, and Master Password (Input Stream Settings). If Airtime is recording, and if the change causes a playout engine restart, the recording will be interrupted."
|
||||
|
@ -2262,7 +2249,7 @@ msgstr "Wenn Sie den Benutzernamen oder das Passwort für einen aktivierten Stre
|
|||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:186
|
||||
msgid "This is the admin username and password for Icecast/SHOUTcast to get listener statistics."
|
||||
msgstr "Das sind Admin Nutzername und Password für Icecast/SHOUTcast um Hörerstatistiken zu erhalten."
|
||||
msgstr "[OPTIONAL] für Icecast/SHOUTcast - Wird benötigt um die Hörerstatistiken zu erhalten."
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:190
|
||||
msgid "No result found"
|
||||
|
@ -2274,7 +2261,7 @@ msgstr "Dies folgt den gleichen Sicherheitsmustern für die Sendung: nur der Sen
|
|||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:192
|
||||
msgid "Specify custom authentication which will work only for this show."
|
||||
msgstr "Spezifizieren Sie benutzerdefinierte Authentifizierung, die nur für diese Sendung funktionieren wird."
|
||||
msgstr "Hier können Sie eine benutzerdefinierte Anmeldung eintragen, welche nur für diese Sendung gilt."
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:194
|
||||
msgid "The show instance doesn't exist anymore!"
|
||||
|
@ -2282,7 +2269,7 @@ msgstr "Diese Instanz der Sendung existiert nicht mehr!"
|
|||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:195
|
||||
msgid "Warning: Shows cannot be re-linked"
|
||||
msgstr ""
|
||||
msgstr "Warnung: Sendungen können nicht neu verknüpft werden"
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:199
|
||||
msgid "Show"
|
||||
|
@ -2322,7 +2309,7 @@ msgstr "Daten vom Server wiederherstellen..."
|
|||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:214
|
||||
msgid "This show has no scheduled content."
|
||||
msgstr "Für diese Sendung sind keine Inhalte geplant."
|
||||
msgstr "Für diese Sendung sind noch keine Inhalte geplant."
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:215
|
||||
msgid "This show is not completely filled with content."
|
||||
|
@ -2452,7 +2439,7 @@ msgstr "Aufnahme der aktuellen Sendung stoppen?"
|
|||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:264
|
||||
msgid "Ok"
|
||||
msgstr "Ok"
|
||||
msgstr "Speichern"
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:265
|
||||
msgid "Contents of Show"
|
||||
|
@ -2469,7 +2456,7 @@ msgstr "Ausgewählte(s) Objekt(e) löschen?"
|
|||
#: airtime_mvc/application/controllers/LocaleController.php:271
|
||||
#: airtime_mvc/application/views/scripts/schedule/show-content-dialog.phtml:5
|
||||
msgid "Start"
|
||||
msgstr "Anfang"
|
||||
msgstr "Beginn"
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:272
|
||||
msgid "End"
|
||||
|
@ -2489,7 +2476,7 @@ msgstr "Aufnehmen über Line In"
|
|||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:285
|
||||
msgid "Track preview"
|
||||
msgstr "Track Vorschau"
|
||||
msgstr "Titel Vorschau"
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:289
|
||||
msgid "Cannot schedule outside a show."
|
||||
|
@ -2512,10 +2499,9 @@ msgstr "Fade Editor"
|
|||
msgid "Cue Editor"
|
||||
msgstr "Cue Editor"
|
||||
|
||||
# Translated without GUI review!
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:296
|
||||
msgid "Waveform features are available in a browser supporting the Web Audio API"
|
||||
msgstr "Waveform-Funktionen sind mit einem 'Web Audio API ' fähigen Browser verfügbar"
|
||||
msgstr "Wellenform-Ansicht ist nur mit einem 'Web Audio API' fähigen Browser verfügbar"
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:299
|
||||
msgid "Select all"
|
||||
|
@ -2547,7 +2533,7 @@ msgstr "Bibliothek öffnen, um Inhalt hinzuzufügen oder zu entfernen"
|
|||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:312
|
||||
msgid "in use"
|
||||
msgstr "In Gebrauch"
|
||||
msgstr "In Verwendung"
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:313
|
||||
msgid "Disk"
|
||||
|
@ -2639,11 +2625,11 @@ msgstr "Hörerstatistiken sehen"
|
|||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:344
|
||||
msgid "Show / hide columns"
|
||||
msgstr "Spalten anzeigen/ausblenden"
|
||||
msgstr "Spalten auswählen"
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:346
|
||||
msgid "From {from} to {to}"
|
||||
msgstr "Von {from} bis {zu}"
|
||||
msgstr "Von {from} bis {to}"
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:347
|
||||
msgid "kbps"
|
||||
|
@ -2743,7 +2729,7 @@ msgstr "N/A"
|
|||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:378
|
||||
msgid "Drag files here."
|
||||
msgstr "Dateien hierhin ziehen"
|
||||
msgstr "Dateien in dieses Feld ziehen.(Drag & Drop)"
|
||||
|
||||
#: airtime_mvc/application/controllers/LocaleController.php:379
|
||||
msgid "File extension error."
|
||||
|
@ -2912,7 +2898,7 @@ msgstr "Sie sehen eine ältere Version von %s"
|
|||
|
||||
#: airtime_mvc/application/controllers/PlaylistController.php:123
|
||||
msgid "You cannot add tracks to dynamic blocks."
|
||||
msgstr "Sie können zu dynamischen Blocks keine Tracks hinzufügen."
|
||||
msgstr "Sie können zu dynamischen Blocks keine Titel hinzufügen."
|
||||
|
||||
#: airtime_mvc/application/controllers/PlaylistController.php:144
|
||||
#, php-format
|
||||
|
@ -2921,7 +2907,7 @@ msgstr "Sie haben keine Berechtigung, ausgewählte %s (s) zu löschen."
|
|||
|
||||
#: airtime_mvc/application/controllers/PlaylistController.php:157
|
||||
msgid "You can only add tracks to smart block."
|
||||
msgstr "Sie können zu Smart Block nur Tracks hinzufügen."
|
||||
msgstr "Sie können zu Smart Block nur Titel hinzufügen."
|
||||
|
||||
#: airtime_mvc/application/controllers/PlaylistController.php:175
|
||||
msgid "Untitled Playlist"
|
||||
|
@ -2991,7 +2977,7 @@ msgstr "Anhören"
|
|||
|
||||
#: airtime_mvc/application/views/scripts/partialviews/header.phtml:59
|
||||
msgid "Station time"
|
||||
msgstr "Station Zeit"
|
||||
msgstr "Sender Zeit"
|
||||
|
||||
#: airtime_mvc/application/views/scripts/partialviews/trialBox.phtml:3
|
||||
msgid "Your trial expires in"
|
||||
|
@ -3071,7 +3057,7 @@ msgstr "Beginnen Sie, indem Sie Ihre Dateien mit dem 'Add Media' Menü-Button in
|
|||
|
||||
#: airtime_mvc/application/views/scripts/dashboard/help.phtml:8
|
||||
msgid "Create a show by going to 'Calendar' in the menu bar, and then clicking the '+ Show' icon. This can be either a one-time or repeating show. Only admins and program managers can add shows."
|
||||
msgstr "Erstellen Sie eine Sendung, indem Sie in der Menüleiste auf 'Kalender' und dann auf das '+ Sendungen'-Symbol klicken. Dies kann entweder eine einmalige oder eine sich wiederholende Sendung. Nur Administratoren und Programm-Manager können Sendungen hinzufügen."
|
||||
msgstr "Erstellen Sie eine Sendung, indem Sie in der Menüleiste auf 'Kalender' und dann auf das '+ Sendungen'-Symbol klicken. Dies kann entweder eine einmalige oder eine sich wiederholende Sendung. (Nur Administratoren und Programm-Manager können Sendungen hinzufügen)"
|
||||
|
||||
#: airtime_mvc/application/views/scripts/dashboard/help.phtml:9
|
||||
msgid "Add media to the show by going to your show in the Schedule calendar, left-clicking on it and selecting 'Add / Remove Content'"
|
||||
|
@ -3106,7 +3092,6 @@ msgstr "Smart Block leeren"
|
|||
msgid "Empty playlist"
|
||||
msgstr "Wiedergabeliste leeren"
|
||||
|
||||
# Translated without GUI review!
|
||||
#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:3
|
||||
#: airtime_mvc/application/views/scripts/playlist/set-cue.phtml:3
|
||||
msgid "Show Waveform"
|
||||
|
@ -3116,7 +3101,7 @@ msgstr "zeige Wellenform"
|
|||
#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:70
|
||||
#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:75
|
||||
msgid "Fade out: "
|
||||
msgstr "Ausblenden: "
|
||||
msgstr "Fade out: "
|
||||
|
||||
#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:6
|
||||
#: airtime_mvc/application/views/scripts/playlist/set-fade.phtml:19
|
||||
|
@ -3129,7 +3114,7 @@ msgstr "(ss.t)"
|
|||
#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:67
|
||||
#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:72
|
||||
msgid "Fade in: "
|
||||
msgstr "Einblenden: "
|
||||
msgstr "Fade in: "
|
||||
|
||||
#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:11
|
||||
#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:11
|
||||
|
@ -3155,7 +3140,6 @@ msgstr "Neuer Smart Block"
|
|||
msgid "New Webstream"
|
||||
msgstr "Neuer Webstream"
|
||||
|
||||
# Translated without GUI review!
|
||||
#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:21
|
||||
msgid "Empty playlist content"
|
||||
msgstr "Leerer Playlist Inhalt"
|
||||
|
@ -3167,7 +3151,7 @@ msgstr "löschen"
|
|||
|
||||
#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:24
|
||||
msgid "Shuffle playlist"
|
||||
msgstr "Playlist shufflen"
|
||||
msgstr "Playlist mischen"
|
||||
|
||||
#: airtime_mvc/application/views/scripts/playlist/playlist.phtml:27
|
||||
msgid "Save playlist"
|
||||
|
@ -3188,7 +3172,6 @@ msgstr "Beschreibung anzeigen/bearbeiten"
|
|||
msgid "No open playlist"
|
||||
msgstr "Keine offene Wiedergabeliste"
|
||||
|
||||
# Translated without GUI review!
|
||||
#: airtime_mvc/application/views/scripts/playlist/smart-block.phtml:21
|
||||
msgid "Empty smart block content"
|
||||
msgstr "Leerer Smart Block Inhalt"
|
||||
|
@ -3217,12 +3200,12 @@ msgstr "Originallänge:"
|
|||
#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6
|
||||
#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40
|
||||
msgid "Add this show"
|
||||
msgstr "Diese Sendung hinzufügen"
|
||||
msgstr "Sendung hinzufügen"
|
||||
|
||||
#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:6
|
||||
#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:40
|
||||
msgid "Update show"
|
||||
msgstr "Diese Sendung aktualisieren"
|
||||
msgstr "Sendung aktualisieren"
|
||||
|
||||
#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:10
|
||||
msgid "What"
|
||||
|
@ -3246,7 +3229,7 @@ msgstr "Wer"
|
|||
|
||||
#: airtime_mvc/application/views/scripts/schedule/add-show-form.phtml:33
|
||||
msgid "Style"
|
||||
msgstr "Stil"
|
||||
msgstr "Farbe"
|
||||
|
||||
#: airtime_mvc/application/views/scripts/login/password-restore-after.phtml:3
|
||||
msgid "Email sent"
|
||||
|
@ -3279,7 +3262,7 @@ msgstr "Neues Passwort"
|
|||
|
||||
#: airtime_mvc/application/views/scripts/login/password-change.phtml:6
|
||||
msgid "Please enter and confirm your new password in the fields below."
|
||||
msgstr "Bitte geben Sie Ihr neues Passwort ein und bestätigen es in die folgenden Feldern."
|
||||
msgstr "Bitte geben Sie Ihr neues Passwort ein und bestätigen es im folgenden Feld."
|
||||
|
||||
#: airtime_mvc/application/views/scripts/systemstatus/index.phtml:4
|
||||
msgid "Service"
|
||||
|
@ -3398,7 +3381,7 @@ msgstr "Stream URL: "
|
|||
#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:9
|
||||
#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:27
|
||||
msgid "Choose folder"
|
||||
msgstr "Ordner auswählen"
|
||||
msgstr "Ordner wählen"
|
||||
|
||||
#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:10
|
||||
msgid "Set"
|
||||
|
@ -3412,7 +3395,7 @@ msgstr "Aktueller Import Ordner:"
|
|||
#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast-absolute.phtml:40
|
||||
#: airtime_mvc/application/views/scripts/form/add-show-rebroadcast.phtml:41
|
||||
msgid "Add"
|
||||
msgstr "Hinzufügen"
|
||||
msgstr "Hinzufüg."
|
||||
|
||||
#: airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml:43
|
||||
msgid "Rescan watched directory (This is useful if it is network mount and may be out of sync with Airtime)"
|
||||
|
@ -3534,11 +3517,11 @@ msgstr "Helfen Sie uns Airtime zu verbessern, indem Sie Sourcefabric wissen lass
|
|||
#: airtime_mvc/application/views/scripts/form/support-setting.phtml:23
|
||||
#, php-format
|
||||
msgid "Click the box below to promote your station on %sSourcefabric.org%s."
|
||||
msgstr "Klicken Sie auf das unten stehende Feld, damit Ihre Station auf %sSourcefabric.org%s beworben wird."
|
||||
msgstr "Klicken Sie auf das unten stehende Feld, damit Ihr Sender auf %sSourcefabric.org%s veröffentlicht wird."
|
||||
|
||||
#: airtime_mvc/application/views/scripts/form/support-setting.phtml:41
|
||||
msgid "(In order to promote your station, 'Send support feedback' must be enabled)."
|
||||
msgstr "(Um Ihre Station zu bewerben muss 'Senden Support Feedback' aktiviert sein)."
|
||||
msgstr "(Um Ihre Station zu veröffentlichen muss 'Support Feedback Senden' aktiviert sein)."
|
||||
|
||||
#: airtime_mvc/application/views/scripts/form/support-setting.phtml:186
|
||||
msgid "Sourcefabric Privacy Policy"
|
||||
|
@ -3612,7 +3595,7 @@ msgstr "Sample Rate:"
|
|||
|
||||
#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:24
|
||||
msgid "Isrc Number:"
|
||||
msgstr "ISRC-Nummer:"
|
||||
msgstr "ISRC-Nr.:"
|
||||
|
||||
#: airtime_mvc/application/views/scripts/library/get-file-metadata.ajax.phtml:27
|
||||
msgid "File Path:"
|
||||
|
@ -3658,8 +3641,9 @@ msgstr "Wählen Sie eine Option aus."
|
|||
msgid "No Records"
|
||||
msgstr "Keine Datensätze"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Playlist"
|
||||
#~ msgstr "Playlist"
|
||||
#~ msgstr "Playlisten"
|
||||
|
||||
#~ msgid "Default Fade (s):"
|
||||
#~ msgstr "Standard Überblendung(en):"
|
||||
|
|
|
@ -105,6 +105,10 @@ div.sb-timerange input#sb_date_start {
|
|||
margin-left: 30px;
|
||||
}
|
||||
|
||||
div.sb-timerange input.error {
|
||||
background-color: rgba(255,0,0,0.2);
|
||||
}
|
||||
|
||||
.sb-starts,
|
||||
.sb-ends {
|
||||
text-align: center;
|
||||
|
|
|
@ -14,11 +14,36 @@
|
|||
.btn-small {
|
||||
/*line-height: 20px;*/
|
||||
}
|
||||
|
||||
.playlist-time-scale {
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 30px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.playlist-time-scale canvas {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
.playlist-time-scale div {
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.playlist-tracks {
|
||||
margin: 8px 0;
|
||||
position: relative;
|
||||
top: 35px;
|
||||
margin: 2px 0;
|
||||
}
|
||||
.playlist-controls {
|
||||
margin: 0 0 16px 0;
|
||||
margin: 40px 0 16px 0;
|
||||
}
|
||||
|
||||
.channel-wrapper {
|
||||
|
@ -30,6 +55,8 @@
|
|||
margin: 0;
|
||||
padding: 0;
|
||||
background: #6e6e6e;
|
||||
/*border-top: 1px solid #6e6e6e;*/
|
||||
/*border-bottom: 1px solid #6e6e6e;*/
|
||||
}
|
||||
|
||||
.state-select {
|
||||
|
@ -41,6 +68,12 @@
|
|||
overflow-y: hidden;
|
||||
}
|
||||
|
||||
.playlist-tracks > .error {
|
||||
height: 80px;
|
||||
width: 300px;
|
||||
background-color: rgba(255,0,0,0.5);
|
||||
}
|
||||
|
||||
.playlist-fade {
|
||||
position: absolute;
|
||||
background-color: rgba(0,0,0,0.1);
|
||||
|
@ -50,7 +83,7 @@
|
|||
margin: 12px 0 16px 0;
|
||||
}
|
||||
.set-fade {
|
||||
margin: 0 0 0 30px;
|
||||
margin: 40px 0 0 30px;
|
||||
}
|
||||
.set-cue input[type="text"] {
|
||||
vertical-align: middle;
|
||||
|
|
|
@ -22,6 +22,13 @@ var live_dj_on_air = false;
|
|||
var scheduled_play_on_air = false;
|
||||
var scheduled_play_source = false;
|
||||
|
||||
|
||||
//a reference returned by setTimeout. Useful for when we want clearTimeout()
|
||||
var newSongTimeoutId = null;
|
||||
|
||||
//a reference returned by setTimeout. Useful for when we want clearTimeout()
|
||||
var newShowTimeoutId = null;
|
||||
|
||||
//keep track of how many UI refreshes the ON-AIR light has been off for.
|
||||
//For example, the uiUpdateInterval is every 200ms, so if onAirOffIterations
|
||||
//is 25, then that means 5 seconds have gone by.
|
||||
|
@ -34,6 +41,8 @@ var nextSongPrepare = true;
|
|||
var nextShowPrepare = true;
|
||||
|
||||
function secondsTimer(){
|
||||
/* This function constantly calls itself every 'uiUpdateInterval'
|
||||
* micro-seconds and is responsible for updating the UI. */
|
||||
if (localRemoteTimeOffset !== null){
|
||||
var date = new Date();
|
||||
approximateServerTime = date.getTime() - localRemoteTimeOffset;
|
||||
|
@ -79,9 +88,11 @@ function updateProgressBarValue(){
|
|||
var songElapsedTime = 0;
|
||||
songPercentDone = (approximateServerTime - currentSong.songStartPosixTime)/currentSong.songLengthMs*100;
|
||||
songElapsedTime = approximateServerTime - currentSong.songStartPosixTime;
|
||||
if (songPercentDone < 0 || songPercentDone > 100){
|
||||
if (songPercentDone < 0) {
|
||||
songPercentDone = 0;
|
||||
//currentSong = null;
|
||||
} else if (songPercentDone > 100) {
|
||||
songPercentDone = 100;
|
||||
} else {
|
||||
if ((currentSong.media_item_played == true && currentShow.length > 0) || (songElapsedTime < 5000 && currentShow[0].record != 1)) {
|
||||
scheduled_play_line_to_switch.attr("class", "line-to-switch on");
|
||||
|
@ -95,40 +106,13 @@ function updateProgressBarValue(){
|
|||
}
|
||||
$('#progress-show').attr("class", "progress-show");
|
||||
}
|
||||
} else if (nextSong == null) {
|
||||
} else {
|
||||
scheduled_play_source = false;
|
||||
scheduled_play_line_to_switch.attr("class", "line-to-switch off");
|
||||
scheduled_play_div.removeClass("ready");
|
||||
$('#progress-show').attr("class", "progress-show-error");
|
||||
}
|
||||
$('#progress-bar').attr("style", "width:"+songPercentDone+"%");
|
||||
|
||||
//calculate how much time left to next song if there is any
|
||||
if (nextSong !== null && nextSongPrepare){
|
||||
var diff = nextSong.songStartPosixTime - approximateServerTime;
|
||||
if (diff < serverUpdateInterval){
|
||||
|
||||
//sometimes the diff is negative (-100ms for example). Still looking
|
||||
//into why this could sometimes happen.
|
||||
if (diff < 0)
|
||||
diff=0;
|
||||
|
||||
nextSongPrepare = false;
|
||||
setTimeout(newSongStart, diff);
|
||||
}
|
||||
}
|
||||
|
||||
//calculate how much time left to next show if there is any
|
||||
if (nextShow.length > 0 && nextShowPrepare){
|
||||
var diff = nextShow[0].showStartPosixTime - approximateServerTime;
|
||||
if (diff < serverUpdateInterval){
|
||||
if (diff < 0)
|
||||
diff=0;
|
||||
|
||||
nextShowPrepare = false;
|
||||
setTimeout(nextShowStart, diff);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function updatePlaybar(){
|
||||
|
@ -159,7 +143,7 @@ function updatePlaybar(){
|
|||
} else {
|
||||
$('#current').html($.i18n._("Current")+": <span style='color:red; font-weight:bold'>"+$.i18n._("Live Stream")+"</span>");
|
||||
}
|
||||
} else if (nextSong == null) {
|
||||
} else {
|
||||
$('#current').html($.i18n._("Current")+": <span style='color:red; font-weight:bold'>"+$.i18n._("Nothing Scheduled")+"</span>");
|
||||
}
|
||||
}
|
||||
|
@ -223,22 +207,66 @@ function calcAdditionalShowData(show){
|
|||
}
|
||||
}
|
||||
|
||||
function calculateTimeToNextSong() {
|
||||
if (approximateServerTime === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (newSongTimeoutId !== null) {
|
||||
/* We have a previous timeout set, let's unset it */
|
||||
clearTimeout(newSongTimeoutId);
|
||||
newSongTimeoutId = null;
|
||||
}
|
||||
|
||||
var diff = nextSong.songStartPosixTime - approximateServerTime;
|
||||
if (diff < 0) diff=0;
|
||||
nextSongPrepare = false;
|
||||
newSongTimeoutId= setTimeout(newSongStart, diff);
|
||||
}
|
||||
|
||||
function calculateTimeToNextShow() {
|
||||
if (approximateServerTime === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (newShowTimeoutId !== null) {
|
||||
/* We have a previous timeout set, let's unset it */
|
||||
clearTimeout(newShowTimeoutId);
|
||||
newShowTimeoutId = null;
|
||||
}
|
||||
|
||||
var diff = nextShow[0].showStartPosixTime - approximateServerTime;
|
||||
if (diff < 0) diff=0;
|
||||
nextShowPrepare = false;
|
||||
newShowTimeoutId= setTimeout(nextShowStart, diff);
|
||||
}
|
||||
|
||||
function parseItems(obj){
|
||||
$('#time-zone').text(obj.timezone);
|
||||
|
||||
|
||||
previousSong = obj.previous;
|
||||
currentSong = obj.current;
|
||||
nextSong = obj.next;
|
||||
|
||||
if (previousSong !== null)
|
||||
if (previousSong !== null) {
|
||||
calcAdditionalData(previousSong);
|
||||
if (currentSong !== null)
|
||||
}
|
||||
if (currentSong !== null) {
|
||||
calcAdditionalData(currentSong);
|
||||
if (nextSong !== null)
|
||||
}
|
||||
if (nextSong !== null) {
|
||||
calcAdditionalData(nextSong);
|
||||
calculateTimeToNextSong();
|
||||
}
|
||||
|
||||
if (obj.currentShow.length > 0) {
|
||||
calcAdditionalShowData(obj.currentShow);
|
||||
}
|
||||
if (obj.nextShow.length > 0) {
|
||||
calcAdditionalShowData(obj.nextShow);
|
||||
calculateTimeToNextShow();
|
||||
}
|
||||
|
||||
currentShow = obj.currentShow;
|
||||
nextShow = obj.nextShow;
|
||||
|
|
|
@ -144,7 +144,8 @@ var AIRTIME = (function(AIRTIME){
|
|||
var url = baseUrl+"Playlist/set-cue",
|
||||
lastMod = getModified(),
|
||||
type = $('#obj_type').val(),
|
||||
li;
|
||||
li,
|
||||
span;
|
||||
|
||||
if (!isTimeValid(cueIn)){
|
||||
$el.find('.cue-in-error').val($.i18n._("please put in a time '00:00:00 (.0)'")).show();
|
||||
|
@ -174,7 +175,27 @@ var AIRTIME = (function(AIRTIME){
|
|||
return;
|
||||
}
|
||||
if (json.cue_error !== undefined) {
|
||||
|
||||
li = $('#side_playlist li[unqid='+id+']');
|
||||
|
||||
if (json.code === 0) {
|
||||
|
||||
span = $('#spl_cue_in_'+id).find('span');
|
||||
showError(span, json.cue_error);
|
||||
span = $('#spl_cue_out_'+id).find('span');
|
||||
showError(span, json.cue_error);
|
||||
}
|
||||
else if (json.code === 1) {
|
||||
|
||||
span = $('#spl_cue_in_'+id).find('span');
|
||||
showError(span, json.cue_error);
|
||||
}
|
||||
else if (json.code === 2) {
|
||||
|
||||
span = $('#spl_cue_out_'+id).find('span');
|
||||
showError(span, json.cue_error);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -188,12 +209,11 @@ var AIRTIME = (function(AIRTIME){
|
|||
}
|
||||
|
||||
/* used from waveform pop-up */
|
||||
function changeCrossfade($el, id1, id2, fadeIn, fadeOut, offset) {
|
||||
function changeCrossfade($el, id1, id2, fadeIn, fadeOut, offset, id) {
|
||||
|
||||
var url = baseUrl+"Playlist/set-crossfade",
|
||||
lastMod = getModified(),
|
||||
type = $('#obj_type').val(),
|
||||
li, id;
|
||||
type = $('#obj_type').val();
|
||||
|
||||
$.post(url,
|
||||
{format: "json", fadeIn: fadeIn, fadeOut: fadeOut, id1: id1, id2: id2, offset: offset, modified: lastMod, type: type},
|
||||
|
@ -209,10 +229,9 @@ var AIRTIME = (function(AIRTIME){
|
|||
|
||||
setPlaylistContent(json);
|
||||
|
||||
id = id1 === undefined ? id2 : id1;
|
||||
li = $('#side_playlist li[unqid='+id+']');
|
||||
li.find('.crossfade').toggle();
|
||||
highlightActive(li.find('.spl_fade_control'));
|
||||
$li = $('#side_playlist li[unqid='+id+']');
|
||||
$li.find('.crossfade').toggle();
|
||||
highlightActive($li.find('.spl_fade_control'));
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1158,13 +1177,16 @@ var AIRTIME = (function(AIRTIME){
|
|||
mod.showFadesWaveform = function(e) {
|
||||
var $el = $(e.target),
|
||||
$parent = $el.parents("dl"),
|
||||
$li = $el.parents("li"),
|
||||
$fadeOut = $parent.find(".spl_fade_out"),
|
||||
$fadeIn = $parent.find(".spl_fade_in"),
|
||||
$html = $($("#tmpl-pl-fades").html()),
|
||||
tracks = [],
|
||||
dim = AIRTIME.utilities.findViewportDimensions(),
|
||||
playlistEditor,
|
||||
id1, id2;
|
||||
id1, id2,
|
||||
id = $li.attr("unqid");
|
||||
|
||||
|
||||
function removeDialog() {
|
||||
playlistEditor.stop();
|
||||
|
@ -1225,7 +1247,7 @@ var AIRTIME = (function(AIRTIME){
|
|||
show: 'clip',
|
||||
hide: 'clip',
|
||||
width: dim.width - 100,
|
||||
height: dim.height - 100,
|
||||
height: 350,
|
||||
buttons: [
|
||||
{text: $.i18n._("Cancel"), class: "btn btn-small", click: removeDialog},
|
||||
{text: $.i18n._("Save"), class: "btn btn-small btn-inverse", click: function() {
|
||||
|
@ -1236,15 +1258,22 @@ var AIRTIME = (function(AIRTIME){
|
|||
|
||||
playlistEditor.stop();
|
||||
|
||||
if (json.length === 1) {
|
||||
if (json.length === 0)
|
||||
{
|
||||
id1 = undefined;
|
||||
id2 = undefined;
|
||||
}
|
||||
else if (json.length === 1) {
|
||||
|
||||
fade = json[0]["fades"][0];
|
||||
|
||||
if (fade["type"] === "FadeOut") {
|
||||
fadeOut = fade["end"] - fade["start"];
|
||||
id2 = undefined; //incase of track decode error.
|
||||
}
|
||||
else {
|
||||
fadeIn = fade["end"] - fade["start"];
|
||||
id1 = undefined; //incase of track decode error.
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -1261,7 +1290,7 @@ var AIRTIME = (function(AIRTIME){
|
|||
fadeIn = (fadeIn === undefined) ? undefined : fadeIn.toFixed(1);
|
||||
fadeOut = (fadeOut === undefined) ? undefined : fadeOut.toFixed(1);
|
||||
|
||||
changeCrossfade($html, id1, id2, fadeIn, fadeOut, offset);
|
||||
changeCrossfade($html, id1, id2, fadeIn, fadeOut, offset, id);
|
||||
}}
|
||||
],
|
||||
open: function (event, ui) {
|
||||
|
@ -1270,6 +1299,7 @@ var AIRTIME = (function(AIRTIME){
|
|||
resolution: 15000,
|
||||
state: "cursor",
|
||||
mono: true,
|
||||
timescale: true,
|
||||
waveHeight: 80,
|
||||
container: $html[0],
|
||||
UITheme: "jQueryUI",
|
||||
|
@ -1280,7 +1310,10 @@ var AIRTIME = (function(AIRTIME){
|
|||
playlistEditor.setConfig(config);
|
||||
playlistEditor.init(tracks);
|
||||
},
|
||||
close: removeDialog
|
||||
close: removeDialog,
|
||||
resizeStop: function(event, ui) {
|
||||
playlistEditor.resize();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
@ -1333,7 +1366,7 @@ var AIRTIME = (function(AIRTIME){
|
|||
show: 'clip',
|
||||
hide: 'clip',
|
||||
width: dim.width - 100,
|
||||
height: dim.height - 100,
|
||||
height: 325,
|
||||
buttons: [
|
||||
{text: $.i18n._("Cancel"), class: "btn btn-small", click: removeDialog},
|
||||
{text: $.i18n._("Save"), class: "btn btn-small btn-inverse", click: function() {
|
||||
|
@ -1350,6 +1383,7 @@ var AIRTIME = (function(AIRTIME){
|
|||
var config = new Config({
|
||||
resolution: 15000,
|
||||
mono: true,
|
||||
timescale: true,
|
||||
waveHeight: 80,
|
||||
container: $html[0],
|
||||
UITheme: "jQueryUI",
|
||||
|
@ -1360,7 +1394,10 @@ var AIRTIME = (function(AIRTIME){
|
|||
playlistEditor.setConfig(config);
|
||||
playlistEditor.init(tracks);
|
||||
},
|
||||
close: removeDialog
|
||||
close: removeDialog,
|
||||
resizeStop: function(event, ui) {
|
||||
playlistEditor.resize();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
@ -35,7 +35,8 @@ AIRTIME = (function(AIRTIME) {
|
|||
dayNamesMin: i18n_days_short,
|
||||
onClick: function(sDate, oDatePicker) {
|
||||
$(this).datepicker( "setDate", sDate );
|
||||
}
|
||||
},
|
||||
onClose: validateTimeRange
|
||||
};
|
||||
|
||||
oBaseTimePickerSettings = {
|
||||
|
@ -90,20 +91,48 @@ AIRTIME = (function(AIRTIME) {
|
|||
}
|
||||
}
|
||||
|
||||
function validateTimeRange() {
|
||||
var oRange,
|
||||
inputs = $('.sb-timerange > input'),
|
||||
start, end;
|
||||
|
||||
oRange = AIRTIME.utilities.fnGetScheduleRange(dateStartId, timeStartId, dateEndId, timeEndId);
|
||||
|
||||
start = oRange.start;
|
||||
end = oRange.end;
|
||||
|
||||
if (end >= start) {
|
||||
inputs.removeClass('error');
|
||||
}
|
||||
else {
|
||||
if (!inputs.hasClass('error')) {
|
||||
inputs.addClass('error');
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
start: start,
|
||||
end: end,
|
||||
isValid: end >= start
|
||||
};
|
||||
}
|
||||
|
||||
function showSearchSubmit() {
|
||||
var fn,
|
||||
oRange,
|
||||
op,
|
||||
oTable = $('#show_builder_table').dataTable();
|
||||
oTable = $('#show_builder_table').dataTable(),
|
||||
check;
|
||||
|
||||
check = validateTimeRange();
|
||||
|
||||
if (check.isValid) {
|
||||
|
||||
//reset timestamp value since input values could have changed.
|
||||
AIRTIME.showbuilder.resetTimestamp();
|
||||
|
||||
oRange = AIRTIME.utilities.fnGetScheduleRange(dateStartId, timeStartId, dateEndId, timeEndId);
|
||||
|
||||
fn = oTable.fnSettings().fnServerData;
|
||||
fn.start = oRange.start;
|
||||
fn.end = oRange.end;
|
||||
fn.start = check.start;
|
||||
fn.end = check.end;
|
||||
|
||||
op = $("div.sb-advanced-options");
|
||||
if (op.is(":visible")) {
|
||||
|
@ -117,6 +146,7 @@ AIRTIME = (function(AIRTIME) {
|
|||
|
||||
oTable.fnDraw();
|
||||
}
|
||||
}
|
||||
|
||||
mod.onReady = function() {
|
||||
// define module vars.
|
||||
|
@ -134,10 +164,22 @@ AIRTIME = (function(AIRTIME) {
|
|||
$(this).removeClass("ui-state-hover");
|
||||
});
|
||||
|
||||
$builder.find(dateStartId).datepicker(oBaseDatePickerSettings);
|
||||
$builder.find(timeStartId).timepicker(oBaseTimePickerSettings);
|
||||
$builder.find(dateEndId).datepicker(oBaseDatePickerSettings);
|
||||
$builder.find(timeEndId).timepicker(oBaseTimePickerSettings);
|
||||
$builder.find(dateStartId)
|
||||
.datepicker(oBaseDatePickerSettings)
|
||||
.blur(validateTimeRange);
|
||||
|
||||
$builder.find(timeStartId)
|
||||
.timepicker(oBaseTimePickerSettings)
|
||||
.blur(validateTimeRange);
|
||||
|
||||
$builder.find(dateEndId)
|
||||
.datepicker(oBaseDatePickerSettings)
|
||||
.blur(validateTimeRange);
|
||||
|
||||
$builder.find(timeEndId)
|
||||
.timepicker(oBaseTimePickerSettings)
|
||||
.blur(validateTimeRange);
|
||||
|
||||
|
||||
oRange = AIRTIME.utilities.fnGetScheduleRange(dateStartId, timeStartId,
|
||||
dateEndId, timeEndId);
|
||||
|
|
|
@ -88,19 +88,13 @@ var AIRTIME = (function(AIRTIME){
|
|||
mod.fnGetScheduleRange = function(dateStart, timeStart, dateEnd, timeEnd) {
|
||||
var iStart,
|
||||
iEnd,
|
||||
iRange,
|
||||
DEFAULT_RANGE = 60*60*24;
|
||||
iRange;
|
||||
|
||||
iStart = AIRTIME.utilities.fnGetTimestamp(dateStart, timeStart);
|
||||
iEnd = AIRTIME.utilities.fnGetTimestamp(dateEnd, timeEnd);
|
||||
|
||||
iRange = iEnd - iStart;
|
||||
|
||||
if (iEnd < iStart) {
|
||||
iEnd = iStart + DEFAULT_RANGE;
|
||||
iRange = DEFAULT_RANGE;
|
||||
}
|
||||
|
||||
return {
|
||||
start: iStart,
|
||||
end: iEnd,
|
||||
|
|
|
@ -1,17 +1,23 @@
|
|||
{
|
||||
"sProcessing": "Bitte warten...",
|
||||
"sLengthMenu": "_MENU_ Einträge anzeigen",
|
||||
"sZeroRecords": "Keine Einträge vorhanden.",
|
||||
"sEmptyTable": "Tabelle enthält keine Daten",
|
||||
"sInfo": "_START_ bis _END_ von _TOTAL_ Einträgen",
|
||||
"sInfoEmpty": "0 bis 0 von 0 Einträgen",
|
||||
"sInfoFiltered": "(gefiltert von _MAX_ Einträgen)",
|
||||
"sInfoPostFix": "",
|
||||
"sInfoThousands": ",",
|
||||
"sLengthMenu": "_MENU_ Einträge anzeigen",
|
||||
"sLoadingRecords": "Lade...",
|
||||
"sProcessing": "Bitte warten...",
|
||||
"sSearch": "",
|
||||
"sUrl": "",
|
||||
"sZeroRecords": "Keine Einträge vorhanden.",
|
||||
"oAria": {
|
||||
"sSortAscending": ": Spalte aufsteigend Sortieren",
|
||||
"sSortDescending": ": Spalte absteigend Sortieren"
|
||||
},
|
||||
"oPaginate": {
|
||||
"sFirst": "Erster",
|
||||
"sFirst": "Erste",
|
||||
"sPrevious": "Zurück",
|
||||
"sNext": "Nächster",
|
||||
"sLast": "Letzter"
|
||||
"sNext": "Nächste",
|
||||
"sLast": "Letzte"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,25 +1,27 @@
|
|||
// German
|
||||
plupload.addI18n({
|
||||
'Select files' : 'Dateien hochladen',
|
||||
'Add files to the upload queue and click the start button.' : 'Dateien hinzufügen und auf \'Hochladen\' klicken.',
|
||||
'Filename' : 'Dateiname',
|
||||
'Status' : 'Status',
|
||||
'Size' : 'Größe',
|
||||
'%d files queued': '%d Dateien in der Warteschlange',
|
||||
'Add files to the upload queue and click the start button.' : '\'Dateien\' hinzufügen und auf \'Hochladen\' klicken.',
|
||||
'Add files' : 'Dateien', // hinzufügen',
|
||||
'Stop current upload' : 'Aktuelles Hochladen stoppen',
|
||||
'Start uploading queue' : 'Hochladen starten',
|
||||
'Uploaded %d/%d files': '%d/%d Dateien sind hochgeladen',
|
||||
'N/A' : 'Nicht verfügbar',
|
||||
'Drag files here.' : 'Ziehen Sie die Dateien hier hin',
|
||||
'Add Files': 'Dateien', // hinzufügen',
|
||||
'Drag files here.' : 'Ziehe Dateien hier hin. (Drag & Drop)',
|
||||
'File extension error.': 'Fehler bei Dateiendung',
|
||||
'File size error.': 'Fehler bei Dateigröße',
|
||||
'Init error.': 'Initialisierungsfehler',
|
||||
'HTTP Error.': 'HTTP-Fehler',
|
||||
'Security error.': 'Sicherheitsfehler',
|
||||
'Filename' : 'Dateiname',
|
||||
'Generic error.': 'Typischer Fehler',
|
||||
'HTTP Error.': 'HTTP-Fehler',
|
||||
'Init error.': 'Initialisierungsfehler',
|
||||
'IO error.': 'Ein/Ausgabe-Fehler',
|
||||
'Stop Upload': 'Hochladen stoppen',
|
||||
'N/A' : 'Nicht verfügbar',
|
||||
'Security error.': 'Sicherheitsfehler',
|
||||
'Select files' : 'Dateien hochladen',
|
||||
'Size' : 'Größe',
|
||||
'Start upload': 'Hochladen',
|
||||
'%d files queued': '%d Dateien in der Warteschlange',
|
||||
'Start Upload': 'Hochladen',
|
||||
'Start uploading queue' : 'Hochladen starten',
|
||||
'Status' : 'Status',
|
||||
'Stop current upload' : 'Aktuelles Hochladen stoppen',
|
||||
'Stop Upload': 'Hochladen stoppen',
|
||||
'Uploaded %d/%d files': '%d/%d Dateien sind hochgeladen',
|
||||
"Error: Invalid file extension: " : $.i18n._("Error: Invalid file extension: ")
|
||||
});
|
||||
|
|
|
@ -56,6 +56,16 @@ PlaylistEditor.prototype.init = function(tracks) {
|
|||
trackEditor.on("deactivateSelection", "onAudioDeselection", audioControls);
|
||||
trackEditor.on("changecursor", "onCursorSelection", audioControls);
|
||||
trackEditor.on("changecursor", "onSelectUpdate", this);
|
||||
|
||||
trackEditor.on("unregister", (function() {
|
||||
var editor = this;
|
||||
|
||||
audioControls.remove("trackedit", "onTrackEdit", editor);
|
||||
audioControls.remove("changeresolution", "onResolutionChange", editor);
|
||||
|
||||
that.removeTrack(editor);
|
||||
|
||||
}).bind(trackEditor));
|
||||
}
|
||||
|
||||
div.innerHTML = '';
|
||||
|
@ -82,6 +92,26 @@ PlaylistEditor.prototype.init = function(tracks) {
|
|||
audioControls.on("changeselection", "onSelectionChange", this);
|
||||
};
|
||||
|
||||
PlaylistEditor.prototype.removeTrack = function(trackEditor) {
|
||||
var i,
|
||||
len,
|
||||
editor,
|
||||
editors = this.trackEditors;
|
||||
|
||||
for (i = 0, len = editors.length; i < len; i++) {
|
||||
editor = editors[i];
|
||||
|
||||
if (editor === trackEditor) {
|
||||
editors.splice(i, 1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
PlaylistEditor.prototype.resize = function() {
|
||||
this.timeScale.onResize();
|
||||
};
|
||||
|
||||
PlaylistEditor.prototype.onTrimAudio = function() {
|
||||
var track = this.activeTrack,
|
||||
selected = track.getSelectedArea(),
|
||||
|
|
|
@ -16,8 +16,6 @@ AudioPlayout.prototype.init = function(config) {
|
|||
|
||||
this.gainNode = undefined;
|
||||
this.destination = this.ac.destination;
|
||||
this.analyser = this.ac.createAnalyser();
|
||||
this.analyser.connect(this.destination);
|
||||
};
|
||||
|
||||
AudioPlayout.prototype.getBuffer = function() {
|
||||
|
@ -41,7 +39,7 @@ AudioPlayout.prototype.applyFades = function(fades, relPos, now, delay) {
|
|||
duration;
|
||||
|
||||
this.gainNode && this.gainNode.disconnect();
|
||||
this.gainNode = this.ac.createGainNode();
|
||||
this.gainNode = this.ac.createGain();
|
||||
|
||||
for (id in fades) {
|
||||
|
||||
|
@ -84,6 +82,7 @@ AudioPlayout.prototype.loadData = function (audioData, cb) {
|
|||
},
|
||||
function(err) {
|
||||
console.log("err(decodeAudioData): "+err);
|
||||
cb(null, err);
|
||||
}
|
||||
);
|
||||
};
|
||||
|
@ -136,7 +135,7 @@ AudioPlayout.prototype.setSource = function(source) {
|
|||
this.source.buffer = this.buffer;
|
||||
|
||||
this.source.connect(this.gainNode);
|
||||
this.gainNode.connect(this.analyser);
|
||||
this.gainNode.connect(this.destination);
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -8,7 +8,8 @@ TimeScale.prototype.init = function(config) {
|
|||
|
||||
var that = this,
|
||||
canv,
|
||||
div;
|
||||
div,
|
||||
resizeTimer;
|
||||
|
||||
makePublisher(this);
|
||||
|
||||
|
@ -36,6 +37,24 @@ TimeScale.prototype.init = function(config) {
|
|||
|
||||
this.prevScrollPos = 0; //checking the horizontal scroll (must update timeline above in case of change)
|
||||
|
||||
//TODO check scroll adjust.
|
||||
function doneResizing() {
|
||||
that.width = that.container.clientWidth;
|
||||
that.height = that.container.clientHeight;
|
||||
|
||||
canv.setAttribute('width', that.width);
|
||||
canv.setAttribute('height', that.height);
|
||||
|
||||
that.drawScale();
|
||||
};
|
||||
|
||||
function onResize() {
|
||||
clearTimeout(resizeTimer);
|
||||
resizeTimer = setTimeout(doneResizing, 100);
|
||||
};
|
||||
|
||||
TimeScale.prototype.onResize = onResize;
|
||||
|
||||
this.drawScale();
|
||||
};
|
||||
|
||||
|
|
|
@ -176,6 +176,7 @@ TrackEditor.prototype.loadBuffer = function(src) {
|
|||
var that = this,
|
||||
xhr = new XMLHttpRequest();
|
||||
|
||||
xhr.open('GET', src, true);
|
||||
xhr.responseType = 'arraybuffer';
|
||||
|
||||
xhr.addEventListener('progress', function(e) {
|
||||
|
@ -198,7 +199,6 @@ TrackEditor.prototype.loadBuffer = function(src) {
|
|||
);
|
||||
}, false);
|
||||
|
||||
xhr.open('GET', src, true);
|
||||
xhr.send();
|
||||
};
|
||||
|
||||
|
@ -208,11 +208,20 @@ TrackEditor.prototype.drawTrack = function(buffer) {
|
|||
this.drawer.drawFades(this.fades);
|
||||
};
|
||||
|
||||
TrackEditor.prototype.onTrackLoad = function(buffer) {
|
||||
TrackEditor.prototype.onTrackLoad = function(buffer, err) {
|
||||
var res,
|
||||
startTime,
|
||||
endTime;
|
||||
|
||||
if (err !== undefined) {
|
||||
this.container.innerHTML = "";
|
||||
this.container.classList.add("error");
|
||||
|
||||
this.fire('unregister');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.cues === undefined) {
|
||||
this.setCuePoints(0, buffer.length - 1);
|
||||
}
|
||||
|
@ -282,6 +291,8 @@ TrackEditor.prototype.deactivate = function() {
|
|||
/* start of state methods */
|
||||
|
||||
TrackEditor.prototype.timeShift = function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var el = e.currentTarget, //want the events placed on the channel wrapper.
|
||||
startX = e.pageX,
|
||||
diffX = 0,
|
||||
|
@ -296,6 +307,8 @@ TrackEditor.prototype.timeShift = function(e) {
|
|||
|
||||
//dynamically put an event on the element.
|
||||
el.onmousemove = function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var endX = e.pageX;
|
||||
|
||||
diffX = endX - startX;
|
||||
|
@ -303,7 +316,9 @@ TrackEditor.prototype.timeShift = function(e) {
|
|||
editor.drawer.setTimeShift(updatedX);
|
||||
editor.leftOffset = editor.pixelsToSamples(updatedX);
|
||||
};
|
||||
el.onmouseup = function() {
|
||||
el.onmouseup = function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var delta;
|
||||
|
||||
el.onmousemove = el.onmouseup = null;
|
||||
|
@ -453,6 +468,8 @@ TrackEditor.prototype.findLayerOffset = function(e) {
|
|||
};
|
||||
|
||||
TrackEditor.prototype.selectStart = function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var el = e.currentTarget, //want the events placed on the channel wrapper.
|
||||
editor = this,
|
||||
startX = e.layerX || e.offsetX, //relative to e.target (want the canvas).
|
||||
|
@ -475,6 +492,8 @@ TrackEditor.prototype.selectStart = function(e) {
|
|||
|
||||
//dynamically put an event on the element.
|
||||
el.onmousemove = function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var currentX = layerOffset + (e.layerX || e.offsetX),
|
||||
delta = currentX - prevX,
|
||||
minX = Math.min(prevX, currentX, startX),
|
||||
|
@ -500,6 +519,8 @@ TrackEditor.prototype.selectStart = function(e) {
|
|||
prevX = currentX;
|
||||
};
|
||||
el.onmouseup = function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var endX = layerOffset + (e.layerX || e.offsetX),
|
||||
minX, maxX,
|
||||
startTime, endTime;
|
||||
|
@ -555,6 +576,8 @@ TrackEditor.prototype.selectCursorPos = function(e) {
|
|||
};
|
||||
|
||||
TrackEditor.prototype.selectFadeIn = function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var startX = e.layerX || e.offsetX, //relative to e.target (want the canvas).
|
||||
layerOffset,
|
||||
FADETYPE = "FadeIn",
|
||||
|
@ -572,6 +595,8 @@ TrackEditor.prototype.selectFadeIn = function(e) {
|
|||
};
|
||||
|
||||
TrackEditor.prototype.selectFadeOut = function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
var startX = e.layerX || e.offsetX, //relative to e.target (want the canvas).
|
||||
layerOffset,
|
||||
FADETYPE = "FadeOut",
|
||||
|
|
|
@ -138,8 +138,8 @@ class ApiRequest(object):
|
|||
content_type = f.info().getheader('Content-Type')
|
||||
response = f.read()
|
||||
except Exception, e:
|
||||
self.logger.error('Exception: %s', e)
|
||||
self.logger.error("traceback: %s", traceback.format_exc())
|
||||
#self.logger.error('Exception: %s', e)
|
||||
#self.logger.error("traceback: %s", traceback.format_exc())
|
||||
raise
|
||||
|
||||
try:
|
||||
|
@ -149,8 +149,8 @@ class ApiRequest(object):
|
|||
else:
|
||||
raise InvalidContentType()
|
||||
except Exception:
|
||||
self.logger.error(response)
|
||||
self.logger.error("traceback: %s", traceback.format_exc())
|
||||
#self.logger.error(response)
|
||||
#self.logger.error("traceback: %s", traceback.format_exc())
|
||||
raise
|
||||
|
||||
def req(self, *args, **kwargs):
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
### BEGIN INIT INFO
|
||||
# Provides: airtime-media-monitor
|
||||
# Required-Start: $local_fs $remote_fs $network $syslog
|
||||
# Required-Start: $local_fs $remote_fs $network $syslog $all
|
||||
# Required-Stop: $local_fs $remote_fs $network $syslog
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
### BEGIN INIT INFO
|
||||
# Provides: airtime-liquidsoap
|
||||
# Required-Start: $local_fs $remote_fs $network $syslog
|
||||
# Required-Start: $local_fs $remote_fs $network $syslog $all
|
||||
# Required-Stop: $local_fs $remote_fs $network $syslog
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
### BEGIN INIT INFO
|
||||
# Provides: airtime-playout
|
||||
# Required-Start: $local_fs $remote_fs $network $syslog
|
||||
# Required-Start: $local_fs $remote_fs $network $syslog $all
|
||||
# Required-Stop: $local_fs $remote_fs $network $syslog
|
||||
# Default-Start: 2 3 4 5
|
||||
# Default-Stop: 0 1 6
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import logging
|
||||
import sys
|
||||
import time
|
||||
import traceback
|
||||
from api_clients.api_client import AirtimeApiClient
|
||||
|
||||
def generate_liquidsoap_config(ss):
|
||||
|
@ -26,19 +27,21 @@ def generate_liquidsoap_config(ss):
|
|||
fh.close()
|
||||
|
||||
logging.basicConfig(format='%(message)s')
|
||||
ac = AirtimeApiClient(logging.getLogger())
|
||||
attempts = 0
|
||||
max_attempts = 5
|
||||
max_attempts = 10
|
||||
successful = False
|
||||
|
||||
while True:
|
||||
while not successful:
|
||||
try:
|
||||
ac = AirtimeApiClient(logging.getLogger())
|
||||
ss = ac.get_stream_setting()
|
||||
generate_liquidsoap_config(ss)
|
||||
break
|
||||
successful = True
|
||||
except Exception, e:
|
||||
if attempts == max_attempts:
|
||||
print "Unable to connect to the Airtime server."
|
||||
logging.error(str(e))
|
||||
logging.error("traceback: %s", traceback.format_exc())
|
||||
sys.exit(1)
|
||||
else:
|
||||
time.sleep(3)
|
||||
|
|
|
@ -40,6 +40,14 @@ source_id = ref 0
|
|||
def create_source()
|
||||
l = request.equeue(id="s#{!source_id}", length=0.5)
|
||||
l = cue_cut(l)
|
||||
|
||||
l = audio_to_stereo(id="queue_src", l)
|
||||
l = amplify(1., override="replay_gain", l)
|
||||
|
||||
# the crossfade function controls fade in/out
|
||||
l = crossfade_airtime(l)
|
||||
|
||||
l = on_metadata(notify, l)
|
||||
sources := list.append([l], !sources)
|
||||
server.register(namespace="queues",
|
||||
"s#{!source_id}_skip",
|
||||
|
@ -62,12 +70,6 @@ create_source()
|
|||
|
||||
queue = add(!sources, normalize=false)
|
||||
|
||||
queue = audio_to_stereo(id="queue_src", queue)
|
||||
queue = amplify(1., override="replay_gain", queue)
|
||||
|
||||
# the crossfade function controls fade in/out
|
||||
queue = crossfade_airtime(queue)
|
||||
queue = on_metadata(notify, queue)
|
||||
output.dummy(fallible=true, queue)
|
||||
|
||||
http = input.http_restart(id="http")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue