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

This commit is contained in:
Yuchen Wang 2011-11-23 16:17:40 -05:00
commit 980c8b2fae
5 changed files with 115 additions and 102 deletions

View file

@ -371,9 +371,11 @@ class ApiController extends Zend_Controller_Action
}
$upload_dir = ini_get("upload_tmp_dir");
Application_Model_StoredFile::uploadFile($upload_dir);
$tempFilePath = Application_Model_StoredFile::uploadFile($upload_dir);
$tempFileName = basename($tempFilePath);
$fileName = isset($_REQUEST["name"]) ? $_REQUEST["name"] : '';
Application_Model_StoredFile::copyFileToStor($upload_dir, $fileName);
Application_Model_StoredFile::copyFileToStor($upload_dir, $fileName, $tempFileName);
}
public function uploadRecordedAction()

View file

@ -26,15 +26,17 @@ class PluploadController extends Zend_Controller_Action
public function uploadAction()
{
$upload_dir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload";
Application_Model_StoredFile::uploadFile($upload_dir);
$tempFilePath = Application_Model_StoredFile::uploadFile($upload_dir);
$tempFileName = basename($tempFilePath);
die('{"jsonrpc" : "2.0"}');
die('{"jsonrpc" : "2.0", "tempfilepath" : "'.$tempFileName.'" }');
}
public function copyfileAction(){
$upload_dir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload";
$filename = $this->_getParam('name');
Application_Model_StoredFile::copyFileToStor($upload_dir, $filename);
$tempname = $this->_getParam('tempname');
Application_Model_StoredFile::copyFileToStor($upload_dir, $filename, $tempname);
die('{"jsonrpc" : "2.0"}');
}

View file

@ -468,13 +468,13 @@ class Application_Model_Show {
return "";
} else {
$row = $rows[0];
$dt = new DateTime($row["first_show"]." ".$row["start_time"], new DateTimeZone($row["timezone"]));
$dt->setTimezone(new DateTimeZone("UTC"));
return $dt->format("Y-m-d");
}
}
/**
* Get the start time of the current show in UTC timezone.
*
@ -673,34 +673,34 @@ class Application_Model_Show {
return $days;
}
/* Only used for shows that aren't repeating.
*
/* Only used for shows that aren't repeating.
*
* @return Boolean: true if show has an instance, otherwise false. */
public function hasInstance(){
return (!is_null($this->getInstance()));
}
/* Only used for shows that aren't repeating.
*
* @return CcShowInstancesQuery: An propel object representing a
/* Only used for shows that aren't repeating.
*
* @return CcShowInstancesQuery: An propel object representing a
* row in the cc_show_instances table. */
public function getInstance(){
$showInstance = CcShowInstancesQuery::create()
->filterByDbShowId($this->getId())
->findOne();
return $showInstance;
}
/* Only used for shows that are repeating. Note that this will return
* true even for dates that only have a "modified" show instance (does not
* true even for dates that only have a "modified" show instance (does not
* check if the "modified_instance" column is set to true). This is intended
* behaviour.
*
* @param $p_dateTime: Date for which we are checking if instance
* behaviour.
*
* @param $p_dateTime: Date for which we are checking if instance
* exists.
*
* @return Boolean: true if show has an instance on $p_dateTime,
*
* @return Boolean: true if show has an instance on $p_dateTime,
* otherwise false. */
public function hasInstanceOnDate($p_dateTime){
return (!is_null($this->getInstanceOnDate($p_dateTime)));
@ -710,10 +710,10 @@ class Application_Model_Show {
/* Only used for shows that are repeating. Note that this will return
* shows that have been "modified" (does not check if the "modified_instance"
* column is set to true). This is intended behaviour.
*
*
* @param $p_dateTime: Date for which we are getting an instance.
*
* @return CcShowInstancesQuery: An propel object representing a
*
* @return CcShowInstancesQuery: An propel object representing a
* row in the cc_show_instances table. */
public function getInstanceOnDate($p_dateTime){
global $CC_DBC;
@ -1071,16 +1071,13 @@ class Application_Model_Show {
$timezone = $p_showRow["timezone"];
$start = $first_show." ".$start_time;
$utcStartDateTime = Application_Model_DateHelper::ConvertToUtcDateTime($start, $timezone);
//start & end UTC DateTimes for the show.
list($utcStartDateTime, $utcEndDateTime) = Application_Model_Show::createUTCStartEndDateTime($start, $duration, $timezone);
if ($utcStartDateTime->getTimestamp() < $p_dateTime->getTimestamp()) {
$utcStart = $utcStartDateTime->format("Y-m-d H:i:s");
$sql = "SELECT timestamp '{$utcStart}' + interval '{$duration}'";
$utcEndDateTime = new DateTime($CC_DBC->GetOne($sql), new DateTimeZone("UTC"));
$date = new Application_Model_DateHelper();
$currentUtcTimestamp = $date->getUtcTimestamp();
$currentUtcTimestamp = gmdate("Y-m-d H:i:s");
$show = new Application_Model_Show($show_id);
if ($show->hasInstance()){
@ -1141,8 +1138,7 @@ class Application_Model_Show {
$record = $p_showRow["record"];
$timezone = $p_showRow["timezone"];
$date = new Application_Model_DateHelper();
$currentUtcTimestamp = $date->getUtcTimestamp();
$currentUtcTimestamp = gmdate("Y-m-d H:i:s");
if(isset($next_pop_date)) {
$start = $next_pop_date." ".$start_time;
@ -1162,9 +1158,7 @@ class Application_Model_Show {
while($utcStartDateTime->getTimestamp() <= $p_dateTime->getTimestamp()
&& (is_null($utcLastShowDateTime) || $utcStartDateTime->getTimestamp() < $utcLastShowDateTime->getTimestamp())){
$utcStart = $utcStartDateTime->format("Y-m-d H:i:s");
$sql = "SELECT timestamp '{$utcStart}' + interval '{$duration}'";
$utcEndDateTime = new DateTime($CC_DBC->GetOne($sql), new DateTimeZone("UTC"));
list($utcStartDateTime, $utcEndDateTime) = Application_Model_Show::createUTCStartEndDateTime($start, $duration, $timezone);
if ($show->hasInstanceOnDate($utcStartDateTime)){
$ccShowInstance = $show->getInstanceOnDate($utcStartDateTime);
@ -1199,25 +1193,25 @@ class Application_Model_Show {
if ($p_interval == 'P1M'){
/* When adding months, there is a problem if we are on January 31st and add one month with PHP.
/* When adding months, there is a problem if we are on January 31st and add one month with PHP.
* What ends up happening is that since February 31st doesn't exist, the date returned is
* March 3rd. For now let's ignore the day and assume we are always working with the
* first of each month, and use PHP to add 1 month to this (this will take care of rolling
* over the years 2011->2012, etc.). Then let's append the actual day, and use the php
* over the years 2011->2012, etc.). Then let's append the actual day, and use the php
* checkdate() function, to see if it is valid. If not, then we'll just skip this month. */
$startDt = new DateTime($start, new DateTimeZone($timezone));
/* pass in only the year and month (not the day) */
$dt = new DateTime($startDt->format("Y-m"), new DateTimeZone($timezone));
/* Keep adding 1 month, until we find the next month that contains the day
* we are looking for (31st day for example) */
do {
$dt->add(new DateInterval($p_interval));
} while(!checkdate($dt->format("m"), $startDt->format("d"), $dt->format("Y")));
$dt->setDate($dt->format("Y"), $dt->format("m"), $startDt->format("d"));
$start = $dt->format("Y-m-d H:i:s");
$dt->setTimezone(new DateTimeZone('UTC'));
@ -1236,49 +1230,78 @@ class Application_Model_Show {
Application_Model_Show::setNextPop($start, $show_id, $day);
}
/*
* @param $p_start
* timestring format "Y-m-d H:i:s" (not UTC)
* @param $p_duration
* string time interval (h)h:(m)m(:ss)
* @param $p_timezone
* string "Europe/Prague"
* @param $p_offset
* array (days, hours, mins) used for rebroadcast shows.
*
* @return
* array of 2 DateTime objects, start/end time of the show in UTC.
*/
private static function createUTCStartEndDateTime($p_start, $p_duration, $p_timezone=null, $p_offset=null)
{
$timezone = $p_timezone ? $p_timezone : date_default_timezone_get();
$startDateTime = new DateTime($p_start, new DateTimeZone($timezone));
if (isset($p_offset)) {
$startDateTime->add(new DateInterval("P{$p_offset["days"]}DT{$p_offset["hours"]}H{$p_offset["mins"]}M"));
}
//convert time to UTC
$startDateTime->setTimezone(new DateTimeZone('UTC'));
$endDateTime = clone $startDateTime;
$duration = explode(":", $p_duration);
list($hours, $mins) = array_slice($duration, 0, 2);
$endDateTime->add(new DateInterval("PT{$hours}H{$mins}M"));
return array($startDateTime, $endDateTime);
}
/* Create rebroadcast instances for a created show marked for recording
*
* @param $p_rebroadcasts rows gotten from the db table cc_show_rebroadcasts, tells airtime when to schedule the rebroadcasts.
* @param $p_currentUtcTimestamp a timestring in format "Y-m-d H:i:s", current UTC time.
* @param $p_showId int of the show it belongs to (from cc_show)
* @param $p_showInstanceId the instance id of the created recorded show instance
* @param $p_rebroadcasts
* rows gotten from the db table cc_show_rebroadcasts, tells airtime when to schedule the rebroadcasts.
* @param $p_currentUtcTimestamp
* a timestring in format "Y-m-d H:i:s", current UTC time.
* @param $p_showId
* int of the show it belongs to (from cc_show)
* @param $p_showInstanceId
* the instance id of the created recorded show instance
* (from cc_show_instances), used to associate rebroadcasts to this show.
* @param $p_startTime a timestring in format "Y-m-d H:i:s" in the timezone, not UTC of the rebroadcasts' parent recorded show.
* @param $p_duration duration of the show in format 1:0
* @param $p_timezone string of user's timezone "Europe/Prague"
* @param $p_startTime
* a timestring in format "Y-m-d H:i:s" in the timezone, not UTC of the rebroadcasts' parent recorded show.
* @param $p_duration
* string time interval (h)h:(m)m:(ss) length of the show.
* @param $p_timezone
* string of user's timezone "Europe/Prague"
*
*/
private static function createRebroadcastInstances($p_rebroadcasts, $p_currentUtcTimestamp, $p_showId, $p_showInstanceId, $p_startTime, $p_duration, $p_timezone=null){
global $CC_DBC;
Logging::log('Count of rebroadcasts '. count($p_rebroadcasts));
//Y-m-d
//use only the date part of the show start time stamp for the offsets to work properly.
$date = explode(" ", $p_startTime);
$start_date = $date[0];
foreach($p_rebroadcasts as $rebroadcast) {
//use only the date part of the show start time stamp for the offsets to work properly.
$sql = "SELECT date '{$p_startTime}' + interval '{$rebroadcast["day_offset"]}' + interval '{$rebroadcast["start_time"]}'";
$rebroadcast_start_time = $CC_DBC->GetOne($sql);
Logging::log('rebroadcast start '.$rebroadcast_start_time);
$days = explode(" ", $rebroadcast["day_offset"]);
$time = explode(":", $rebroadcast["start_time"]);
$offset = array("days"=>$days[0], "hours"=>$time[0], "mins"=>$time[1]);
$sql = "SELECT timestamp '{$rebroadcast_start_time}' + interval '{$p_duration}'";
$rebroadcast_end_time = $CC_DBC->GetOne($sql);
Logging::log('rebroadcast end '.$rebroadcast_end_time);
list($utcStartDateTime, $utcEndDateTime) = Application_Model_Show::createUTCStartEndDateTime($start_date, $p_duration, $p_timezone, $offset);
//convert to UTC, after we have used the defined offsets to calculate rebroadcasts.
$utc_rebroadcast_start_time = Application_Model_DateHelper::ConvertToUtcDateTime($rebroadcast_start_time, $p_timezone);
$utc_rebroadcast_end_time = Application_Model_DateHelper::ConvertToUtcDateTime($rebroadcast_end_time, $p_timezone);
Logging::log('UTC rebroadcast start '.$utc_rebroadcast_start_time->format("Y-m-d H:i:s"));
Logging::log('UTC rebroadcast end '.$utc_rebroadcast_end_time->format("Y-m-d H:i:s"));
Logging::log('Current UTC timestamp '.$p_currentUtcTimestamp);
if ($utc_rebroadcast_start_time->format("Y-m-d H:i:s") > $p_currentUtcTimestamp){
Logging::log('Creating rebroadcast show starting at UTC '.$utc_rebroadcast_start_time->format("Y-m-d H:i:s"));
if ($utcStartDateTime->format("Y-m-d H:i:s") > $p_currentUtcTimestamp){
$newRebroadcastInstance = new CcShowInstances();
$newRebroadcastInstance->setDbShowId($p_showId);
$newRebroadcastInstance->setDbStarts($utc_rebroadcast_start_time->format("Y-m-d H:i:s"));
$newRebroadcastInstance->setDbEnds($utc_rebroadcast_end_time->format("Y-m-d H:i:s"));
$newRebroadcastInstance->setDbStarts($utcStartDateTime);
$newRebroadcastInstance->setDbEnds($utcEndDateTime);
$newRebroadcastInstance->setDbRecord(0);
$newRebroadcastInstance->setDbRebroadcast(1);
$newRebroadcastInstance->setDbOriginalShow($p_showInstanceId);
@ -1552,7 +1575,7 @@ class Application_Model_Show {
." AND si.starts >= TIMESTAMP '$timeStart'"
." AND si.starts < TIMESTAMP $timeEnd"
." ORDER BY si.starts";
// defaults to retrieve all shows within the interval if $limit not set
if($limit != 0) {
$sql = $sql . " LIMIT $limit";

View file

@ -809,10 +809,18 @@ class Application_Model_StoredFile {
if (isset($_SERVER["CONTENT_TYPE"]))
$contentType = $_SERVER["CONTENT_TYPE"];
// create temp file name (CC-3086)
$command = "mktemp --tmpdir=".$p_targetDir;
$tempFilePath= exec($command);
if($tempFilePath == ""){
die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Unable to create tmp file."}, "id" : "id"}');
}
if (strpos($contentType, "multipart") !== false) {
if (isset($_FILES['file']['tmp_name']) && is_uploaded_file($_FILES['file']['tmp_name'])) {
// Open temp file
$out = fopen($p_targetDir . DIRECTORY_SEPARATOR . $fileName, $chunk == 0 ? "wb" : "ab");
$out = fopen($tempFilePath, $chunk == 0 ? "wb" : "ab");
if ($out) {
// Read binary input stream and append it to temp file
$in = fopen($_FILES['file']['tmp_name'], "rb");
@ -831,7 +839,7 @@ class Application_Model_StoredFile {
die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}');
} else {
// Open temp file
$out = fopen($p_targetDir . DIRECTORY_SEPARATOR . $fileName, $chunk == 0 ? "wb" : "ab");
$out = fopen($tempFilePath, $chunk == 0 ? "wb" : "ab");
if ($out) {
// Read binary input stream and append it to temp file
$in = fopen("php://input", "rb");
@ -846,34 +854,12 @@ class Application_Model_StoredFile {
} else
die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
}
/*$audio_file = $p_targetDir . DIRECTORY_SEPARATOR . $fileName;
$md5 = md5_file($audio_file);
$duplicate = Application_Model_StoredFile::RecallByMd5($md5);
if ($duplicate) {
if (PEAR::isError($duplicate)) {
die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": ' . $duplicate->getMessage() .'}}');
}
if (file_exists($duplicate->getFilePath())) {
$duplicateName = $duplicate->getMetadataValue('MDATA_KEY_TITLE');
die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "An identical audioclip named ' . $duplicateName . ' already exists in the storage server."}}');
}
}
$storDir = Application_Model_MusicDir::getStorDir();
$stor = $storDir->getDirectory();
$stor .= "/organize";
$audio_stor = $stor . DIRECTORY_SEPARATOR . $fileName;
$r = @copy($audio_file, $audio_stor);*/
return $tempFilePath;
}
public static function copyFileToStor($p_targetDir, $fileName){
$audio_file = $p_targetDir . DIRECTORY_SEPARATOR . $fileName;
public static function copyFileToStor($p_targetDir, $fileName, $tempname){
$audio_file = $p_targetDir . DIRECTORY_SEPARATOR . $tempname;
Logging::log('copyFileToStor: moving file '.$audio_file);
$md5 = md5_file($audio_file);
$duplicate = Application_Model_StoredFile::RecallByMd5($md5);
@ -895,7 +881,7 @@ class Application_Model_StoredFile {
$audio_stor = $stor . DIRECTORY_SEPARATOR . $fileName;
$r = @copy($audio_file, $audio_stor);
//$r = @unlink($audio_file);
$r = @unlink($audio_file);
}
public static function getFileCount()

View file

@ -16,16 +16,16 @@ $(document).ready(function() {
uploader.bind('FileUploaded', function(up, file, json) {
var j = jQuery.parseJSON(json.response);
if(j.error !== undefined) {
if(j.error !== undefined) {
var row = $("<tr/>")
.append('<td>' + file.name +'</td>')
.append('<td>' + j.error.message + '</td>');
$("#plupload_error").find("table").append(row);
}else{
$.get('/Plupload/copyfile/format/json/name/'+encodeURIComponent(file.name), function(json){
var tempFileName = j.tempfilepath;
$.get('/Plupload/copyfile/format/json/name/'+encodeURIComponent(file.name)+'/tempname/'+encodeURIComponent(tempFileName), function(json){
var jr = jQuery.parseJSON(json);
if(jr.error !== undefined) {
var row = $("<tr/>")