diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php
index de175004d..94a214fef 100644
--- a/airtime_mvc/application/controllers/LibraryController.php
+++ b/airtime_mvc/application/controllers/LibraryController.php
@@ -106,9 +106,11 @@ class LibraryController extends Zend_Controller_Action
}
}
if ($isAdminOrPM || $obj->getCreatorId() == $user->getId()) {
- $menu["del"] = array("name"=> "Delete", "icon" => "delete", "url" => "/library/delete");
+ if ($screen == "playlist") {
$menu["edit"] = array("name"=> "Edit", "icon" => "edit", "url" => "/library/edit-file-md/id/{$id}");
}
+ $menu["del"] = array("name"=> "Delete", "icon" => "delete", "url" => "/library/delete");
+ }
}
//SOUNDCLOUD MENU OPTIONS
diff --git a/airtime_mvc/application/controllers/WebstreamController.php b/airtime_mvc/application/controllers/WebstreamController.php
index c7ed7d048..127e23ee2 100644
--- a/airtime_mvc/application/controllers/WebstreamController.php
+++ b/airtime_mvc/application/controllers/WebstreamController.php
@@ -75,16 +75,15 @@ class WebstreamController extends Zend_Controller_Action
return;
}
- $analysis = Application_Model_Webstream::analyzeFormData($parameters);
+ list($analysis, $mime, $di) = Application_Model_Webstream::analyzeFormData($parameters);
try {
if (Application_Model_Webstream::isValid($analysis)) {
- Application_Model_Webstream::save($parameters);
+ Application_Model_Webstream::save($parameters, $mime, $di);
$this->view->statusMessage = "
Webstream saved.
";
} else {
- throw new Exception();
+ throw new Exception("isValid returned false");
}
} catch (Exception $e) {
- Logging::log($e);
$this->view->statusMessage = "Invalid form values.
";
$this->view->analysis = $analysis;
}
diff --git a/airtime_mvc/application/models/Webstream.php b/airtime_mvc/application/models/Webstream.php
index cdbd14af0..702d2c68d 100644
--- a/airtime_mvc/application/models/Webstream.php
+++ b/airtime_mvc/application/models/Webstream.php
@@ -63,7 +63,6 @@ class Application_Model_Webstream{
"login"=> $username,
"url" => $this->webstream->getDbUrl(),
);
-
}
public static function deleteStreams($p_ids, $p_userId)
@@ -97,9 +96,22 @@ class Application_Model_Webstream{
"url" => array(true, ''),
"name" => array(true, ''));
+ $di = null;
$length = $parameters["length"];
- $result = preg_match("/^([0-9]{1,2})h ([0-5][0-9])m$/", $length, $matches);
- if (!$result == 1 || !count($matches) == 3) {
+ $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");
+
+ $totalMinutes = $di->h * 60 + $di->i;
+
+ if ($totalMinutes == 0) {
+ $valid['length'][0] = false;
+ $valid['length'][1] = 'Length needs to be greater than 0 minutes';
+ }
+
+ } else {
$valid['length'][0] = false;
$valid['length'][1] = 'Length should be of form "00h 00m"';
}
@@ -111,11 +123,19 @@ class Application_Model_Webstream{
//and that the domain is at least 1 letter long
$result = preg_match("/^(http|https):\/\/.+/", $url, $matches);
+ $mime = null;
if ($result == 0) {
$valid['url'][0] = false;
- $valid['url'][1] = 'URL should be of form "http://www.domain.com/mount"';
- }
+ $valid['url'][1] = 'URL should be of form "http://domain"';
+ } else {
+ try {
+ $mime = Application_Model_Webstream::discoverStreamMime($url);
+ } catch (Exception $e) {
+ $valid['url'][0] = false;
+ $valid['url'][1] = $e->getMessage();
+ }
+ }
$name = $parameters["name"];
if (strlen($name) == 0) {
@@ -134,7 +154,7 @@ class Application_Model_Webstream{
Logging::log("EDIT");
}
- return $valid;
+ return array($valid, $mime, $di);
}
public static function isValid($analysis)
@@ -148,56 +168,43 @@ class Application_Model_Webstream{
return true;
}
- /*
- * This function is a callback used by curl to let us work
- * with the contents returned from an http request. We don't
- * actually want to work with the contents however (we just want
- * the response headers), so immediately return a -1 in this function
- * which tells curl not to download the response body at all.
- */
- private function writefn($ch, $chunk)
- {
- return -1;
- }
-
- private function discoverStreamMime()
+ private static function discoverStreamMime($url)
{
- Logging::log($this->webstream->getDbUrl());
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $this->webstream->getDbUrl());
- curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
- curl_setopt($ch, CURLOPT_WRITEFUNCTION, array($this, 'writefn'));
- $result = curl_exec($ch);
- $mime = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
- curl_close($ch);
+ $headers = get_headers($url);
+ $mime = null;
+ foreach ($headers as $h) {
+ if (preg_match("/^content-type:/i", $h)) {
+ list(, $value) = explode(":", $h, 2);
+ $mime = trim($value);
+ }
+ if (preg_match("/^content-length:/i", $h)) {
+ //if content-length appears, this is not a web stream!!!!
+ //Aborting the save process.
+ throw new Exception("Invalid webstream - This appears to be a file download.");
+ }
+ }
+
+ if (is_null($mime)) {
+ throw new Exception("No MIME type found for webstream.");
+ } else {
+ if (!preg_match("/(mpeg|ogg)/", $mime)) {
+ throw new Exception("Unrecognized stream type: $mime");
+ }
+ }
- Logging::log($mime);
return $mime;
}
- public static function save($parameters)
+ public static function save($parameters, $mime, $di)
{
$userInfo = Zend_Auth::getInstance()->getStorage()->read();
- $length = $parameters["length"];
- $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");
- }
-
$webstream = new CcWebstream();
$webstream->setDbName($parameters["name"]);
$webstream->setDbDescription($parameters["description"]);
$webstream->setDbUrl($parameters["url"]);
+ $dblength = $di->format("%H:%I");
$webstream->setDbLength($dblength);
$webstream->setDbCreatorId($userInfo->id);
$webstream->setDbUtime(new DateTime("now", new DateTimeZone('UTC')));
@@ -205,12 +212,7 @@ class Application_Model_Webstream{
$ws = new Application_Model_Webstream($webstream);
- $mime = $ws->discoverStreamMime();
- if ($mime !== false) {
- $webstream->setDbMime($mime);
- } else {
- throw new Exception("Couldn't get MIME type!");
- }
+ $webstream->setDbMime($mime);
$webstream->save();
}
}