diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php
index 514fcf6d5..284c4aaff 100644
--- a/airtime_mvc/application/controllers/ApiController.php
+++ b/airtime_mvc/application/controllers/ApiController.php
@@ -875,11 +875,10 @@ class ApiController extends Zend_Controller_Action
$watched_dirs = Application_Model_MusicDir::getWatchedDirs(null,null);
foreach( $added_list as $ad){
+ $ad .= '/';
foreach( $watched_dirs as $dir ){
$dirPath = $dir->getDirectory();
- $ad .= '/';
-
// if mount path itself was watched
if($dirPath == $ad){
Application_Model_MusicDir::addWatchedDir($dirPath, false);
@@ -901,9 +900,9 @@ class ApiController extends Zend_Controller_Action
}
}
foreach( $removed_list as $rd){
+ $rd .= '/';
foreach( $watched_dirs as $dir ){
$dirPath = $dir->getDirectory();
- $rd .= '/';
// if dir contains any dir in removed_list( if watched dir resides on new mounted path )
if(substr($dirPath, 0, strlen($rd)) === $rd && $dir->getExistsFlag() == true){
Application_Model_MusicDir::removeWatchedDir($dirPath, false);
diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php
index b3ca1dc79..8845583b6 100644
--- a/airtime_mvc/application/controllers/LibraryController.php
+++ b/airtime_mvc/application/controllers/LibraryController.php
@@ -45,7 +45,7 @@ class LibraryController extends Zend_Controller_Action
$file = Application_Model_StoredFile::Recall($id);
if (isset($this->pl_sess->id) && $screen == "playlist") {
- $menu["pl_add"] = array("name"=> "Add to Playlist", "icon" => "copy");
+ $menu["pl_add"] = array("name"=> "Add to Playlist", "icon" => "add-playlist", "icon" => "copy");
}
@@ -56,7 +56,7 @@ class LibraryController extends Zend_Controller_Action
}
$url = $file->getRelativeFileUrl($baseUrl).'/download/true';
- $menu["download"] = array("name" => "Download", "url" => $url);
+ $menu["download"] = array("name" => "Download", "icon" => "download", "url" => $url);
if (Application_Model_Preference::GetUploadToSoundcloudOption()) {
@@ -75,11 +75,11 @@ class LibraryController extends Zend_Controller_Action
$text = "Upload to SoundCloud";
}
- $menu["soundcloud"]["items"]["upload"] = array("name" => $text, "url" => "/library/upload-file-soundcloud/id/{$id}");
+ $menu["soundcloud"]["items"]["upload"] = array("name" => $text, "icon" => "soundcloud", "url" => "/library/upload-file-soundcloud/id/{$id}");
if ($scid > 0){
$url = $file->getSoundCloudLinkToFile();
- $menu["soundcloud"]["items"]["view"] = array("name" => "View on Soundcloud", "url" => $url);
+ $menu["soundcloud"]["items"]["view"] = array("name" => "View on Soundcloud", "icon" => "soundcloud", "url" => $url);
}
}
}
@@ -93,7 +93,7 @@ class LibraryController extends Zend_Controller_Action
}
//Open a jPlayer window and play the audio clip.
- $menu["play"] = array("name"=> "Play", "icon" => "big_play");
+ $menu["play"] = array("name"=> "Play", "icon" => "play");
$this->view->items = $menu;
}
diff --git a/airtime_mvc/application/controllers/ScheduleController.php b/airtime_mvc/application/controllers/ScheduleController.php
index 02031b90b..487253647 100644
--- a/airtime_mvc/application/controllers/ScheduleController.php
+++ b/airtime_mvc/application/controllers/ScheduleController.php
@@ -233,10 +233,10 @@ class ScheduleController extends Zend_Controller_Action
&& !$instance->isRecorded()
&& !$instance->isRebroadcast()) {
- $menu["schedule"] = array("name"=> "Add / Remove Content",
+ $menu["schedule"] = array("name"=> "Add / Remove Content", "icon" => "add-remove-content",
"url" => "/showbuilder/builder-dialog/");
- $menu["clear"] = array("name"=> "Remove All Content", "icon" => "delete",
+ $menu["clear"] = array("name"=> "Remove All Content", "icon" => "remove-all-content",
"url" => "/schedule/clear-show");
}
@@ -244,7 +244,7 @@ class ScheduleController extends Zend_Controller_Action
if (!$instance->isRecorded()) {
- $menu["content"] = array("name"=> "Show Content", "url" => "/schedule/show-content-dialog");
+ $menu["content"] = array("name"=> "Show Content", "icon" => "overview", "url" => "/schedule/show-content-dialog");
}
if ($showEndLocalDT->getTimestamp() <= $epochNow
diff --git a/airtime_mvc/application/controllers/ShowbuilderController.php b/airtime_mvc/application/controllers/ShowbuilderController.php
index b68c7d7bf..85780ef88 100644
--- a/airtime_mvc/application/controllers/ShowbuilderController.php
+++ b/airtime_mvc/application/controllers/ShowbuilderController.php
@@ -167,10 +167,10 @@ class ShowbuilderController extends Zend_Controller_Action
$item = CcScheduleQuery::create()->findPK($id);
$instance = $item->getCcShowInstances();
- $menu["preview"] = array("name"=> "Preview");
+ $menu["preview"] = array("name"=> "Preview","icon" => "overview");
//select the cursor
- $menu["selCurs"] = array("name"=> "Select Cursor");
- $menu["delCurs"] = array("name"=> "Remove Cursor");
+ $menu["selCurs"] = array("name"=> "Select Cursor","icon" => "select-cursor");
+ $menu["delCurs"] = array("name"=> "Remove Cursor","icon" => "select-cursor");
if ($now < floatval($item->getDbEnds("U.u")) && $user->canSchedule($instance->getDbShowId())) {
diff --git a/airtime_mvc/application/forms/EditAudioMD.php b/airtime_mvc/application/forms/EditAudioMD.php
index 7dbcdf961..96d29bda5 100644
--- a/airtime_mvc/application/forms/EditAudioMD.php
+++ b/airtime_mvc/application/forms/EditAudioMD.php
@@ -84,12 +84,14 @@ class Application_Form_EditAudioMD extends Zend_Form
));
// Add bmp field
- $this->addElement('text', 'bpm', array(
- 'label' => 'BPM:',
- 'class' => 'input_text',
- 'filters' => array('StringTrim'),
- 'validators' => array(array('StringLength', false, array(0, 8)))
- ));
+ $bpm = new Zend_Form_Element_Text('bpm');
+ $bpm->class = 'input_text';
+ $bpm->setLabel('BPM:')
+ ->setFilters(array('StringTrim'))
+ ->setValidators(array(
+ new Zend_Validate_StringLength(array('min'=>0,'max' => 8)),
+ new Zend_Validate_Digits()));
+ $this->addElement($bpm);
// Add copyright field
$this->addElement('text', 'copyright', array(
diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php
index 91661e001..eb98f47d2 100644
--- a/airtime_mvc/application/models/Schedule.php
+++ b/airtime_mvc/application/models/Schedule.php
@@ -114,6 +114,10 @@ class Application_Model_Schedule {
$timeNowAsMillis = strtotime($p_timeNow);
for( $i = 0; $i < $numberOfRows; ++$i ){
+ // if the show is overbooked, then update the track end time to the end of the show time.
+ if($rows[$i]['ends'] > $rows[$i]["show_ends"]){
+ $rows[$i]['ends'] = $rows[$i]["show_ends"];
+ }
if ((strtotime($rows[$i]['starts']) <= $timeNowAsMillis) && (strtotime($rows[$i]['ends']) >= $timeNowAsMillis)){
if ( $i - 1 >= 0){
$results['previous'] = array("name"=>$rows[$i-1]["artist_name"]." - ".$rows[$i-1]["track_title"],
@@ -351,7 +355,7 @@ class Application_Model_Schedule {
if (strpos($t[2], ".")) {
$secParts = explode(".", $t[2]);
$millisecs = $secParts[1];
- $millisecs = substr($millisecs, 0, 3);
+ $millisecs = str_pad(substr($millisecs, 0, 3),3, '0');
$millisecs = intval($millisecs);
$seconds = intval($secParts[0]);
} else {
@@ -408,6 +412,7 @@ class Application_Model_Schedule {
$baseQuery = "SELECT st.file_id AS file_id,"
." st.id as id,"
+ ." st.instance_id as instance_id,"
." st.starts AS start,"
." st.ends AS end,"
." st.cue_in AS cue_in,"
@@ -523,7 +528,12 @@ class Application_Model_Schedule {
}
foreach ($items as $item){
-
+
+ $showInstance = CcShowInstancesQuery::create()->findPK($item["instance_id"]);
+ $showId = $showInstance->getDbShowId();
+ $show = CcShowQuery::create()->findPK($showId);
+ $showName = $show->getDbName();
+
$showEndDateTime = new DateTime($item["show_end"], $utcTimeZone);
$trackStartDateTime = new DateTime($item["start"], $utcTimeZone);
$trackEndDateTime = new DateTime($item["end"], $utcTimeZone);
@@ -555,7 +565,8 @@ class Application_Model_Schedule {
'cue_in' => Application_Model_DateHelper::CalculateLengthInSeconds($item["cue_in"]),
'cue_out' => Application_Model_DateHelper::CalculateLengthInSeconds($item["cue_out"]),
'start' => $start,
- 'end' => Application_Model_Schedule::AirtimeTimeToPypoTime($item["end"])
+ 'end' => Application_Model_Schedule::AirtimeTimeToPypoTime($item["end"]),
+ 'show_name' => $showName
);
}
diff --git a/airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml b/airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml
index 192c40474..88b7a804d 100644
--- a/airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml
+++ b/airtime_mvc/application/views/scripts/form/preferences_watched_dirs.phtml
@@ -38,7 +38,7 @@
0): ?>
- getExistsFlag())?"":"
"?>getDirectory();?>
+ getExistsFlag())?"":"
"?>getDirectory();?>
diff --git a/airtime_mvc/public/css/images/icon_add_content_cm.png b/airtime_mvc/public/css/images/icon_add_content_cm.png
new file mode 100644
index 000000000..9aed5f47d
Binary files /dev/null and b/airtime_mvc/public/css/images/icon_add_content_cm.png differ
diff --git a/airtime_mvc/public/css/images/icon_add_playlist_cm.png b/airtime_mvc/public/css/images/icon_add_playlist_cm.png
new file mode 100644
index 000000000..3b273b3ea
Binary files /dev/null and b/airtime_mvc/public/css/images/icon_add_playlist_cm.png differ
diff --git a/airtime_mvc/public/css/images/icon_copy_cm.png b/airtime_mvc/public/css/images/icon_copy_cm.png
new file mode 100644
index 000000000..f7d0f1958
Binary files /dev/null and b/airtime_mvc/public/css/images/icon_copy_cm.png differ
diff --git a/airtime_mvc/public/css/images/icon_cut_cm.png b/airtime_mvc/public/css/images/icon_cut_cm.png
new file mode 100644
index 000000000..13e7abea8
Binary files /dev/null and b/airtime_mvc/public/css/images/icon_cut_cm.png differ
diff --git a/airtime_mvc/public/css/images/icon_delete_cm.png b/airtime_mvc/public/css/images/icon_delete_cm.png
new file mode 100644
index 000000000..701205b93
Binary files /dev/null and b/airtime_mvc/public/css/images/icon_delete_cm.png differ
diff --git a/airtime_mvc/public/css/images/icon_door_cm.png b/airtime_mvc/public/css/images/icon_door_cm.png
new file mode 100644
index 000000000..d34d7fc20
Binary files /dev/null and b/airtime_mvc/public/css/images/icon_door_cm.png differ
diff --git a/airtime_mvc/public/css/images/icon_download_cm.png b/airtime_mvc/public/css/images/icon_download_cm.png
new file mode 100644
index 000000000..90965f4dd
Binary files /dev/null and b/airtime_mvc/public/css/images/icon_download_cm.png differ
diff --git a/airtime_mvc/public/css/images/icon_edit_cm.png b/airtime_mvc/public/css/images/icon_edit_cm.png
new file mode 100644
index 000000000..8dc0d78db
Binary files /dev/null and b/airtime_mvc/public/css/images/icon_edit_cm.png differ
diff --git a/airtime_mvc/public/css/images/icon_overview_cm.png b/airtime_mvc/public/css/images/icon_overview_cm.png
new file mode 100644
index 000000000..1e085d84a
Binary files /dev/null and b/airtime_mvc/public/css/images/icon_overview_cm.png differ
diff --git a/airtime_mvc/public/css/images/icon_paste_cm.png b/airtime_mvc/public/css/images/icon_paste_cm.png
new file mode 100644
index 000000000..9de4d01f9
Binary files /dev/null and b/airtime_mvc/public/css/images/icon_paste_cm.png differ
diff --git a/airtime_mvc/public/css/images/icon_play_cm.png b/airtime_mvc/public/css/images/icon_play_cm.png
new file mode 100644
index 000000000..8197e946b
Binary files /dev/null and b/airtime_mvc/public/css/images/icon_play_cm.png differ
diff --git a/airtime_mvc/public/css/images/icon_remove_all_content_cm.png b/airtime_mvc/public/css/images/icon_remove_all_content_cm.png
new file mode 100644
index 000000000..29e1e83ae
Binary files /dev/null and b/airtime_mvc/public/css/images/icon_remove_all_content_cm.png differ
diff --git a/airtime_mvc/public/css/images/icon_select-cursor_cm.png b/airtime_mvc/public/css/images/icon_select-cursor_cm.png
new file mode 100644
index 000000000..a495d7279
Binary files /dev/null and b/airtime_mvc/public/css/images/icon_select-cursor_cm.png differ
diff --git a/airtime_mvc/public/css/images/icon_soundcloud_cm.png b/airtime_mvc/public/css/images/icon_soundcloud_cm.png
new file mode 100644
index 000000000..e7c4d8c61
Binary files /dev/null and b/airtime_mvc/public/css/images/icon_soundcloud_cm.png differ
diff --git a/airtime_mvc/public/css/images/warning-icon.png b/airtime_mvc/public/css/images/warning-icon.png
new file mode 100644
index 000000000..a1b86d38a
Binary files /dev/null and b/airtime_mvc/public/css/images/warning-icon.png differ
diff --git a/airtime_mvc/public/css/jquery.contextMenu.css b/airtime_mvc/public/css/jquery.contextMenu.css
index 17c1555a9..98e5c5091 100755
--- a/airtime_mvc/public/css/jquery.contextMenu.css
+++ b/airtime_mvc/public/css/jquery.contextMenu.css
@@ -22,8 +22,8 @@
position: absolute;
list-style-type: none;
- border: 1px solid #DDD;
- background: #EEE;
+ border: 1px solid #333333;
+ background: #f0f0f0;
-webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.5);
-moz-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.5);
@@ -31,14 +31,15 @@
-o-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.5);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.5);
- font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-family: Arial, Helvetica, sans-serif;
font-size: 11px;
}
.context-menu-item {
padding: 2px 2px 2px 28px;
- background-color: #EEE;
+ background-color: #f0f0f0;
position: relative;
+ min-height: 18px;
-moz-user-select: -moz-none;
}
@@ -53,7 +54,7 @@
.context-menu-item.hover {
cursor: pointer;
- background-color: #39F;
+ background-color: #ff5d1a;
}
.context-menu-item.disabled {
@@ -82,13 +83,21 @@
.context-menu-item.icon:before {}
*/
.context-menu-item.icon { min-height: 18px; background-repeat: no-repeat; background-position: 4px 2px; }
-.context-menu-item.icon-edit { background-image: url(images/icon_edit.png); }
-.context-menu-item.icon-cut { background-image: url(images/icon_cut.png); }
-.context-menu-item.icon-copy { background-image: url(images/icon_copy.png); }
-.context-menu-item.icon-paste { background-image: url(images/icon_paste.png); }
-.context-menu-item.icon-delete { background-image: url(images/icon_delete.png); }
-.context-menu-item.icon-quit { background-image: url(images/icon_door.png); }
-.context-menu-item.icon-soundcloud { background-image: url(images/icon_soundcloud.png); }
+.context-menu-item.icon-edit { background-image: url(images/icon_edit_cm.png); }
+.context-menu-item.icon-cut { background-image: url(images/icon_cut_cm.png); }
+.context-menu-item.icon-copy { background-image: url(images/icon_copy_cm.png); }
+.context-menu-item.icon-paste { background-image: url(images/icon_paste_cm.png); }
+.context-menu-item.icon-delete { background-image: url(images/icon_delete_cm.png); }
+.context-menu-item.icon-quit { background-image: url(images/icon_door_cm.png); }
+.context-menu-item.icon-soundcloud { background-image: url(images/icon_soundcloud_cm.png); }
+
+.context-menu-item.icon-download { background-image: url(images/icon_download_cm.png); }
+.context-menu-item.icon-overview { background-image: url(images/icon_overview_cm.png); }
+.context-menu-item.icon-play { background-image: url(images/icon_play_cm.png); }
+.context-menu-item.icon-select-cursor { background-image: url(images/icon_select-cursor_cm.png); }
+.context-menu-item.icon-add-playlist { background-image: url(images/icon_add_playlist_cm.png); }
+.context-menu-item.icon-add-remove-content { background-image: url(images/icon_add_content_cm.png); }
+.context-menu-item.icon-remove-all-content { background-image: url(images/icon_remove_all_content_cm.png); }
/* vertically align inside labels */
.context-menu-input > label > * { vertical-align: top; }
diff --git a/airtime_mvc/public/js/airtime/dashboard/playlist.js b/airtime_mvc/public/js/airtime/dashboard/playlist.js
index 9bbed3603..3ad590fb6 100644
--- a/airtime_mvc/public/js/airtime/dashboard/playlist.js
+++ b/airtime_mvc/public/js/airtime/dashboard/playlist.js
@@ -135,25 +135,28 @@ function updateProgressBarValue(){
function updatePlaybar(){
/* Column 0 update */
- $('#previous').empty();
- $('#prev-length').empty();
- $('#current').html("Current: Nothing Scheduled");
- $('#next').empty();
- $('#next-length').empty();
if (previousSong !== null){
$('#previous').text(previousSong.name+",");
$('#prev-length').text(convertToHHMMSSmm(previousSong.songLengthMs));
+ }else{
+ $('#previous').empty();
+ $('#prev-length').empty();
}
if (currentSong !== null){
if (currentSong.record == "1")
$('#current').html("Recording: "+currentSong.name+",");
else
$('#current').text(currentSong.name+",");
+ }else{
+ $('#current').html("Current: Nothing Scheduled");
}
if (nextSong !== null){
$('#next').text(nextSong.name+",");
$('#next-length').text(convertToHHMMSSmm(nextSong.songLengthMs));
+ }else{
+ $('#next').empty();
+ $('#next-length').empty();
}
$('#start').empty();
diff --git a/airtime_mvc/public/js/airtime/library/spl.js b/airtime_mvc/public/js/airtime/library/spl.js
index adb3d9891..a3b01f335 100644
--- a/airtime_mvc/public/js/airtime/library/spl.js
+++ b/airtime_mvc/public/js/airtime/library/spl.js
@@ -764,7 +764,7 @@ var AIRTIME = (function(AIRTIME){
$pl.find(".ui-icon-alert").qtip({
content: {
- text: "File does not exist on disk..."
+ text: "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."
},
position:{
adjust: {
diff --git a/airtime_mvc/public/js/airtime/preferences/musicdirs.js b/airtime_mvc/public/js/airtime/preferences/musicdirs.js
index 796baec96..7e70b8650 100644
--- a/airtime_mvc/public/js/airtime/preferences/musicdirs.js
+++ b/airtime_mvc/public/js/airtime/preferences/musicdirs.js
@@ -98,5 +98,23 @@ function setWatchedDirEvents() {
$(document).ready(function() {
setWatchedDirEvents();
-
+ $(".ui-icon-alert").qtip({
+ content: {
+ text: "This path is currently not accessible."
+ },
+ position:{
+ adjust: {
+ resize: true,
+ method: "flip flip"
+ },
+ at: "right center",
+ my: "left top",
+ viewport: $(window)
+ },
+ style: {
+ classes: "ui-tooltip-dark"
+ },
+ show: 'mouseover',
+ hide: 'mouseout'
+ });
});
diff --git a/install_minimal/upgrades/airtime-2.1.0/DbUpgrade.php b/install_minimal/upgrades/airtime-2.1.0/DbUpgrade.php
index ed4ac9089..f3b00b8d9 100644
--- a/install_minimal/upgrades/airtime-2.1.0/DbUpgrade.php
+++ b/install_minimal/upgrades/airtime-2.1.0/DbUpgrade.php
@@ -8,12 +8,48 @@ class AirtimeDatabaseUpgrade{
public static function start(){
echo "* Updating Database".PHP_EOL;
self::task0();
+ self::task1();
}
private static function task0(){
- UpgradeCommon::MigrateTablesToVersion(__DIR__, '20120410143340');
+ UpgradeCommon::MigrateTablesToVersion(__DIR__, '20120411174904');
+
$sql = "INSERT INTO cc_pref(\"keystr\", \"valstr\") VALUES('scheduled_play_switch', 'on')";
UpgradeCommon::nonSelectQueryDb($sql);
}
+
+ /*
+ * set values for playout_status in cc_schedule
+ */
+ private static function task1() {
+
+ // Define path to application directory
+ defined('APPLICATION_PATH')
+ || define('APPLICATION_PATH', realpath(__DIR__.'/../../../airtime_mvc/application'));
+
+ // Ensure library is on include_path
+ set_include_path(implode(PATH_SEPARATOR, array(
+ get_include_path(),
+ realpath(APPLICATION_PATH . '/../library')
+ )));
+
+ //Propel classes.
+ set_include_path(APPLICATION_PATH . '/models' . PATH_SEPARATOR . get_include_path());
+
+ //include_once APPLICATION_PATH."/configs/conf.php";
+ include_once 'propel/runtime/lib/Propel.php';
+ Propel::init(APPLICATION_PATH."/configs/airtime-conf-production.php");
+
+ $con = Propel::getConnection(CcSchedulePeer::DATABASE_NAME);
+
+ $showInstances = CcShowInstancesQuery::create()
+ ->setFormatter(ModelCriteria::FORMAT_ON_DEMAND)
+ ->filterByDbStarts(gmdate("Y-m-d H:i:s"), Criteria::GREATER_EQUAL)
+ ->find($con);
+
+ foreach ($showInstances as $instance) {
+ $instance->updateScheduleStatus($con);
+ }
+ }
}
diff --git a/install_minimal/upgrades/airtime-2.1.0/common/Version20120410104441.php b/install_minimal/upgrades/airtime-2.1.0/common/Version20120410104441.php
index 557796819..c41f7ef31 100644
--- a/install_minimal/upgrades/airtime-2.1.0/common/Version20120410104441.php
+++ b/install_minimal/upgrades/airtime-2.1.0/common/Version20120410104441.php
@@ -28,6 +28,10 @@ class Version20120410104441 extends AbstractMigration
//add utime, lptime
$this->_addSql("ALTER TABLE cc_files ADD utime timestamp(6)");
$this->_addSql("ALTER TABLE cc_files ADD lptime timestamp(6)");
+
+ //setting these to a default now for timeline refresh purposes.
+ $now = gmdate("Y-m-d H:i:s");
+ $this->_addSql("UPDATE cc_files SET utime = '$now'");
}
public function down(Schema $schema)
diff --git a/install_minimal/upgrades/airtime-2.1.0/common/Version20120411102907.php b/install_minimal/upgrades/airtime-2.1.0/common/Version20120411102907.php
new file mode 100644
index 000000000..3eee194f2
--- /dev/null
+++ b/install_minimal/upgrades/airtime-2.1.0/common/Version20120411102907.php
@@ -0,0 +1,41 @@
+_addSql("ALTER TABLE cc_files ALTER COLUMN length TYPE interval");
+
+ $this->_addSql("ALTER TABLE cc_playlistcontents ALTER COLUMN cuein TYPE interval");
+ $this->_addSql("ALTER TABLE cc_playlistcontents ALTER COLUMN cueout TYPE interval");
+ $this->_addSql("ALTER TABLE cc_playlistcontents ALTER COLUMN cliplength TYPE interval");
+
+ $this->_addSql("ALTER TABLE cc_schedule ALTER COLUMN cue_in TYPE interval");
+ $this->_addSql("ALTER TABLE cc_schedule ALTER COLUMN cue_out TYPE interval");
+ $this->_addSql("ALTER TABLE cc_schedule ALTER COLUMN clip_length TYPE interval");
+
+ $this->_addSql("ALTER TABLE cc_show_instances ALTER COLUMN time_filled TYPE interval");
+
+ //remove old columns from cc_schedule that deal with groups or playlists.
+ $this->_addSql("ALTER TABLE cc_schedule DROP COLUMN group_id");
+ $this->_addSql("ALTER TABLE cc_schedule DROP COLUMN schedule_group_played");
+ $this->_addSql("ALTER TABLE cc_schedule DROP COLUMN playlist_id");
+
+ $this->_addSql("ALTER TABLE cc_schedule ADD playout_status integer DEFAULT 1 NOT NULL");
+ }
+
+ public function down(Schema $schema)
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/install_minimal/upgrades/airtime-2.1.0/common/Version20120411174904.php b/install_minimal/upgrades/airtime-2.1.0/common/Version20120411174904.php
new file mode 100644
index 000000000..8f8c1ba02
--- /dev/null
+++ b/install_minimal/upgrades/airtime-2.1.0/common/Version20120411174904.php
@@ -0,0 +1,28 @@
+_addSql("ALTER TABLE cc_show_instances ADD created timestamp(6)");
+ $this->_addSql("ALTER TABLE cc_show_instances ADD last_scheduled timestamp(6)");
+
+ //setting these to a default now for timeline refresh purposes.
+ $now = gmdate("Y-m-d H:i:s");
+ $this->_addSql("UPDATE cc_show_instances SET created = '$now'");
+ $this->_addSql("UPDATE cc_show_instances SET last_scheduled = '$now'");
+ }
+
+ public function down(Schema $schema)
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/python_apps/api_clients/api_client.py b/python_apps/api_clients/api_client.py
index 1f32a993b..747f26300 100755
--- a/python_apps/api_clients/api_client.py
+++ b/python_apps/api_clients/api_client.py
@@ -442,7 +442,10 @@ class AirTimeApiClient(ApiClientInterface):
except Exception, e:
response = None
- logger.error("Exception with file %s: %s", md, e)
+ import traceback
+ top = traceback.format_exc()
+ logger.error('Exception: %s', e)
+ logger.error("traceback: %s", top)
return response
diff --git a/python_apps/pypo/liquidsoap_scripts/ls_lib.liq b/python_apps/pypo/liquidsoap_scripts/ls_lib.liq
index aad687a53..82ef411b1 100644
--- a/python_apps/pypo/liquidsoap_scripts/ls_lib.liq
+++ b/python_apps/pypo/liquidsoap_scripts/ls_lib.liq
@@ -15,6 +15,15 @@ def append_title(m) =
end
end
+def crossfade(s)
+ #duration is automatically overwritten by metadata fields passed in
+ #with audio
+ s = fade.in(type="log", duration=0., s)
+ s = fade.out(type="log", duration=0., s)
+ fader = fun (a,b) -> add(normalize=false,[b,a])
+ cross(fader,s)
+end
+
def transition(a,b) =
log("transition called...")
add(normalize=false,
diff --git a/python_apps/pypo/liquidsoap_scripts/ls_script.liq b/python_apps/pypo/liquidsoap_scripts/ls_script.liq
index fa5d631f8..54649b8b1 100644
--- a/python_apps/pypo/liquidsoap_scripts/ls_script.liq
+++ b/python_apps/pypo/liquidsoap_scripts/ls_script.liq
@@ -29,6 +29,8 @@ s3_namespace = ref ''
queue = on_metadata(notify, queue)
queue = map_metadata(append_title, queue)
+# the crossfade function controls fade in/out
+queue = crossfade(queue)
ignore(output.dummy(queue, fallible=true))
server.register(namespace="vars", "pypo_data", fun (s) -> begin pypo_data := s "Done" end)
diff --git a/python_apps/pypo/pypofetch.py b/python_apps/pypo/pypofetch.py
index cbe21b5dd..c66fc825e 100644
--- a/python_apps/pypo/pypofetch.py
+++ b/python_apps/pypo/pypofetch.py
@@ -90,7 +90,7 @@ class PypoFetch(Thread):
self.switch_source(self.logger, self.telnet_lock, m['sourcename'], m['status'])
elif command == 'disconnect_source':
self.logger.info("disconnect_on_source show command received...")
- self.disconnect_source(self.logger, self.telnet.lock, m['sourcename'])
+ self.disconnect_source(self.logger, self.telnet_lock, m['sourcename'])
except Exception, e:
import traceback
top = traceback.format_exc()
@@ -421,8 +421,7 @@ class PypoFetch(Thread):
try:
mediaKeys = sorted(media.iterkeys())
for mkey in mediaKeys:
- media_item = media[mkey]
- media_item['show_name'] = "TODO"
+ media_item = media[mkey]
except Exception, e:
self.logger.error("%s", e)
diff --git a/python_apps/pypo/pypomessagehandler.py b/python_apps/pypo/pypomessagehandler.py
index a6dfc2e49..23e269b16 100644
--- a/python_apps/pypo/pypomessagehandler.py
+++ b/python_apps/pypo/pypomessagehandler.py
@@ -99,7 +99,7 @@ class PypoMessageHandler(Thread):
self.handle_message(message.payload)
# ACK the message to take it off the queue
message.ack()
- except IOError, e:
+ except (IOError, AttributeError), e:
import traceback
top = traceback.format_exc()
self.logger.error('Exception: %s', e)
diff --git a/python_apps/pypo/pypopush.py b/python_apps/pypo/pypopush.py
index 0a6bde357..fa9ef9ecf 100644
--- a/python_apps/pypo/pypopush.py
+++ b/python_apps/pypo/pypopush.py
@@ -429,7 +429,8 @@ class PypoPush(Thread):
self.telnet_lock.release()
def create_liquidsoap_annotation(self, media):
- return 'annotate:media_id="%s",liq_fade_in="%s",liq_fade_out="%s",liq_cue_in="%s",liq_cue_out="%s",schedule_table_id="%s":%s' \
+ # we need lia_start_next value in the annotate. That is the value that controlls overlap duration of crossfade.
+ return 'annotate:media_id="%s",liq_start_next="0",liq_fade_in="%s",liq_fade_out="%s",liq_cue_in="%s",liq_cue_out="%s",schedule_table_id="%s":%s' \
% (media['id'], float(media['fade_in'])/1000, float(media['fade_out'])/1000, float(media['cue_in']), float(media['cue_out']), media['row_id'], media['dst'])
def run(self):