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 = "<div class='success'>Webstream saved.</div>"; } else { - throw new Exception(); + throw new Exception("isValid returned false"); } } catch (Exception $e) { - Logging::log($e); $this->view->statusMessage = "<div class='errors'>Invalid form values.</div>"; $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(); } }