From b53bc36f4f6e077b5c42c597c40b4a0cee08f9f9 Mon Sep 17 00:00:00 2001 From: Martin Konecny Date: Thu, 9 Aug 2012 14:39:31 -0400 Subject: [PATCH 1/2] CC-1665: Scheduled stream rebroadcasting and recording -ability to preview webstreams --- .../controllers/AudiopreviewController.php | 24 ++++++++++++++++--- airtime_mvc/application/models/StoredFile.php | 7 +++++- .../scripts/audiopreview/audio-preview.phtml | 4 ++-- .../airtime/audiopreview/preview_jplayer.js | 17 ++++++------- .../public/js/airtime/common/common.js | 12 ++++------ .../public/js/airtime/library/library.js | 6 +++-- 6 files changed, 47 insertions(+), 23 deletions(-) diff --git a/airtime_mvc/application/controllers/AudiopreviewController.php b/airtime_mvc/application/controllers/AudiopreviewController.php index 478b7ef19..af8b8c283 100644 --- a/airtime_mvc/application/controllers/AudiopreviewController.php +++ b/airtime_mvc/application/controllers/AudiopreviewController.php @@ -24,15 +24,22 @@ class AudiopreviewController extends Zend_Controller_Action $audioFileID = $this->_getParam('audioFileID'); $audioFileArtist = $this->_getParam('audioFileArtist'); $audioFileTitle = $this->_getParam('audioFileTitle'); + $type = $this->_getParam('type'); $request = $this->getRequest(); $baseUrl = $request->getBaseUrl(); + $baseDir = dirname($_SERVER['SCRIPT_FILENAME']); - $this->view->headScript()->appendFile($baseUrl.'/js/airtime/audiopreview/preview_jplayer.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); - $this->view->headScript()->appendFile($baseUrl.'/js/jplayer/jplayer.playlist.min.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); - $this->view->headLink()->appendStylesheet($baseUrl.'/js/jplayer/skin/jplayer.airtime.audio.preview.css?'.$CC_CONFIG['airtime_version']); + $this->view->headScript()->appendFile( + $baseUrl.'/js/airtime/audiopreview/preview_jplayer.js?'.$CC_CONFIG['airtime_version'], + 'text/javascript'); + $this->view->headScript()->appendFile( + $baseUrl.'/js/jplayer/jplayer.playlist.min.js?'.$CC_CONFIG['airtime_version'], + 'text/javascript'); + $this->view->headLink()->appendStylesheet( + $baseUrl.'/js/jplayer/skin/jplayer.airtime.audio.preview.css?'.$CC_CONFIG['airtime_version']); $this->_helper->layout->setLayout('audioPlayer'); $logo = Application_Model_Preference::GetStationLogo(); @@ -41,6 +48,17 @@ class AudiopreviewController extends Zend_Controller_Action } else { $this->view->logo = "$baseUrl/css/images/airtime_logo_jp.png"; } + + if ($type == "audioclip") { + $uri = "/api/get-media/file/".$audioFileID; + } else if ($type == "stream") { + $webstream = CcWebstreamQuery::create()->findPk($audioFileID); + $uri = $webstream->getDbUrl(); + } else { + throw new Exception("Unknown type for audio preview!"); + } + + $this->view->uri = $uri; $this->view->audioFileID = $audioFileID; $this->view->audioFileArtist = $audioFileArtist; $this->view->audioFileTitle = $audioFileTitle; diff --git a/airtime_mvc/application/models/StoredFile.php b/airtime_mvc/application/models/StoredFile.php index a945324c1..62c900907 100644 --- a/airtime_mvc/application/models/StoredFile.php +++ b/airtime_mvc/application/models/StoredFile.php @@ -641,6 +641,11 @@ class Application_Model_StoredFile $blSelect[] = "NULL::int AS ".$key; $fileSelect[] = $key; $streamSelect[] = "NULL::int AS ".$key; + } else if ($key === "filepath") { + $plSelect[] = "NULL::VARCHAR AS ".$key; + $blSelect[] = "NULL::VARCHAR AS ".$key; + $fileSelect[] = $key; + $streamSelect[] = "url AS ".$key; } else { $plSelect[] = "NULL::text AS ".$key; $blSelect[] = "NULL::text AS ".$key; @@ -719,13 +724,13 @@ class Application_Model_StoredFile //datatable stuff really needs to be pulled out and generalized within the project //access to zend view methods to access url helpers is needed. - Logging::log($type); if ($type == "au") { $row['audioFile'] = $row['id'].".".pathinfo($row['filepath'], PATHINFO_EXTENSION); $row['image'] = ''; } else if ($type == "pl") { $row['image'] = ''; } else if ($type == "st") { + $row['audioFile'] = $row['id']; $row['image'] = ''; } else if ($type == "bl") { $row['image'] = ''; diff --git a/airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml b/airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml index d440d96ca..447157a16 100644 --- a/airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml +++ b/airtime_mvc/application/views/scripts/audiopreview/audio-preview.phtml @@ -6,8 +6,8 @@ blockId)): ?> blockId" ?> blockIndex" ?> -audioFileID)): ?> - audioFileID" ?> +uri)): ?> + uri" ?> audioFileTitle" ?> audioFileArtist" ?> showID)): ?> diff --git a/airtime_mvc/public/js/airtime/audiopreview/preview_jplayer.js b/airtime_mvc/public/js/airtime/audiopreview/preview_jplayer.js index dcc33f11d..2feca14a1 100644 --- a/airtime_mvc/public/js/airtime/audiopreview/preview_jplayer.js +++ b/airtime_mvc/public/js/airtime/audiopreview/preview_jplayer.js @@ -35,7 +35,8 @@ $(document).ready(function(){ $.jPlayer.timeFormat.showHour = true; - var audioFileID = $('.audioFileID').text(); + var audioUri = $('.audioUri').text(); + //var audioFileID = $('.audioFileID').text(); var playlistID = $('.playlistID').text(); var playlistIndex = $('.playlistIndex').text(); var showID = $('.showID').text(); @@ -47,8 +48,8 @@ $(document).ready(function(){ if (playlistID != "" && playlistID !== ""){ playAllPlaylist(playlistID, playlistIndex); - }else if (audioFileID != "") { - playOne(audioFileID); + }else if (audioUri != "") { + playOne(audioUri); }else if (showID != "") { playAllShow(showID, showIndex); }else if(blockId != "" && blockIndex != ""){ @@ -179,18 +180,18 @@ function play(p_playlistIndex){ * Playing one audio track occurs from the library. This function will create the media, setup * jplayer and play the track. */ -function playOne(p_audioFileID) { +function playOne(uri) { var playlist = new Array(); - var fileExtension = p_audioFileID.split('.').pop(); + var fileExtension = uri.split('.').pop(); if (fileExtension.toLowerCase() === 'mp3') { media = {title: $('.audioFileTitle').text() !== 'null' ?$('.audioFileTitle').text():"", artist: $('.audioFileArtist').text() !== 'null' ?$('.audioFileArtist').text():"", - mp3:"/api/get-media/file/"+p_audioFileID + mp3:uri }; - }else if (fileExtension.toLowerCase() === 'ogg' ) { + } else if (fileExtension.toLowerCase() === 'ogg' ) { media = {title: $('.audioFileTitle').text() != 'null' ?$('.audioFileTitle').text():"", artist: $('.audioFileArtist').text() != 'null' ?$('.audioFileArtist').text():"", - oga:"/api/get-media/file/"+p_audioFileID + oga:uri }; } _playlist_jplayer.option("autoPlay", true); diff --git a/airtime_mvc/public/js/airtime/common/common.js b/airtime_mvc/public/js/airtime/common/common.js index 074c6f267..bd162f980 100644 --- a/airtime_mvc/public/js/airtime/common/common.js +++ b/airtime_mvc/public/js/airtime/common/common.js @@ -43,15 +43,18 @@ function openAudioPreview(p_event) { } } -function open_audio_preview(audioFileID, audioFileTitle, audioFileArtist) { +function open_audio_preview(type, id, audioFileTitle, audioFileArtist) { // we need to remove soundcloud icon from audioFileTitle var index = audioFileTitle.indexOf(" Date: Thu, 9 Aug 2012 16:49:20 -0400 Subject: [PATCH 2/2] CC-1665: Scheduled stream rebroadcasting and recording -ability to preview webstreams inside of playlists --- .../controllers/AudiopreviewController.php | 114 ++++++++++-------- .../airtime/audiopreview/preview_jplayer.js | 34 ++++-- 2 files changed, 85 insertions(+), 63 deletions(-) diff --git a/airtime_mvc/application/controllers/AudiopreviewController.php b/airtime_mvc/application/controllers/AudiopreviewController.php index af8b8c283..7e8150914 100644 --- a/airtime_mvc/application/controllers/AudiopreviewController.php +++ b/airtime_mvc/application/controllers/AudiopreviewController.php @@ -101,49 +101,49 @@ class AudiopreviewController extends Zend_Controller_Action public function blockPreviewAction() { - global $CC_CONFIG; - - $blockIndex = $this->_getParam('blockIndex'); - $blockId = $this->_getParam('blockId'); - - $request = $this->getRequest(); - $baseUrl = $request->getBaseUrl(); - - $baseDir = dirname($_SERVER['SCRIPT_FILENAME']); - - $this->view->headScript()->appendFile($baseUrl.'/js/airtime/audiopreview/preview_jplayer.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); - $this->view->headScript()->appendFile($baseUrl.'/js/jplayer/jplayer.playlist.min.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); - $this->view->headLink()->appendStylesheet($baseUrl.'/js/jplayer/skin/jplayer.airtime.audio.preview.css?'.$CC_CONFIG['airtime_version']); - $this->_helper->layout->setLayout('audioPlayer'); - - $logo = Application_Model_Preference::GetStationLogo(); - if ($logo) { - $this->view->logo = "data:image/png;base64,$logo"; - } else { - $this->view->logo = "$baseUrl/css/images/airtime_logo_jp.png"; - } - $this->view->blockIndex= $blockIndex; - $this->view->blockId = $blockId; - + global $CC_CONFIG; + + $blockIndex = $this->_getParam('blockIndex'); + $blockId = $this->_getParam('blockId'); + + $request = $this->getRequest(); + $baseUrl = $request->getBaseUrl(); + + $baseDir = dirname($_SERVER['SCRIPT_FILENAME']); + + $this->view->headScript()->appendFile($baseUrl.'/js/airtime/audiopreview/preview_jplayer.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); + $this->view->headScript()->appendFile($baseUrl.'/js/jplayer/jplayer.playlist.min.js?'.$CC_CONFIG['airtime_version'],'text/javascript'); + $this->view->headLink()->appendStylesheet($baseUrl.'/js/jplayer/skin/jplayer.airtime.audio.preview.css?'.$CC_CONFIG['airtime_version']); + $this->_helper->layout->setLayout('audioPlayer'); + + $logo = Application_Model_Preference::GetStationLogo(); + if ($logo) { + $this->view->logo = "data:image/png;base64,$logo"; + } else { + $this->view->logo = "$baseUrl/css/images/airtime_logo_jp.png"; + } + $this->view->blockIndex= $blockIndex; + $this->view->blockId = $blockId; + $this->_helper->viewRenderer->setRender('audio-preview'); } public function getBlockAction() { - // disable the view and the layout - $this->view->layout()->disableLayout(); - $this->_helper->viewRenderer->setNoRender(true); - - $blockId = $this->_getParam('blockId'); - - if (!isset($blockId)) { - return; - } - + // disable the view and the layout + $this->view->layout()->disableLayout(); + $this->_helper->viewRenderer->setNoRender(true); + + $blockId = $this->_getParam('blockId'); + + if (!isset($blockId)) { + return; + } + $bl = new Application_Model_Block($blockId); - $result = array(); + $result = array(); foreach ($bl->getContents(true) as $ele) { $result[] = $this->createElementMap($ele); - } + } $this->_helper->json($result); } /** @@ -173,26 +173,40 @@ class AudiopreviewController extends Zend_Controller_Action $result[] = $this->createElementMap($track); } } - }else{ + } else { $result[] = $this->createElementMap($ele); } } $this->_helper->json($result); } - function createElementMap($track){ - $elementMap = array( 'element_title' => isset($track['track_title'])?$track['track_title']:"", - 'element_artist' => isset($track['artist_name'])?$track['artist_name']:"", - 'element_id' => isset($track['id'])?$track['id']:"", - 'element_position' => isset($track['position'])?$track['position']:"", - ); - $fileExtension = pathinfo($track['path'], PATHINFO_EXTENSION); - if (strtolower($fileExtension) === 'mp3') { - $elementMap['element_mp3'] = $track['item_id']; - } else if (strtolower($fileExtension) === 'ogg') { - $elementMap['element_oga'] = $track['item_id']; - } else { - //the media was neither mp3 or ogg + private function createElementMap($track) + { + $elementMap = array( 'element_title' => isset($track['track_title'])?$track['track_title']:"", + 'element_artist' => isset($track['artist_name'])?$track['artist_name']:"", + 'element_id' => isset($track['id'])?$track['id']:"", + 'element_position' => isset($track['position'])?$track['position']:"", + ); + + + $elementMap['type'] = $track['type']; + + if ($track['type'] == 0) { + $fileExtension = pathinfo($track['path'], PATHINFO_EXTENSION); + //type is file + //TODO: use MIME type for this + if (strtolower($fileExtension) === 'mp3') { + $elementMap['element_mp3'] = $track['item_id']; + } else if (strtolower($fileExtension) === 'ogg') { + $elementMap['element_oga'] = $track['item_id']; + } else { + //the media was neither mp3 or ogg + throw new Exception("Unknown file type"); + } + + $elementMap['uri'] = "/api/get-media/file/".$track['item_id']; + } else { + $elementMap['uri'] = $track['path']; } return $elementMap; } diff --git a/airtime_mvc/public/js/airtime/audiopreview/preview_jplayer.js b/airtime_mvc/public/js/airtime/audiopreview/preview_jplayer.js index 2feca14a1..6e0538ada 100644 --- a/airtime_mvc/public/js/airtime/audiopreview/preview_jplayer.js +++ b/airtime_mvc/public/js/airtime/audiopreview/preview_jplayer.js @@ -76,7 +76,7 @@ function playAllPlaylist(p_playlistID, p_playlistIndex) { if ( _idToPostionLookUp !== undefined && viewsPlaylistID == p_playlistID ) { play(p_playlistIndex); - }else { + } else { buildplaylist("/audiopreview/get-playlist/playlistID/"+p_playlistID, p_playlistIndex); } } @@ -87,7 +87,7 @@ function playBlock(p_blockId, p_blockIndex) if ( _idToPostionLookUp !== undefined && viewsBlockId == p_blockId ) { play(p_blockIndex); - }else { + } else { buildplaylist("/audiopreview/get-block/blockId/"+p_blockId, p_blockIndex); } } @@ -124,20 +124,28 @@ function buildplaylist(p_url, p_playIndex) { var index; var total = 0; for(index in data){ - - if (data[index]['element_mp3'] != undefined){ - media = {title: data[index]['element_title'], + + if (data[index]['type'] == 0) { + if (data[index]['element_mp3'] != undefined){ + media = {title: data[index]['element_title'], + artist: data[index]['element_artist'], + mp3:data[index]['uri'] + }; + } else if (data[index]['element_oga'] != undefined) { + media = {title: data[index]['element_title'], + artist: data[index]['element_artist'], + oga:data[index]['uri'] + }; + } + } else if (data[index]['type'] == 1) { + media = {title: data[index]['element_title'], artist: data[index]['element_artist'], - mp3:"/api/get-media/file/"+data[index]['element_mp3'] - }; - }else if (data[index]['element_oga'] != undefined) { - media = {title: data[index]['element_title'], - artist: data[index]['element_artist'], - oga:"/api/get-media/file/"+data[index]['element_oga'] + mp3:data[index]['uri'] }; } - myPlaylist[index] = media; - + if (media) { + myPlaylist[index] = media; + } // we should create a map according to the new position in the player itself // total is the index on the player _idToPostionLookUp[data[index]['element_id']] = total;