From 488dad1fd94d8329fbd78207494700389af8ad69 Mon Sep 17 00:00:00 2001 From: paul Date: Sun, 21 Jan 2007 03:31:19 +0000 Subject: [PATCH] Cleaned up BasicStor::bsPutFile()/StoredFile::Insert() by making a better set of more extensible parameters. This allowed me to pass in the MD5 and MIME type values, which means those values do not have to be re-calculated when this function is called. This means adding files will be faster now (each calculation of an MD5 value is .25 of a second on my machine). Added a cache to the Metadata class (this class needs serious cleaning up), so that you only have to do one database call and the rest of the time you just use the cache. The number of calls to getMetadataValue() should speedups due to this. Merged the LsPlaylist class into the Playlist class. Importing through the import script and web interface now reads the COMMENT tag and the COMPOSER tag (bug #2108). Moved from using (ls:genre) to (dc:type) for the metadata label for genre and added to the upgrade script to take this into account. Fixed bug in StoredFile::Recall() so that Playlists work again, added an MD5 parameter for this function so that all the Recall functions work in the same way, changed the return value to NULL if the Recall function does not find the record. Made a lot of code more readable and easier to debug. Added StoredFile::getGunid(). --- .../src/modules/archiveServer/var/Archive.php | 31 +- campcaster/src/modules/htmlUI/var/Input.php | 187 +++ .../htmlUI/var/formmask/metadata.inc.php | 2 +- .../modules/htmlUI/var/html/ui_handler.php | 9 +- .../htmlUI/var/templates/file/edit.tpl | 4 +- .../src/modules/htmlUI/var/ui_base.inc.php | 9 +- .../modules/htmlUI/var/ui_browser.class.php | 14 +- .../modules/htmlUI/var/ui_handler.class.php | 87 +- .../storageAdmin/var/campcaster-import.php | 45 +- .../src/modules/storageAdmin/var/restore.php | 11 +- .../modules/storageServer/var/BasicStor.php | 224 +-- .../modules/storageServer/var/DataEngine.php | 10 +- .../modules/storageServer/var/GreenBox.php | 49 +- .../src/modules/storageServer/var/LocStor.php | 17 +- .../modules/storageServer/var/LsPlaylist.php | 599 ------- .../modules/storageServer/var/MetaData.php | 315 ++-- .../modules/storageServer/var/Playlist.php | 1381 +++++++++++------ .../modules/storageServer/var/Renderer.php | 23 +- .../src/modules/storageServer/var/Restore.php | 17 +- .../storageServer/var/SmilPlaylist.php | 2 +- .../modules/storageServer/var/StoredFile.php | 579 +++---- .../modules/storageServer/var/Transport.php | 33 +- .../modules/storageServer/var/Validator.php | 3 +- .../var/install/upgrade/upgrade-to-1.2.0.php | 4 + .../storageServer/var/tests/transTest.php | 17 +- .../storageServer/var/tests/webstreamTest.php | 2 +- 26 files changed, 1904 insertions(+), 1770 deletions(-) create mode 100644 campcaster/src/modules/htmlUI/var/Input.php delete mode 100644 campcaster/src/modules/storageServer/var/LsPlaylist.php diff --git a/campcaster/src/modules/archiveServer/var/Archive.php b/campcaster/src/modules/archiveServer/var/Archive.php index ea586a4ee..f18b16ef1 100644 --- a/campcaster/src/modules/archiveServer/var/Archive.php +++ b/campcaster/src/modules/archiveServer/var/Archive.php @@ -89,12 +89,18 @@ class Archive extends XR_LocStor { if (PEAR::isError($parid)) { return $parid; } - $res = $this->bsPutFile($parid, $pars['name'], - $fname, $mdfname, - $pars['gunid'], 'audioclip', 'file'); - if (PEAR::isError($res)) { - return $res; + $values = array( + "filename" => $pars['name'], + "filepath" => $fname, + "metadata" => $mdfname, + "gunid" => $pars['gunid'], + "filetype" => "audioclip" + ); + $storedFile = $this->bsPutFile($parid, $values); + if (PEAR::isError($storedFile)) { + return $storedFile; } + $res = $storedFile->getId(); @unlink($fname); @unlink($mdfname); break; @@ -106,12 +112,17 @@ class Archive extends XR_LocStor { if (PEAR::isError($parid)) { return $parid; } - $res = $this->bsPutFile($parid, $pars['name'], - '', $fname, - $pars['gunid'], 'playlist', 'file'); - if (PEAR::isError($res)) { - return $res; + $values = array( + "filename" => $pars['name'], + "metadata" => $fname, + "gunid" => $pars['gunid'], + "filetype" => "playlist" + ); + $storedFile = $this->bsPutFile($parid, $values); + if (PEAR::isError($storedFile)) { + return $storedFile; } + $res = $storedFile->getId(); @unlink($fname); break; case "playlistPkg": diff --git a/campcaster/src/modules/htmlUI/var/Input.php b/campcaster/src/modules/htmlUI/var/Input.php new file mode 100644 index 000000000..a1b3ceab7 --- /dev/null +++ b/campcaster/src/modules/htmlUI/var/Input.php @@ -0,0 +1,187 @@ + $value) { + $decodedKey = stripslashes($key); + if (is_array($value)) { + $decodedValue = Input::CleanMagicQuotes($value); + } else { + $decodedValue = stripslashes($value); + } + $gpcList[$decodedKey] = $decodedValue; + } + return $gpcList; + } // fn CleanMagicQuotes + + + /** + * Get an input value from the $_REQUEST array and check its type. + * The default value is returned if the value is not defined in the + * $_REQUEST array, or if the value does not match the required type. + * + * The type 'checkbox' is special - you cannot specify a default + * value for this. The return value will be TRUE or FALSE, but + * you can change this by specifying 'numeric' as the 3rd parameter + * in which case it will return '1' or '0'. + * + * Use Input::IsValid() to check if any errors were generated. + * + * @param string $p_varName + * The index into the $_REQUEST array. + * + * @param string $p_type + * The type of data expected; can be: + * "int" + * "string" + * "array" + * "checkbox" + * "boolean" + * + * Default is 'string'. + * + * @param mixed $p_defaultValue + * The default value to return if the value is not defined in + * the $_REQUEST array, or if the value does not match + * the required type. + * + * @param boolean $p_errorsOk + * Set to true to ignore any errors for this variable (i.e. + * Input::IsValid() will still return true even if there + * are errors for this varaible). + * + * @return mixed + */ + function Get($p_varName, $p_type = 'string', $p_defaultValue = null, $p_errorsOk = false) + { + global $g_inputErrors; + $p_type = strtolower($p_type); + + if ($p_type == 'checkbox') { + if (strtolower($p_defaultValue) != 'numeric') { + return isset($_REQUEST[$p_varName]); + } else { + return isset($_REQUEST[$p_varName]) ? '1' : '0'; + } + } + if (!isset($_REQUEST[$p_varName])) { + if (!$p_errorsOk) { + $g_inputErrors[$p_varName] = 'not set'; + } + return $p_defaultValue; + } + // Clean the slashes + if (get_magic_quotes_gpc()) { + if (is_array($_REQUEST[$p_varName])) { + $_REQUEST[$p_varName] = Input::CleanMagicQuotes($_REQUEST[$p_varName]); + } else { + $_REQUEST[$p_varName] = stripslashes($_REQUEST[$p_varName]); + } + } + switch ($p_type) { + case 'boolean': + $value = strtolower($_REQUEST[$p_varName]); + if ( ($value == "true") || (is_numeric($value) && ($value > 0)) ) { + return true; + } else { + return false; + } + break; + case 'int': + if (!is_numeric($_REQUEST[$p_varName])) { + if (!$p_errorsOk) { + $g_inputErrors[$p_varName] = 'Incorrect type. Expected type '.$p_type + .', but received type '.gettype($_REQUEST[$p_varName]).'.' + .' Value is "'.$_REQUEST[$p_varName].'".'; + } + return $p_defaultValue; + } + break; + case 'string': + if (!is_string($_REQUEST[$p_varName])) { + if (!$p_errorsOk) { + $g_inputErrors[$p_varName] = 'Incorrect type. Expected type '.$p_type + .', but received type '.gettype($_REQUEST[$p_varName]).'.' + .' Value is "'.$_REQUEST[$p_varName].'".'; + } + return $p_defaultValue; + } + break; + case 'array': + if (!is_array($_REQUEST[$p_varName])) { + // Create an array if it isnt one already. + // Arrays are used with checkboxes and radio buttons. + // The problem with them is that if there is only one + // checkbox, the given value will not be an array. So + // we make it easy for the programmer by always returning + // an array. + $newArray = array(); + $newArray[] = $_REQUEST[$p_varName]; + return $newArray; +// if (!$p_errorsOk) { +// $g_inputErrors[$p_varName] = 'Incorrect type. Expected type '.$p_type +// .', but received type '.gettype($_REQUEST[$p_varName]).'.' +// .' Value is "'.$_REQUEST[$p_varName].'".'; +// } +// return $p_defaultValue; + } + } + return $_REQUEST[$p_varName]; + } // fn get + + + /** + * Return FALSE if any calls to Input::Get() resulted in an error. + * @return boolean + */ + function IsValid() + { + global $g_inputErrors; + if (count($g_inputErrors) > 0) { + return false; + } else { + return true; + } + } // fn isValid + + + /** + * Return a default error string. + * @return string + */ + function GetErrorString() + { + global $g_inputErrors; + ob_start(); + print_r($g_inputErrors); + $str = ob_get_clean(); + return $str; + } // fn GetErrorString + +} // class Input + +?> \ No newline at end of file diff --git a/campcaster/src/modules/htmlUI/var/formmask/metadata.inc.php b/campcaster/src/modules/htmlUI/var/formmask/metadata.inc.php index 3753aae02..46e77e001 100644 --- a/campcaster/src/modules/htmlUI/var/formmask/metadata.inc.php +++ b/campcaster/src/modules/htmlUI/var/formmask/metadata.inc.php @@ -82,7 +82,7 @@ $mask = array( 'element' => 'dc:type', 'type' => 'text', 'label' => 'Genre', - 'required' => TRUE, + 'required' => FALSE, 'id3' => array('Genre') ), array( diff --git a/campcaster/src/modules/htmlUI/var/html/ui_handler.php b/campcaster/src/modules/htmlUI/var/html/ui_handler.php index b37b14c60..5c8e0af62 100644 --- a/campcaster/src/modules/htmlUI/var/html/ui_handler.php +++ b/campcaster/src/modules/htmlUI/var/html/ui_handler.php @@ -1,5 +1,10 @@ PLAYLIST->addItem($_REQUEST['id'], $_REQUEST['playlength']) !== FALSE) { $uiHandler->SCRATCHPAD->addItem($_REQUEST['id']); } diff --git a/campcaster/src/modules/htmlUI/var/templates/file/edit.tpl b/campcaster/src/modules/htmlUI/var/templates/file/edit.tpl index eec944051..8e18e55db 100644 --- a/campcaster/src/modules/htmlUI/var/templates/file/edit.tpl +++ b/campcaster/src/modules/htmlUI/var/templates/file/edit.tpl @@ -5,7 +5,7 @@

- {if $_REQUEST.act == addFileData || $_REQUEST.act == addFileMData || $_REQUEST.act == addWebstreamData || $_REQUEST.act == addWebstreamMData} + {if $_REQUEST.act == addFileData || $_REQUEST.act == addWebstreamData || $_REQUEST.act == addWebstreamMData} ##New## {else} ##Edit## @@ -21,7 +21,7 @@ {assign var="_uploadform" value=null} {/if}

- +
{include file="file/metadataform.tpl"}
diff --git a/campcaster/src/modules/htmlUI/var/ui_base.inc.php b/campcaster/src/modules/htmlUI/var/ui_base.inc.php index 14e523cc8..faae0caad 100644 --- a/campcaster/src/modules/htmlUI/var/ui_base.inc.php +++ b/campcaster/src/modules/htmlUI/var/ui_base.inc.php @@ -514,6 +514,9 @@ class uiBase public function getMetadataValue($id, $key, $langid=NULL, $deflangid=UI_DEFAULT_LANGID) { + if (!is_numeric($id)) { + return null; + } if (!$langid) { $langid = $_SESSION['langid']; } @@ -527,9 +530,9 @@ class uiBase if (!$langid) { $langid = UI_DEFAULT_LANGID; } - if (ini_get('magic_quotes_gpc')) { - $value = str_replace("\'", "'", $value); - } +// if (ini_get('magic_quotes_gpc')) { +// $value = str_replace("\'", "'", $value); +// } if ($this->gb->setMetadataValue($id, $key, $this->sessid, $value, $langid)) { return TRUE; diff --git a/campcaster/src/modules/htmlUI/var/ui_browser.class.php b/campcaster/src/modules/htmlUI/var/ui_browser.class.php index 33bfe0cdb..702f3a426 100644 --- a/campcaster/src/modules/htmlUI/var/ui_browser.class.php +++ b/campcaster/src/modules/htmlUI/var/ui_browser.class.php @@ -122,7 +122,6 @@ class uiBrowser extends uiBase { $data['listdata'][$key]['title'] = $val['name']; } } - #print_r($data); return $data; } // fn getStructure @@ -250,7 +249,7 @@ class uiBrowser extends uiBase { */ function getMdata($id) { - return ($this->gb->getMdata($id, $this->sessid)); + return ($this->gb->getMetadata($id, $this->sessid)); } // getMdata @@ -268,7 +267,7 @@ class uiBrowser extends uiBase { include dirname(__FILE__).'/formmask/mdata_relations.inc.php'; } - $mdata = $this->gb->getMDataArray($id, $this->sessid); + $mdata = $this->gb->getMetadataArray($id, $this->sessid); if (!is_array($mdata)) { return FALSE; } @@ -304,7 +303,7 @@ class uiBrowser extends uiBase { */ function metaDataForm($parms) { - include dirname(__FILE__).'/formmask/metadata.inc.php'; + include(dirname(__FILE__).'/formmask/metadata.inc.php'); extract($parms); $langid = $langid ? $langid : UI_DEFAULT_LANGID; @@ -321,8 +320,7 @@ class uiBrowser extends uiBase { $form->setConstants(array('act' => 'editMetaData', 'id' => $id, 'curr_langid' => $langid, - ) - ); + )); // Convert element names to be unique over different forms-parts, // add javascript to spread values over parts, add existing @@ -332,9 +330,9 @@ class uiBrowser extends uiBase { if (!is_array($mask['pages'][$key][$k]['attributes'])) { $mask['pages'][$key][$k]['attributes'] = array(); } - $mask['pages'][$key][$k]['element'] = $key.'___'.uiBase::formElementEncode($v['element']); + $mask['pages'][$key][$k]['element'] = $key.'___'.uiBase::formElementEncode($v['element']); $mask['pages'][$key][$k]['attributes'] = array_merge($mask['pages'][$key][$k]['attributes'], array('onChange' => "spread(this, '".uiBase::formElementEncode($v['element'])."')")); - ## load data from GreenBox + // load data from GreenBox if ($getval = $this->getMetadataValue($id, $v['element'], $langid, NULL)) { $mask['pages'][$key][$k]['default'] = $getval; $mask['pages'][$key][$k]['attributes']['onFocus'] = 'MData_confirmChange(this)'; diff --git a/campcaster/src/modules/htmlUI/var/ui_handler.class.php b/campcaster/src/modules/htmlUI/var/ui_handler.class.php index a2fa14b8a..6db6a93a7 100644 --- a/campcaster/src/modules/htmlUI/var/ui_handler.class.php +++ b/campcaster/src/modules/htmlUI/var/ui_handler.class.php @@ -35,6 +35,9 @@ class uiHandler extends uiBase { /** * Login to the storageServer. * It set sessid to the cookie with name defined in ../conf.php + * + * @param array $formdata + * The REQUEST array. */ function login($formdata, $mask) { @@ -114,7 +117,7 @@ class uiHandler extends uiBase { function uploadFile($formdata, $mask, $replace=NULL) { global $CC_CONFIG; - if ($this->test4audioType($formdata['mediafile']['name']) === FALSE) { + if ($this->testForAudioType($formdata['mediafile']['name']) === FALSE) { if (UI_ERROR) { $this->_retMsg('"$1" uses an unsupported file type.', $formdata['mediafile']['name']); } @@ -139,9 +142,16 @@ class uiHandler extends uiBase { $md5 = md5_file($formdata['mediafile']['tmp_name']); $duplicate = StoredFile::RecallByMd5($md5); if ($duplicate) { - $this->_retMsg('The file "'.basename($formdata['mediafile']['name']).'" already exists in the database.'); - $this->redirUrl = UI_BROWSER."?act=addFileData&folderId=".$formdata['folderId']; - return FALSE; + if (PEAR::isError($duplicate)) { + $this->_retMsg($duplicate->getMessage()); + $this->redirUrl = UI_BROWSER."?act=addFileData&folderId=".$formdata['folderId']; + return FALSE; + } else { + $duplicate->delete(); +// $this->_retMsg('The file "'.basename($formdata['mediafile']['name']).'" already exists in the database.'); +// $this->redirUrl = UI_BROWSER."?act=addFileData&folderId=".$formdata['folderId']; +// return FALSE; + } } $metadata = camp_get_audio_metadata($formdata['mediafile']['tmp_name']); @@ -150,43 +160,42 @@ class uiHandler extends uiBase { $this->redirUrl = UI_BROWSER."?act=addFileData&folderId=".$formdata['folderId']; return FALSE; } + // bsSetMetadataBatch doesnt like these values + unset($metadata['audio']); + unset($metadata['playtime_seconds']); $tmpgunid = md5(microtime().$_SERVER['SERVER_ADDR'].rand()."org.mdlf.campcaster"); $ntmp = $CC_CONFIG['bufferDir'].'/'.$tmpgunid; move_uploaded_file($formdata['mediafile']['tmp_name'], $ntmp); chmod($ntmp, 0664); -// echo "buffer dir: ".$CC_CONFIG['bufferDir']."
"; -// echo "$ntmp
"; -// print_r($formdata); -// exit; - $r = $this->gb->putFile($folderId, $formdata['mediafile']['name'], $ntmp, NULL, $this->sessid, $replace); + $values = array( + "filename" => $formdata['mediafile']['name'], + "filepath" => $ntmp, + "filetype" => "audioclip", + "mime" => $metadata["dc:format"], + "md5" => $md5 + ); + $storedFile = $this->gb->putFile($folderId, $values, $this->sessid); @unlink($ntmp); - if (PEAR::isError($r)) { - $this->_retMsg($r->getMessage()); + if (PEAR::isError($storedFile)) { + $this->_retMsg($storedFile->getMessage()); $this->redirUrl = UI_BROWSER."?act=editFile&id=".$id; return FALSE; } - $this->setMetadataValue($r, UI_MDATA_KEY_TITLE, $formdata['mediafile']['name']); - $this->translateMetadata($r); + $result = $this->gb->bsSetMetadataBatch($storedFile->getId(), $metadata); - // set records in default language too - if (UI_UPLOAD_LANGID !== UI_DEFAULT_LANGID) { - $this->setMetadataValue($r, UI_MDATA_KEY_TITLE, $formdata['mediafile']['name'], UI_UPLOAD_LANGID); - $this->translateMetadata($r, UI_UPLOAD_LANGID); - } - - $this->redirUrl = UI_BROWSER."?act=addFileMData&id=$r"; + $this->redirUrl = UI_BROWSER."?act=addFileMData&id=".$storedFile->getId(); if (UI_VERBOSE) { - $this->_retMsg('Data of audiclip saved.'); + $this->_retMsg('Data of audioclip saved.'); } - return $r; + return $storedFile->getId(); } // fn uploadFile - function test4audioType($filename) + function testForAudioType($filename) { global $CC_CONFIG; foreach ($CC_CONFIG['file_types'] as $t) { @@ -195,7 +204,7 @@ class uiHandler extends uiBase { } } return FALSE; - } // fn test4AudioType + } /** @@ -212,22 +221,24 @@ class uiHandler extends uiBase { $this->_retMsg($ia->getMessage()); return; } + // This is really confusing: the import script does not do it + // this way. Which way is the right way? $this->setMetadataValue($id, UI_MDATA_KEY_DURATION, Playlist::secondsToPlaylistTime($ia['playtime_seconds'])); - $this->setMetadataValue($id, UI_MDATA_KEY_FORMAT, UI_MDATA_VALUE_FORMAT_FILE); +// $this->setMetadataValue($id, UI_MDATA_KEY_FORMAT, UI_MDATA_VALUE_FORMAT_FILE); // some data from raw audio - if (isset($ia['audio']['channels'])) { - $this->setMetadataValue($id, UI_MDATA_KEY_CHANNELS, $ia['audio']['channels']); - } - if (isset($ia['audio']['sample_rate'])) { - $this->setMetadataValue($id, UI_MDATA_KEY_SAMPLERATE, $ia['audio']['sample_rate']); - } - if (isset($ia['audio']['bitrate'])) { - $this->setMetadataValue($id, UI_MDATA_KEY_BITRATE, $ia['audio']['bitrate']); - } - if (isset($ia['audio']['codec'])) { - $this->setMetadataValue($id, UI_MDATA_KEY_ENCODER, $ia['audio']['codec']); - } +// if (isset($ia['audio']['channels'])) { +// $this->setMetadataValue($id, UI_MDATA_KEY_CHANNELS, $ia['audio']['channels']); +// } +// if (isset($ia['audio']['sample_rate'])) { +// $this->setMetadataValue($id, UI_MDATA_KEY_SAMPLERATE, $ia['audio']['sample_rate']); +// } +// if (isset($ia['audio']['bitrate'])) { +// $this->setMetadataValue($id, UI_MDATA_KEY_BITRATE, $ia['audio']['bitrate']); +// } +// if (isset($ia['audio']['codec'])) { +// $this->setMetadataValue($id, UI_MDATA_KEY_ENCODER, $ia['audio']['codec']); +// } // from id3 Tags // loop main, music, talk @@ -489,7 +500,7 @@ class uiHandler extends uiBase { function getMdata($id) { header("Content-type: text/xml"); - $r = $this->gb->getMdata($id, $this->sessid); + $r = $this->gb->getMetadata($id, $this->sessid); print_r($r); } diff --git a/campcaster/src/modules/storageAdmin/var/campcaster-import.php b/campcaster/src/modules/storageAdmin/var/campcaster-import.php index 6e7248836..229bd5d71 100644 --- a/campcaster/src/modules/storageAdmin/var/campcaster-import.php +++ b/campcaster/src/modules/storageAdmin/var/campcaster-import.php @@ -119,16 +119,19 @@ function camp_import_audio_file($p_filepath, $p_importMode = null, $p_testOnly = // Check for non-supported file type if (!preg_match('/\.(ogg|mp3)$/i', $p_filepath, $var)) { + echo "IGNORED: $p_filepath\n"; //echo " * WARNING: File extension not supported - skipping file: $p_filepath\n"; return array($fileCount, $duplicates); } +// $timeBegin = microtime(true); $md5sum = md5_file($p_filepath); +// $timeEnd = microtime(true); +// echo " * MD5 time: ".($timeEnd-$timeBegin)."\n"; // Look up md5sum in database $duplicate = StoredFile::RecallByMd5($md5sum); if ($duplicate) { - //echo " * File already exists in the database.\n"; echo "DUPLICATE: $p_filepath\n"; return array($fileCount, $duplicates+1); } @@ -138,6 +141,7 @@ function camp_import_audio_file($p_filepath, $p_importMode = null, $p_testOnly = import_err($metadata); return array($fileCount, $duplicates); } + // bsSetMetadataBatch doesnt like these values unset($metadata['audio']); unset($metadata['playtime_seconds']); @@ -147,30 +151,43 @@ function camp_import_audio_file($p_filepath, $p_importMode = null, $p_testOnly = } elseif ($p_importMode == "link") { $doCopyFiles = false; } - $r = $greenbox->bsPutFile($parentId, $metadata['ls:filename'], - $p_filepath, "$STORAGE_SERVER_PATH/var/emptyMdata.xml", NULL, - 'audioclip', 'file', $doCopyFiles); - if (PEAR::isError($r)) { - import_err($r, "Error in bsPutFile()"); + $values = array( + "filename" => $metadata['ls:filename'], + "filepath" => $p_filepath, + "metadata" => "$STORAGE_SERVER_PATH/var/emptyMdata.xml", + "gunid" => NULL, + "filetype" => "audioclip", + "md5" => $md5sum, + "mime" => $metadata['dc:format'] + ); +// $timeBegin = microtime(true); + $storedFile = $greenbox->bsPutFile($parentId, $values, $doCopyFiles); + if (PEAR::isError($storedFile)) { + import_err($storedFile, "Error in bsPutFile()"); echo var_export($metadata)."\n"; return 0; } - $id = $r; + $id = $storedFile->getId(); +// $timeEnd = microtime(true); +// echo " * Store file time: ".($timeEnd-$timeBegin)."\n"; + // Note: the bsSetMetadataBatch() takes up .25 of a second + // on my 3Ghz computer. We should try to speed this up. +// $timeBegin = microtime(true); $r = $greenbox->bsSetMetadataBatch($id, $metadata); if (PEAR::isError($r)) { import_err($r, "Error in bsSetMetadataBatch()"); echo var_export($metadata)."\n"; return 0; } +// $timeEnd = microtime(true); +// echo " * Metadata store time: ".($timeEnd-$timeBegin)."\n"; } else { - var_dump($infoFromFile); - echo "======================= "; + echo "==========================================================================\n"; + echo "METADATA\n"; var_dump($metadata); - echo "======================= "; } - //echo " * OK\n"; $fileCount++; return array($fileCount, $duplicates); } @@ -201,7 +218,6 @@ if (count($parsedCommandLine[1]) == 0) { exit; } -//print_r($parsedCommandLine); $files = $parsedCommandLine[1]; $testonly = FALSE; @@ -216,12 +232,10 @@ foreach ($cmdLineOptions as $tmpValue) { exit; case "c": case "--copy": - //echo " *** Working in copy mode\n"; $importMode = "copy"; break 2; case 'l': case '--link': - //echo " *** Working in link mode\n"; $importMode = "link"; break 2; case "t": @@ -236,7 +250,6 @@ if (is_null($importMode)) { exit(0); } -//echo "==========================================================================\n"; $filecount = 0; $duplicates = 0; if (is_array($files)) { @@ -262,6 +275,4 @@ echo " *** Errors: $g_errors\n"; echo " *** Total: ".($filecount+$duplicates)." files in $time seconds = $speed files/second.\n"; echo "==========================================================================\n"; -//echo " * Import completed.\n"; - ?> \ No newline at end of file diff --git a/campcaster/src/modules/storageAdmin/var/restore.php b/campcaster/src/modules/storageAdmin/var/restore.php index 036502b02..4e502e2aa 100644 --- a/campcaster/src/modules/storageAdmin/var/restore.php +++ b/campcaster/src/modules/storageAdmin/var/restore.php @@ -84,9 +84,14 @@ function ls_restore_restoreObject($obj, $parid, $reallyInsert=TRUE){ if (VERBOSE) { echo " creating file {$obj['name']} ...\n"; } - $r = $bs->bsPutFile($parid, $obj['name'], - $mediaFile, $mdataFile, $obj['gunid'], - strtolower($obj['type'])); + $values = array( + "filename" => $obj['name'], + "filepath" => $mediaFile, + "metadata" => $mdataFile, + "gunid" => $obj['gunid'], + "filetype" => strtolower($obj['type']) + ); + $r = $bs->bsPutFile($parid, $values); ls_restore_checkErr($r, __LINE__); } break; diff --git a/campcaster/src/modules/storageServer/var/BasicStor.php b/campcaster/src/modules/storageServer/var/BasicStor.php index 10e47e502..1f3cdb480 100644 --- a/campcaster/src/modules/storageServer/var/BasicStor.php +++ b/campcaster/src/modules/storageServer/var/BasicStor.php @@ -82,20 +82,21 @@ class BasicStor { * 'file'|'string' * @param boolean $copyMedia * copy the media file if true, make symlink if false - * @return int - * @exception PEAR_Error + * @return int|PEAR_Error + * ID of the StoredFile that was created. */ - public function bsPutFile($parid, $fileName, $localFilePath, $metadataFilePath, - $gunid=NULL, $ftype='unknown', $mdataLoc='file', $copyMedia=TRUE) + public function bsPutFile($p_parentId, $p_values, $p_copyMedia=TRUE) { - $ftype = strtolower($ftype); - $id = BasicStor::AddObj($fileName, $ftype, $parid); + if (!isset($p_values['filetype']) || !isset($p_values['filename'])) { + return NULL; + } + $ftype = strtolower($p_values['filetype']); + $id = BasicStor::AddObj($p_values['filename'], $ftype, $p_parentId); if (PEAR::isError($id)) { return $id; } - $storedFile = StoredFile::Insert($id, $fileName, - $localFilePath, $metadataFilePath, $mdataLoc, $gunid, $ftype, - $copyMedia); + $p_values['id'] = $id; + $storedFile = StoredFile::Insert($p_values, $p_copyMedia); if (PEAR::isError($storedFile)) { $res = BasicStor::RemoveObj($id); // catch constraint violations @@ -108,10 +109,7 @@ class BasicStor { return $storedFile; } } - if ($ftype == 'playlist') { - $storedFile->setMime('application/smil'); - } - return $id; + return $storedFile; } // fn bsPutFile @@ -900,8 +898,11 @@ class BasicStor { */ public function bsGetMetadataValue($id, $category = null) { + if (!is_numeric($id)) { + return null; + } $storedFile = StoredFile::Recall($id); - if (PEAR::isError($storedFile)) { + if (PEAR::isError($storedFile) || is_null($storedFile)) { return $storedFile; } if (is_null($category)) { @@ -921,7 +922,7 @@ class BasicStor { /** * Set metadata element value * - * @param int $id + * @param int|StoredFile $id * Virtual file's local id * @param string $category * Metadata element identification (e.g. dc:title) @@ -940,9 +941,16 @@ class BasicStor { public function bsSetMetadataValue($id, $category, $value, $lang=NULL, $mid=NULL, $container='metadata', $regen=TRUE) { - $storedFile = StoredFile::Recall($id); - if (PEAR::isError($storedFile)) { - return $storedFile; + if (!is_string($category) || is_array($value)) { + return FALSE; + } + if (is_a($id, "StoredFile")) { + $storedFile =& $id; + } else { + $storedFile = StoredFile::Recall($id); + if (PEAR::isError($storedFile)) { + return $storedFile; + } } if ($category == 'dcterms:extent') { $value = BasicStor::NormalizeExtent($value); @@ -1002,9 +1010,13 @@ class BasicStor { if (!is_array($values)) { $values = array($values); } + $storedFile = StoredFile::Recall($id); + if (PEAR::isError($storedFile)) { + return $storedFile; + } foreach ($values as $category => $oneValue) { - $res = $this->bsSetMetadataValue($id, $category, $oneValue, - $lang, NULL, $container, FALSE); + $res = $this->bsSetMetadataValue($storedFile, $category, + $oneValue, $lang, NULL, $container, FALSE); if (PEAR::isError($res)) { return $res; } @@ -1136,7 +1148,7 @@ class BasicStor { } $gunids = array(); foreach ($plids as $plid) { - $pl = Playlist::RecallByGunid($plid); + $pl = StoredFile::RecallByGunid($plid); if (PEAR::isError($pl)) { return $pl; } @@ -1150,7 +1162,6 @@ class BasicStor { } $gunids = array_merge($gunids, $gunidsX); } -# header("Content-type: text/plain"); var_dump($gunids); var_dump($withContent); exit; $plExts = array('lspl'=>"lspl", 'smil'=>"smil", 'm3u'=>"m3u"); $plExt = (isset($plExts[$type]) ? $plExts[$type] : "xml" ); $res = array(); @@ -1176,8 +1187,8 @@ class BasicStor { if (file_exists($MDfname)) { switch ($it['type']) { case "playlist": - require_once("LsPlaylist.php"); - $storedFile = $r = LsPlaylist::RecallByGunid($it['gunid']); + require_once("Playlist.php"); + $storedFile = $r = StoredFile::RecallByGunid($it['gunid']); switch ($type) { case "smil": $string = $r = $storedFile->outputToSmil(); @@ -1286,11 +1297,18 @@ class BasicStor { "BasicStor::bsImportPlaylistRaw: file doesn't exist ($aPath/$rPath)" ); } - switch($ext){ + switch ($ext) { case "xml": case "lspl": $fname = $plid; - $res = $this->bsPutFile($parid, $fname, NULL, $path, $plid, 'playlist'); + $values = array( + "filename" => $fname, + "metadata" => $path, + "gunid" => $plid, + "filetype" => "playlist" + ); + $storedFile = $this->bsPutFile($parid, $values); + $res = $storedFile->getId(); break; case "smil": require_once("SmilPlaylist.php"); @@ -1384,8 +1402,15 @@ class BasicStor { } } if (!PEAR::isError($res) ) { - $res = $this->bsPutFile($parid, $gunid, $rawMedia, $metadata, - $gunid, 'audioclip'); + $values = array( + "filename" => $gunid, + "filepath" => $rawMedia, + "metadata" => $metadata, + "gunid" => $gunid, + "filetype" => "audioclip" + ); + $storedFile = $this->bsPutFile($parid, $values); + $res = $storedFile->getId(); } @unlink("$tmpdc/{$it['rawMedia']}"); @unlink("$tmpdc/{$it['metadata']}"); @@ -2202,7 +2227,14 @@ class BasicStor { $fname = basename($xml); break; } - $r = $this->bsPutFile($rootHD, $fname, $media, $xml, $gunid, $type); + $values = array( + "filename" => $fname, + "filepath" => $media, + "metadata" => $xml, + "gunid" => $gunid, + "filetype" => $type + ); + $r = $this->bsPutFile($rootHD, $values); if (PEAR::isError($r)) { return $r; } @@ -2286,140 +2318,6 @@ class BasicStor { } - /** - * Create BasicStor object with temporarily changed configuration - * to prevent data changes in tests - * - */ -// function createTestSpace(&$dbc, $config){ -// $configBckp = $config; -// $config['tblNamePrefix'] .= '_test_'; -// mkdir($config['storageDir'].'/tmp'); -// $config['storageDir'] .= '/tmp/stor'; -// $config['bufferDir'] = $config['storageDir'].'/buffer'; -// $config['transDir'] .= '/tmp/trans'; -// $config['accessDir'] .= '/tmp/access'; -// mkdir($config['storageDir']); -// mkdir($config['bufferDir']); -// $bs = new BasicStor($dbc, $config); -// $bs->configBckp = $configBckp; -// $r = $bs->install(); -// if (PEAR::isError($r)) { -// return $r; -// } -// return $bs; -// } - - - /** - * Clean up test space - * - */ -// function releaseTestSpace() { -// $r = $this->uninstall(); -// if (PEAR::isError($r)) { -// return $r; -// } -// // rmdir($this->config['bufferDir']); -// rmdir($this->config['storageDir']); -// $this->config = $this->configBckp; -// rmdir($this->config['storageDir'].'/tmp'); -// } - - - /** - * testData - * - */ - public function testData($d='') - { - $exdir = dirname(__FILE__).'/tests'; - $o[] = $this->addSubj('test1', 'a'); - $o[] = $this->addSubj('test2', 'a'); - $o[] = $this->addSubj('test3', 'a'); - $o[] = $this->addSubj('test4', 'a'); - - $o[] = $t1hd = M2tree::GetObjId('test1', $this->storId); - $o[] = $t1d1 = BasicStor::bsCreateFolder($t1hd, 'test1_folder1'); - $o[] = BasicStor::bsCreateFolder($t1hd, 'test1_folder2'); - $o[] = BasicStor::bsCreateFolder($t1d1, 'test1_folder1_1'); - $o[] = $t1d12 = BasicStor::bsCreateFolder($t1d1, 'test1_folder1_2'); - - $o[] = $t2hd = M2tree::GetObjId('test2', $this->storId); - $o[] = BasicStor::bsCreateFolder($t2hd, 'test2_folder1'); - - $o[] = $this->bsPutFile($t1hd, 'file1.mp3', "$exdir/ex1.mp3", '', NULL, 'audioclip'); - $o[] = $this->bsPutFile($t1d12, 'file2.wav', "$exdir/ex2.wav", '', NULL, 'audioclip'); - $this->tdata['storage'] = $o; - } - - /** - * test - * - */ - public function test() - { - global $CC_CONFIG; - $this->test_log = ''; - // if(PEAR::isError($p = parent::test())) return $p; - $this->deleteData(); - $this->testData(); - if ($CC_CONFIG['useTrash']) { - $trash = "\n ".$CC_CONFIG['TrashName']; - } else { - $trash = ""; - } - if (!$CC_CONFIG['isArchive']) { - $this->test_correct = " StorageRoot - root - test1 - file1.mp3 - public - test1_folder1 - test1_folder1_1 - test1_folder1_2 - file2.wav - test1_folder2 - test2 - public - test2_folder1 - test3 - public - test4 - public{$trash} -"; - } else { - $this->test_correct = " StorageRoot - root - test1 - file1.mp3 - test1_folder1 - test1_folder1_1 - test1_folder1_2 - file2.wav - test1_folder2 - test2 - test2_folder1 - test3 - test4{$trash} -"; - } - $r = M2tree::DumpTree($this->storId, ' ', ' ', '{name}'); - if (PEAR::isError($r)) { - return $r; - } - $this->test_dump = $r; - if ($this->test_dump == $this->test_correct) { - $this->test_log .= "# BasicStor::test: OK\n"; - return true; - } else { - return PEAR::raiseError( - "BasicStor::test:\ncorrect:\n.{$this->test_correct}.\n". - "dump:\n.{$this->test_dump}.\n", 1, PEAR_ERROR_RETURN); - } - } - - /** * initData - initialize * diff --git a/campcaster/src/modules/storageServer/var/DataEngine.php b/campcaster/src/modules/storageServer/var/DataEngine.php index 1bf61a0a7..741d563d1 100644 --- a/campcaster/src/modules/storageServer/var/DataEngine.php +++ b/campcaster/src/modules/storageServer/var/DataEngine.php @@ -443,11 +443,11 @@ class DataEngine { 'id' => $it['id'], 'gunid' => $gunid, 'type' => $it['ftype'], - 'title' => $values['dc:title'], - 'creator' => (isset($values['dc:creator']) ? $values['dc:creator'] : NULL ), - 'duration' => $values['dcterms:extent'], - 'length' => $values['dcterms:extent'], - 'source' => (isset($values['dc:source']) ? $values['dc:source'] : NULL ), + 'title' => $values['dc:title']["object"], + 'creator' => (isset($values['dc:creator']) ? $values['dc:creator']["object"] : NULL ), + 'duration' => $values['dcterms:extent']["object"], + 'length' => $values['dcterms:extent']["object"], + 'source' => (isset($values['dc:source']) ? $values['dc:source']["object"] : NULL ), ); } else { $eres[] = $it['txt']; diff --git a/campcaster/src/modules/storageServer/var/GreenBox.php b/campcaster/src/modules/storageServer/var/GreenBox.php index 2174598e4..50234e92b 100644 --- a/campcaster/src/modules/storageServer/var/GreenBox.php +++ b/campcaster/src/modules/storageServer/var/GreenBox.php @@ -60,15 +60,15 @@ class GreenBox extends BasicStor { * @param string $ftype * Internal file type * @return int + * ID of the StoredFile that was created. */ - public function putFile($parid, $fileName, $mediaFileLP, $mdataFileLP, - $sessid='', $gunid=NULL, $ftype='audioclip') + public function putFile($p_parentId, $p_values, $p_sessionId='') { - if (($res = BasicStor::Authorize('write', $parid, $sessid)) !== TRUE) { + if (($res = BasicStor::Authorize('write', $p_parentId, $p_sessionId)) !== TRUE) { return $res; } - return $this->bsPutFile($parid, $fileName, $mediaFileLP, - $mdataFileLP, $gunid, $ftype); + $storedFile = $this->bsPutFile($p_parentId, $p_values); + return $storedFile; } // fn putFile @@ -99,12 +99,17 @@ class GreenBox extends BasicStor { if (!file_exists($mdataFileLP)) { $mdataFileLP = dirname(__FILE__).'/emptyWebstream.xml'; } - $oid = $this->bsPutFile( - $parid, $fileName, '', $mdataFileLP, $gunid, 'webstream' + $values = array( + "filename" => $fileName, + "metadata" => $mdataFileLP, + "gunid" => $gunid, + "filetype" => "webstream" ); - if (PEAR::isError($oid)) { - return $oid; + $storedFile = $this->bsPutFile($parid, $values); + if (PEAR::isError($storedFile)) { + return $storedFile; } + $oid = $storedFile->getId(); $r = $this->bsSetMetadataValue( $oid, 'ls:url', $url, NULL, NULL, 'metadata'); if (PEAR::isError($r)) { @@ -313,13 +318,13 @@ class GreenBox extends BasicStor { * @return string|PEAR_Error * @todo rename this function to "getMetadata" */ - public function getMdata($id, $sessid='') + public function getMetadata($id, $sessid='') { if (($res = BasicStor::Authorize('read', $id, $sessid)) !== TRUE) { return $res; } return $this->bsGetMetadata($id); - } // fn getMdata + } /** @@ -334,9 +339,8 @@ class GreenBox extends BasicStor { * @param string $sessid * session ID * @return array - * @todo rename this function to "getMdataArray" */ - public function getMdataArray($id, $sessid) + public function getMetadataArray($id, $sessid) { if (($res = BasicStor::Authorize('read', $id, $sessid)) !== TRUE) { return $res; @@ -355,7 +359,7 @@ class GreenBox extends BasicStor { } if ($md === FALSE) { return PEAR::raiseError( - "GreenBox::getMdataArray: no metadata container found" + "GreenBox::getMetadataArray: no metadata container found" ); } $res = array(); @@ -369,7 +373,7 @@ class GreenBox extends BasicStor { } } return $res; - } // fn getMdataArray + } /** @@ -396,6 +400,9 @@ class GreenBox extends BasicStor { public function getMetadataValue($id, $category, $sessid='', $lang=NULL, $deflang=NULL) { + if (!is_numeric($id)) { + return null; + } if (($res = BasicStor::Authorize('read', $id, $sessid)) !== TRUE) { return $res; } @@ -572,7 +579,7 @@ class GreenBox extends BasicStor { */ // function getPlaylistXml($id, $sessid) // { -// return $this->getMdata($id, $sessid); +// return $this->getMetadata($id, $sessid); // } // fn getPlaylistXml @@ -672,7 +679,7 @@ class GreenBox extends BasicStor { $fadeIn=NULL, $fadeOut=NULL, $length=NULL, $pause=NULL) { require_once"Playlist.php"; - $pl = Playlist::RecallByToken($token); + $pl = StoredFile::RecallByToken($token); if (PEAR::isError($pl)) { return $pl; } @@ -713,7 +720,7 @@ class GreenBox extends BasicStor { public function delAudioClipFromPlaylist($token, $plElGunid, $sessid) { require_once("Playlist.php"); - $pl = Playlist::RecallByToken($token); + $pl = StoredFile::RecallByToken($token); if (PEAR::isError($pl)) { return $pl; } @@ -748,7 +755,7 @@ class GreenBox extends BasicStor { public function changeFadeInfo($token, $plElGunid, $fadeIn, $fadeOut, $sessid) { require_once("Playlist.php"); - $pl = Playlist::RecallByToken($token); + $pl = StoredFile::RecallByToken($token); if (PEAR::isError($pl)) { return $pl; } @@ -784,7 +791,7 @@ class GreenBox extends BasicStor { public function moveAudioClipInPlaylist($token, $plElGunid, $newPos, $sessid) { require_once("Playlist.php"); - $pl = Playlist::RecallByToken($token); + $pl = StoredFile::RecallByToken($token); if (PEAR::isError($pl)) { return $pl; } @@ -864,7 +871,7 @@ class GreenBox extends BasicStor { $lang=NULL, $deflang=NULL) { require_once("Playlist.php"); - $pl = Playlist::RecallByGunid($plid); + $pl = StoredFile::RecallByGunid($plid); if (PEAR::isError($pl)) { return $pl; } diff --git a/campcaster/src/modules/storageServer/var/LocStor.php b/campcaster/src/modules/storageServer/var/LocStor.php index 39ff07d71..b00cab38b 100644 --- a/campcaster/src/modules/storageServer/var/LocStor.php +++ b/campcaster/src/modules/storageServer/var/LocStor.php @@ -93,8 +93,12 @@ class LocStor extends BasicStor { if (PEAR::isError($oid)) { return $oid; } - $storedFile =& StoredFile::Insert($oid, '', '', $metadata, - 'string', $gunid, $ftype); + $values = array( + "id" => $oid, + "metadata" => $metadata, + "gunid" => $gunid, + "filetype" => $ftype); + $storedFile =& StoredFile::Insert($values); if (PEAR::isError($storedFile)) { $res = BasicStor::RemoveObj($oid); return $storedFile; @@ -606,9 +610,12 @@ class LocStor extends BasicStor { if (PEAR::isError($oid)) { return $oid; } - $storedFile =& StoredFile::Insert($oid, '', '', - dirname(__FILE__).'/emptyPlaylist.xml', - 'file', $playlistId, 'playlist'); + $values = array( + "id" => $oid, + "metadata" => dirname(__FILE__).'/emptyPlaylist.xml', + "gunid" => $playlistId, + "filetype" => "playlist"); + $storedFile = StoredFile::Insert($values); if (PEAR::isError($storedFile)) { $res = BasicStor::RemoveObj($oid); return $storedFile; diff --git a/campcaster/src/modules/storageServer/var/LsPlaylist.php b/campcaster/src/modules/storageServer/var/LsPlaylist.php deleted file mode 100644 index ba8c57008..000000000 --- a/campcaster/src/modules/storageServer/var/LsPlaylist.php +++ /dev/null @@ -1,599 +0,0 @@ - - * @author Paul Baranowski - * @version $Revision: 1848 $ - * @package Campcaster - * @subpackage StorageServer - * @copyright 2006 MDLF, Inc. - * @license http://www.gnu.org/licenses/gpl.txt - * @link http://www.campware.org - * @todo Rename this class - */ -class LsPlaylist extends Playlist -{ - /** - * Create instance of LsPlaylist object and recall existing file - * by gunid. - * - * @param string $gunid - * global unique id - * @param string $className - * optional classname to recall - * @return LsPlaylist - */ - public static function RecallByGunid($gunid, $className='LsPlaylist') - { - return parent::RecallByGunid($gunid, $className); - } - - - /** - * Create instance of LsPlaylist object and recall existing file - * by access token. - * - * @param string $token - * access token - * @param string $className - * optional classname to recall - * @return LsPlaylist - */ - public static function RecallByToken($token, $className='LsPlaylist') - { - return parent::RecallByToken($token, $className); - } - - - /** - * Export playlist as simplified SMIL XML file. - * - * @param boolean $toString - * if false don't real export, - * return misc info about playlist only - * @return string - * XML string or hasharray with misc info - */ - public function outputToSmil($toString=TRUE) - { - $plGunid = $this->gunid; - $arr = $this->md->genPhpArray(); - if (PEAR::isError($arr)) { - return $arr; - } - if ($toString) { - $r = LsPlaylistTag::outputToSmil($this, $arr); - if (PEAR::isError($r)) { - return $r; - } - return $r; - } else { - return array( - 'type' => 'playlist', - 'gunid' => $plGunid, - 'src' => PL_URL_RELPATH."$plGunid.smil", - 'playlength' => $arr['attrs']['playlength'], - ); - } - } - - - /** - * Export playlist as M3U file. - * - * @param boolean $toString - * if false don't real export, - * return misc info about playlist only - * @return string|array - * M3U string or hasharray with misc info - */ - public function outputToM3u($toString=TRUE) - { - $plGunid = $this->gunid; - $arr = $this->md->genPhpArray(); - if (PEAR::isError($arr)) { - return $arr; - } - if ($toString) { - $r = LsPlaylistTag::outputToM3u($this, $arr); - if (PEAR::isError($r)) { - return $r; - } - return $r; - } else { - return array( - 'type' => 'playlist', - 'gunid' => $plGunid, - 'uri' => PL_URL_RELPATH."$plGunid.m3u", - 'playlength' => $arr['attrs']['playlength'], - 'title' => $arr['attrs']['title'], - ); - } - } - - - /** - * Export playlist as RSS XML file - * - * @param boolean $toString - * if false don't really export, - * return misc info about playlist only - * @return mixed - * XML string or hasharray with misc info - */ - public function outputToRss($toString=TRUE) - { - $plGunid = $this->gunid; - $arr = $this->md->genPhpArray(); - if (PEAR::isError($arr)) { - return $arr; - } - if ($toString) { - $r = LsPlaylistTag::outputToRss($this, $arr); - if (PEAR::isError($r)) { - return $r; - } - return $r; - } else { - return array( - 'type' => 'playlist', - 'gunid' => $plGunid, - 'src' => PL_URL_RELPATH."$plGunid.smil", - 'playlength' => $arr['attrs']['playlength'], - ); - } - } - -} // class LsPlaylist - - -/** - * Several auxiliary classes follows - * @author Tomas Hlava - * @author Paul Baranowski - * @package Campcaster - * @subpackage StorageServer - * @copyright 2006 MDLF, Inc. - * @license http://www.gnu.org/licenses/gpl.txt - * @link http://www.campware.org - * @todo Rename this class PlaylistTag - */ -class LsPlaylistTag -{ - public function outputToSmil(&$pl, $plt, $ind='') - { - $ind2 = $ind.INDCH; - $ind3 = $ind2.INDCH; - $ind4 = $ind3.INDCH; - $res = ""; - foreach ($plt['children'] as $ple) { - switch ($ple['elementname']) { - case"playlistElement": - $r = LsPlaylistElement::outputToSmil($pl, $ple, $ind4); - if (PEAR::isError($r)) { - return $r; - } - if (!is_null($r)) { - $res .= $r; - } - break; - case"metadata": - $r = LsPlaylistMetadata::outputToSmil($pl, $ple, $ind4); - if (PEAR::isError($r)) { - return $r; - } - if (!is_null($r)) { - $res .= $r; - } - break; - default: - } - } - $res = "$ind\n". - "$ind\n". - "$ind2\n". - "$ind3\n". - "$res". - "$ind3\n". - "$ind2\n". - "$ind\n"; - return $res; - } - - - public function outputToM3u(&$pl, $plt, $ind='') - { - $res = ""; - foreach ($plt['children'] as $ple) { - switch ($ple['elementname']) { - case"playlistElement": - $r = LsPlaylistElement::outputToM3u($pl, $ple); - if (PEAR::isError($r)) { - return $r; - } - if (!is_null($r)) { - $res .= $r; - } - break; - } - } - $res = "#EXTM3U\n$res"; - return $res; - } - - - public function outputToRss(&$pl, $plt, $ind='') - { - $ind2 = $ind.INDCH; - $ind3 = $ind2.INDCH; - $res = ""; - foreach ($plt['children'] as $ple) { - switch ($ple['elementname']) { - case"playlistElement": - $r = LsPlaylistElement::outputToRss($pl, $ple, $ind3); - if (PEAR::isError($r)) { - return $r; - } - if (!is_null($r)) { - $res .= $r; - } - break; - case"metadata": - $r = LsPlaylistMetadata::outputToRss($pl, $ple, $ind3); - if (PEAR::isError($r)) { - return $r; - } - if (!is_null($r)) { - $res .= $r; - } - break; - default: - } - } - $res = "$ind\n". - "$ind\n". - "$ind2\n". - "$res". - "$ind2\n". - "$ind\n"; - return $res; - } -} // class LsPlaylistTag - - -/** - * @author Tomas Hlava - * @author Paul Baranowski - * @package Campcaster - * @subpackage StorageServer - * @copyright 2006 MDLF, Inc. - * @license http://www.gnu.org/licenses/gpl.txt - * @link http://www.campware.org - * @todo Rename this class "PlaylistElement" - */ -class LsPlaylistElement { - - - public function outputToSmil(&$pl, $ple, $ind='') - { - $acOrPl = NULL; - $finfo = array('fi'=>0, 'fo'=>0); - $ind2 = $ind.INDCH; - $ind3 = $ind2.INDCH; - $anim = ''; - foreach ($ple['children'] as $ac) { - switch ($ac['elementname']) { - case "audioClip": - $r = LsPlaylistAudioClip::outputToSmil($pl, $ac, $ind2); - if (PEAR::isError($r)) { - return $r; - } - if (!is_null($r)) { - $acOrPl = $r; - } - break; - case "playlist": - $gunid = $ac['attrs']['id']; - $pl2 = LsPlaylist::RecallByGunid($gunid); - if (PEAR::isError($pl2)) { - return $pl2; - } - $r = $pl2->outputToSmil(FALSE); - if (PEAR::isError($r)) { - return $r; - } - if (!is_null($r)) { - $acOrPl = $r; - } - break; - case "fadeInfo": - $r = LsPlaylistFadeInfo::outputToSmil($pl, $ac, $ind2); - if (PEAR::isError($r)) { - return $r; - } - if (!is_null($r)) { - $finfo = $r; - } - break; - default: - return PEAR::raiseError( - "LsPlaylistElement::outputToSmil:". - " unknown tag {$ac['elementname']}" - ); - } - } - $beginS = Playlist::playlistTimeToSeconds($ple['attrs']['relativeOffset']); - $playlengthS = Playlist::playlistTimeToSeconds($acOrPl['playlength']); - $fadeOutS = Playlist::playlistTimeToSeconds($finfo['fo']); - $fiBeginS = 0; - $fiEndS = Playlist::playlistTimeToSeconds($finfo['fi']); - $foBeginS = ($playlengthS - $fadeOutS); - $foEndS = Playlist::playlistTimeToSeconds($acOrPl['playlength']); - foreach (array('fi','fo') as $ff) { - if (${$ff."EndS"} - ${$ff."BeginS"} > 0) { - $anim .= "{$ind2}\n" - ; - } - } - $src = $acOrPl['src']; - $str = "$ind" : " />"). - " ". - "\n"; - return $str; - } - - - public function outputToM3u(&$pl, $ple, $ind='') - { - $acOrPl = NULL; - foreach ($ple['children'] as $ac) { - switch ($ac['elementname']) { - case "audioClip": - $r = LsPlaylistAudioClip::outputToM3u($pl, $ac); - if (PEAR::isError($r)) { - return $r; - } - if (!is_null($r)) { - $acOrPl = $r; - } - break; - case "playlist": - $gunid = $ac['attrs']['id']; - $pl2 = LsPlaylist::RecallByGunid($gunid); - if (PEAR::isError($pl2)) { - return $pl2; - } - $r = $pl2->outputToM3u(FALSE); - if (PEAR::isError($r)) { - return $r; - } - if (!is_null($r)) { - $acOrPl = $r; - } - break; - } - } - if (is_null($acOrPl)) { - return ''; - } - $playlength = ceil(Playlist::playlistTimeToSeconds($acOrPl['playlength'])); - $title = $acOrPl['title']; - $uri = (isset($acOrPl['uri']) ? $acOrPl['uri'] : '???' ); - $res = "#EXTINF: $playlength, $title\n"; - $res .= "$uri\n"; - return $res; - } - - - function outputToRss(&$pl, $ple, $ind='') - { - $acOrPl = NULL; - $ind2 = $ind.INDCH; - $anim = ''; - foreach ($ple['children'] as $ac) { - switch ($ac['elementname']) { - case "audioClip": - $r = LsPlaylistAudioClip::outputToRss($pl, $ac, $ind2); - if (PEAR::isError($r)) { - return $r; - } - if (!is_null($r)) { - $acOrPl = $r; - } - break; - case "playlist": - $gunid = $ac['attrs']['id']; - $pl2 = LsPlaylist::RecallByGunid($gunid); - if (PEAR::isError($pl2)) { - return $pl2; - } - $r = $pl2->outputToRss(FALSE); - if (PEAR::isError($r)) { - return $r; - } - if (!is_null($r)) { - $acOrPl = $r; - } - break; - case"fadeInfo": - break; - default: - return PEAR::raiseError( - "LsPlaylistElement::outputToRss:". - " unknown tag {$ac['elementname']}" - ); - } - } - $title = (isset($acOrPl['title']) ? htmlspecialchars($acOrPl['title']) : '' ); - $desc = (isset($acOrPl['desc']) ? htmlspecialchars($acOrPl['desc']) : '' ); - $link = htmlspecialchars($acOrPl['src']); - $desc = ''; - $str = "$ind\n". - "$ind2$title\n". - "$ind2$desc\n". - "$ind2$link\n". - "$ind\n"; - return $str; - } -} - - -/** - * @author Tomas Hlava - * @author Paul Baranowski - * @package Campcaster - * @subpackage StorageServer - * @copyright 2006 MDLF, Inc. - * @license http://www.gnu.org/licenses/gpl.txt - * @link http://www.campware.org - * @todo Rename this class to PlaylistAudioClip (notice the caps) - */ -class LsPlaylistAudioClip -{ - - public function outputToSmil(&$pl, $plac, $ind='') - { - $gunid = $plac['attrs']['id']; - $ac = StoredFile::RecallByGunid($gunid); - if (PEAR::isError($ac)) { - return $ac; - } - $RADext = $ac->getFileExtension(); - if (PEAR::isError($RADext)) { - return $RADext; - } - return array( - 'type' => 'audioclip', - 'gunid' => $gunid, - 'src' => AC_URL_RELPATH."$gunid.$RADext", - 'playlength' => $plac['attrs']['playlength'], - ); - } - - - public function outputToM3u(&$pl, $plac, $ind='') - { - $gunid = $plac['attrs']['id']; - $ac = StoredFile::RecallByGunid($gunid); - if (PEAR::isError($ac)) { - return $ac; - } - $RADext = $ac->getFileExtension(); - if (PEAR::isError($RADext)) { - return $RADext; - } - return array( - 'playlength' => $plac['attrs']['playlength'], - 'title' => $plac['attrs']['title'], - 'uri' => AC_URL_RELPATH."$gunid.$RADext", - ); - } - - - public function outputToRss(&$pl, $plac, $ind='') - { - $gunid = $plac['attrs']['id']; - $ac = StoredFile::RecallByGunid($gunid); - if (PEAR::isError($ac)) { - return $ac; - } - $RADext = $ac->getFileExtension(); - if (PEAR::isError($RADext)) { - return $RADext; - } - $title = $pl->gb->bsGetMetadataValue($ac->getId(), 'dc:title'); - $desc = $pl->gb->bsGetMetadataValue($ac->getId(), 'dc:description'); - return array( - 'type' => 'audioclip', - 'gunid' => $gunid, - 'src' => "http://XXX/YY/$gunid.$RADext", - 'playlength' => $plac['attrs']['playlength'], - 'title' => $title, - 'desc' => $desc, - ); - } -} // class LsPlaylistAudioClip - - -/** - * @author Tomas Hlava - * @author Paul Baranowski - * @package Campcaster - * @subpackage StorageServer - * @copyright 2006 MDLF, Inc. - * @license http://www.gnu.org/licenses/gpl.txt - * @link http://www.campware.org - * @todo Rename this class "PlaylistFadeInfo" (notive the caps) - */ -class LsPLaylistFadeInfo -{ - - public function outputToSmil(&$pl, $plfi, $ind='') - { - $r = array( - 'fi'=>$plfi['attrs']['fadeIn'], - 'fo'=>$plfi['attrs']['fadeOut'], - ); - return $r; - } - - - public function outputToM3u(&$pl, $plfa, $ind='') - { - return ''; - } - - - public function outputToRss(&$pl, $plfa, $ind='') - { - return ''; - } - -} // class LsPlaylistFadeInfo - - -/** - * @author Tomas Hlava - * @author Paul Baranowski - * @package Campcaster - * @subpackage StorageServer - * @copyright 2006 MDLF, Inc. - * @license http://www.gnu.org/licenses/gpl.txt - * @link http://www.campware.org - * @todo Rename this class to PlaylistMetadata (notice the caps) - */ -class LsPlaylistMetadata -{ - public function outputToSmil(&$pl, $md, $ind='') - { - return NULL; - } - - - public function outputToM3u(&$pl, $md, $ind='') - { - return NULL; - } - - - public function outputToRss(&$pl, $md, $ind='') - { - return NULL; - } -} // class PlaylistMetadata -?> \ No newline at end of file diff --git a/campcaster/src/modules/storageServer/var/MetaData.php b/campcaster/src/modules/storageServer/var/MetaData.php index 7d175a39f..af3488f16 100644 --- a/campcaster/src/modules/storageServer/var/MetaData.php +++ b/campcaster/src/modules/storageServer/var/MetaData.php @@ -3,7 +3,7 @@ define('DEBUG', FALSE); //define('DEBUG', TRUE); define('MODIFY_LAST_MATCH', TRUE); -require_once "XML/Util.php"; +require_once("XML/Util.php"); /** * File storage support class. @@ -23,11 +23,39 @@ require_once "XML/Util.php"; */ class MetaData { + /** + * @var string + */ public $gunid; + + /** + * For debugging purposes. + * + * @var string + */ + public $gunidBigint; + + /** + * @var string + */ public $resDir; + + /** + * @var string + */ public $fname; + + /** + * @var boolean + */ public $exists; + /** + * @var array + */ + private $metadata; + + /** * @param string $gunid * global unique id @@ -40,6 +68,7 @@ class MetaData { $this->resDir = $resDir; $this->fname = $this->makeFileName(); $this->exists = null; + $this->getAllMetadata(); } @@ -116,7 +145,7 @@ class MetaData { public function exists() { if (is_null($this->exists)) { - $this->exists = $this->dbCheck($this->gunid) + $this->exists = ($this->numElements($this->gunid) > 0) && is_file($this->fname) && is_readable($this->fname); } @@ -135,10 +164,9 @@ class MetaData { if (file_exists($this->fname)) { @unlink($this->fname); } - $res = $CC_DBC->query(" - DELETE FROM ".$CC_CONFIG['mdataTable']." - WHERE gunid=x'{$this->gunid}'::bigint - "); + $sql = "DELETE FROM ".$CC_CONFIG['mdataTable'] + ." WHERE gunid=x'{$this->gunid}'::bigint"; + $res = $CC_DBC->query($sql); if (PEAR::isError($res)) { return $res; } @@ -164,41 +192,54 @@ class MetaData { /** - * Return all metadata for this GUNID. + * Return all metadata as an array. * * @return array */ public function getAllMetadata() { global $CC_CONFIG, $CC_DBC; - $sql = "SELECT predns, predicate, object + if (!is_string($this->gunid)) { + return array(); + } + $sql = "SELECT id, to_hex(gunid), subjns, subject, predns, predicate, predxml, objns, object FROM ".$CC_CONFIG['mdataTable']." WHERE gunid=x'{$this->gunid}'::bigint"; $rows = $CC_DBC->getAll($sql); - $values = array(); + $this->metadata = array(); foreach ($rows as $row) { - $values[$row["predns"].":".$row["predicate"]] = $row["object"]; + $this->metadata[$row["predns"].":".$row["predicate"]] = $row; } - return $values; + return $this->metadata; } /** * Get metadata element value and record id * - * @param string $category + * @param string $p_category * metadata element name * @param int $parid * metadata record id of parent element * @return array * int 'mid': record id - * string 'value': metadata value} + * string 'value': metadata value */ - public function getMetadataEl($category, $parid=NULL) + public function getMetadataElement($p_category, $parid=NULL) { global $CC_CONFIG, $CC_DBC; + + // Get cached value if it exists. + if (is_null($parid) && isset($this->metadata[$p_category])) { + // to be compatible with return values below - yuk + $retval = array(); + $retval[0]['mid'] = $this->metadata[$p_category]["id"]; + $retval[0]['value'] = $this->metadata[$p_category]["object"]; + return $retval; + } + // handle predicate namespace shortcut - $a = XML_Util::splitQualifiedName($category); + $a = XML_Util::splitQualifiedName($p_category); if (PEAR::isError($a)) { return $a; } @@ -231,13 +272,13 @@ class MetaData { /** * Set metadata value / delete metadata record * - * @param int $mid + * @param int $p_id * metadata record id - * @param string $value + * @param string $p_value * new metadata value (NULL for delete) * @return boolean */ - public function setMetadataEl($mid, $value=NULL) + public function setMetadataElement($p_id, $p_value=NULL) { global $CC_CONFIG, $CC_DBC; $info = $CC_DBC->getRow(" @@ -246,33 +287,29 @@ class MetaData { FROM ".$CC_CONFIG['mdataTable']." parmd INNER JOIN ".$CC_CONFIG['mdataTable']." md ON parmd.id=md.subject AND md.subjns='_I' - WHERE md.id=$mid - "); + WHERE md.id=$p_id"); if (PEAR::isError($info)) { return $info; } if (is_null($info)) { return PEAR::raiseError( - "MetaData::setMetadataEl: parent container not found" - ); + "MetaData::setMetadataElement: parent container not found"); } extract($info); $parname = ($parns ? "$parns:" : '').$parname; $category = ($chns ? "$chns:" : '').$chname; - $r = $this->validateOneValue($parname, $category, $predxml, $value); + $r = $this->validateOneValue($parname, $category, $predxml, $p_value); if (PEAR::isError($r)) { return $r; } - if (!is_null($value)) { - $escapedValue = pg_escape_string($value); - $sql = " - UPDATE ".$CC_CONFIG['mdataTable']." + if (!is_null($p_value)) { + $escapedValue = pg_escape_string($p_value); + $sql = "UPDATE ".$CC_CONFIG['mdataTable']." SET object='$escapedValue', objns='_L' - WHERE id={$mid} - "; + WHERE id={$p_id}"; $res = $CC_DBC->query($sql); } else { - $res = $this->deleteRecord($mid); + $res = $this->deleteRecord($p_id); } if (PEAR::isError($res)) { return $res; @@ -286,46 +323,46 @@ class MetaData { * * @param int $parid * metadata record id of parent element - * @param string $category + * @param string $p_category * metadata element name - * @param string value + * @param string $p_value * new metadata value (NULL for delete) * @param string $predxml * 'T' | 'A' | 'N' (tag, attr., namespace) * @return int * new metadata record id */ - public function insertMetadataEl($parid, $category, $value=NULL, $predxml='T') + public function insertMetadataElement($parid, $p_category, $p_value=NULL, $predxml='T') { global $CC_CONFIG, $CC_DBC; - //$category = strtolower($category); - $parent = $CC_DBC->getRow(" - SELECT predns, predicate, predxml FROM ".$CC_CONFIG['mdataTable']." - WHERE gunid=x'{$this->gunid}'::bigint AND id=$parid - "); + //$p_category = strtolower($p_category); + $sql = "SELECT predns, predicate, predxml " + ." FROM ".$CC_CONFIG['mdataTable'] + ." WHERE gunid=x'{$this->gunid}'::bigint AND id=$parid"; + $parent = $CC_DBC->getRow($sql); if (PEAR::isError($parent)) { return $parent; } if (is_null($parent)) { return PEAR::raiseError( - "MetaData::insertMetadataEl: container not found" + "MetaData::insertMetadataElement: container not found" ); } $parNs = ($parent['predns'] ? "{$parent['predns']}:" : ''); $parName = $parNs.$parent['predicate']; - $r = $this->validateOneValue($parName, $category, $predxml, $value); + $r = $this->validateOneValue($parName, $p_category, $predxml, $p_value); if (PEAR::isError($r)) { return $r; } - $a = XML_Util::splitQualifiedName($category); + $a = XML_Util::splitQualifiedName($p_category); if (PEAR::isError($a)) { return $a; } $catNs = $a['namespace']; $cat = $a['localPart']; - $objns = (is_null($value) ? '_blank' : '_L' ); + $objns = (is_null($p_value) ? '_blank' : '_L' ); $nid= $this->storeRecord('_I', $parid, $catNs, $cat, $predxml, - $objns, $value); + $objns, $p_value); if (PEAR::isError($nid)) { return $nid; } @@ -336,53 +373,53 @@ class MetaData { /** * Get metadata element value * - * @param string $category + * @param string $p_category * metadata element name - * @param string $lang + * @param string $p_lang * optional xml:lang value for select language version * @param string $deflang * optional xml:lang for default language * @param string $objns * object namespace prefix - for internal use only * @return array - * array of matching records as hash with fields: + * array of matching records as an array with fields: *
    - *
  • mid int, local metadata record id
  • - *
  • value string, element value
  • - *
  • attrs hasharray of element's attributes indexed by + *
  • "mid" - int, local metadata record id
  • + *
  • "value" - string, element value
  • + *
  • "attrs" - hasharray of element's attributes indexed by * qualified name (e.g. xml:lang)
  • *
* @see BasicStor::bsGetMetadataValue */ - private function getMetadataValueWithAttrs($category, $lang=NULL, $deflang=NULL, $objns='_L') + private function getMetadataValueWithAttrs($p_category, $p_lang=NULL, $deflang=NULL, $objns='_L') { - $all = $this->getMetadataEl($category); + $all = $this->getMetadataElement($p_category); $res = array(); $exact = NULL; $def = NULL; $plain = NULL; // add attributes to result - foreach ($all as $i => $rec) { - $pom = $this->getSubrows($rec['mid']); - if (PEAR::isError($pom)) { - return $pom; + foreach ($all as $key => $rec) { + $subrows = $this->getSubrows($rec['mid']); + if (PEAR::isError($subrows)) { + return $subrows; } - $all[$i]['attrs'] = $pom['attrs']; - $atlang = (isset($pom['attrs']['xml:lang']) ? - $pom['attrs']['xml:lang'] : NULL); + $all[$key]['attrs'] = $subrows['attrs']; + $atlang = (isset($subrows['attrs']['xml:lang']) ? + $subrows['attrs']['xml:lang'] : NULL); // select only matching lang (en is default) - if (is_null($lang)) { - $res[] = $all[$i]; + if (is_null($p_lang)) { + $res[] = $all[$key]; } else { switch (strtolower($atlang)) { case '': - $plain = array($all[$i]); + $plain = array($all[$key]); break; - case strtolower($lang): - $exact = array($all[$i]); + case strtolower($p_lang): + $exact = array($all[$key]); break; case strtolower($deflang): - $def = array($all[$i]); + $def = array($all[$key]); break; } } @@ -403,14 +440,14 @@ class MetaData { /** * Get metadata element value. * - * @param string $category + * @param string $p_category * metadata element name * @return string * If the value doesnt exist, return the empty string. */ - public function getMetadataValue($category) + public function getMetadataValue($p_category) { - $element = $this->getMetadataEl($category); + $element = $this->getMetadataElement($p_category); $value = (isset($element[0]['value']) ? $element[0]['value'] : ''); return $value; } @@ -419,64 +456,63 @@ class MetaData { /** * Set metadata element value * - * @param string $category + * @param string $p_category * metadata element name (e.g. dc:title) - * @param string $value + * @param string $p_value * value to store, if NULL then delete record - * @param string $lang + * @param string $p_lang * optional xml:lang value for select language version - * @param int $mid + * @param int $p_id * metadata record id (OPTIONAL on unique elements) - * @param string $container + * @param string $p_container * container element name for insert * @return boolean */ - public function setMetadataValue($category, $value, $lang=NULL, $mid=NULL, - $container='metadata') + public function setMetadataValue($p_category, $p_value, $p_lang=NULL, + $p_id=NULL, $p_container='metadata') { // resolve actual element: - $rows = $this->getMetadataValueWithAttrs($category, $lang); - $aktual = NULL; + $rows = $this->getMetadataValueWithAttrs($p_category, $p_lang); + $currentRow = NULL; if (count($rows) > 1) { - if (is_null($mid)) { + if (is_null($p_id)) { if (MODIFY_LAST_MATCH) { - $aktual = array_pop($rows); + $currentRow = array_pop($rows); } else { return PEAR::raiseError( - "MetaData::setMetadataValue:". - " nonunique category, mid required" - ); + "Metadata::setMetadataValue:". + " nonunique category, mid required"); } } else { foreach ($rows as $i => $row) { - if ($mid == intval($row['mid'])) { - $aktual = $row; + if ($p_id == intval($row['mid'])) { + $currentRow = $row; } } } } else { - $aktual = (isset($rows[0])? $rows[0] : NULL); + $currentRow = (isset($rows[0])? $rows[0] : NULL); } - if (!is_null($aktual)) { - $res = $this->setMetadataEl($aktual['mid'], $value); + if (!is_null($currentRow)) { + $res = $this->setMetadataElement($currentRow['mid'], $p_value); if (PEAR::isError($res)) { return $res; } - if (!is_null($lang) - && isset($aktual['attrs']['xml:lang']) - && $aktual['attrs']['xml:lang'] != $lang) { - $lg = $this->getMetadataEl('xml:lang', $aktual['mid']); + if (!is_null($p_lang) + && isset($currentRow['attrs']['xml:lang']) + && $currentRow['attrs']['xml:lang'] != $p_lang) { + $lg = $this->getMetadataElement('xml:lang', $currentRow['mid']); if (PEAR::isError($lg)) { return $lg; } if (isset($lg['mid'])) { - $res = $this->setMetadataEl($lg['mid'], $lang); + $res = $this->setMetadataElement($lg['mid'], $p_lang); if (PEAR::isError($res)) { return $res; } } else { - $res = $this->insertMetadataEl( - $aktual['mid'], 'xml:lang', $lang, 'A'); + $res = $this->insertMetadataElement( + $currentRow['mid'], 'xml:lang', $p_lang, 'A'); if (PEAR::isError($res)) { return $res; } @@ -484,22 +520,22 @@ class MetaData { } } else { // resolve container: - $contArr = $this->getMetadataValueWithAttrs($container, NULL, NULL, '_blank'); + $contArr = $this->getMetadataValueWithAttrs($p_container, NULL, NULL, '_blank'); if (PEAR::isError($contArr)) { return $contArr; } $parid = $contArr[0]['mid']; if (is_null($parid)) { return PEAR::raiseError( - "MetaData::setMetadataValue: container ($container) not found" + "MetaData::setMetadataValue: container ($p_container) not found" ); } - $nid = $this->insertMetadataEl($parid, $category, $value); + $nid = $this->insertMetadataElement($parid, $p_category, $p_value); if (PEAR::isError($nid)) { return $nid; } - if (!is_null($lang)) { - $res = $this->insertMetadataEl($nid, 'xml:lang', $lang, 'A'); + if (!is_null($p_lang)) { + $res = $this->insertMetadataElement($nid, 'xml:lang', $p_lang, 'A'); if (PEAR::isError($res) && $res->getCode()!=VAL_UNKNOWNA) { return $res; } @@ -586,18 +622,17 @@ class MetaData { * global unique id * @return boolean */ - private function dbCheck($gunid) + private function numElements($gunid) { global $CC_CONFIG, $CC_DBC; $cnt = $CC_DBC->getOne(" SELECT count(*)as cnt FROM ".$CC_CONFIG['mdataTable']." - WHERE gunid=x'$gunid'::bigint - "); + WHERE gunid=x'$gunid'::bigint"); if (PEAR::isError($cnt)) { return $cnt; } - return (intval($cnt) > 0); + return intval($cnt); } @@ -649,15 +684,15 @@ class MetaData { * * @param string $parName * parent element name - * @param string $category + * @param string $p_category * qualif. category name * @param string $predxml * 'A' | 'T' (attr or tag) - * @param string $value + * @param string $p_value * validated element value * @return true|PEAR_Error */ - private function validateOneValue($parName, $category, $predxml, $value) + private function validateOneValue($parName, $p_category, $predxml, $p_value) { global $CC_CONFIG; if ($CC_CONFIG['validate'] && !is_null($this->format)) { @@ -666,7 +701,7 @@ class MetaData { if (PEAR::isError($val)) { return $val; } - $r = $val->validateOneValue($parName, $category, $predxml, $value); + $r = $val->validateOneValue($parName, $p_category, $predxml, $p_value); if (PEAR::isError($r)) { return $r; } @@ -817,14 +852,12 @@ class MetaData { INSERT INTO ".$CC_CONFIG['mdataTable']." (id , gunid, subjns, subject, predns, predicate, predxml, - objns, object - ) + objns, object) VALUES ($id, x'{$this->gunid}'::bigint, $subjns_sql, $subject_sql, $predns_sql, $predicate_sql, '$predxml', $objns_sql, $object_sql - ) - "); + )"); if (PEAR::isError($res)) { return $res; } @@ -835,15 +868,15 @@ class MetaData { /** * Delete metadata record recursively * - * @param int $mid + * @param int $p_id * local metadata record id * @return boolean */ - private function deleteRecord($mid) + private function deleteRecord($p_id) { global $CC_CONFIG, $CC_DBC; $sql = "SELECT id FROM ".$CC_CONFIG['mdataTable']." - WHERE subjns='_I' AND subject='{$mid}' AND + WHERE subjns='_I' AND subject='{$p_id}' AND gunid=x'{$this->gunid}'::bigint"; $rh = $CC_DBC->query($sql); if (PEAR::isError($rh)) { @@ -857,7 +890,7 @@ class MetaData { } $rh->free(); $sql = "DELETE FROM ".$CC_CONFIG['mdataTable']." - WHERE id={$mid} AND + WHERE id={$p_id} AND gunid=x'{$this->gunid}'::bigint"; $res = $CC_DBC->query($sql); if (PEAR::isError($res)) { @@ -989,7 +1022,7 @@ class MetaData { * local id of parent metadata record * @param boolean $genXML * if TRUE generate XML else PHP array for children - * @return array + * @return array|PEAR_Error * hash with three fields: * - attr hash, attributes * - children array, child nodes @@ -998,53 +1031,41 @@ class MetaData { private function getSubrows($parid, $genXML=TRUE) { global $CC_CONFIG, $CC_DBC; - if (DEBUG) { - echo" getSubrows:\n"; - } - $qh = $CC_DBC->query($q = " - SELECT - id, predxml, predns, predicate, objns, object - FROM ".$CC_CONFIG['mdataTable']." - WHERE - subjns='_I' AND subject='$parid' AND - gunid=x'{$this->gunid}'::bigint - ORDER BY id - "); - if (PEAR::isError($qh)) { - return $qh; + $sql = "SELECT id, predxml, predns, predicate, objns, object" + ." FROM ".$CC_CONFIG['mdataTable'] + ." WHERE subjns='_I' AND subject='$parid' " + ." AND gunid=x'{$this->gunid}'::bigint" + ." ORDER BY id"; + $dbResult = $CC_DBC->query($sql); + if (PEAR::isError($dbResult)) { + return $dbResult; } $attrs = array(); $children = array(); $nSpaces = array(); - if (DEBUG) { - echo " #=".$qh->numRows()."\n$q\n"; - } - while ($row = $qh->fetchRow()) { - if (DEBUG) { - var_dump($row); - } - extract($row); - switch ($predxml) { + while ($row = $dbResult->fetchRow()) { + switch ($row["predxml"]) { case "N": - $nSpaces["$predicate"] = $object; - // $nSpaces["$predicate"] = htmlentities($object, ENT_COMPAT, 'UTF-8'); + $nSpaces[$row["predicate"]] = $row["object"]; case "A": - $sep=':'; - if($predns=='' || $predicate=='') $sep=''; - $attrs["{$predns}{$sep}{$predicate}"] = $object; - // $attrs["{$predns}{$sep}{$predicate}"] = htmlentities($object, ENT_COMPAT, 'UTF-8'); + $sep = ':'; + if ($row["predns"] == '' || $row["predicate"] == '') { + $sep = ''; + } + $key = $row["predns"].$sep.$row["predicate"]; + $attrs[$key] = $row["object"]; break; case "T": $children[] = $this->genXMLNode($row, $genXML); break; default: return PEAR::raiseError( - "MetaData::getSubrows: unknown predxml ($predxml)"); + "MetaData::getSubrows: unknown predxml (".$row["predxml"].")"); } // switch } - $qh->free(); + $dbResult->free(); if ($genXML) { - $children = join(" ", $children); + $children = join(" ", $children); } return compact('attrs', 'children', 'nSpaces'); } diff --git a/campcaster/src/modules/storageServer/var/Playlist.php b/campcaster/src/modules/storageServer/var/Playlist.php index d356007c1..73c64cc54 100644 --- a/campcaster/src/modules/storageServer/var/Playlist.php +++ b/campcaster/src/modules/storageServer/var/Playlist.php @@ -17,68 +17,9 @@ require_once("StoredFile.php"); */ class Playlist extends StoredFile { - /** - * Create instance of Playlist object and recall existing file - * by gunid.
- * - * @param string $gunid - * global unique id - * @param string $className - * optional classname to recall - * @return Playlist - * instance of Playlist object - */ - public static function RecallByGunid($gunid, $className='Playlist') + public function __construct($p_gunid=NULL) { - return parent::RecallByGunid($gunid, $className); - } - - - /** - * Create instance of Playlist object and recall existing file - * by access token.
- * - * @param string $token - * access token - * @param string $className - * optional classname to recall - * @return Playlist - * instance of Playlist object - */ - public static function RecallByToken($token, $className='Playlist') - { - return parent::RecallByToken($token, $className); - } - - - /** - * Create instance of Playlist object and insert new file - * - * @param GreenBox $gb - * reference to GreenBox object - * @param int $oid - * local object id in the tree - * @param string $fname - * name of new file - * @param string $mediaFileLP - * ignored - * @param string $metadata - * local path to playlist XML file or XML string - * @param string $mdataLoc - * 'file'|'string' (optional) - * @param global $plid - * unique id (optional) - for insert file with gunid - * @param string $ftype - * ignored - * @return Playlist - * instance of Playlist object - */ - public static function &insert(&$gb, $oid, $fname, - $mediaFileLP='', $metadata='', $mdataLoc='file', - $plid=NULL, $ftype=NULL) - { - return parent::insert($gb, $oid, $fname, - '', $metadata, $mdataLoc, $plid, 'playlist', 'Playlist'); + parent::__construct($p_gunid); } @@ -95,17 +36,19 @@ class Playlist extends StoredFile { * local object id of parent folder * @return instance of Playlist object */ - public function &create(&$gb, $plid, $fname=NULL, $parid=NULL) + public function create(&$gb, $plid, $fname=NULL, $parid=NULL) { $tmpFname = uniqid(''); $oid = BasicStor::AddObj($tmpFname , 'playlist', $parid); if (PEAR::isError($oid)) { return $oid; } - $pl =& Playlist::insert($gb, $oid, '', '', - dirname(__FILE__).'/emptyPlaylist.xml', - 'file', $plid - ); + $values = array( + "id" => $oid, + "metadata" => dirname(__FILE__).'/emptyPlaylist.xml', + "gunid" => $plid, + "filetype" => "playlist"); + $pl =& StoredFile::Insert($values); if (PEAR::isError($pl)) { $res = BasicStor::RemoveObj($oid); return $pl; @@ -178,363 +121,6 @@ class Playlist extends StoredFile { } - /** - * Set values of auxiliary metadata - * - * @return mixed - * true or error object - */ - private function setAuxMetadata() - { - // get info about playlist - $plInfo = $this->getPlaylistInfo(); - if (PEAR::isError($plInfo)) { - return $plInfo; - } - extract($plInfo); // 'plLen', 'parid', 'metaParid' - // set gunid as id attr in playlist tag: - $mid = $this->_getMidOrInsert('id', $parid, $this->gunid, 'A'); - if (PEAR::isError($mid)) { - return $mid; - } - $r = $this->_setValueOrInsert( - $mid, $this->gunid, $parid, 'id', 'A'); - if (PEAR::isError($r)) { - return $r; - } - return TRUE; - } - - - /** - * Get audioClip length and title - * - * @param int $acId - * local id of audioClip inserted to playlist - * @return array with fields: - *
    - *
  • acGunid, string - audioClip gunid
  • - *
  • acLen string - length of clip in dcterms:extent format
  • - *
  • acTit string - clip title
  • - *
  • elType string - audioClip | playlist
  • - *
- */ - private function getAudioClipInfo($acId) - { - $ac = StoredFile::Recall($acId); - if (PEAR::isError($ac)) { - return $ac; - } - $acGunid = $ac->gunid; - $r = $ac->md->getMetadataEl('dcterms:extent'); - if (PEAR::isError($r)) { - return $r; - } - if (isset($r[0]['value'])) { - $acLen = $r[0]['value']; - } else { - $acLen = '00:00:00.000000'; - } - $r = $ac->md->getMetadataEl('dc:title'); - if (PEAR::isError($r)) { - return $r; - } - if (isset($r[0]['value'])) { - $acTit = $r[0]['value']; - } else { - $acTit = $acGunid; - } - $elType = BasicStor::GetObjType($acId); - $trTbl = array('audioclip'=>'audioClip', 'webstream'=>'audioClip', - 'playlist'=>'playlist'); - $elType = $trTbl[$elType]; - if ($elType == 'webstream') { - $elType = 'audioClip'; - } - return compact('acGunid', 'acLen', 'acTit', 'elType'); - } - - - /** - * Get info about playlist - * - * @return array with fields: - *
    - *
  • plLen string - length of playlist in dcterms:extent format
  • - *
  • parid int - metadata record id of playlist container
  • - *
  • metaParid int - metadata record id of metadata container
  • - *
- */ - private function getPlaylistInfo() - { - $parid = $this->getContainer('playlist'); - if (PEAR::isError($parid)) { - return $parid; - } - // get playlist length and record id: - $r = $this->md->getMetadataEl('playlength', $parid); - if (PEAR::isError($r)) { - return $r; - } - if (isset($r[0])) { - $plLen = $r[0]['value']; - } else { - $r = $this->md->getMetadataEl('dcterms:extent'); - if (PEAR::isError($r)) { - return $r; - } - if (isset($r[0])) { - $plLen = $r[0]['value']; - } else { - $plLen = '00:00:00.000000'; - } - } - // get main playlist container - $parid = $this->getContainer('playlist'); - if (PEAR::isError($parid)) { - return $parid; - } - // get metadata container (optionally insert it) - $metaParid = $this->getContainer('metadata', $parid, TRUE); - if (PEAR::isError($metaParid)) { - return $metaParid; - } - return compact('plLen', 'parid', 'metaParid'); - } - - - /** - * Get container record id, optionally insert new container - * - * @param string $containerName - * @param int $parid - * parent record id - * @param boolean $insertIfNone - flag if insert may be done - * if container wouldn't be found - * @return int - * metadata record id of container - */ - private function getContainer($containerName, $parid=NULL, $insertIfNone=FALSE) - { - $r = $this->md->getMetadataEl($containerName, $parid); - if (PEAR::isError($r)) { - return $r; - } - $id = $r[0]['mid']; - if (!is_null($id)) { - return $id; - } - if (!$insertIfNone || is_null($parid)) { - return PEAR::raiseError( - "Playlist::getContainer: can't find container ($containerName)" - ); - } - $id = $this->md->insertMetadataEl($parid, $containerName); - if (PEAR::isError($id)) { - return $id; - } - return $id; - } - - - /** - * Inserting of new playlistEelement - * - * @param int $parid - * parent record id - * @param string $offset - * relative offset in extent format - * @param string $acGunid - * audioClip gunid - * @param string $acLen - * audioClip length in extent format - * @param string $acTit - * audioClip title - * @param string $fadeIn - * fadeIn value in ss.ssssss or extent format - * @param string $fadeOut - * fadeOut value in ss.ssssss or extent format - * @param string $plElGunid - * optional playlist element gunid - * @param string $elType - * optional 'audioClip' | 'playlist' - * @return array with fields: - *
    - *
  • plElId int - record id of playlistElement
  • - *
  • plElGunid string - gl.unique id of playlistElement
  • - *
  • fadeInId int - record id
  • - *
  • fadeOutId int - record id
  • - *
- */ - private function insertPlaylistElement($parid, $offset, $acGunid, $acLen, $acTit, - $fadeIn=NULL, $fadeOut=NULL, $plElGunid=NULL, $elType='audioClip') - { - // insert playlistElement - $r = $this->md->insertMetadataEl($parid, 'playlistElement'); - if (PEAR::isError($r)) { - return $r; - } - $plElId = $r; - // create and insert gunid (id attribute) - if (is_null($plElGunid)) { - $plElGunid = StoredFile::CreateGunid(); - } - $r = $this->md->insertMetadataEl($plElId, 'id', $plElGunid, 'A'); - if (PEAR::isError($r)) { - return $r; - } - // insert relativeOffset - $r = $this->md->insertMetadataEl( - $plElId, 'relativeOffset', $offset, 'A'); - if (PEAR::isError($r)) { - return $r; - } - // insert audioClip (or playlist) element into playlistElement - $r = $this->md->insertMetadataEl($plElId, $elType); - if (PEAR::isError($r)) { - return $r; - } - $acId = $r; - $r = $this->md->insertMetadataEl($acId, 'id', $acGunid, 'A'); - if (PEAR::isError($r)) { - return $r; - } - $r = $this->md->insertMetadataEl($acId, 'playlength', $acLen, 'A'); - if (PEAR::isError($r)) { - return $r; - } - $r = $this->md->insertMetadataEl($acId, 'title', $acTit, 'A'); - if (PEAR::isError($r)) { - return $r; - } - $fadeInId=NULL; - $fadeOutId=NULL; - if (!is_null($fadeIn) || !is_null($fadeOut)) { - // insert fadeInfo element into playlistElement - $r = $this->md->insertMetadataEl($plElId, 'fadeInfo'); - if (PEAR::isError($r)) { - return $r; - } - $fiId = $r; - $fiGunid = StoredFile::CreateGunid(); - $r = $this->md->insertMetadataEl($fiId, 'id', $fiGunid, 'A'); - if (PEAR::isError($r)) { - return $r; - } - $r = $this->md->insertMetadataEl($fiId, 'fadeIn', $fadeIn, 'A'); - if (PEAR::isError($r)) { - return $r; - } - $fadeInId = $r; - $r = $this->md->insertMetadataEl($fiId, 'fadeOut', $fadeOut, 'A'); - if (PEAR::isError($r)) { - return $r; - } - $fadeOutId = $r; - } - return compact('plElId', 'plElGunid', 'fadeInId', 'fadeOutId'); - } - - - /** - * Return record id, optionally insert new record - * - * @param string $category - * qualified name of metadata category - * @param int $parid - * parent record id - * @param string $value - * value for inserted record - * @param string $predxml - * 'A' | 'T' (attribute or tag) - * @return int - * metadata record id - */ - private function _getMidOrInsert($category, $parid, $value=NULL, $predxml='T') - { - $arr = $this->md->getMetadataEl($category, $parid); - if (PEAR::isError($arr)) { - return $arr; - } - $mid = NULL; - if (isset($arr[0]['mid'])) { - $mid = $arr[0]['mid']; - } - if (!is_null($mid)) { - return $mid; - } - $mid = $this->md->insertMetadataEl($parid, $category, $value, $predxml); - if (PEAR::isError($mid)) { - return $mid; - } - return $mid; - } - - - /** - * Set value of metadata record, optionally insert new record - * - * @param int $mid - * record id - * @param string $value - * value for inserted record - * @param int $parid - * parent record id - * @param string $category - * qualified name of metadata category - * @param string $predxml - * 'A' | 'T' (attribute or tag) - * @return boolean - */ - private function _setValueOrInsert($mid, $value, $parid, $category, $predxml='T') - { - if (is_null($mid)) { - $r = $this->md->insertMetadataEl( - $parid, $category, $value, $predxml); - } else { - $r = $this->md->setMetadataEl($mid, $value); - } - if (PEAR::isError($r)) { - return $r; - } - return TRUE; - } - - - /** - * Set playlist length - dcterm:extent - * - * @param string $newPlLen - * new length in extent format - * @param int $parid - * playlist container record id - * @param int $metaParid - * metadata container record id - * @return boolean - */ - private function setPlaylistLength($newPlLen, $parid, $metaParid) - { - $mid = $this->_getMidOrInsert('playlength', $parid, $newPlLen, 'A'); - if (PEAR::isError($mid)) { - return $mid; - } - $r = $this->_setValueOrInsert( - $mid, $newPlLen, $parid, 'playlength', 'A'); - if (PEAR::isError($r)) { - return $r; - } - $mid = $this->_getMidOrInsert('dcterms:extent', $metaParid, $newPlLen); - if (PEAR::isError($mid)) { - return $mid; - } - $r = $this->_setValueOrInsert( - $mid, $newPlLen, $metaParid, 'dcterms:extent'); - if (PEAR::isError($r)) { - return $r; - } - return TRUE; - } - /** * Add audioClip specified by local id to the playlist * @@ -602,30 +188,30 @@ class Playlist extends StoredFile { extract($plInfo); // 'plLen', 'parid', 'metaParid' // get array of playlist elements: - $plElArr = $this->md->getMetadataEl('playlistElement', $parid); + $plElArr = $this->md->getMetadataElement('playlistElement', $parid); if (PEAR::isError($plElArr)) { return $plElArr; } $found = FALSE; foreach ($plElArr as $el) { - $plElGunidArr = $this->md->getMetadataEl('id', $el['mid']); + $plElGunidArr = $this->md->getMetadataElement('id', $el['mid']); if (PEAR::isError($plElGunidArr)) { return $plElGunidArr; } // select playlist element to remove if ($plElGunidArr[0]['value'] == $plElGunid) { - $acArr = $this->md->getMetadataEl('audioClip', $el['mid']); + $acArr = $this->md->getMetadataElement('audioClip', $el['mid']); if (PEAR::isError($acArr)) { return $acArr; } $storedAcMid = $acArr[0]['mid']; - $acLenArr = $this->md->getMetadataEl('playlength', $storedAcMid); + $acLenArr = $this->md->getMetadataElement('playlength', $storedAcMid); if (PEAR::isError($acLenArr)) { return $acLenArr; } $acLen = $acLenArr[0]['value']; // remove playlist element: - $r = $this->md->setMetadataEl($el['mid'], NULL); + $r = $this->md->setMetadataElement($el['mid'], NULL); if (PEAR::isError($r)) { return $r; } @@ -664,13 +250,13 @@ class Playlist extends StoredFile { extract($plInfo); // 'plLen', 'parid', 'metaParid' // get array of playlist elements: - $plElArr = $this->md->getMetadataEl('playlistElement', $parid); + $plElArr = $this->md->getMetadataElement('playlistElement', $parid); if (PEAR::isError($plElArr)) { return $plElArr; } $found = FALSE; foreach ($plElArr as $el) { - $plElGunidArr = $this->md->getMetadataEl('id', $el['mid']); + $plElGunidArr = $this->md->getMetadataElement('id', $el['mid']); if (PEAR::isError($plElGunidArr)) { return $plElGunidArr; } @@ -754,11 +340,11 @@ class Playlist extends StoredFile { $fadeOut = NULL; foreach ($el['children'] as $j => $af) { switch ($af['elementname']) { - case"audioClip": - case"playlist": + case "audioClip": + case "playlist": $acGunid = $af['attrs']['id']; break; - case"fadeInfo": + case "fadeInfo": $fadeIn = $af['attrs']['fadeIn']; $fadeOut = $af['attrs']['fadeOut']; break; @@ -788,7 +374,7 @@ class Playlist extends StoredFile { /** - * Recalculate total length of playlist and relativeOffset values + * Recalculate total length of playlist and relativeOffset values * of all playlistElements according to legth and fadeIn values. * FadeOut values adjusted to next fadeIn. * @@ -804,7 +390,7 @@ class Playlist extends StoredFile { } extract($plInfo); // 'plLen', 'parid', 'metaParid' // get array of playlist elements: - $plElArr = $this->md->getMetadataEl('playlistElement', $parid); + $plElArr = $this->md->getMetadataElement('playlistElement', $parid); if (PEAR::isError($plElArr)) { return $plElArr; } @@ -816,46 +402,46 @@ class Playlist extends StoredFile { foreach ($plElArr as $el) { $elId = $el['mid']; // get playlistElement gunid: - $plElGunidArr = $this->md->getMetadataEl('id', $elId); + $plElGunidArr = $this->md->getMetadataElement('id', $elId); if (PEAR::isError($plElGunidArr)) { return $plElGunidArr; } $plElGunid = $plElGunidArr[0]['value']; // get relativeOffset: - $offArr = $this->md->getMetadataEl('relativeOffset', $elId); + $offArr = $this->md->getMetadataElement('relativeOffset', $elId); if (PEAR::isError($offArr)) { return $offArr; } $offsetId = $offArr[0]['mid']; $offset = $offArr[0]['value']; // get audioClip: - $acArr = $this->md->getMetadataEl('audioClip', $elId); + $acArr = $this->md->getMetadataElement('audioClip', $elId); if (is_array($acArr) && (!isset($acArr[0]) || is_null($acArr[0]))) { - $acArr = $this->md->getMetadataEl('playlist', $elId); + $acArr = $this->md->getMetadataElement('playlist', $elId); } if (PEAR::isError($acArr)) { return $acArr; } $storedAcMid = $acArr[0]['mid']; // get playlength: - $acLenArr = $this->md->getMetadataEl('playlength', $storedAcMid); + $acLenArr = $this->md->getMetadataElement('playlength', $storedAcMid); if (PEAR::isError($acLenArr)) { return $acLenArr; } $acLen = $acLenArr[0]['value']; // get fadeInfo: - $fiArr = $this->md->getMetadataEl('fadeInfo', $elId); + $fiArr = $this->md->getMetadataElement('fadeInfo', $elId); if (PEAR::isError($fiArr)) { return $fiArr; } if (isset($fiArr[0]['mid'])) { $fiMid = $fiArr[0]['mid']; - $fadeInArr = $this->md->getMetadataEl('fadeIn', $fiMid); + $fadeInArr = $this->md->getMetadataElement('fadeIn', $fiMid); if (PEAR::isError($fadeInArr)) { return $fadeInArr; } $fadeIn = $fadeInArr[0]['value']; - $fadeOutArr = $this->md->getMetadataEl('fadeOut', $fiMid); + $fadeOutArr = $this->md->getMetadataElement('fadeOut', $fiMid); if (PEAR::isError($fadeOutArr)) { return $fadeOutArr; } @@ -956,7 +542,7 @@ class Playlist extends StoredFile { if ($found) { // we've found offset switch ($el['type']) { case "playlist": - $pl = Playlist::RecallByGunid($acGunid); + $pl = StoredFile::RecallByGunid($acGunid); if (PEAR::isError($pl)) { return $pl; } @@ -1033,7 +619,7 @@ class Playlist extends StoredFile { extract($el); // acLen, elOffset, acGunid, fadeIn, fadeOut, playlist switch ($el['type']) { case "playlist": - $pl = Playlist::RecallByGunid($acGunid); + $pl = StoredFile::RecallByGunid($acGunid); if (PEAR::isError($pl)) { return $pl; } @@ -1105,7 +691,7 @@ class Playlist extends StoredFile { if ($this->gunid == $insGunid) { return TRUE; } - $pl = Playlist::RecallByGunid($insGunid); + $pl = StoredFile::RecallByGunid($insGunid); if (PEAR::isError($pl)) { return $pl; } @@ -1135,11 +721,470 @@ class Playlist extends StoredFile { return FALSE; } + + /** + * Export playlist as simplified SMIL XML file. + * + * @param boolean $toString + * if false don't real export, + * return misc info about playlist only + * @return string + * XML string or hasharray with misc info + */ + public function outputToSmil($toString=TRUE) + { + $plGunid = $this->gunid; + $arr = $this->md->genPhpArray(); + if (PEAR::isError($arr)) { + return $arr; + } + if ($toString) { + $r = PlaylistTagExport::OutputToSmil($this, $arr); + if (PEAR::isError($r)) { + return $r; + } + return $r; + } else { + return array( + 'type' => 'playlist', + 'gunid' => $plGunid, + 'src' => PL_URL_RELPATH."$plGunid.smil", + 'playlength' => $arr['attrs']['playlength'], + ); + } + } + + + /** + * Export playlist as M3U file. + * + * @param boolean $toString + * if false don't real export, + * return misc info about playlist only + * @return string|array + * M3U string or hasharray with misc info + */ + public function outputToM3u($toString=TRUE) + { + $plGunid = $this->gunid; + $arr = $this->md->genPhpArray(); + if (PEAR::isError($arr)) { + return $arr; + } + if ($toString) { + $r = PlaylistTagExport::OutputToM3u($this, $arr); + if (PEAR::isError($r)) { + return $r; + } + return $r; + } else { + return array( + 'type' => 'playlist', + 'gunid' => $plGunid, + 'uri' => PL_URL_RELPATH."$plGunid.m3u", + 'playlength' => $arr['attrs']['playlength'], + 'title' => $arr['attrs']['title'], + ); + } + } + + + /** + * Export playlist as RSS XML file + * + * @param boolean $toString + * if false don't really export, + * return misc info about playlist only + * @return mixed + * XML string or hasharray with misc info + */ + public function outputToRss($toString=TRUE) + { + $plGunid = $this->gunid; + $arr = $this->md->genPhpArray(); + if (PEAR::isError($arr)) { + return $arr; + } + if ($toString) { + $r = PlaylistTagExport::OutputToRss($this, $arr); + if (PEAR::isError($r)) { + return $r; + } + return $r; + } else { + return array( + 'type' => 'playlist', + 'gunid' => $plGunid, + 'src' => PL_URL_RELPATH."$plGunid.smil", + 'playlength' => $arr['attrs']['playlength'], + ); + } + } + + + /** + * Set values of auxiliary metadata + * + * @return mixed + * true or error object + */ + private function setAuxMetadata() + { + // get info about playlist + $plInfo = $this->getPlaylistInfo(); + if (PEAR::isError($plInfo)) { + return $plInfo; + } + extract($plInfo); // 'plLen', 'parid', 'metaParid' + // set gunid as id attr in playlist tag: + $mid = $this->_getMidOrInsert('id', $parid, $this->gunid, 'A'); + if (PEAR::isError($mid)) { + return $mid; + } + $r = $this->_setValueOrInsert( + $mid, $this->gunid, $parid, 'id', 'A'); + if (PEAR::isError($r)) { + return $r; + } + return TRUE; + } + + + /** + * Get audioClip length and title + * + * @param int $acId + * local id of audioClip inserted to playlist + * @return array with fields: + *
    + *
  • acGunid, string - audioClip gunid
  • + *
  • acLen string - length of clip in dcterms:extent format
  • + *
  • acTit string - clip title
  • + *
  • elType string - audioClip | playlist
  • + *
+ */ + private function getAudioClipInfo($acId) + { + $ac = StoredFile::Recall($acId); + if (PEAR::isError($ac)) { + return $ac; + } + $acGunid = $ac->gunid; + $r = $ac->md->getMetadataElement('dcterms:extent'); + if (PEAR::isError($r)) { + return $r; + } + if (isset($r[0]['value'])) { + $acLen = $r[0]['value']; + } else { + $acLen = '00:00:00.000000'; + } + $r = $ac->md->getMetadataElement('dc:title'); + if (PEAR::isError($r)) { + return $r; + } + if (isset($r[0]['value'])) { + $acTit = $r[0]['value']; + } else { + $acTit = $acGunid; + } + $elType = BasicStor::GetObjType($acId); + $trTbl = array('audioclip'=>'audioClip', 'webstream'=>'audioClip', + 'playlist'=>'playlist'); + $elType = $trTbl[$elType]; + if ($elType == 'webstream') { + $elType = 'audioClip'; + } + return compact('acGunid', 'acLen', 'acTit', 'elType'); + } + + + /** + * Get info about playlist + * + * @return array with fields: + *
    + *
  • plLen string - length of playlist in dcterms:extent format
  • + *
  • parid int - metadata record id of playlist container
  • + *
  • metaParid int - metadata record id of metadata container
  • + *
+ */ + private function getPlaylistInfo() + { + $parid = $this->getContainer('playlist'); + if (PEAR::isError($parid)) { + return $parid; + } + // get playlist length and record id: + $r = $this->md->getMetadataElement('playlength', $parid); + if (PEAR::isError($r)) { + return $r; + } + if (isset($r[0])) { + $plLen = $r[0]['value']; + } else { + $r = $this->md->getMetadataElement('dcterms:extent'); + if (PEAR::isError($r)) { + return $r; + } + if (isset($r[0])) { + $plLen = $r[0]['value']; + } else { + $plLen = '00:00:00.000000'; + } + } + // get main playlist container + $parid = $this->getContainer('playlist'); + if (PEAR::isError($parid)) { + return $parid; + } + // get metadata container (optionally insert it) + $metaParid = $this->getContainer('metadata', $parid, TRUE); + if (PEAR::isError($metaParid)) { + return $metaParid; + } + return compact('plLen', 'parid', 'metaParid'); + } + + + /** + * Get container record id, optionally insert new container + * + * @param string $containerName + * @param int $parid + * parent record id + * @param boolean $insertIfNone - flag if insert may be done + * if container wouldn't be found + * @return int + * metadata record id of container + */ + private function getContainer($containerName, $parid=NULL, $insertIfNone=FALSE) + { + $r = $this->md->getMetadataElement($containerName, $parid); + if (PEAR::isError($r)) { + return $r; + } + $id = $r[0]['mid']; + if (!is_null($id)) { + return $id; + } + if (!$insertIfNone || is_null($parid)) { + return PEAR::raiseError( + "Playlist::getContainer: can't find container ($containerName)" + ); + } + $id = $this->md->insertMetadataElement($parid, $containerName); + if (PEAR::isError($id)) { + return $id; + } + return $id; + } + + + /** + * Insert a new playlist element. + * + * @param int $parid + * parent record id + * @param string $offset + * relative offset in extent format + * @param string $acGunid + * audioClip gunid + * @param string $acLen + * audioClip length in extent format + * @param string $acTit + * audioClip title + * @param string $fadeIn + * fadeIn value in ss.ssssss or extent format + * @param string $fadeOut + * fadeOut value in ss.ssssss or extent format + * @param string $plElGunid + * optional playlist element gunid + * @param string $elType + * optional 'audioClip' | 'playlist' + * @return array with fields: + *
    + *
  • plElId int - record id of playlistElement
  • + *
  • plElGunid string - gl.unique id of playlistElement
  • + *
  • fadeInId int - record id
  • + *
  • fadeOutId int - record id
  • + *
+ */ + private function insertPlaylistElement($parid, $offset, $acGunid, $acLen, $acTit, + $fadeIn=NULL, $fadeOut=NULL, $plElGunid=NULL, $elType='audioClip') + { + // insert playlistElement + $r = $this->md->insertMetadataElement($parid, 'playlistElement'); + if (PEAR::isError($r)) { + return $r; + } + $plElId = $r; + // create and insert gunid (id attribute) + if (is_null($plElGunid)) { + $plElGunid = StoredFile::CreateGunid(); + } + $r = $this->md->insertMetadataElement($plElId, 'id', $plElGunid, 'A'); + if (PEAR::isError($r)) { + return $r; + } + // insert relativeOffset + $r = $this->md->insertMetadataElement( + $plElId, 'relativeOffset', $offset, 'A'); + if (PEAR::isError($r)) { + return $r; + } + // insert audioClip (or playlist) element into playlistElement + $r = $this->md->insertMetadataElement($plElId, $elType); + if (PEAR::isError($r)) { + return $r; + } + $acId = $r; + $r = $this->md->insertMetadataElement($acId, 'id', $acGunid, 'A'); + if (PEAR::isError($r)) { + return $r; + } + $r = $this->md->insertMetadataElement($acId, 'playlength', $acLen, 'A'); + if (PEAR::isError($r)) { + return $r; + } + $r = $this->md->insertMetadataElement($acId, 'title', $acTit, 'A'); + if (PEAR::isError($r)) { + return $r; + } + $fadeInId=NULL; + $fadeOutId=NULL; + if (!is_null($fadeIn) || !is_null($fadeOut)) { + // insert fadeInfo element into playlistElement + $r = $this->md->insertMetadataElement($plElId, 'fadeInfo'); + if (PEAR::isError($r)) { + return $r; + } + $fiId = $r; + $fiGunid = StoredFile::CreateGunid(); + $r = $this->md->insertMetadataElement($fiId, 'id', $fiGunid, 'A'); + if (PEAR::isError($r)) { + return $r; + } + $r = $this->md->insertMetadataElement($fiId, 'fadeIn', $fadeIn, 'A'); + if (PEAR::isError($r)) { + return $r; + } + $fadeInId = $r; + $r = $this->md->insertMetadataElement($fiId, 'fadeOut', $fadeOut, 'A'); + if (PEAR::isError($r)) { + return $r; + } + $fadeOutId = $r; + } + return compact('plElId', 'plElGunid', 'fadeInId', 'fadeOutId'); + } + + + /** + * Return record id, optionally insert new record + * + * @param string $category + * qualified name of metadata category + * @param int $parid + * parent record id + * @param string $value + * value for inserted record + * @param string $predxml + * 'A' | 'T' (attribute or tag) + * @return int + * metadata record id + */ + private function _getMidOrInsert($category, $parid, $value=NULL, $predxml='T') + { + $arr = $this->md->getMetadataElement($category, $parid); + if (PEAR::isError($arr)) { + return $arr; + } + $mid = NULL; + if (isset($arr[0]['mid'])) { + $mid = $arr[0]['mid']; + } + if (!is_null($mid)) { + return $mid; + } + $mid = $this->md->insertMetadataElement($parid, $category, $value, $predxml); + if (PEAR::isError($mid)) { + return $mid; + } + return $mid; + } + + + /** + * Set value of metadata record, optionally insert new record + * + * @param int $mid + * record id + * @param string $value + * value for inserted record + * @param int $parid + * parent record id + * @param string $category + * qualified name of metadata category + * @param string $predxml + * 'A' | 'T' (attribute or tag) + * @return boolean + */ + private function _setValueOrInsert($mid, $value, $parid, $category, $predxml='T') + { + if (is_null($mid)) { + $r = $this->md->insertMetadataElement( + $parid, $category, $value, $predxml); + } else { + $r = $this->md->setMetadataElement($mid, $value); + } + if (PEAR::isError($r)) { + return $r; + } + return TRUE; + } + + + /** + * Set playlist length - dcterm:extent + * + * @param string $newPlLen + * new length in extent format + * @param int $parid + * playlist container record id + * @param int $metaParid + * metadata container record id + * @return boolean + */ + private function setPlaylistLength($newPlLen, $parid, $metaParid) + { + $mid = $this->_getMidOrInsert('playlength', $parid, $newPlLen, 'A'); + if (PEAR::isError($mid)) { + return $mid; + } + $r = $this->_setValueOrInsert( + $mid, $newPlLen, $parid, 'playlength', 'A'); + if (PEAR::isError($r)) { + return $r; + } + $mid = $this->_getMidOrInsert('dcterms:extent', $metaParid, $newPlLen); + if (PEAR::isError($mid)) { + return $mid; + } + $r = $this->_setValueOrInsert( + $mid, $newPlLen, $metaParid, 'dcterms:extent'); + if (PEAR::isError($r)) { + return $r; + } + return TRUE; + } + } // class Playlist /** * Auxiliary class for GB playlist editing methods + * * @author Tomas Hlava * @author Paul Baranowski * @copyright 2006 MDLF, Inc. @@ -1152,7 +1197,7 @@ class PlaylistElement { public function PlaylistElement(&$pl, $plEl) { - $this->pl = $pl; + $this->pl = $pl; $this->plEl = $plEl; } @@ -1198,4 +1243,446 @@ class PlaylistElement { } } // class PlaylistElement + +/** + * @author Tomas Hlava + * @author Paul Baranowski + * @package Campcaster + * @subpackage StorageServer + * @copyright 2006 MDLF, Inc. + * @license http://www.gnu.org/licenses/gpl.txt + * @link http://www.campware.org + * @todo Rename this class PlaylistTag + */ +class PlaylistTagExport +{ + public static function OutputToSmil(&$pl, $plt, $ind='') + { + $ind2 = $ind.INDCH; + $ind3 = $ind2.INDCH; + $ind4 = $ind3.INDCH; + $res = ""; + foreach ($plt['children'] as $ple) { + switch ($ple['elementname']) { + case "playlistElement": + $r = PlaylistElementExport::OutputToSmil($pl, $ple, $ind4); + if (PEAR::isError($r)) { + return $r; + } + if (!is_null($r)) { + $res .= $r; + } + break; + case "metadata": + $r = PlaylistMetadataExport::OutputToSmil($pl, $ple, $ind4); + if (PEAR::isError($r)) { + return $r; + } + if (!is_null($r)) { + $res .= $r; + } + break; + default: + } + } + $res = "$ind\n". + "$ind\n". + "$ind2\n". + "$ind3\n". + "$res". + "$ind3\n". + "$ind2\n". + "$ind\n"; + return $res; + } + + + public static function OutputToM3u(&$pl, $plt, $ind='') + { + $res = ""; + foreach ($plt['children'] as $ple) { + switch ($ple['elementname']) { + case"playlistElement": + $r = PlaylistElementExport::OutputToM3u($pl, $ple); + if (PEAR::isError($r)) { + return $r; + } + if (!is_null($r)) { + $res .= $r; + } + break; + } + } + $res = "#EXTM3U\n$res"; + return $res; + } + + + public static function OutputToRss(&$pl, $plt, $ind='') + { + $ind2 = $ind.INDCH; + $ind3 = $ind2.INDCH; + $res = ""; + foreach ($plt['children'] as $ple) { + switch ($ple['elementname']) { + case "playlistElement": + $r = PlaylistElementExport::OutputToRss($pl, $ple, $ind3); + if (PEAR::isError($r)) { + return $r; + } + if (!is_null($r)) { + $res .= $r; + } + break; + case "metadata": + $r = PlaylistMetadataExport::OutputToRss($pl, $ple, $ind3); + if (PEAR::isError($r)) { + return $r; + } + if (!is_null($r)) { + $res .= $r; + } + break; + default: + } + } + $res = "$ind\n". + "$ind\n". + "$ind2\n". + "$res". + "$ind2\n". + "$ind\n"; + return $res; + } +} + + +/** + * @author Tomas Hlava + * @author Paul Baranowski + * @package Campcaster + * @subpackage StorageServer + * @copyright 2006 MDLF, Inc. + * @license http://www.gnu.org/licenses/gpl.txt + * @link http://www.campware.org + * @todo Rename this class "PlaylistElement" + */ +class PlaylistElementExport { + + public static function OutputToSmil(&$pl, $ple, $ind='') + { + $acOrPl = NULL; + $finfo = array('fi'=>0, 'fo'=>0); + $ind2 = $ind.INDCH; + $ind3 = $ind2.INDCH; + $anim = ''; + foreach ($ple['children'] as $ac) { + switch ($ac['elementname']) { + case "audioClip": + $r = PlaylistAudioClipExport::OutputToSmil($pl, $ac, $ind2); + if (PEAR::isError($r)) { + return $r; + } + if (!is_null($r)) { + $acOrPl = $r; + } + break; + case "playlist": + $gunid = $ac['attrs']['id']; + $pl2 = StoredFile::RecallByGunid($gunid); + if (PEAR::isError($pl2)) { + return $pl2; + } + $r = $pl2->outputToSmil(FALSE); + if (PEAR::isError($r)) { + return $r; + } + if (!is_null($r)) { + $acOrPl = $r; + } + break; + case "fadeInfo": + $r = PlaylistFadeInfoExport::OutputToSmil($pl, $ac, $ind2); + if (PEAR::isError($r)) { + return $r; + } + if (!is_null($r)) { + $finfo = $r; + } + break; + default: + return PEAR::raiseError( + "PlaylistElementExport::OutputToSmil:". + " unknown tag {$ac['elementname']}" + ); + } + } + $beginS = Playlist::playlistTimeToSeconds($ple['attrs']['relativeOffset']); + $playlengthS = Playlist::playlistTimeToSeconds($acOrPl['playlength']); + $fadeOutS = Playlist::playlistTimeToSeconds($finfo['fo']); + $fiBeginS = 0; + $fiEndS = Playlist::playlistTimeToSeconds($finfo['fi']); + $foBeginS = ($playlengthS - $fadeOutS); + $foEndS = Playlist::playlistTimeToSeconds($acOrPl['playlength']); + foreach (array('fi','fo') as $ff) { + if (${$ff."EndS"} - ${$ff."BeginS"} > 0) { + $anim .= "{$ind2}\n" + ; + } + } + $src = $acOrPl['src']; + $str = "$ind" : " />"). + " ". + "\n"; + return $str; + } + + + public static function OutputToM3u(&$pl, $ple, $ind='') + { + $acOrPl = NULL; + foreach ($ple['children'] as $ac) { + switch ($ac['elementname']) { + case "audioClip": + $r = PlaylistAudioClipExport::OutputToM3u($pl, $ac); + if (PEAR::isError($r)) { + return $r; + } + if (!is_null($r)) { + $acOrPl = $r; + } + break; + case "playlist": + $gunid = $ac['attrs']['id']; + $pl2 = StoredFile::RecallByGunid($gunid); + if (PEAR::isError($pl2)) { + return $pl2; + } + $r = $pl2->outputToM3u(FALSE); + if (PEAR::isError($r)) { + return $r; + } + if (!is_null($r)) { + $acOrPl = $r; + } + break; + } + } + if (is_null($acOrPl)) { + return ''; + } + $playlength = ceil(Playlist::playlistTimeToSeconds($acOrPl['playlength'])); + $title = $acOrPl['title']; + $uri = (isset($acOrPl['uri']) ? $acOrPl['uri'] : '???' ); + $res = "#EXTINF: $playlength, $title\n"; + $res .= "$uri\n"; + return $res; + } + + + public static function OutputToRss(&$pl, $ple, $ind='') + { + $acOrPl = NULL; + $ind2 = $ind.INDCH; + $anim = ''; + foreach ($ple['children'] as $ac) { + switch ($ac['elementname']) { + case "audioClip": + $r = PlaylistAudioClipExport::OutputToRss($pl, $ac, $ind2); + if (PEAR::isError($r)) { + return $r; + } + if (!is_null($r)) { + $acOrPl = $r; + } + break; + case "playlist": + $gunid = $ac['attrs']['id']; + $pl2 = StoredFile::RecallByGunid($gunid); + if (PEAR::isError($pl2)) { + return $pl2; + } + $r = $pl2->outputToRss(FALSE); + if (PEAR::isError($r)) { + return $r; + } + if (!is_null($r)) { + $acOrPl = $r; + } + break; + case "fadeInfo": + break; + default: + return PEAR::raiseError( + "PlaylistElementExport::OutputToRss:". + " unknown tag {$ac['elementname']}" + ); + } + } + $title = (isset($acOrPl['title']) ? htmlspecialchars($acOrPl['title']) : '' ); + $desc = (isset($acOrPl['desc']) ? htmlspecialchars($acOrPl['desc']) : '' ); + $link = htmlspecialchars($acOrPl['src']); + $desc = ''; + $str = "$ind\n". + "$ind2$title\n". + "$ind2$desc\n". + "$ind2$link\n". + "$ind\n"; + return $str; + } +} + + +/** + * @author Tomas Hlava + * @author Paul Baranowski + * @package Campcaster + * @subpackage StorageServer + * @copyright 2006 MDLF, Inc. + * @license http://www.gnu.org/licenses/gpl.txt + * @link http://www.campware.org + * @todo Rename this class to PlaylistAudioClip (notice the caps) + */ +class PlaylistAudioClipExport +{ + + public static function OutputToSmil(&$pl, $plac, $ind='') + { + $gunid = $plac['attrs']['id']; + $ac = StoredFile::RecallByGunid($gunid); + if (PEAR::isError($ac)) { + return $ac; + } + $RADext = $ac->getFileExtension(); + if (PEAR::isError($RADext)) { + return $RADext; + } + return array( + 'type' => 'audioclip', + 'gunid' => $gunid, + 'src' => AC_URL_RELPATH."$gunid.$RADext", + 'playlength' => $plac['attrs']['playlength'], + ); + } + + + public static function OutputToM3u(&$pl, $plac, $ind='') + { + $gunid = $plac['attrs']['id']; + $ac = StoredFile::RecallByGunid($gunid); + if (PEAR::isError($ac)) { + return $ac; + } + $RADext = $ac->getFileExtension(); + if (PEAR::isError($RADext)) { + return $RADext; + } + return array( + 'playlength' => $plac['attrs']['playlength'], + 'title' => $plac['attrs']['title'], + 'uri' => AC_URL_RELPATH."$gunid.$RADext", + ); + } + + + public static function OutputToRss(&$pl, $plac, $ind='') + { + $gunid = $plac['attrs']['id']; + $ac = StoredFile::RecallByGunid($gunid); + if (PEAR::isError($ac)) { + return $ac; + } + $RADext = $ac->getFileExtension(); + if (PEAR::isError($RADext)) { + return $RADext; + } + $title = $pl->gb->bsGetMetadataValue($ac->getId(), 'dc:title'); + $desc = $pl->gb->bsGetMetadataValue($ac->getId(), 'dc:description'); + return array( + 'type' => 'audioclip', + 'gunid' => $gunid, + 'src' => "http://XXX/YY/$gunid.$RADext", + 'playlength' => $plac['attrs']['playlength'], + 'title' => $title, + 'desc' => $desc, + ); + } +} + + +/** + * @author Tomas Hlava + * @author Paul Baranowski + * @package Campcaster + * @subpackage StorageServer + * @copyright 2006 MDLF, Inc. + * @license http://www.gnu.org/licenses/gpl.txt + * @link http://www.campware.org + * @todo Rename this class "PlaylistFadeInfo" (notive the caps) + */ +class PlaylistFadeInfoExport +{ + + public static function OutputToSmil(&$pl, $plfi, $ind='') + { + $r = array( + 'fi'=>$plfi['attrs']['fadeIn'], + 'fo'=>$plfi['attrs']['fadeOut'], + ); + return $r; + } + + + public static function OutputToM3u(&$pl, $plfa, $ind='') + { + return ''; + } + + + public static function OutputToRss(&$pl, $plfa, $ind='') + { + return ''; + } + +} + + +/** + * @author Tomas Hlava + * @author Paul Baranowski + * @package Campcaster + * @subpackage StorageServer + * @copyright 2006 MDLF, Inc. + * @license http://www.gnu.org/licenses/gpl.txt + * @link http://www.campware.org + * @todo Rename this class to PlaylistMetadata (notice the caps) + */ +class PlaylistMetadataExport +{ + public static function OutputToSmil(&$pl, $md, $ind='') + { + return NULL; + } + + + public static function OutputToM3u(&$pl, $md, $ind='') + { + return NULL; + } + + + public static function OutputToRss(&$pl, $md, $ind='') + { + return NULL; + } +} + ?> \ No newline at end of file diff --git a/campcaster/src/modules/storageServer/var/Renderer.php b/campcaster/src/modules/storageServer/var/Renderer.php index e8ed75900..c68424930 100644 --- a/campcaster/src/modules/storageServer/var/Renderer.php +++ b/campcaster/src/modules/storageServer/var/Renderer.php @@ -1,7 +1,7 @@ \n \n$mdata \n\n"; //$mdata = "\n \n$mdata0\n\n\n"; - $id = $gb->bsPutFile($parid, $fileName, $realOgg, $mdata, - NULL, 'audioclip', 'string'); - if (PEAR::isError($id)) { - return $id; + $values = array( + "filename" => $fileName, + "filepath" => $realOgg, + "metadata" => $mdata, + "filetype" => "audioclip" + ); + $storedFile = $gb->bsPutFile($parid, $values); + if (PEAR::isError($storedFile)) { + return $storedFile; } - $ac = StoredFile::Recall($id); - if (PEAR::isError($ac)) { - return $ac; - } - return array('gunid' => $ac->gunid); + return array('gunid' => $storedFile->getGunid()); } diff --git a/campcaster/src/modules/storageServer/var/Restore.php b/campcaster/src/modules/storageServer/var/Restore.php index 8c0b9143f..94412f32f 100644 --- a/campcaster/src/modules/storageServer/var/Restore.php +++ b/campcaster/src/modules/storageServer/var/Restore.php @@ -312,16 +312,15 @@ class Restore { "$parid, $name, $mediaFileLP, $file, {$this->sessid}, $gunid, $type \n" ); } - $put = $this->gb->putFile( - $parid, # parent id - $name, # name of original file - $mediaFileLP, # media file if have - $file, # meta file - $this->sessid, # sessid - $gunid, # gunid - $type # type + $values = array( + "filename" => $name, + "filepath" => $mediaFileLP, + "metadata" => $file, + "gunid" => $gunid, + "filetype" => $type ); - # $this->addLogItem("add as new \n"); + $put = $this->gb->putFile($parid, $values, $this->sessid); + //$this->addLogItem("add as new \n"); if (PEAR::isError($put)) { $this->addLogItem("-E- ".date("Ymd-H:i:s"). " addFileToStorage - putFile Error ". diff --git a/campcaster/src/modules/storageServer/var/SmilPlaylist.php b/campcaster/src/modules/storageServer/var/SmilPlaylist.php index 61cdbbca4..bf4404ec2 100644 --- a/campcaster/src/modules/storageServer/var/SmilPlaylist.php +++ b/campcaster/src/modules/storageServer/var/SmilPlaylist.php @@ -266,7 +266,7 @@ class SmilPlaylistAudioElement { if (PEAR::isError($ac)) { return $ac; } - $r = $ac->md->getMetadataEl('dcterms:extent'); + $r = $ac->md->getMetadataElement('dcterms:extent'); if (PEAR::isError($r)) { return $r; } diff --git a/campcaster/src/modules/storageServer/var/StoredFile.php b/campcaster/src/modules/storageServer/var/StoredFile.php index 3ecdee4d9..23587f796 100644 --- a/campcaster/src/modules/storageServer/var/StoredFile.php +++ b/campcaster/src/modules/storageServer/var/StoredFile.php @@ -57,13 +57,12 @@ function camp_add_metadata(&$p_mdata, $p_key, $p_val, $p_inputEncoding='iso-8859 * For diagnostic and debugging purposes - setting this to TRUE * will print out the values found in the file and the ones assigned * to the return array. - * @return array/PEAR_Error + * @return array|PEAR_Error */ function camp_get_audio_metadata($p_filename, $p_testonly = false) { $getID3 = new getID3(); $infoFromFile = $getID3->analyze($p_filename); - //echo "\n".var_export($infoFromFile)."\n"; exit; if (PEAR::isError($infoFromFile)) { return $infoFromFile; } @@ -79,16 +78,45 @@ function camp_get_audio_metadata($p_filename, $p_testonly = false) } $titleKey = 'dc:title'; $flds = array( - 'dc:format' => array( + 'dc:format' => array( array('path'=>"['mime_type']", 'ignoreEnc'=>TRUE), ), - 'ls:bitrate' => array( + 'ls:bitrate' => array( array('path'=>"['bitrate']", 'ignoreEnc'=>TRUE), + array('path'=>"['audio']['bitrate']", 'ignoreEnc'=>TRUE), + ), + 'ls:samplerate' => array( + array('path'=>"['audio']['sample_rate']", 'ignoreEnc'=>TRUE), + ), + 'ls:encoder' => array( + array('path'=>"['audio']['codec']", 'ignoreEnc'=>TRUE), ), 'dcterms:extent'=> array( array('path'=>"['playtime_seconds']", 'ignoreEnc'=>TRUE), ), - 'dc:title' => array( + 'ls:composer'=> array( + array('path'=>"['id3v2']['comments']['composer']", 'dataPath'=>"[0]", 'ignoreEnc'=>TRUE), + array('path'=>"['id3v2']['TCOM'][0]", 'dataPath'=>"['data']", 'encPath'=>"['encoding']"), + array('path'=>"['tags']['id3v2']['composer']", 'dataPath'=>"[0]", 'ignoreEnc'=>TRUE), + array('path'=>"['ogg']['comments']['composer']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), + array('path'=>"['tags']['vorbiscomment']['composer']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), + ), + 'dc:description'=> array( + array('path'=>"['id3v1']['comments']['comment']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), + array('path'=>"['id3v2']['comments']['comments']", 'dataPath'=>"[0]", 'ignoreEnc'=>TRUE), + array('path'=>"['id3v2']['COMM'][0]", 'dataPath'=>"['data']", 'encPath'=>"['encoding']"), + array('path'=>"['tags']['id3v2']['comments']", 'dataPath'=>"[0]", 'ignoreEnc'=>TRUE), + array('path'=>"['ogg']['comments']['comment']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), + array('path'=>"['tags']['vorbiscomment']['comment']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), + ), + 'dc:type'=> array( + array('path'=>"['id3v1']", 'dataPath'=>"['genre']", 'encPath'=>"['encoding']"), + array('path'=>"['id3v2']['comments']['content_type']", 'dataPath'=>"[0]", 'ignoreEnc'=>TRUE), + array('path'=>"['id3v2']['TCON'][0]", 'dataPath'=>"['data']", 'encPath'=>"['encoding']"), + array('path'=>"['ogg']['comments']['genre']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), + array('path'=>"['tags']['vorbiscomment']['genre']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), + ), + 'dc:title' => array( array('path'=>"['id3v2']['comments']['title']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), array('path'=>"['id3v2']['TIT2'][0]", 'dataPath'=>"['data']", 'encPath'=>"['encoding']"), array('path'=>"['id3v2']['TT2'][0]", 'dataPath'=>"['data']", 'encPath'=>"['encoding']"), @@ -96,7 +124,7 @@ function camp_get_audio_metadata($p_filename, $p_testonly = false) array('path'=>"['ogg']['comments']['title']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), array('path'=>"['tags']['vorbiscomment']['title']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), ), - 'dc:creator' => array( + 'dc:creator' => array( array('path'=>"['id3v2']['comments']['artist']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), array('path'=>"['id3v2']['TPE1'][0]", 'dataPath'=>"['data']", 'encPath'=>"['encoding']"), array('path'=>"['id3v2']['TP1'][0]", 'dataPath'=>"['data']", 'encPath'=>"['encoding']"), @@ -104,7 +132,7 @@ function camp_get_audio_metadata($p_filename, $p_testonly = false) array('path'=>"['ogg']['comments']['artist']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), array('path'=>"['tags']['vorbiscomment']['artist']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), ), - 'dc:source' => array( + 'dc:source' => array( array('path'=>"['id3v2']['comments']['album']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), array('path'=>"['id3v2']['TALB'][0]", 'dataPath'=>"['data']", 'encPath'=>"['encoding']"), array('path'=>"['id3v2']['TAL'][0]", 'dataPath'=>"['data']", 'encPath'=>"['encoding']"), @@ -117,36 +145,30 @@ function camp_get_audio_metadata($p_filename, $p_testonly = false) array('path'=>"['ogg']['comments']['encoded-by']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), array('path'=>"['tags']['vorbiscomment']['encoded-by']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), ), - 'ls:track_num' => array( + 'ls:track_num' => array( array('path'=>"['id3v2']['TRCK'][0]", 'dataPath'=>"['data']", 'encPath'=>"['encoding']"), array('path'=>"['id3v2']['TRK'][0]", 'dataPath'=>"['data']", 'encPath'=>"['encoding']"), array('path'=>"['ogg']['comments']['tracknumber']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), array('path'=>"['tags']['vorbiscomment']['tracknumber']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), ), - 'ls:genre' => array( - array('path'=>"['id3v1']", 'dataPath'=>"['genre']", 'encPath'=>"['encoding']"), - array('path'=>"['id3v2']['TCON'][0]", 'dataPath'=>"['data']", 'encPath'=>"['encoding']"), - array('path'=>"['id3v2']['comments']['content_type']", 'dataPath'=>"[0]", 'ignoreEnc'=>TRUE), - array('path'=>"['ogg']['comments']['genre']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), - array('path'=>"['tags']['vorbiscomment']['genre']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), - ), - 'ls:channels' => array( +// 'ls:genre' => array( +// array('path'=>"['id3v1']", 'dataPath'=>"['genre']", 'encPath'=>"['encoding']"), +// array('path'=>"['id3v2']['TCON'][0]", 'dataPath'=>"['data']", 'encPath'=>"['encoding']"), +// array('path'=>"['id3v2']['comments']['content_type']", 'dataPath'=>"[0]", 'ignoreEnc'=>TRUE), +// array('path'=>"['ogg']['comments']['genre']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), +// array('path'=>"['tags']['vorbiscomment']['genre']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), +// ), + 'ls:channels' => array( array('path'=>"['audio']['channels']", 'ignoreEnc'=>TRUE), ), - 'ls:year' => array( + 'ls:year' => array( array('path'=>"['comments']['date']"), array('path'=>"['ogg']['comments']['date']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), array('path'=>"['tags']['vorbiscomment']['date']", 'dataPath'=>"[0]", 'encPath'=>"['encoding']"), ), - 'ls:filename' => array( + 'ls:filename' => array( array('path'=>"['filename']"), ), - /* - 'xx:fileformat' => array(array('path'=>"['fileformat']")), - 'xx:filesize' => array(array('path'=>"['filesize']")), - 'xx:dataformat' => array(array('path'=>"['audio']['dataformat']")), - 'xx:sample_rate'=> array(array('path'=>"['audio']['sample_rate']")), - */ ); $mdata = array(); if (isset($infoFromFile['audio'])) { @@ -158,9 +180,6 @@ function camp_get_audio_metadata($p_filename, $p_testonly = false) $titleHaveSet = FALSE; foreach ($flds as $key => $getid3keys) { - if ($p_testonly) { - echo "$key\n"; - } foreach ($getid3keys as $getid3key) { $path = $getid3key["path"]; $ignoreEnc = isset($getid3key["ignoreEnc"])?$getid3key["ignoreEnc"]:FALSE; @@ -168,35 +187,22 @@ function camp_get_audio_metadata($p_filename, $p_testonly = false) $encPath = isset($getid3key["encPath"])?$getid3key["encPath"]:""; $enc = "UTF-8"; - $vn = "\$infoFromFile$path$dataPath"; - if ($p_testonly) { - echo " $vn -> "; - } - eval("\$vnFl = isset($vn);"); - if ($vnFl) { - eval("\$data = $vn;"); - if ($p_testonly) { - echo "$data\n"; - } + $tagElement = "\$infoFromFile$path$dataPath"; + eval("\$tagExists = isset($tagElement);"); + if ($tagExists) { + eval("\$data = $tagElement;"); if (!$ignoreEnc && $encPath != "") { - $encVn = "\$infoFromFile$path$encPath"; - eval("\$encVnFl = isset($encVn);"); - if ($encVnFl) { - eval("\$enc = $encVn;"); + $encodedElement = "\$infoFromFile$path$encPath"; + eval("\$encodedElementExists = isset($encodedElement);"); + if ($encodedElementExists) { + eval("\$enc = $encodedElement;"); } } - if ($p_testonly) { - echo " ENC=$enc\n"; - } camp_add_metadata($mdata, $key, $data, $enc); if ($key == $titleKey) { $titleHaveSet = TRUE; } break; - } else { - if ($p_testonly) { - echo "\n"; - } } } } @@ -248,6 +254,15 @@ class StoredFile { */ public $gunid; + /** + * The unique ID of the file as it is stored in the database. + * This is for debugging purposes and may not always exist in this + * class. + * + * @var string + */ + private $gunidBigint; + /** * @var string */ @@ -321,14 +336,14 @@ class StoredFile { /** * Constructor, but shouldn't be externally called * - * @param string $gunid + * @param string $p_gunid * globally unique id of file */ - public function __construct($gunid=NULL) + public function __construct($p_gunid=NULL) { global $CC_CONFIG; global $CC_DBC; - $this->gunid = $gunid; + $this->gunid = $p_gunid; if (is_null($this->gunid)) { $this->gunid = StoredFile::CreateGunid(); } @@ -343,54 +358,65 @@ class StoredFile { /** * Create instance of StoredFile object and insert new file * - * @param int $oid - * local object id in the tree - * @param string $filename - * name of new file - * @param string $localFilePath - * local path to media file - * @param string $metadata - * local path to metadata XML file or XML string - * @param string $mdataLoc - * 'file'|'string' - * @param global $gunid - * unique id - for insert file with gunid - * @param string $ftype - * internal file type - * @param boolean $copyMedia + * @param array $p_values + * "id" - required, local object id in the tree + * "gunid" - optional, unique id, for insert file with gunid + * "filename" - optional + * "filepath" - local path to media file, not needed for Playlist + * "metadata" - local path to metadata XML file or XML string + * "filetype" - internal file type + * "mime" - MIME type, highly recommended to pass in + * "md5" - MD5 sum, highly recommended to pass in + * @param boolean $p_copyMedia * copy the media file if true, make symlink if false - * @return StoredFile + * @return StoredFile|NULL|PEAR_Error */ - public static function Insert($oid, $filename, $localFilePath='', - $metadata='', $mdataLoc='file', $gunid=NULL, $ftype=NULL, - $copyMedia=TRUE) + public static function Insert($p_values, $p_copyMedia=TRUE) { global $CC_CONFIG, $CC_DBC; - $storedFile = new StoredFile(($gunid ? $gunid : NULL)); - $storedFile->name = $filename; - $storedFile->id = $oid; - $storedFile->mime = "unknown"; - $emptyState = TRUE; - if ($storedFile->name == '') { - $storedFile->name = $storedFile->gunid; + + $gunid = isset($p_values['gunid'])?$p_values['gunid']:NULL; + + // Create the StoredFile object + $storedFile = new StoredFile($gunid); + $storedFile->name = isset($p_values['filename']) ? $p_values['filename'] : $storedFile->gunid; + $storedFile->id = $p_values['id']; + $storedFile->ftype = $p_values['filetype']; + if ($storedFile->ftype == 'playlist') { + $storedFile->mime = 'application/smil'; + } else { + $storedFile->mime = $p_values["mime"]; } + $storedFile->filepath = $p_values['filepath']; + if (isset($p_values['md5'])) { + $storedFile->md5 = $p_values['md5']; + } elseif (file_exists($storedFile->filepath)) { + echo "StoredFile::Insert: WARNING: Having to recalculate MD5 value\n"; + $storedFile->md5 = md5_file($storedFile->filepath); + } + $storedFile->exists = FALSE; - if (file_exists($localFilePath)) { - $md5 = md5_file($localFilePath); - } - $escapedName = pg_escape_string($filename); - $escapedFtype = pg_escape_string($ftype); + $emptyState = TRUE; + + // Insert record into the database + $escapedName = pg_escape_string($storedFile->name); + $escapedFtype = pg_escape_string($storedFile->ftype); $CC_DBC->query("BEGIN"); $sql = "INSERT INTO ".$CC_CONFIG['filesTable'] ."(id, name, gunid, mime, state, ftype, mtime, md5)" - ."VALUES ('$oid', '{$escapedName}', x'{$storedFile->gunid}'::bigint, - '{$storedFile->mime}', 'incomplete', '$escapedFtype', now(), '$md5')"; + ."VALUES ('{$storedFile->id}', '{$escapedName}', " + ." x'{$storedFile->gunid}'::bigint," + ." '{$storedFile->mime}', 'incomplete', '$escapedFtype'," + ." now(), '{$storedFile->md5}')"; $res = $CC_DBC->query($sql); if (PEAR::isError($res)) { $CC_DBC->query("ROLLBACK"); return $res; } - // --- metadata insert: + + // Insert metadata + $metadata = $p_values['metadata']; + $mdataLoc = ($metadata[0]=="/")?"file":"string"; if (is_null($metadata) || ($metadata == '') ) { $metadata = dirname(__FILE__).'/emptyMdata.xml'; $mdataLoc = 'file'; @@ -401,73 +427,95 @@ class StoredFile { return PEAR::raiseError("StoredFile::Insert: ". "metadata file not found ($metadata)"); } - $res = $storedFile->md->insert($metadata, $mdataLoc, $ftype); + $res = $storedFile->md->insert($metadata, $mdataLoc, $storedFile->ftype); if (PEAR::isError($res)) { $CC_DBC->query("ROLLBACK"); return $res; } - // --- media file insert: - if ($localFilePath != '') { - if (!file_exists($localFilePath)) { + + // Save media file + if (!empty($storedFile->filepath)) { + if (!file_exists($storedFile->filepath)) { return PEAR::raiseError("StoredFile::Insert: ". - "media file not found ($localFilePath)"); + "media file not found ($storedFile->filepath)"); } - $res = $storedFile->addFile($localFilePath, $copyMedia); + $res = $storedFile->addFile($storedFile->filepath, $p_copyMedia); if (PEAR::isError($res)) { $CC_DBC->query("ROLLBACK"); return $res; } - $mime = $storedFile->getMime(); - if ($mime !== FALSE) { - $res = $storedFile->setMime($mime); + if (empty($storedFile->mime)) { + echo "StoredFile::Insert: WARNING: Having to recalculate MIME value\n"; + $storedFile->setMime($storedFile->getMime()); } $emptyState = FALSE; } + + // Save state if (!$emptyState) { $res = $storedFile->setState('ready'); } + + // Commit changes $res = $CC_DBC->query("COMMIT"); if (PEAR::isError($res)) { $CC_DBC->query("ROLLBACK"); return $res; } + + // Recall the object to get all the proper values + $storedFile = StoredFile::RecallByGunid($storedFile->gunid); return $storedFile; } /** - * Create instance of StoreFile object and recall existing file.
- * Should be supplied with oid OR gunid - not both. + * Fetch instance of StoreFile object.
+ * Should be supplied with only ONE parameter, all the rest should + * be NULL. * - * @param int $oid + * @param int $p_oid * local object id in the tree - * @param string $gunid + * @param string $p_gunid * global unique id of file - * @return StoredFile + * @param string $p_md5sum + * MD5 sum of the file + * @return StoredFile|Playlist|NULL + * Return NULL if the object doesnt exist in the DB. */ - public static function Recall($oid='', $gunid='') + public static function Recall($p_oid=null, $p_gunid=null, $p_md5sum=null) { global $CC_DBC; global $CC_CONFIG; - $cond = ($oid != '' - ? "id='".intval($oid)."'" - : "gunid=x'$gunid'::bigint" - ); - $row = $CC_DBC->getRow(" - SELECT id, to_hex(gunid)as gunid, name, mime, ftype, state, currentlyaccessing, editedby, mtime, md5 - FROM ".$CC_CONFIG['filesTable']." WHERE $cond"); + if (!is_null($p_oid)) { + $cond = "id='".intval($p_oid)."'"; + } elseif (!is_null($p_gunid)) { + $cond = "gunid=x'$p_gunid'::bigint"; + } elseif (!is_null($p_md5sum)) { + $cond = "md5='$p_md5sum'"; + } else { + return null; + } + $sql = "SELECT id, to_hex(gunid)as gunid, gunid as gunid_bigint," + ." name, mime, ftype, state, currentlyaccessing, editedby, " + ." mtime, md5" + ." FROM ".$CC_CONFIG['filesTable'] + ." WHERE $cond"; + $row = $CC_DBC->getRow($sql); if (PEAR::isError($row)) { return $row; } if (is_null($row)) { - $r =& PEAR::raiseError( - "StoredFile::recall: fileobj not exist ($oid/$gunid)", - GBERR_FOBJNEX - ); - return $r; + return null; } $gunid = StoredFile::NormalizeGunid($row['gunid']); - $storedFile = new StoredFile($gunid); + if ($row['ftype'] == 'audioclip') { + $storedFile = new StoredFile($gunid); + } elseif ($row['ftype'] == 'playlist') { + $storedFile = new Playlist($gunid); + } + $storedFile->gunidBigint = $row['gunid_bigint']; + $storedFile->md->gunidBigint = $row['gunid_bigint']; $storedFile->id = $row['id']; $storedFile->name = $row['name']; $storedFile->mime = $row['mime']; @@ -487,13 +535,25 @@ class StoredFile { * Create instance of StoreFile object and recall existing file * by gunid. * - * @param string $gunid + * @param string $p_gunid * global unique id of file * @return StoredFile */ - public static function RecallByGunid($gunid='') + public static function RecallByGunid($p_gunid='') { - return StoredFile::Recall('', $gunid); + return StoredFile::Recall(null, $p_gunid); + } + + + /** + * Fetch the StoredFile by looking up the MD5 value. + * + * @param string $p_md5sum + * @return StoredFile|NULL|PEAR_Error + */ + public static function RecallByMd5($p_md5sum) + { + return StoredFile::Recall(null, null, $p_md5sum); } @@ -501,80 +561,55 @@ class StoredFile { * Create instance of StoreFile object and recall existing file * by access token. * - * @param string $token + * @param string $p_token * access token * @return StoredFile */ - public static function RecallByToken($token) + public static function RecallByToken($p_token) { global $CC_CONFIG, $CC_DBC; - $gunid = $CC_DBC->getOne(" - SELECT to_hex(gunid) as gunid - FROM ".$CC_CONFIG['accessTable']." - WHERE token=x'$token'::bigint"); + $sql = "SELECT to_hex(gunid) as gunid" + ." FROM ".$CC_CONFIG['accessTable'] + ." WHERE token=x'$p_token'::bigint"; + $gunid = $CC_DBC->getOne($sql); if (PEAR::isError($gunid)) { return $gunid; } if (is_null($gunid)) { return PEAR::raiseError( - "StoredFile::RecallByToken: invalid token ($token)", GBERR_AOBJNEX); + "StoredFile::RecallByToken: invalid token ($p_token)", GBERR_AOBJNEX); } $gunid = StoredFile::NormalizeGunid($gunid); - return StoredFile::Recall('', $gunid); - } - - - /** - * Check if the MD5 value already exists. - * - * @param string $p_md5sum - * @return StoredFile|FALSE|PEAR_Error - */ - public static function RecallByMd5($p_md5sum) - { - global $CC_CONFIG, $CC_DBC; - $gunid = $CC_DBC->getOne( - "SELECT to_hex(gunid) as gunid - FROM ".$CC_CONFIG['filesTable']." - WHERE md5='$p_md5sum'"); - if (PEAR::isError($gunid)) { - return $gunid; - } - if ($gunid) { - $gunid = StoredFile::NormalizeGunid($gunid); - return StoredFile::Recall('', $gunid); - } else { - return FALSE; - } + return StoredFile::Recall(null, $gunid); } /** * Insert media file to filesystem * - * @param string $localFilePath + * @param string $p_localFilePath * local path - * @param boolean $copyMedia + * @param boolean $p_copyMedia * copy the media file if true, make symlink if false * @return TRUE|PEAR_Error */ - public function addFile($localFilePath, $copyMedia=TRUE) + public function addFile($p_localFilePath, $p_copyMedia=TRUE) { if ($this->exists) { return FALSE; } // for files downloaded from archive: - if ($localFilePath == $this->filepath) { + if ($p_localFilePath == $this->filepath) { $this->exists = TRUE; return TRUE; } umask(0002); - if ($copyMedia) { - $r = @copy($localFilePath, $this->filepath); + if ($p_copyMedia) { + $r = @copy($p_localFilePath, $this->filepath); } else { - $r = @symlink($localFilePath, $this->filepath); + $r = @symlink($p_localFilePath, $this->filepath); } - if ( $r ) { + if ($r) { $this->exists = TRUE; return TRUE; } else { @@ -582,7 +617,7 @@ class StoredFile { $this->exists = FALSE; return PEAR::raiseError( "StoredFile::addFile: file save failed". - " ($localFilePath, {$this->filepath})",GBERR_FILEIO + " ($p_localFilePath, {$this->filepath})",GBERR_FILEIO ); } } @@ -591,15 +626,15 @@ class StoredFile { /** * Delete and insert media file * - * @param string $localFilePath + * @param string $p_localFilePath * local path * @return TRUE|PEAR_Error */ - public function replaceFile($localFilePath) + public function replaceFile($p_localFilePath) { // Dont do anything if the source and destination files are // the same. - if ($this->name == $localFilePath) { + if ($this->name == $p_localFilePath) { return TRUE; } @@ -609,7 +644,7 @@ class StoredFile { return $r; } } - return $this->addFile($localFilePath); + return $this->addFile($p_localFilePath); } @@ -668,20 +703,25 @@ class StoredFile { /** * Create instance of StoredFile object and make copy of existing file * - * @param StoredFile $src + * @param StoredFile $p_src * source object - * @param int $nid + * @param int $p_nid * new local id * @return StoredFile */ - public static function CopyOf(&$src, $nid) + public static function CopyOf(&$p_src, $p_nid) { - $storedFile = StoredFile::Insert($nid, $src->name, $src->getRealFileName(), - '', '', NULL, BasicStor::GetType($src->gunid)); + $values = array( + "id" => $p_nid, + "filename" => $p_src->name, + "filepath" => $p_src->getRealFileName(), + "filetype" => BasicStor::GetType($p_src->gunid) + ); + $storedFile = StoredFile::Insert($values); if (PEAR::isError($storedFile)) { return $storedFile; } - $storedFile->md->replace($src->md->getMetadata(), 'string'); + $storedFile->md->replace($p_src->md->getMetadata(), 'string'); return $storedFile; } @@ -689,30 +729,30 @@ class StoredFile { /** * Replace existing file with new data. * - * @param int $oid - * local id - * @param string $name + * @param int $p_oid + * NOT USED + * @param string $p_name * name of file - * @param string $localFilePath + * @param string $p_localFilePath * local path to media file - * @param string $metadata + * @param string $p_metadata * local path to metadata XML file or XML string - * @param string $mdataLoc + * @param string $p_mdataLoc * 'file'|'string' * @return TRUE|PEAR_Error */ - public function replace($oid, $name, $localFilePath='', $metadata='', - $mdataLoc='file') + public function replace($p_oid, $p_name, $p_localFilePath='', $p_metadata='', + $p_mdataLoc='file') { global $CC_CONFIG, $CC_DBC; $CC_DBC->query("BEGIN"); - $res = $this->setName($name); + $res = $this->setName($p_name); if (PEAR::isError($res)) { $CC_DBC->query("ROLLBACK"); return $res; } - if ($localFilePath != '') { - $res = $this->setRawMediaData($localFilePath); + if ($p_localFilePath != '') { + $res = $this->setRawMediaData($p_localFilePath); } else { $res = $this->deleteFile(); } @@ -720,8 +760,8 @@ class StoredFile { $CC_DBC->query("ROLLBACK"); return $res; } - if ($metadata != '') { - $res = $this->setMetadata($metadata, $mdataLoc); + if ($p_metadata != '') { + $res = $this->setMetadata($p_metadata, $p_mdataLoc); } else { $res = $this->md->delete(); } @@ -746,11 +786,11 @@ class StoredFile { * @return array * array with: access URL, access token */ - public function accessRawMediaData($parent='0') + public function accessRawMediaData($p_parent='0') { $realFname = $this->getRealFileName(); $ext = $this->getFileExtension(); - $res = BasicStor::bsAccess($realFname, $ext, $this->gunid, 'access', $parent); + $res = BasicStor::bsAccess($realFname, $ext, $this->gunid, 'access', $p_parent); if (PEAR::isError($res)) { return $res; } @@ -763,13 +803,13 @@ class StoredFile { /** * Decrease access couter, delete access record. * - * @param string $token + * @param string $p_token * access token * @return boolean */ - public function releaseRawMediaData($token) + public function releaseRawMediaData($p_token) { - $res = BasicStor::bsRelease($token); + $res = BasicStor::bsRelease($p_token); if (PEAR::isError($res)) { return $res; } @@ -780,13 +820,13 @@ class StoredFile { /** * Replace media file only with new binary file * - * @param string $localFilePath + * @param string $p_localFilePath * local path to media file * @return TRUE|PEAR_Error */ - public function setRawMediaData($localFilePath) + public function setRawMediaData($p_localFilePath) { - $res = $this->replaceFile($localFilePath); + $res = $this->replaceFile($p_localFilePath); if (PEAR::isError($res)) { return $res; } @@ -808,21 +848,21 @@ class StoredFile { /** * Replace metadata with new XML file * - * @param string $metadata + * @param string $p_metadata * local path to metadata XML file or XML string - * @param string $mdataLoc + * @param string $p_mdataLoc * 'file'|'string' - * @param string $format + * @param string $p_format * metadata format for validation * ('audioclip' | 'playlist' | 'webstream' | NULL) * (NULL = no validation) * @return boolean */ - public function setMetadata($metadata, $mdataLoc='file', $format=NULL) + public function setMetadata($p_metadata, $p_mdataLoc='file', $p_format=NULL) { global $CC_CONFIG, $CC_DBC; $CC_DBC->query("BEGIN"); - $res = $this->md->replace($metadata, $mdataLoc, $format); + $res = $this->md->replace($p_metadata, $p_mdataLoc, $p_format); if (PEAR::isError($res)) { $CC_DBC->query("ROLLBACK"); return $res; @@ -855,16 +895,17 @@ class StoredFile { /** * Rename stored virtual file * - * @param string $newname + * @param string $p_newname * @return TRUE|PEAR_Error */ public function setName($p_newname) { global $CC_CONFIG, $CC_DBC; $escapedName = pg_escape_string($p_newname); - $res = $CC_DBC->query(" - UPDATE ".$CC_CONFIG['filesTable']." SET name='$escapedName', mtime=now() - WHERE gunid=x'{$this->gunid}'::bigint"); + $sql = "UPDATE ".$CC_CONFIG['filesTable'] + ." SET name='$escapedName', mtime=now()" + ." WHERE gunid=x'{$this->gunid}'::bigint"; + $res = $CC_DBC->query($sql); if (PEAR::isError($res)) { return $res; } @@ -876,9 +917,9 @@ class StoredFile { /** * Set state of virtual file * - * @param string $state + * @param string $p_state * 'empty'|'incomplete'|'ready'|'edited' - * @param int $editedby + * @param int $p_editedby * user id | 'NULL' for clear editedBy field * @return TRUE|PEAR_Error */ @@ -887,10 +928,10 @@ class StoredFile { global $CC_CONFIG, $CC_DBC; $escapedState = pg_escape_string($p_state); $eb = (!is_null($p_editedby) ? ", editedBy=$p_editedby" : ''); - $res = $CC_DBC->query(" - UPDATE ".$CC_CONFIG['filesTable']." - SET state='$escapedState'$eb, mtime=now() - WHERE gunid=x'{$this->gunid}'::bigint"); + $sql = "UPDATE ".$CC_CONFIG['filesTable'] + ." SET state='$escapedState'$eb, mtime=now()" + ." WHERE gunid=x'{$this->gunid}'::bigint"; + $res = $CC_DBC->query($sql); if (PEAR::isError($res)) { return $res; } @@ -903,7 +944,7 @@ class StoredFile { /** * Set mime-type of virtual file * - * @param string $mime + * @param string $p_mime * mime-type * @return boolean|PEAR_Error */ @@ -914,9 +955,10 @@ class StoredFile { $p_mime = 'application/octet-stream'; } $escapedMime = pg_escape_string($p_mime); - $res = $CC_DBC->query( - "UPDATE ".$CC_CONFIG['filesTable']." SET mime='$escapedMime', mtime=now() - WHERE gunid=x'{$this->gunid}'::bigint"); + $sql = "UPDATE ".$CC_CONFIG['filesTable'] + ." SET mime='$escapedMime', mtime=now()" + ." WHERE gunid=x'{$this->gunid}'::bigint"; + $res = $CC_DBC->query($sql); if (PEAR::isError($res)) { return $res; } @@ -935,9 +977,10 @@ class StoredFile { { global $CC_CONFIG, $CC_DBC; $escapedMd5 = pg_escape_string($p_md5sum); - $res = $CC_DBC->query( - "UPDATE ".$CC_CONFIG['filesTable']." SET md5='$escapedMd5', mtime=now() - WHERE gunid=x'{$this->gunid}'::bigint"); + $sql = "UPDATE ".$CC_CONFIG['filesTable'] + ." SET md5='$escapedMd5', mtime=now()" + ." WHERE gunid=x'{$this->gunid}'::bigint"; + $res = $CC_DBC->query($sql); if (PEAR::isError($res)) { return $res; } @@ -949,6 +992,7 @@ class StoredFile { /** * Delete stored virtual file * + * @param boolean $p_deleteFile * @see MetaData * @return TRUE|PEAR_Error */ @@ -965,9 +1009,10 @@ class StoredFile { if (PEAR::isError($res)) { return $res; } - $tokens = $CC_DBC->getAll(" - SELECT to_hex(token)as token, ext FROM ".$CC_CONFIG['accessTable']." - WHERE gunid=x'{$this->gunid}'::bigint"); + $sql = "SELECT to_hex(token)as token, ext " + ." FROM ".$CC_CONFIG['accessTable'] + ." WHERE gunid=x'{$this->gunid}'::bigint"; + $tokens = $CC_DBC->getAll($sql); if (is_array($tokens)) { foreach ($tokens as $i => $item) { $file = $this->_getAccessFileName($item['token'], $item['ext']); @@ -976,15 +1021,15 @@ class StoredFile { } } } - $res = $CC_DBC->query( - "DELETE FROM ".$CC_CONFIG['accessTable']." - WHERE gunid=x'{$this->gunid}'::bigint"); + $sql = "DELETE FROM ".$CC_CONFIG['accessTable'] + ." WHERE gunid=x'{$this->gunid}'::bigint"; + $res = $CC_DBC->query($sql); if (PEAR::isError($res)) { return $res; } - $res = $CC_DBC->query( - "DELETE FROM ".$CC_CONFIG['filesTable']." - WHERE gunid=x'{$this->gunid}'::bigint"); + $sql = "DELETE FROM ".$CC_CONFIG['filesTable'] + ." WHERE gunid=x'{$this->gunid}'::bigint"; + $res = $CC_DBC->query($sql); if (PEAR::isError($res)) { return $res; } @@ -996,22 +1041,22 @@ class StoredFile { * Returns true if virtual file is currently in use.
* Static or dynamic call is possible. * - * @param string $gunid + * @param string $p_gunid * optional (for static call), global unique id * @return boolean|PEAR_Error */ - public function isAccessed($gunid=NULL) + public function isAccessed($p_gunid=NULL) { global $CC_CONFIG, $CC_DBC; - if (is_null($gunid)) { + if (is_null($p_gunid)) { return ($this->currentlyaccessing > 0); } - $ca = $CC_DBC->getOne(" - SELECT currentlyAccessing FROM ".$CC_CONFIG['filesTable']." - WHERE gunid=x'$gunid'::bigint"); + $sql = "SELECT currentlyAccessing FROM ".$CC_CONFIG['filesTable'] + ." WHERE gunid=x'$p_gunid'::bigint"; + $ca = $CC_DBC->getOne($sql); if (is_null($ca)) { return PEAR::raiseError( - "StoredFile::isAccessed: invalid gunid ($gunid)", + "StoredFile::isAccessed: invalid gunid ($p_gunid)", GBERR_FOBJNEX ); } @@ -1022,16 +1067,16 @@ class StoredFile { /** * Returns true if virtual file is edited * - * @param string $playlistId + * @param string $p_playlistId * playlist global unique ID * @return boolean */ - public function isEdited($playlistId=NULL) + public function isEdited($p_playlistId=NULL) { - if (is_null($playlistId)) { + if (is_null($p_playlistId)) { return ($this->state == 'edited'); } - $state = $this->getState($playlistId); + $state = $this->getState($p_playlistId); if ($state != 'edited') { return FALSE; } @@ -1042,21 +1087,20 @@ class StoredFile { /** * Returns id of user editing playlist * - * @param string $playlistId + * @param string $p_playlistId * playlist global unique ID * @return int|null|PEAR_Error * id of user editing it */ - public function isEditedBy($playlistId=NULL) + public function isEditedBy($p_playlistId=NULL) { global $CC_CONFIG, $CC_DBC; - if (is_null($playlistId)) { - $playlistId = $this->gunid; + if (is_null($p_playlistId)) { + $p_playlistId = $this->gunid; } - $ca = $CC_DBC->getOne(" - SELECT editedBy FROM ".$CC_CONFIG['filesTable']." - WHERE gunid=x'$playlistId'::bigint - "); + $sql = "SELECT editedBy FROM ".$CC_CONFIG['filesTable'] + ." WHERE gunid=x'$p_playlistId'::bigint"; + $ca = $CC_DBC->getOne($sql); if (PEAR::isError($ca)) { return $ca; } @@ -1068,7 +1112,8 @@ class StoredFile { /** - * Returns local id of virtual file + * Return local ID of virtual file. + * * @return int */ public function getId() @@ -1077,6 +1122,17 @@ class StoredFile { } + /** + * Return global ID of virtual file. + * + * @return string + */ + public function getGunid() + { + return $this->gunid; + } + + /** * Returns true if raw media file exists * @return boolean|PEAR_Error @@ -1084,9 +1140,10 @@ class StoredFile { public function exists() { global $CC_CONFIG, $CC_DBC; - $indb = $CC_DBC->getRow( - "SELECT to_hex(gunid) FROM ".$CC_CONFIG['filesTable'] - ." WHERE gunid=x'{$this->gunid}'::bigint"); + $sql = "SELECT to_hex(gunid) " + ." FROM ".$CC_CONFIG['filesTable'] + ." WHERE gunid=x'{$this->gunid}'::bigint"; + $indb = $CC_DBC->getRow($sql); if (PEAR::isError($indb)) { return $indb; } @@ -1121,9 +1178,9 @@ class StoredFile { * * @return string */ - public static function NormalizeGunid($gunid) + public static function NormalizeGunid($p_gunid) { - return str_pad($gunid, 16, "0", STR_PAD_LEFT); + return str_pad($p_gunid, 16, "0", STR_PAD_LEFT); } @@ -1187,41 +1244,39 @@ class StoredFile { /** * Get storage-internal file state * - * @param string $gunid + * @param string $p_gunid * global unique id of file * @return string * see install() */ - public function getState($gunid=NULL) + public function getState($p_gunid=NULL) { global $CC_CONFIG, $CC_DBC; - if (is_null($gunid)) { + if (is_null($p_gunid)) { return $this->state; } - return $CC_DBC->getOne(" - SELECT state FROM ".$CC_CONFIG['filesTable']." - WHERE gunid=x'$gunid'::bigint - "); + $sql = "SELECT state FROM ".$CC_CONFIG['filesTable'] + ." WHERE gunid=x'$p_gunid'::bigint"; + return $CC_DBC->getOne($sql); } /** * Get mnemonic file name * - * @param string $gunid + * @param string $p_gunid * global unique id of file * @return string */ - public function getName($gunid=NULL) + public function getName($p_gunid=NULL) { global $CC_CONFIG, $CC_DBC; - if (is_null($gunid)) { + if (is_null($p_gunid)) { return $this->name; } - return $CC_DBC->getOne(" - SELECT name FROM ".$CC_CONFIG['filesTable']." - WHERE gunid=x'$gunid'::bigint - "); + $sql = "SELECT name FROM ".$CC_CONFIG['filesTable'] + ." WHERE gunid=x'$p_gunid'::bigint"; + return $CC_DBC->getOne($sql); } @@ -1274,11 +1329,11 @@ class StoredFile { * @todo Should be more unique * @return string */ - private function _getAccessFileName($token, $ext='EXT') + private function _getAccessFileName($p_token, $p_ext='EXT') { global $CC_CONFIG; - $token = StoredFile::NormalizeGunid($token); - return $CC_CONFIG['accessDir']."/$token.$ext"; + $token = StoredFile::NormalizeGunid($p_token); + return $CC_CONFIG['accessDir']."/$p_token.$p_ext"; } } // class StoredFile diff --git a/campcaster/src/modules/storageServer/var/Transport.php b/campcaster/src/modules/storageServer/var/Transport.php index 30223c18d..8fcbed023 100644 --- a/campcaster/src/modules/storageServer/var/Transport.php +++ b/campcaster/src/modules/storageServer/var/Transport.php @@ -325,7 +325,7 @@ class Transport case "playlist": $plid = $gunid; require_once("Playlist.php"); - $pl = Playlist::RecallByGunid($plid); + $pl = StoredFile::RecallByGunid($plid); if (PEAR::isError($pl)) { return $pl; } @@ -1351,13 +1351,19 @@ class Transport $mdtrec->setLock(FALSE); return $parid; } - $res = $this->gb->bsPutFile($parid, $row['fname'], - $trec->row['localfile'], $mdtrec->row['localfile'], - $row['gunid'], 'audioclip', 'file'); - if (PEAR::isError($res)) { + $values = array( + "filename" => $row['fname'], + "filepath" => $trec->row['localfile'], + "metadata" => $mdtrec->row['localfile'], + "gunid" => $row['gunid'], + "filetype" => "audioclip" + ); + $storedFile = $this->gb->bsPutFile($parid, $values); + if (PEAR::isError($storedFile)) { $mdtrec->setLock(FALSE); - return $res; + return $storedFile; } + $res = $storedFile->getId(); $ret = $this->xmlrpcCall('archive.downloadClose', array( 'token' => $mdtrec->row['pdtoken'] , @@ -1406,12 +1412,17 @@ class Transport if (PEAR::isError($parid)) { return $parid; } - $res = $this->gb->bsPutFile($parid, $row['fname'], - '', $trec->row['localfile'], - $row['gunid'], 'playlist', 'file'); - if (PEAR::isError($res)) { - return $res; + $values = array( + "filename" => $row['fname'], + "metadata" => $trec->row['localfile'], + "gunid" => $row['gunid'], + "filetype" => "playlist" + ); + $storedFile = $this->gb->bsPutFile($parid, $values); + if (PEAR::isError($storedFile)) { + return $storedFile; } + $res = $storedFile->getId(); @unlink($row['localfile']); break; case "playlistPkg": diff --git a/campcaster/src/modules/storageServer/var/Validator.php b/campcaster/src/modules/storageServer/var/Validator.php index eefd33161..9e8801fd5 100644 --- a/campcaster/src/modules/storageServer/var/Validator.php +++ b/campcaster/src/modules/storageServer/var/Validator.php @@ -109,8 +109,7 @@ class Validator { * 'A' | 'T' (attr or tag) * @param string $value * validated element value - * @return mixed - * TRUE or PEAR::error + * @return TRUE|PEAR_Error */ function validateOneValue($fname, $category, $predxml, $value) { diff --git a/campcaster/src/modules/storageServer/var/install/upgrade/upgrade-to-1.2.0.php b/campcaster/src/modules/storageServer/var/install/upgrade/upgrade-to-1.2.0.php index cc69093bc..9ffaf4346 100644 --- a/campcaster/src/modules/storageServer/var/install/upgrade/upgrade-to-1.2.0.php +++ b/campcaster/src/modules/storageServer/var/install/upgrade/upgrade-to-1.2.0.php @@ -48,6 +48,10 @@ echo " * Creating index on column 'md5'..."; $sql = "CREATE INDEX ".$CC_CONFIG['filesTable']."_md5_idx ON ".$CC_CONFIG['filesTable']." (md5)"; camp_install_query($sql); +echo " * Converting metadata values 'ls:genre' to 'dc:type'..."; +$sql = "UPDATE ".$CC_CONFIG['mdataTable']." SET predns='dc', predicate='type' WHERE predns='ls' and predicate='genre'"; +camp_install_query($sql); + // Get MD5 values for all files echo " * Computing MD5 sums for all files (this may take a while)...\n"; $sql = "SELECT to_hex(gunid) as gunid, name FROM ".$CC_CONFIG['filesTable'] ." WHERE ftype='audioclip'"; diff --git a/campcaster/src/modules/storageServer/var/tests/transTest.php b/campcaster/src/modules/storageServer/var/tests/transTest.php index f521b7416..f98e7bd68 100644 --- a/campcaster/src/modules/storageServer/var/tests/transTest.php +++ b/campcaster/src/modules/storageServer/var/tests/transTest.php @@ -40,8 +40,21 @@ echo"# Login: ".($sessid = Alib::Login('root', 'q'))."\n"; echo"# Store: "; $parid = $gb->_getHomeDirIdFromSess($sessid); -$oid = $r = $gb->bsPutFile($parid, "xx1.mp3", $mediaFile, $mdataFile, $gunid, 'audioclip'); -if(PEAR::isError($r)){ if($r->getCode()!=GBERR_GUNID){ echo "ERROR: ".$r->getMessage()."\n"; exit(1); }} +$values = array( + "filename" => "xx1.mp3", + "filepath" => $mediaFile, + "metadata" => $mdataFile, + "gunid" => $gunid, + "filetype" => "audioclip" +); +$storedFile = $gb->bsPutFile($parid, $values); +if (PEAR::isError($storedFile)) { + if ($storedFile->getCode()!=GBERR_GUNID) { + echo "ERROR: ".$storedFile->getMessage()."\n"; + exit(1); + } +} +$oid = $storedFile->getId(); $comm = "ls -l ".$CC_CONFIG['storageDir']."/a23"; echo `$comm`; echo "$oid\n"; diff --git a/campcaster/src/modules/storageServer/var/tests/webstreamTest.php b/campcaster/src/modules/storageServer/var/tests/webstreamTest.php index f9f13dc40..415175b85 100644 --- a/campcaster/src/modules/storageServer/var/tests/webstreamTest.php +++ b/campcaster/src/modules/storageServer/var/tests/webstreamTest.php @@ -33,7 +33,7 @@ var_dump($r); $id = $r; echo "# getMdata: "; -$r = $gb->getMdata($id, $sessid); +$r = $gb->getMetadata($id, $sessid); if (PEAR::isError($r)) { echo "ERROR: ".$r->getMessage()." ".$r->getUserInfo()."\n"; exit(1);