diff --git a/airtime_mvc/application/Bootstrap.php b/airtime_mvc/application/Bootstrap.php index 852078675..7173f30b5 100644 --- a/airtime_mvc/application/Bootstrap.php +++ b/airtime_mvc/application/Bootstrap.php @@ -33,11 +33,11 @@ date_default_timezone_set(Application_Model_Preference::GetTimezone()); Zend_Validate::setDefaultNamespaces("Zend"); $front = Zend_Controller_Front::getInstance(); -$front->registerPlugin(new RabbitMqPlugin()); +$front->registerPlugin(new RabbitMqPlugin()); Logging::debug($_SERVER['REQUEST_URI']); -/* The bootstrap class should only be used to initialize actions that return a view. +/* The bootstrap class should only be used to initialize actions that return a view. Actions that return JSON will not use the bootstrap class! */ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { @@ -56,23 +56,25 @@ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap $view->headLink()->appendStylesheet($baseUrl.'/css/redmond/jquery-ui-1.8.8.custom.css?'.filemtime($baseDir.'/css/redmond/jquery-ui-1.8.8.custom.css')); $view->headLink()->appendStylesheet($baseUrl.'/css/pro_dropdown_3.css?'.filemtime($baseDir.'/css/pro_dropdown_3.css')); - $view->headLink()->appendStylesheet($baseUrl.'/css/qtip/jquery.qtip.min.css?'.filemtime($baseDir.'/css/qtip/jquery.qtip.min.css')); + $view->headLink()->appendStylesheet($baseUrl.'/css/qtip/jquery.qtip.css?'.filemtime($baseDir.'/css/qtip/jquery.qtip.min.css')); $view->headLink()->appendStylesheet($baseUrl.'/css/styles.css?'.filemtime($baseDir.'/css/styles.css')); + } protected function _initHeadScript() { global $CC_CONFIG; - + $view = $this->getResource('view'); $baseUrl = Zend_Controller_Front::getInstance()->getBaseUrl(); $baseDir = dirname($_SERVER['SCRIPT_FILENAME']); - $view->headScript()->appendFile($baseUrl.'/js/libs/jquery-1.5.2.min.js?'.filemtime($baseDir.'/js/libs/jquery-1.5.2.min.js'),'text/javascript'); - $view->headScript()->appendFile($baseUrl.'/js/libs/jquery-ui-1.8.11.custom.min.js?'.filemtime($baseDir.'/js/libs/jquery-ui-1.8.11.custom.min.js'),'text/javascript'); + $view->headScript()->appendFile($baseUrl.'/js/libs/jquery-1.7.1.min.js?'.filemtime($baseDir.'/js/libs/jquery-1.7.1.min.js'),'text/javascript'); + $view->headScript()->appendFile('https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js'); $view->headScript()->appendFile($baseUrl.'/js/libs/jquery.stickyPanel.js?'.filemtime($baseDir.'/js/libs/jquery.stickyPanel.js'),'text/javascript'); - $view->headScript()->appendFile($baseUrl.'/js/qtip/jquery.qtip2.min.js?'.filemtime($baseDir.'/js/qtip/jquery.qtip2.min.js'),'text/javascript'); + $view->headScript()->appendFile($baseUrl.'/js/qtip/jquery.qtip.min.js?'.filemtime($baseDir.'/js/qtip/jquery.qtip2.min.js'),'text/javascript'); $view->headScript()->appendFile($baseUrl.'/js/jplayer/jquery.jplayer.min.js?'.filemtime($baseDir.'/js/jplayer/jquery.jplayer.min.js')); + $view->headScript()->appendScript("var baseUrl='$baseUrl/'"); //scripts for now playing bar @@ -81,7 +83,7 @@ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap $view->headScript()->appendFile($baseUrl.'/js/airtime/dashboard/versiontooltip.js?'.filemtime($baseDir.'/js/airtime/dashboard/versiontooltip.js'),'text/javascript'); $view->headScript()->appendFile($baseUrl.'/js/airtime/common/common.js?'.filemtime($baseDir.'/js/airtime/common/common.js'),'text/javascript'); - + if (Application_Model_Preference::GetPlanLevel() != "disabled" && $_SERVER['REQUEST_URI'] != '/Dashboard/stream-player') { $client_id = Application_Model_Preference::GetClientId(); @@ -109,12 +111,12 @@ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { if (APPLICATION_ENV == "development"){ global $CC_DBC; - + $autoloader = Zend_Loader_Autoloader::getInstance(); $autoloader->registerNamespace('ZFDebug'); $options = array( - 'plugins' => array('Variables', + 'plugins' => array('Variables', 'Exception', 'Memory', 'Time') @@ -126,12 +128,12 @@ class Bootstrap extends Zend_Application_Bootstrap_Bootstrap $frontController->registerPlugin($debug); } } - + protected function _initRouter() { $front = Zend_Controller_Front::getInstance(); $router = $front->getRouter(); - + $router->addRoute( 'password-change', new Zend_Controller_Router_Route('password-change/:user_id/:token', array( diff --git a/airtime_mvc/application/configs/ACL.php b/airtime_mvc/application/configs/ACL.php index 6f0581296..e3001cffc 100644 --- a/airtime_mvc/application/configs/ACL.php +++ b/airtime_mvc/application/configs/ACL.php @@ -24,6 +24,7 @@ $ccAcl->add(new Zend_Acl_Resource('library')) ->add(new Zend_Acl_Resource('dashboard')) ->add(new Zend_Acl_Resource('preference')) ->add(new Zend_Acl_Resource('recorder')) + ->add(new Zend_Acl_Resource('showbuilder')) ->add(new Zend_Acl_Resource('auth')); /** Creating permissions */ @@ -42,6 +43,7 @@ $ccAcl->allow('G', 'index') ->allow('H', 'library') ->allow('H', 'search') ->allow('H', 'playlist') + ->allow('H', 'showbuilder') ->allow('A', 'user') ->allow('A', 'systemstatus') ->allow('A', 'preference'); diff --git a/airtime_mvc/application/configs/navigation.php b/airtime_mvc/application/configs/navigation.php index 851cae36b..8ab913804 100644 --- a/airtime_mvc/application/configs/navigation.php +++ b/airtime_mvc/application/configs/navigation.php @@ -29,6 +29,13 @@ $pages = array( 'action' => 'index', 'resource' => 'library' ), + array( + 'label' => 'Airtimeline', + 'module' => 'default', + 'controller' => 'Showbuilder', + 'action' => 'index', + 'resource' => 'showbuilder' + ), array( 'label' => 'Calendar', 'module' => 'default', @@ -67,7 +74,7 @@ $pages = array( 'action' => 'stream-setting' ), array( - 'label' => + 'label' => Application_Model_Preference::GetPlanLevel() == 'disabled'?'Support Settings':'Station Information Settings', 'module' => 'default', 'controller' => 'Preference', diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php index 1068c403f..ab52d2e00 100644 --- a/airtime_mvc/application/controllers/LibraryController.php +++ b/airtime_mvc/application/controllers/LibraryController.php @@ -23,28 +23,40 @@ class LibraryController extends Zend_Controller_Action $this->search_sess = new Zend_Session_Namespace("search"); } - public function indexAction() + public function indexAction() { + + $this->_helper->layout->setLayout('library'); + + $this->view->headScript()->appendFile($this->view->baseUrl('/js/airtime/library/events/library_playlistbuilder.js'),'text/javascript'); + + $this->_helper->actionStack('library', 'library'); + $this->_helper->actionStack('index', 'playlist'); + } + + public function libraryAction() { $request = $this->getRequest(); $baseUrl = $request->getBaseUrl(); + $baseDir = dirname($_SERVER['SCRIPT_FILENAME']); - $this->view->headScript()->appendFile($baseUrl.'/js/contextmenu/jjmenu.js?'.filemtime($baseDir.'/js/contextmenu/jjmenu.js'),'text/javascript'); + $this->view->headScript()->appendFile($baseUrl.'/js/contextmenu/jquery.contextMenu.js?'.filemtime($baseDir.'/js/contextmenu/jquery.contextMenu.js'),'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'/js/datatables/js/jquery.dataTables.js?'.filemtime($baseDir.'/js/datatables/js/jquery.dataTables.js'),'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'/js/datatables/plugin/dataTables.pluginAPI.js?'.filemtime($baseDir.'/js/datatables/plugin/dataTables.pluginAPI.js'),'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'/js/datatables/plugin/dataTables.fnSetFilteringDelay.js?'.filemtime($baseDir.'/js/datatables/plugin/dataTables.fnSetFilteringDelay.js'),'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'/js/datatables/plugin/dataTables.ColVis.js?'.filemtime($baseDir.'/js/datatables/plugin/dataTables.ColVis.js'),'text/javascript'); - $this->view->headScript()->appendFile($baseUrl.'/js/datatables/plugin/dataTables.ColReorder.js?'.filemtime($baseDir.'/js/datatables/plugin/dataTables.ColReorder.js'),'text/javascript'); + $this->view->headScript()->appendFile($baseUrl.'/js/datatables/plugin/dataTables.ColReorderResize.js?'.filemtime($baseDir.'/js/datatables/plugin/dataTables.ColReorderResize.js'),'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'/js/datatables/plugin/dataTables.FixedColumns.js?'.filemtime($baseDir.'/js/datatables/plugin/dataTables.FixedColumns.js'),'text/javascript'); + $this->view->headScript()->appendFile($baseUrl.'/js/datatables/plugin/dataTables.TableTools.js?'.filemtime($baseDir.'/js/datatables/plugin/dataTables.TableTools.js'),'text/javascript'); + $this->view->headScript()->appendFile($baseUrl.'/js/airtime/library/library.js?'.filemtime($baseDir.'/js/airtime/library/library.js'),'text/javascript'); - $this->view->headScript()->appendFile($baseUrl.'/js/airtime/library/advancedsearch.js?'.filemtime($baseDir.'/js/airtime/library/advancedsearch.js'),'text/javascript'); $this->view->headLink()->appendStylesheet($baseUrl.'/css/media_library.css?'.filemtime($baseDir.'/css/media_library.css')); - $this->view->headLink()->appendStylesheet($baseUrl.'/css/contextmenu.css?'.filemtime($baseDir.'/css/contextmenu.css')); + $this->view->headLink()->appendStylesheet($baseUrl.'/css/jquery.contextMenu.css?'.filemtime($baseDir.'/css/jquery.contextMenu.css')); $this->view->headLink()->appendStylesheet($baseUrl.'/css/datatables/css/ColVis.css?'.filemtime($baseDir.'/css/datatables/css/ColVis.css')); $this->view->headLink()->appendStylesheet($baseUrl.'/css/datatables/css/ColReorder.css?'.filemtime($baseDir.'/css/datatables/css/ColReorder.css')); + $this->view->headLink()->appendStylesheet($baseUrl.'/css/TableTools.css?'.filemtime($baseDir.'/css/TableTools.css')); - $this->_helper->layout->setLayout('library'); $this->_helper->viewRenderer->setResponseSegment('library'); $form = new Application_Form_AdvancedSearch(); @@ -54,8 +66,6 @@ class LibraryController extends Zend_Controller_Action $this->search_sess->next_row[1] = 2; $this->view->form = $form; $this->view->md = $this->search_sess->md; - - $this->_helper->actionStack('index', 'playlist'); } public function contextMenuAction() @@ -64,186 +74,137 @@ class LibraryController extends Zend_Controller_Action $id = $this->_getParam('id'); $type = $this->_getParam('type'); + //playlist||timeline + $screen = $this->_getParam('screen'); $request = $this->getRequest(); $baseUrl = $request->getBaseUrl(); - $params = '/format/json/id/#id#/type/#type#'; - - $paramsPop = str_replace('#id#', $id, $params); - $paramsPop = str_replace('#type#', $type, $paramsPop); - $userInfo = Zend_Auth::getInstance()->getStorage()->read(); $user = new Application_Model_User($userInfo->id); - $pl_sess = $this->pl_sess; + if ($type === "audioclip") { - if($type === "au") { + $file = Application_Model_StoredFile::Recall($id); - if(isset($pl_sess->id)) { - $menu[] = array('action' => array('type' => 'ajax', 'url' => '/Playlist/add-item'.$params, 'callback' => 'window["setSPLContent"]'), - 'title' => 'Add to Playlist'); + $menu["edit"] = array("name"=> "Edit Metadata", "icon" => "edit", "url" => "/library/edit-file-md/id/{$id}"); + + if ($user->isAdmin()) { + $menu["del"] = array("name"=> "Delete", "icon" => "delete", "url" => "/library/delete"); } - $menu[] = array('action' => array('type' => 'gourl', 'url' => '/Library/edit-file-md/id/#id#'), - 'title' => 'Edit Metadata'); - - // added for downlaod - $id = $this->_getParam('id'); - - $file_id = $this->_getParam('id', null); - $file = Application_Model_StoredFile::Recall($file_id); - $url = $file->getRelativeFileUrl($baseUrl).'/download/true'; - $menu[] = array('action' => array('type' => 'gourl', 'url' => $url), - 'title' => 'Download'); + $menu["download"] = array("name" => "Download", "url" => $url); if (Application_Model_Preference::GetUploadToSoundcloudOption()) { - $text = "Upload to SoundCloud"; - if(!is_null($file->getSoundCloudId())){ - $text = "Re-upload to SoundCloud"; - } - $menu[] = array('action' => array('type' => 'ajax', 'url' => '/Library/upload-file-soundcloud/id/#id#', - 'callback'=>"window['addProgressIcon']('$file_id')"),'title' => $text); + + //create a menu separator + $menu["sep1"] = "-----------"; + + //create a sub menu for Soundcloud actions. + $menu["soundcloud"] = array("name" => "Soundcloud", "icon" => "soundcloud", "items" => array()); $scid = $file->getSoundCloudId(); - if($scid > 0){ - $link_to_file = $file->getSoundCloudLinkToFile(); - $menu[] = array('action' => array('type' => 'fn', - 'callback' => "window['openFileOnSoundCloud']('$link_to_file')"), - 'title' => 'View on SoundCloud'); + if (!is_null($scid)){ + $text = "Re-upload to SoundCloud"; + } + else { + $text = "Upload to SoundCloud"; + } + + $menu["soundcloud"]["items"]["upload"] = array("name" => $text, "url" => "/library/upload-file-soundcloud/id/{$id}"); + + if ($scid > 0){ + $url = $file->getSoundCloudLinkToFile(); + $menu["soundcloud"]["items"]["view"] = array("name" => "View on Soundcloud", "url" => $url); } } - - if ($user->isAdmin()) { - $menu[] = array('action' => array('type' => 'fn', - 'callback' => "window['confirmDeleteAudioClip']('$paramsPop')"), - 'title' => 'Delete'); - } } - else if($type === "pl") { + else if ($type === "playlist") { - if(!isset($pl_sess->id) || $pl_sess->id !== $id) { - $menu[] = array('action' => - array('type' => 'ajax', - 'url' => '/Playlist/edit'.$params, - 'callback' => 'window["openDiffSPL"]'), - 'title' => 'Edit'); - } - else if(isset($pl_sess->id) && $pl_sess->id === $id) { - $menu[] = array('action' => - array('type' => 'ajax', - 'url' => '/Playlist/close'.$params, - 'callback' => 'window["noOpenPL"]'), - 'title' => 'Close'); + if ($this->pl_sess->id !== $id && $screen == "playlist") { + $menu["edit"] = array("name"=> "Edit", "icon" => "edit"); } - $menu[] = array('action' => array('type' => 'fn', - 'callback' => "window['confirmDeletePlaylist']('$paramsPop')"), - 'title' => 'Delete'); - + $menu["del"] = array("name"=> "Delete", "icon" => "delete", "url" => "/library/delete"); } - //returns format jjmenu is looking for. - die(json_encode($menu)); + $this->view->items = $menu; } public function deleteAction() { - $id = $this->_getParam('id'); - $userInfo = Zend_Auth::getInstance()->getStorage()->read(); - $user = new Application_Model_User($userInfo->id); + //array containing id and type of media to delete. + $mediaItems = $this->_getParam('media', null); - if ($user->isAdmin()) { + $user = Application_Model_User::GetCurrentUser(); - if (!is_null($id)) { - $file = Application_Model_StoredFile::Recall($id); + $files = array(); + $playlists = array(); - if (PEAR::isError($file)) { - $this->view->message = $file->getMessage(); - return; - } - else if(is_null($file)) { - $this->view->message = "file doesn't exist"; - return; - } + $message = null; - $res = $file->delete(true); + foreach ($mediaItems as $media) { - if (PEAR::isError($res)) { - $this->view->message = $res->getMessage(); - return; - } - else { - $res = settype($res, "integer"); - $data = array("filepath" => $file->getFilePath(), "delete" => $res); - Application_Model_RabbitMq::SendMessageToMediaMonitor("file_delete", $data); - } + if ($media["type"] === "audioclip") { + $files[] = intval($media["id"]); + } + else if ($media["type"] === "playlist") { + $playlists[] = intval($media["id"]); } - - $this->view->id = $id; } - } - - public function deleteGroupAction() - { - $ids = $this->_getParam('ids'); - $userInfo = Zend_Auth::getInstance()->getStorage()->read(); - $user = new Application_Model_User($userInfo->id); - if ($user->isAdmin()) { + if (count($playlists)) { + Application_Model_Playlist::DeletePlaylists($playlists); + } - if (!is_null($ids)) { - foreach ($ids as $key => $id) { - $file = Application_Model_StoredFile::Recall($id); + if (!$user->isAdmin()) { + return; + } - if (PEAR::isError($file)) { - $this->view->message = $file->getMessage(); - return; - } - else if(is_null($file)) { - $this->view->message = "file doesn't exist"; - return; - } + foreach ($files as $id) { + Logging::log("deleting file {$id}"); - $res = $file->delete(); + $file = Application_Model_StoredFile::Recall($id); - if (PEAR::isError($res)) { - $this->view->message = $res->getMessage(); - return; - } - else { - $res = settype($res, "integer"); - $data = array("filepath" => $file->getFilePath(), "delete" => $res); - Application_Model_RabbitMq::SendMessageToMediaMonitor("file_delete", $data); - } + if (isset($file)) { + try { + $res = $file->delete(true); + } + //could throw a scheduled in future exception. + catch (Exception $e) { + $message = "Could not delete some scheduled files."; } - - $this->view->ids = $ids; } } + + if (isset($message)) { + $this->view->message = $message; + } } public function contentsAction() { - $post = $this->getRequest()->getPost(); - $datatables = Application_Model_StoredFile::searchFilesForPlaylistBuilder($post); - - //format clip lengh to 1 decimal - foreach($datatables["aaData"] as &$data){ - if($data['ftype'] == 'audioclip'){ + $params = $this->getRequest()->getParams(); + $datatables = Application_Model_StoredFile::searchFilesForPlaylistBuilder($params); + + //TODO move this to the datatables row callback. + foreach ($datatables["aaData"] as &$data) { + + if ($data['ftype'] == 'audioclip'){ $file = Application_Model_StoredFile::Recall($data['id']); $scid = $file->getSoundCloudId(); - if($scid == "-2"){ - $data['track_title'] .= ''; - }else if($scid == "-3"){ - $data['track_title'] .= ''; - }else if(!is_null($scid)){ - $data['track_title'] .= ''; + + if ($scid == "-2"){ + $data['track_title'] .= ''; + } + else if ($scid == "-3"){ + $data['track_title'] .= ''; + } + else if (!is_null($scid)){ + $data['track_title'] .= ''; } } - $sec = Application_Model_Playlist::playlistTimeToSeconds($data['length']); - $data['length'] = Application_Model_Playlist::secondsToPlaylistTime($sec); } die(json_encode($datatables)); @@ -284,13 +245,13 @@ class LibraryController extends Zend_Controller_Action $id = $this->_getParam('id'); $type = $this->_getParam('type'); - if($type == "au") { + if ($type == "audioclip") { $file = Application_Model_StoredFile::Recall($id); $this->view->type = $type; $this->view->md = $file->getMetadata(); } - else if($type == "pl") { - $file = Application_Model_Playlist::Recall($id); + else if ($type == "playlist") { + $file = new Application_Model_Playlist($id); $this->view->type = $type; $this->view->md = $file->getAllPLMetaData(); $this->view->contents = $file->getContents(); @@ -308,13 +269,15 @@ class LibraryController extends Zend_Controller_Action public function getUploadToSoundcloudStatusAction(){ $id = $this->_getParam('id'); $type = $this->_getParam('type'); - if($type == "show"){ + + if ($type == "show") { $show_instance = new Application_Model_ShowInstance($id); $this->view->sc_id = $show_instance->getSoundCloudFileId(); $file = $show_instance->getRecordedFile(); $this->view->error_code = $file->getSoundCloudErrorCode(); $this->view->error_msg = $file->getSoundCloudErrorMsg(); - }else{ + } + else if ($type == "file") { $file = Application_Model_StoredFile::Recall($id); $this->view->sc_id = $file->getSoundCloudId(); $this->view->error_code = $file->getSoundCloudErrorCode(); diff --git a/airtime_mvc/application/controllers/PlaylistController.php b/airtime_mvc/application/controllers/PlaylistController.php index b2b8c25ad..a136bd1a9 100644 --- a/airtime_mvc/application/controllers/PlaylistController.php +++ b/airtime_mvc/application/controllers/PlaylistController.php @@ -7,19 +7,16 @@ class PlaylistController extends Zend_Controller_Action public function init() { $ajaxContext = $this->_helper->getHelper('AjaxContext'); - $ajaxContext->addActionContext('add-item', 'json') - ->addActionContext('delete-item', 'json') - ->addActionContext('add-group', 'json') - ->addActionContext('delete-group', 'json') + $ajaxContext->addActionContext('add-items', 'json') + ->addActionContext('move-items', 'json') + ->addActionContext('delete-items', 'json') ->addActionContext('set-fade', 'json') ->addActionContext('set-cue', 'json') - ->addActionContext('move-item', 'json') - ->addActionContext('close', 'json') ->addActionContext('new', 'json') ->addActionContext('edit', 'json') - ->addActionContext('delete-active', 'json') ->addActionContext('delete', 'json') ->addActionContext('set-playlist-fades', 'json') + ->addActionContext('get-playlist-fades', 'json') ->addActionContext('set-playlist-name', 'json') ->addActionContext('set-playlist-description', 'json') ->initContext(); @@ -29,52 +26,41 @@ class PlaylistController extends Zend_Controller_Action private function getPlaylist() { - $pl_sess = $this->pl_sess; + $pl = null; - if(isset($pl_sess->id)) { - - $pl = Application_Model_Playlist::Recall($pl_sess->id); - if($pl === FALSE) { - unset($pl_sess->id); - return false; - } - return $pl; - }else{ - return false; + if (isset($this->pl_sess->id)) { + $pl = new Application_Model_Playlist($this->pl_sess->id); } + return $pl; } private function changePlaylist($pl_id) { - $pl_sess = $this->pl_sess; - - if(isset($pl_sess->id)) { - - $pl = Application_Model_Playlist::Recall($pl_sess->id); - if($pl !== FALSE) { - $this->closePlaylist($pl); - } - } - - $userInfo = Zend_Auth::getInstance()->getStorage()->read(); - - $pl = Application_Model_Playlist::Recall($pl_id); - if($pl === FALSE) { - return FALSE; - } - $pl->lock($userInfo->id); - $pl_sess->id = $pl_id; + $this->pl_sess->id = intval($pl_id); } - private function closePlaylist($pl) + private function createUpdateResponse($pl) { - $userInfo = Zend_Auth::getInstance()->getStorage()->read(); - $res = $pl->unlock($userInfo->id); + $this->view->pl = $pl; + $this->view->html = $this->view->render('playlist/update.phtml'); + $this->view->name = $pl->getName(); + $this->view->length = $pl->getLength(); + $this->view->description = $pl->getDescription(); - $pl_sess = $this->pl_sess; - unset($pl_sess->id); + unset($this->view->pl); + } - return $res; + private function createFullResponse($pl = null) + { + if (isset($pl)) { + $this->view->pl = $pl; + $this->view->id = $pl->getId(); + $this->view->html = $this->view->render('playlist/index.phtml'); + unset($this->view->pl); + } + else { + $this->view->html = $this->view->render('playlist/index.phtml'); + } } public function indexAction() @@ -87,10 +73,21 @@ class PlaylistController extends Zend_Controller_Action $this->view->headLink()->appendStylesheet($baseUrl.'/css/playlist_builder.css?'.filemtime($baseDir.'/css/playlist_builder.css')); $this->_helper->viewRenderer->setResponseSegment('spl'); - $pl = $this->getPlaylist(); - if($pl !== false){ - $this->view->pl = $pl; - } + + try { + $pl = $this->getPlaylist(); + + if (isset($pl)) { + $this->view->pl = $pl; + } + } + catch (PlaylistNotFoundException $e) { + Logging::log("Playlist not found"); + $this->changePlaylist(null); + } + catch (Exception $e) { + Logging::log("{$e->getMessage()}"); + } } public function newAction() @@ -99,275 +96,223 @@ class PlaylistController extends Zend_Controller_Action $userInfo = Zend_Auth::getInstance()->getStorage()->read(); $pl = new Application_Model_Playlist(); - $pl->create("Untitled Playlist"); - $pl->setPLMetaData('dc:creator', $userInfo->login); + $pl->setName("Untitled Playlist"); + $pl->setPLMetaData('dc:creator', $userInfo->id); $this->changePlaylist($pl->getId()); - - $this->view->pl = $pl; - $this->view->pl_id = $pl->getId(); - $this->view->html = $this->view->render('playlist/index.phtml'); - unset($this->view->pl); + $this->createFullResponse($pl); } public function editAction() { - $pl_id = $this->_getParam('id', null); - - if(!is_null($pl_id)) { - $this->changePlaylist($pl_id); - } - - $pl = $this->getPlaylist(); - if($pl === false){ - $this->view->playlist_error = true; - return false; - } - - $this->view->pl = $pl; - $this->view->pl_id = $pl->getId(); - $this->view->html = $this->view->render('playlist/index.phtml'); - unset($this->view->pl); - } - - public function addItemAction() - { - $id = $this->_getParam('id'); - $pos = $this->_getParam('pos', null); + $id = $this->_getParam('id', null); + Logging::log("editing playlist {$id}"); if (!is_null($id)) { - - $pl = $this->getPlaylist(); - if($pl === false){ - $this->view->playlist_error = true; - return false; - } - $res = $pl->addAudioClip($id, $pos); - - if (PEAR::isError($res)) { - $this->view->message = $res->getMessage(); - } - - $this->view->pl = $pl; - $this->view->html = $this->view->render('playlist/update.phtml'); - $this->view->name = $pl->getName(); - $this->view->length = $pl->getLength(); - $this->view->description = $pl->getDescription(); - - unset($this->view->pl); - return; + $this->changePlaylist($id); } - $this->view->message = "a file is not chosen"; - } - public function moveItemAction() - { - $oldPos = $this->_getParam('oldPos'); - $newPos = $this->_getParam('newPos'); - - - $pl = $this->getPlaylist(); - if($pl === false){ - $this->view->playlist_error = true; - return false; - } - - $pl->moveAudioClip($oldPos, $newPos); - - $this->view->pl = $pl; - $this->view->html = $this->view->render('playlist/update.phtml'); - $this->view->name = $pl->getName(); - $this->view->length = $pl->getLength(); - $this->view->description = $pl->getDescription(); - - unset($this->view->pl); - } - - public function deleteItemAction() - { - $positions = $this->_getParam('pos', array()); - - if (!is_array($positions)) - $positions = array($positions); - - //so the automatic updating of playlist positioning doesn't affect removal. - sort($positions); - $positions = array_reverse($positions); - - $pl = $this->getPlaylist(); - if($pl === false){ - $this->view->playlist_error = true; - return false; - } - - foreach ($positions as $pos) { - $pl->delAudioClip($pos); - } - - $this->view->pl = $pl; - $this->view->html = $this->view->render('playlist/update.phtml'); - $this->view->name = $pl->getName(); - $this->view->length = $pl->getLength(); - $this->view->description = $pl->getDescription(); - - unset($this->view->pl); - } - - public function addGroupAction() - { - $ids = $this->_getParam('ids'); - $pos = $this->_getParam('pos', null); - - if (!is_null($ids)) { + try { $pl = $this->getPlaylist(); - if ($pl === false) { - $this->view->playlist_error = true; - return false; - } - - foreach ($ids as $key => $value) { - $res = $pl->addAudioClip($value); - if (PEAR::isError($res)) { - $this->view->message = $res->getMessage(); - break; - } - } - - $this->view->pl = $pl; - $this->view->html = $this->view->render('playlist/update.phtml'); - $this->view->name = $pl->getName(); - $this->view->length = $pl->getLength(); - $this->view->description = $pl->getDescription(); - return; - } - $this->view->message = "a file is not chosen"; - } - - public function deleteGroupAction() - { - $ids = $this->_getParam('ids', null); - - foreach ($ids as $key => $id) { - $pl = Application_Model_Playlist::Recall($id); - - if ($pl !== FALSE) { - Application_Model_Playlist::Delete($id); - $pl_sess = $this->pl_sess; - if($pl_sess->id === $id){ - unset($pl_sess->id); - } - } else { - $this->view->playlist_error = true; - return false; - } - } - - $this->view->ids = $ids; - $this->view->html = $this->view->render('playlist/index.phtml'); - } - - public function setCueAction() - { - $pos = $this->_getParam('pos'); - $pl = $this->getPlaylist(); - if ($pl === false){ - $this->view->playlist_error = true; - return false; - } - - $cueIn = $this->_getParam('cueIn', null); - $cueOut = $this->_getParam('cueOut', null); - - $response = $pl->changeClipLength($pos, $cueIn, $cueOut); - - $this->view->response = $response; - - if(!isset($response["error"])) { - $this->view->pl = $pl; - $this->view->html = $this->view->render('playlist/update.phtml'); - $this->view->name = $pl->getName(); - $this->view->length = $pl->getLength(); - $this->view->description = $pl->getDescription(); - - unset($this->view->pl); } - } + catch (PlaylistNotFoundException $e) { + Logging::log("Playlist {$id} not found"); + $this->changePlaylist(null); + } + catch (Exception $e) { + Logging::log("{$e->getFile()}"); + Logging::log("{$e->getLine()}"); + Logging::log("{$e->getMessage()}"); + $this->changePlaylist(null); + } - public function setFadeAction() - { - $pos = $this->_getParam('pos'); - $pl = $this->getPlaylist(); - - if($pl === false){ - $this->view->playlist_error = true; - return false; - } - - $fadeIn = $this->_getParam('fadeIn', null); - $fadeOut = $this->_getParam('fadeOut', null); - - $response = $pl->changeFadeInfo($pos, $fadeIn, $fadeOut); - $this->view->response = $response; - - if(!isset($response["error"])) { - $this->view->pl = $pl; - $this->view->html = $this->view->render('playlist/update.phtml'); - $this->view->name = $pl->getName(); - $this->view->length = $pl->getLength(); - $this->view->description = $pl->getDescription(); - - unset($this->view->pl); - } + $this->createFullResponse($pl); } public function deleteAction() { - $id = $this->_getParam('id', null); - $pl = Application_Model_Playlist::Recall($id); + $ids = $this->_getParam('ids'); + $ids = (!is_array($ids)) ? array($ids) : $ids; + $pl = null; - if ($pl !== FALSE) { + try { - Application_Model_Playlist::Delete($id); + Logging::log("Currently active playlist {$this->pl_sess->id}"); + if (in_array($this->pl_sess->id, $ids)) { + Logging::log("Deleting currently active playlist"); + $this->changePlaylist(null); + } + else { + $pl = $this->getPlaylist(); + Logging::log("Not deleting currently active playlist"); + } - $pl_sess = $this->pl_sess; - - if($pl_sess->id === $id){ - unset($pl_sess->id); - } - }else{ - $this->view->playlist_error = true; - return false; + Application_Model_Playlist::DeletePlaylists($ids); + } + catch(PlaylistNotFoundException $e) { + Logging::log("Playlist not found"); + $this->changePlaylist(null); + $pl = null; + } + catch(Exception $e) { + Logging::log("{$e->getFile()}"); + Logging::log("{$e->getLine()}"); + Logging::log("{$e->getMessage()}"); } - $this->view->id = $id; - $this->view->html = $this->view->render('playlist/index.phtml'); + $this->createFullResponse($pl); } - public function deleteActiveAction() + public function addItemsAction() { - $pl = $this->getPlaylist(); - if($pl === false){ - $this->view->playlist_error = true; - return false; + $ids = $this->_getParam('ids'); + $ids = (!is_array($ids)) ? array($ids) : $ids; + $afterItem = $this->_getParam('afterItem', null); + $addType = $this->_getParam('type', 'after'); + + Logging::log("type is ".$addType); + + try { + $pl = $this->getPlaylist(); + $pl->addAudioClips($ids, $afterItem, $addType); + } + catch (PlaylistNotFoundException $e) { + Logging::log("Playlist not found"); + $this->changePlaylist(null); + $this->createFullResponse(null); + } + catch (Exception $e) { + Logging::log("{$e->getFile()}"); + Logging::log("{$e->getLine()}"); + Logging::log("{$e->getMessage()}"); } - Application_Model_Playlist::Delete($pl->getId()); - $pl_sess = $this->pl_sess; - unset($pl_sess->id); - - $this->view->html = $this->view->render('playlist/index.phtml'); + $this->createUpdateResponse($pl); } - public function closeAction() + public function moveItemsAction() { - $pl = $this->getPlaylist(); - if($pl === false){ - $this->view->playlist_error = true; - return false; - } - $this->closePlaylist($pl); + $ids = $this->_getParam('ids'); + $ids = (!is_array($ids)) ? array($ids) : $ids; + $afterItem = $this->_getParam('afterItem', null); - $this->view->html = $this->view->render('playlist/index.phtml'); + try { + $pl = $this->getPlaylist(); + $pl->moveAudioClips($ids, $afterItem); + } + catch (PlaylistNotFoundException $e) { + Logging::log("Playlist not found"); + $this->changePlaylist(null); + $this->createFullResponse(null); + } + catch (Exception $e) { + Logging::log("{$e->getFile()}"); + Logging::log("{$e->getLine()}"); + Logging::log("{$e->getMessage()}"); + } + + $this->createUpdateResponse($pl); + } + + public function deleteItemsAction() + { + $ids = $this->_getParam('ids'); + $ids = (!is_array($ids)) ? array($ids) : $ids; + + try { + $pl = $this->getPlaylist(); + $pl->delAudioClips($ids); + } + catch (PlaylistNotFoundException $e) { + Logging::log("Playlist not found"); + $this->changePlaylist(null); + $this->createFullResponse(null); + } + catch (Exception $e) { + Logging::log("{$e->getFile()}"); + Logging::log("{$e->getLine()}"); + Logging::log("{$e->getMessage()}"); + } + + $this->createUpdateResponse($pl); + } + + public function setCueAction() + { + $id = $this->_getParam('id'); + $cueIn = $this->_getParam('cueIn', null); + $cueOut = $this->_getParam('cueOut', null); + + try { + $pl = $this->getPlaylist(); + $response = $pl->changeClipLength($id, $cueIn, $cueOut); + + $this->view->response = $response; + + if(!isset($response["error"])) { + $this->createUpdateResponse($pl); + } + } + catch (PlaylistNotFoundException $e) { + Logging::log("Playlist not found"); + $this->changePlaylist(null); + $this->createFullResponse(null); + } + catch (Exception $e) { + Logging::log("{$e->getFile()}"); + Logging::log("{$e->getLine()}"); + Logging::log("{$e->getMessage()}"); + } + } + + public function setFadeAction() + { + $id = $this->_getParam('id'); + $fadeIn = $this->_getParam('fadeIn', null); + $fadeOut = $this->_getParam('fadeOut', null); + + try { + $pl = $this->getPlaylist(); + $response = $pl->changeFadeInfo($id, $fadeIn, $fadeOut); + + $this->view->response = $response; + + if (!isset($response["error"])) { + $this->createUpdateResponse($pl); + } + } + catch (PlaylistNotFoundException $e) { + Logging::log("Playlist not found"); + $this->changePlaylist(null); + $this->createFullResponse(null); + } + catch (Exception $e) { + Logging::log("{$e->getFile()}"); + Logging::log("{$e->getLine()}"); + Logging::log("{$e->getMessage()}"); + } + } + + public function getPlaylistFadesAction() + { + try { + $pl = $this->getPlaylist(); + $fades = $pl->getFadeInfo(0); + $this->view->fadeIn = $fades[0]; + + $fades = $pl->getFadeInfo($pl->getSize()-1); + $this->view->fadeOut = $fades[1]; + } + catch (PlaylistNotFoundException $e) { + Logging::log("Playlist not found"); + $this->changePlaylist(null); + $this->createFullResponse(null); + } + catch (Exception $e) { + Logging::log("{$e->getFile()}"); + Logging::log("{$e->getLine()}"); + Logging::log("{$e->getMessage()}"); + } } /** @@ -377,32 +322,23 @@ class PlaylistController extends Zend_Controller_Action **/ public function setPlaylistFadesAction() { - $request = $this->getRequest(); - $pl = $this->getPlaylist(); - if($pl === false){ - $this->view->playlist_error = true; - return false; + $fadeIn = $this->_getParam('fadeIn', null); + $fadeOut = $this->_getParam('fadeOut', null); + + try { + $pl = $this->getPlaylist(); + $pl->setPlaylistfades($fadeIn, $fadeOut); + } + catch (PlaylistNotFoundException $e) { + Logging::log("Playlist not found"); + $this->changePlaylist(null); + $this->createFullResponse(null); + } + catch (Exception $e) { + Logging::log("{$e->getFile()}"); + Logging::log("{$e->getLine()}"); + Logging::log("{$e->getMessage()}"); } - - if($request->isPost()) { - $fadeIn = $this->_getParam('fadeIn', null); - $fadeOut = $this->_getParam('fadeOut', null); - - if($fadeIn) - $response = $pl->changeFadeInfo(0, $fadeIn, $fadeOut); - else if($fadeOut) - $response = $pl->changeFadeInfo($pl->getSize(), $fadeIn, $fadeOut); - - $this->view->response = $response; - - return; - } - - $fades = $pl->getFadeInfo(0); - $this->view->fadeIn = $fades[0]; - - $fades = $pl->getFadeInfo($pl->getSize()); - $this->view->fadeOut = $fades[1]; } public function setPlaylistNameAction() diff --git a/airtime_mvc/application/controllers/ScheduleController.php b/airtime_mvc/application/controllers/ScheduleController.php index efa204b03..eeb64a181 100644 --- a/airtime_mvc/application/controllers/ScheduleController.php +++ b/airtime_mvc/application/controllers/ScheduleController.php @@ -45,7 +45,7 @@ class ScheduleController extends Zend_Controller_Action $this->view->headScript()->appendFile($baseUrl.'/js/datatables/js/jquery.dataTables.js?'.filemtime($baseDir.'/js/datatables/js/jquery.dataTables.js'),'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'/js/datatables/plugin/dataTables.pluginAPI.js?'.filemtime($baseDir.'/js/datatables/plugin/dataTables.pluginAPI.js'),'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'/js/fullcalendar/fullcalendar.js?'.filemtime($baseDir.'/js/fullcalendar/fullcalendar.js'),'text/javascript'); - $this->view->headScript()->appendFile($baseUrl.'/js/timepicker/jquery.ui.timepicker-0.0.6.js?'.filemtime($baseDir.'/js/timepicker/jquery.ui.timepicker-0.0.6.js'),'text/javascript'); + $this->view->headScript()->appendFile($baseUrl.'/js/timepicker/jquery.ui.timepicker.js?'.filemtime($baseDir.'/js/timepicker/jquery.ui.timepicker.js'),'text/javascript'); $this->view->headScript()->appendFile($baseUrl.'/js/colorpicker/js/colorpicker.js?'.filemtime($baseDir.'/js/colorpicker/js/colorpicker.js'),'text/javascript'); //full-calendar-functions.js requires this variable, so that datePicker widget can be offset to server time instead of client time @@ -68,7 +68,7 @@ class ScheduleController extends Zend_Controller_Action $user = new Application_Model_User($userInfo->id); $this->view->isAdmin = $user->isAdmin(); $this->view->isProgramManager = $user->isUserType('P'); - + $this->view->headScript()->appendScript("var weekStart = ".Application_Model_Preference::GetWeekStartDay().";"); } diff --git a/airtime_mvc/application/controllers/ShowbuilderController.php b/airtime_mvc/application/controllers/ShowbuilderController.php new file mode 100644 index 000000000..dd6134f68 --- /dev/null +++ b/airtime_mvc/application/controllers/ShowbuilderController.php @@ -0,0 +1,128 @@ +_helper->getHelper('AjaxContext'); + $ajaxContext->addActionContext('schedule-move', 'json') + ->addActionContext('schedule-add', 'json') + ->addActionContext('schedule-remove', 'json') + ->addActionContext('builder-feed', 'json') + ->initContext(); + } + + public function indexAction() { + + $this->_helper->layout->setLayout('builder'); + + $this->view->headScript()->appendFile($this->view->baseUrl('/js/airtime/library/events/library_showbuilder.js'),'text/javascript'); + + $this->_helper->actionStack('library', 'library'); + $this->_helper->actionStack('builder', 'showbuilder'); + } + + public function builderAction() { + + $request = $this->getRequest(); + $baseUrl = $request->getBaseUrl(); + + $this->view->headScript()->appendScript("var serverTimezoneOffset = ".date("Z")."; //in seconds"); + $this->view->headScript()->appendFile($baseUrl.'/js/timepicker/jquery.ui.timepicker.js','text/javascript'); + $this->view->headScript()->appendFile($baseUrl.'/js/airtime/showbuilder/builder.js','text/javascript'); + + $this->view->headLink()->appendStylesheet($baseUrl.'/css/jquery.ui.timepicker.css'); + $this->view->headLink()->appendStylesheet($baseUrl.'/css/showbuilder.css'); + + $this->_helper->viewRenderer->setResponseSegment('builder'); + } + + public function builderFeedAction() { + + $request = $this->getRequest(); + $current_time = time(); + + $starts_epoch = $request->getParam("start", $current_time); + //default ends is 24 hours after starts. + $ends_epoch = $request->getParam("end", $current_time + (60*60*24)); + + $startsDT = DateTime::createFromFormat("U", $starts_epoch, new DateTimeZone("UTC")); + $endsDT = DateTime::createFromFormat("U", $ends_epoch, new DateTimeZone("UTC")); + + Logging::log("showbuilder starts {$startsDT->format("Y-m-d H:i:s")}"); + Logging::log("showbuilder ends {$endsDT->format("Y-m-d H:i:s")}"); + + $showBuilder = new Application_Model_ShowBuilder($startsDT, $endsDT); + + $this->view->schedule = $showBuilder->GetItems(); + } + + public function scheduleAddAction() { + + $request = $this->getRequest(); + + $mediaItems = $request->getParam("mediaIds", null); + $scheduledIds = $request->getParam("schedIds", null); + + $json = array(); + + try { + $scheduler = new Application_Model_Scheduler(); + $scheduler->scheduleAfter($scheduledIds, $mediaItems); + + $json["message"]="success... maybe"; + } + catch (Exception $e) { + $json["message"]=$e->getMessage(); + Logging::log($e->getMessage()); + } + + $this->view->data = $json; + } + + public function scheduleRemoveAction() + { + $request = $this->getRequest(); + + $ids = $request->getParam("ids", null); + + $json = array(); + + try { + $scheduler = new Application_Model_Scheduler(); + $scheduler->removeItems($ids); + + $json["message"]="success... maybe"; + } + catch (Exception $e) { + $json["message"]=$e->getMessage(); + Logging::log($e->getMessage()); + } + + $this->view->data = $json; + } + + public function scheduleMoveAction() { + + $request = $this->getRequest(); + + $selectedItem = $request->getParam("selectedItem"); + $afterItem = $request->getParam("afterItem"); + + $json = array(); + + try { + $scheduler = new Application_Model_Scheduler(); + $scheduler->moveItem($selectedItem, $afterItem); + + $json["message"]="success... maybe"; + } + catch (Exception $e) { + $json["message"]=$e->getMessage(); + Logging::log($e->getMessage()); + } + + $this->view->data = $json; + } +} \ No newline at end of file diff --git a/airtime_mvc/application/layouts/scripts/builder.phtml b/airtime_mvc/application/layouts/scripts/builder.phtml new file mode 100644 index 000000000..e9313cd03 --- /dev/null +++ b/airtime_mvc/application/layouts/scripts/builder.phtml @@ -0,0 +1,28 @@ +doctype() ?> + +
+ + headTitle() ?> + headScript() ?> + headLink() ?> + + + +