Merge branch 'devel' of dev.sourcefabric.org:airtime into devel

Conflicts:
	airtime_mvc/application/models/Block.php
This commit is contained in:
James 2012-08-02 16:37:12 -04:00
commit 028e089c82
9 changed files with 193 additions and 55 deletions

View file

@ -126,7 +126,7 @@ class PlaylistController extends Zend_Controller_Action
private function blockDynamic($obj)
{
$this->view->error = "You cannot add tracks to dynamic block.";
$this->view->error = "You cannot add tracks to dynamic blocks.";
$this->createFullResponse($obj);
}
@ -151,6 +151,11 @@ class PlaylistController extends Zend_Controller_Action
Logging::log("{$e->getLine()}");
Logging::log("{$e->getMessage()}");
}
private function playlistDenied($obj) {
$this->view->error = "You cannot add playlists to smart playlists.";
$this->createFullResponse($obj);
}
public function indexAction()
{
@ -306,9 +311,15 @@ class PlaylistController extends Zend_Controller_Action
$obj->addAudioClips($ids, $afterItem, $addType);
} else if ($obj->isStatic()) {
// if the dest is a block object
//check if any items are playlists
foreach($ids as $id) {
if (is_array($id) && isset($id[1]) && $id[1] == 'playlist') {
throw new Exception('playlist to block');
}
}
$obj->addAudioClips($ids, $afterItem, $addType);
} else {
throw new BlockDynamicException;
throw new Exception('track to dynamic');
}
$this->createUpdateResponse($obj);
}
@ -318,11 +329,14 @@ class PlaylistController extends Zend_Controller_Action
catch (PlaylistNotFoundException $e) {
$this->playlistNotFound($obj_type);
}
catch (BlockDynamicException $e) {
$this->blockDynamic($obj);
}
catch (Exception $e) {
$this->playlistUnknownError($e);
if ($e->getMessage() == 'playlist to block') {
$this->playlistDenied($obj);
} else if ($e->getMessage() == 'track to dynamic') {
$this->blockDynamic($obj);
} else {
$this->playlistUnknownError($e);
}
}
}

View file

@ -33,9 +33,14 @@ class WebstreamController extends Zend_Controller_Action
{
$request = $this->getRequest();
Application_Model_Webstream::save($request);
$analysis = Application_Model_Webstream::analyzeFormData($request);
$this->view->statusMessage = "<div class='success'>Webstream saved.</div>";
if (Application_Model_Webstream::isValid($analysis)) {
Application_Model_Webstream::save($request);
$this->view->statusMessage = "<div class='success'>Webstream saved.</div>";
} else {
$this->view->statusMessage = "<div class='errors'>Invalid form values.</div>";
$this->view->analysis = $analysis;
}
}
}

View file

@ -408,9 +408,14 @@ EOT;
foreach ($p_items as $ac) {
Logging::log("Adding audio file {$ac}");
$res = $this->insertBlockElement($this->buildEntry($ac, $pos));
$pos = $pos + 1;
if (is_array($ac) && $ac[1] == 'audioclip') {
$res = $this->insertBlockElement($this->buildEntry($ac[0], $pos));
$pos = $pos + 1;
} elseif (!is_array($ac)) {
$res = $this->insertBlockElement($this->buildEntry($ac, $pos));
$pos = $pos + 1;
}
}
//reset the positions of the remaining items.

View file

@ -75,20 +75,82 @@ class Application_Model_Webstream{
return $leftOvers;
}
/*
Array
(
[controller] => Webstream
[action] => save
[module] => default
[format] => json
[description] => desc
[url] => http://
[length] => 00h 20m
[name] => Default
)
*/
public static function analyzeFormData($request)
{
$valid = array("length" => array(true, ''),
"url" => array(true, ''));
$length = trim($request->getParam("length"));
$result = preg_match("/^([0-9]{1,2})h ([0-5][0-9])m$/", $length, $matches);
if (!$result == 1 || !count($matches) == 3) {
$valid['length'][0] = false;
$valid['length'][1] = 'Length should be of form "00h 00m"';
}
$url = trim($request->getParam("url"));
//simple validator that checks to make sure that the url starts with http(s),
//and that the domain is at least 1 letter long followed by a period.
$result = preg_match("/^(http|https):\/\/.+\./", $url, $matches);
if ($result == 0) {
$valid['url'][0] = false;
$valid['url'][1] = 'URL should be of form "http://www.domain.com/mount"';
}
$name = trim($request->getParam("name"));
if (strlen($name) == 0) {
$valid['name'][0] = false;
$valid['name'][1] = 'Webstream name cannot be empty';
}
return $valid;
}
public static function isValid($analysis)
{
foreach ($analysis as $k => $v) {
if ($v[0] == false) {
return false;
}
}
return true;
}
public static function save($request)
{
Logging::log($request->getParams());
$userInfo = Zend_Auth::getInstance()->getStorage()->read();
Logging::log($userInfo);
$length = trim($request->getParam("length"));
preg_match("/^([0-9]{1,2})h ([0-5][0-9])m$/", $length, $matches);
$hours = $matches[1];
$minutes = $matches[2];
$di = new DateInterval("PT{$hours}H{$minutes}M");
$dblength = $di->format("%H:%I");
$result = preg_match("/^([0-9]{1,2})h ([0-5][0-9])m$/", $length, $matches);
if ($result == 1 && count($matches) == 3) {
$hours = $matches[1];
$minutes = $matches[2];
$di = new DateInterval("PT{$hours}H{$minutes}M");
$dblength = $di->format("%H:%I");
} else {
//This should never happen because we should have already validated
//in the controller
throw new Exception("Invalid date format: $length");
}
#TODO: These should be validated by a Zend Form.
$webstream = new CcWebstream();
$webstream->setDbName($request->getParam("name"));

View file

@ -8,6 +8,7 @@
<input id="pl_lastMod" type="hidden" value="<?php echo $this->ws->getLastModified('U'); ?>"></input>
<div class="status" style="display:none;"></div>
<div class="playlist_title">
<div id="name-error" class="errors" style="display:none;"></div>
<h3 id="ws_name">
<a id="playlist_name_display" contenteditable="true"><?php echo $this->ws->getName(); ?></a>
</h3>
@ -22,10 +23,12 @@
<textarea cols="80" rows="24" id="description" name="description"><?php echo $this->ws->getDescription(); ?></textarea>
</dd>
<dt id="submit-label" style="display: none;">&nbsp;</dt>
<div id="url-error" class="errors" style="display:none;"></div>
<dt id="streamurl-label"><label for="streamurl">Stream URL:</label></dt>
<dd id="streamurl-element">
<input type="text" value="http://" size="40"/>
</dd>
<div id="length-error" class="errors" style="display:none;"></div>
<dt id="streamlength-label"><label for="streamlength">Default Length:</label></dt>
<dd id="streamlength-element">
<input type="text" value="00h 20m"/>

View file

@ -128,11 +128,14 @@ var AIRTIME = (function(AIRTIME){
for (i = 0, length = aData.length; i < length; i++) {
temp = aData[i];
if (temp.ftype === "audioclip" || temp.ftype === "block") {
aMediaIds.push(temp.id);
aMediaIds.push(new Array (temp.id, temp.ftype));
}
}
AIRTIME.playlist.fnAddItems(aMediaIds, undefined, 'after');
if (aMediaIds.length > 0) {
AIRTIME.playlist.fnAddItems(aMediaIds, undefined, 'after');
} else {
alert('You cannot add playlists to smart playlists');
}
});
//delete from library.

View file

@ -642,7 +642,7 @@ var AIRTIME = (function(AIRTIME) {
//delete through the playlist controller, will reset
//playlist screen if this is the currently edited playlist.
if (data.ftype === "playlist" && screen === "playlist") {
if ((data.ftype === "playlist" || data.ftype === "block") && screen === "playlist") {
callback = function() {
if (confirm('Are you sure you want to delete the selected item?')) {

View file

@ -533,15 +533,30 @@ var AIRTIME = (function(AIRTIME){
var streamurl = $pl.find("#streamurl-element input").val();
var length = $pl.find("#streamlength-element input").val();
var name = $pl.find("#playlist_name_display").text();
//hide any previous errors (if any)
$("#side_playlist .errors").empty().hide();
var url = 'Webstream/save';
$.post(url,
{format: "json", description: description, url:streamurl, length: length, name: name},
function(json){
var $status = $("#side_playlist .status");
$status.html(json.statusMessage);
$status.show();
setTimeout(function(){$status.fadeOut("slow", function(){$status.empty()})}, 5000);
if (json.analysis){
for (var s in json.analysis){
var field = json.analysis[s];
if (!field[0]) {
var elemId = "#"+s+"-error";
var $div = $("#side_playlist " + elemId).text(field[1]).show();
}
}
} else {
var $status = $("#side_playlist .status");
$status.html(json.statusMessage);
$status.show();
setTimeout(function(){$status.fadeOut("slow", function(){$status.empty()})}, 5000);
}
});