dcCore dcCore instance
protected $con; ///< connection Database connection
protected $table; ///< string Media table name
protected $type; ///< string Media type filter
protected $postmedia;
protected $file_sort = 'name-asc';
protected $file_handler = array(); ///< array Array of callbacks
public $thumb_tp = '%s/.%s_%s.jpg'; ///< string Thumbnail file pattern
/**
array Tubmnail sizes:
- m: medium image
- s: small image
- t: thumbnail image
- sq: square image
*/
public $thumb_sizes = array(
'm' => array(448,'ratio','medium'),
's' => array(240,'ratio','small'),
't' => array(100,'ratio','thumbnail'),
'sq' => array(48,'crop','square')
);
public $icon_img = 'images/media/%s.png'; ///< string Icon file pattern
/**
Object constructor.
@param core dcCore dcCore instance
@param type string Media type filter
*/
public function __construct($core,$type='')
{
$this->core =& $core;
$this->con =& $core->con;
$this->postmedia = new dcPostMedia($core);
if ($this->core->blog == null) {
throw new Exception(__('No blog defined.'));
}
$this->table = $this->core->prefix.'media';
$root = $this->core->blog->public_path;
if (preg_match('#^http(s)?://#',$this->core->blog->settings->system->public_url)) {
$root_url = rawurldecode($this->core->blog->settings->system->public_url);
} else {
$root_url = rawurldecode($this->core->blog->host.path::clean($this->core->blog->settings->system->public_url));
}
if (!is_dir($root)) {
throw new Exception(sprintf(__('Directory %s does not exist.'),$root));
}
$this->type = $type;
parent::__construct($root,$root_url);
$this->chdir('');
$this->path = $this->core->blog->settings->system->public_path;
$this->addExclusion(DC_RC_PATH);
$this->addExclusion(dirname(__FILE__).'/../');
$this->exclude_pattern = $core->blog->settings->system->media_exclusion;
# Event handlers
$this->addFileHandler('image/jpeg','create',array($this,'imageThumbCreate'));
$this->addFileHandler('image/png','create',array($this,'imageThumbCreate'));
$this->addFileHandler('image/gif','create',array($this,'imageThumbCreate'));
$this->addFileHandler('image/png','update',array($this,'imageThumbUpdate'));
$this->addFileHandler('image/jpeg','update',array($this,'imageThumbUpdate'));
$this->addFileHandler('image/gif','update',array($this,'imageThumbUpdate'));
$this->addFileHandler('image/png','remove',array($this,'imageThumbRemove'));
$this->addFileHandler('image/jpeg','remove',array($this,'imageThumbRemove'));
$this->addFileHandler('image/gif','remove',array($this,'imageThumbRemove'));
$this->addFileHandler('image/jpeg','create',array($this,'imageMetaCreate'));
$this->addFileHandler('image/jpeg','recreate',array($this,'imageThumbCreate'));
$this->addFileHandler('image/png','recreate',array($this,'imageThumbCreate'));
$this->addFileHandler('image/gif','recreate',array($this,'imageThumbCreate'));
$this->addFileHandler('image/jpeg','recreate',array($this,'imageThumbCreate'));
$this->addFileHandler('image/png','recreate',array($this,'imageThumbCreate'));
$this->addFileHandler('image/gif','recreate',array($this,'imageThumbCreate'));
# Thumbnails sizes
$this->thumb_sizes['m'][0] = abs($core->blog->settings->system->media_img_m_size);
$this->thumb_sizes['s'][0] = abs($core->blog->settings->system->media_img_s_size);
$this->thumb_sizes['t'][0] = abs($core->blog->settings->system->media_img_t_size);
# Thumbnails sizes names
$this->thumb_sizes['m'][2] = __($this->thumb_sizes['m'][2]);
$this->thumb_sizes['s'][2] = __($this->thumb_sizes['s'][2]);
$this->thumb_sizes['t'][2] = __($this->thumb_sizes['t'][2]);
$this->thumb_sizes['sq'][2] = __($this->thumb_sizes['sq'][2]);
# --BEHAVIOR-- coreMediaConstruct
$this->core->callBehavior('coreMediaConstruct',$this);
}
/**
Changes working directory.
@param dir string Directory name.
*/
public function chdir($dir)
{
parent::chdir($dir);
$this->relpwd = preg_replace('/^'.preg_quote($this->root,'/').'\/?/','',$this->pwd);
}
/**
Adds a new file handler for a given media type and event.
Available events are:
- create: file creation
- update: file update
- remove: file deletion
@param type string Media type
@param event string Event
@param function callback
*/
public function addFileHandler($type,$event,$function)
{
if (is_callable($function)) {
$this->file_handler[$type][$event][] = $function;
}
}
protected function callFileHandler($type,$event)
{
if (!empty($this->file_handler[$type][$event]))
{
$args = func_get_args();
array_shift($args);
array_shift($args);
foreach ($this->file_handler[$type][$event] as $f)
{
call_user_func_array($f,$args);
}
}
}
/**
Returns HTML breadCrumb for media manager navigation.
@param href string URL pattern
@param last string Last item pattern
@return string HTML code
*/
public function breadCrumb($href,$last='')
{
$res = '';
if ($this->relpwd && $this->relpwd != '.') {
$pwd = '';
$arr = explode('/',$this->relpwd);
$count = count($arr);
foreach ($arr as $v) {
if (($last != '') && (0 === --$count)) {
$res .= sprintf($last,$v);
} else {
$pwd .= rawurlencode($v).'/';
$res .= ''.$v.' / ';
}
}
}
return $res;
}
protected function fileRecord($rs)
{
if ($rs->isEmpty()) { return null; }
if (!$this->isFileExclude($this->root.'/'.$rs->media_file) && is_file($this->root.'/'.$rs->media_file))
{
$f = new fileItem($this->root.'/'.$rs->media_file,$this->root,$this->root_url);
if ($this->type && $f->type_prefix != $this->type) {
return null;
}
$meta = @simplexml_load_string($rs->media_meta);
$f->editable = true;
$f->media_id = $rs->media_id;
$f->media_title = $rs->media_title;
$f->media_meta = $meta instanceof SimpleXMLElement ? $meta : simplexml_load_string('');
$f->media_user = $rs->user_id;
$f->media_priv = (boolean) $rs->media_private;
$f->media_dt = strtotime($rs->media_dt);
$f->media_dtstr = dt::str('%Y-%m-%d %H:%M',$f->media_dt);
$f->media_image = false;
if (!$this->core->auth->check('media_admin',$this->core->blog->id)
&& $this->core->auth->userID() != $f->media_user) {
$f->del = false;
$f->editable = false;
}
$type_prefix = explode('/',$f->type);
$type_prefix = $type_prefix[0];
switch ($type_prefix) {
case 'image':
$f->media_image = true;
$f->media_icon = 'image';
break;
case 'audio':
$f->media_icon = 'audio';
break;
case 'text':
$f->media_icon = 'text';
break;
case 'video':
$f->media_icon = 'video';
break;
default:
$f->media_icon = 'blank';
}
switch ($f->type) {
case 'application/msword':
case 'application/vnd.oasis.opendocument.text':
case 'application/vnd.sun.xml.writer':
case 'application/pdf':
case 'application/postscript':
$f->media_icon = 'document';
break;
case 'application/msexcel':
case 'application/vnd.oasis.opendocument.spreadsheet':
case 'application/vnd.sun.xml.calc':
$f->media_icon = 'spreadsheet';
break;
case 'application/mspowerpoint':
case 'application/vnd.oasis.opendocument.presentation':
case 'application/vnd.sun.xml.impress':
$f->media_icon = 'presentation';
break;
case 'application/x-debian-package':
case 'application/x-bzip':
case 'application/x-gzip':
case 'application/x-java-archive':
case 'application/rar':
case 'application/x-redhat-package-manager':
case 'application/x-tar':
case 'application/x-gtar':
case 'application/zip':
$f->media_icon = 'package';
break;
case 'application/octet-stream':
$f->media_icon = 'executable';
break;
case 'application/x-shockwave-flash':
$f->media_icon = 'video';
break;
case 'application/ogg':
$f->media_icon = 'audio';
break;
case 'text/html':
$f->media_icon = 'html';
break;
}
$f->media_type = $f->media_icon;
$f->media_icon = sprintf($this->icon_img,$f->media_icon);
# Thumbnails
$f->media_thumb = array();
$p = path::info($f->relname);
$thumb = sprintf($this->thumb_tp,$this->root.'/'.$p['dirname'],$p['base'],'%s');
$thumb_url = sprintf($this->thumb_tp,$this->root_url.$p['dirname'],$p['base'],'%s');
# Cleaner URLs
$thumb_url = preg_replace('#\./#','/',$thumb_url);
$thumb_url = preg_replace('#(?thumb_sizes as $suffix => $s) {
if (file_exists(sprintf($thumb,$suffix))) {
$f->media_thumb[$suffix] = sprintf($thumb_url,$suffix);
}
}
if (isset($f->media_thumb['sq']) && $f->media_type == 'image') {
$f->media_icon = $f->media_thumb['sq'];
}
return $f;
}
return null;
}
public function setFileSort($type='name')
{
if (in_array($type,array('name-asc','name-desc','date-asc','date-desc'))) {
$this->file_sort = $type;
}
}
protected function sortFileHandler($a,$b)
{
switch ($this->file_sort)
{
case 'date-asc':
if ($a->media_dt == $b->media_dt) {
return 0;
}
return ($a->media_dt < $b->media_dt) ? -1 : 1;
case 'date-desc':
if ($a->media_dt == $b->media_dt) {
return 0;
}
return ($a->media_dt > $b->media_dt) ? -1 : 1;
case 'name-desc':
return strcasecmp($b->basename,$a->basename);
case 'name-asc':
default:
return strcasecmp($a->basename,$b->basename);
}
}
/**
Gets current working directory content.
@param type string Media type filter
*/
public function getDir($type=null)
{
if ($type) {
$this->type = $type;
}
$media_dir = $this->relpwd ? $this->relpwd : '.';
$strReq =
'SELECT media_file, media_id, media_path, media_title, media_meta, media_dt, '.
'media_creadt, media_upddt, media_private, user_id '.
'FROM '.$this->table.' '.
"WHERE media_path = '".$this->path."' ".
"AND media_dir = '".$this->con->escape($media_dir)."' ";
if (!$this->core->auth->check('media_admin',$this->core->blog->id))
{
$strReq .= 'AND (media_private <> 1 ';
if ($this->core->auth->userID()) {
$strReq .= "OR user_id = '".$this->con->escape($this->core->auth->userID())."'";
}
$strReq .= ') ';
}
$rs = $this->con->select($strReq);
parent::getDir();
$f_res = array();
$p_dir = $this->dir;
# If type is set, remove items from p_dir
if ($this->type)
{
foreach ($p_dir['files'] as $k => $f) {
if ($f->type_prefix != $this->type) {
unset($p_dir['files'][$k]);
}
}
}
$f_reg = array();
while ($rs->fetch())
{
# File in subdirectory, forget about it!
if (dirname($rs->media_file) != '.' && dirname($rs->media_file) != $this->relpwd) {
continue;
}
if ($this->inFiles($rs->media_file))
{
$f = $this->fileRecord($rs);
if ($f !== null) {
if (isset($f_reg[$rs->media_file]))
{
# That media is duplicated in the database,
# time to do a bit of house cleaning.
$this->con->execute(
'DELETE FROM '.$this->table.' '.
"WHERE media_id = ".$this->fileRecord($rs)->media_id
);
} else {
$f_res[] = $this->fileRecord($rs);
$f_reg[$rs->media_file] = 1;
}
}
}
elseif (!empty($p_dir['files']) && $this->relpwd == '')
{
# Physical file does not exist remove it from DB
# Because we don't want to erase everything on
# dotclear upgrade, do it only if there are files
# in directory and directory is root
$this->con->execute(
'DELETE FROM '.$this->table.' '.
"WHERE media_path = '".$this->con->escape($this->path)."' ".
"AND media_file = '".$this->con->escape($rs->media_file)."' "
);
$this->callFileHandler(files::getMimeType($rs->media_file),'remove',$this->pwd.'/'.$rs->media_file);
}
}
$this->dir['files'] = $f_res;
foreach ($this->dir['dirs'] as $k => $v) {
$v->media_icon = sprintf($this->icon_img,'folder');
}
# Check files that don't exist in database and create them
if ($this->core->auth->check('media,media_admin',$this->core->blog->id))
{
foreach ($p_dir['files'] as $f)
{
if (!isset($f_reg[$f->relname])) {
if (($id = $this->createFile($f->basename,null,false,null,false)) !== false) {
$this->dir['files'][] = $this->getFile($id);
}
}
}
}
usort($this->dir['files'],array($this,'sortFileHandler'));
}
/**
Gets file by its id. Returns a filteItem object.
@param id integer File ID
@return fileItem
*/
public function getFile($id)
{
$strReq =
'SELECT media_id, media_path, media_title, '.
'media_file, media_meta, media_dt, media_creadt, '.
'media_upddt, media_private, user_id '.
'FROM '.$this->table.' '.
"WHERE media_path = '".$this->path."' ".
'AND media_id = '.(integer) $id.' ';
if (!$this->core->auth->check('media_admin',$this->core->blog->id))
{
$strReq .= 'AND (media_private <> 1 ';
if ($this->core->auth->userID()) {
$strReq .= "OR user_id = '".$this->con->escape($this->core->auth->userID())."'";
}
$strReq .= ') ';
}
$rs = $this->con->select($strReq);
return $this->fileRecord($rs);
}
/**
Returns media items attached to a blog post. Result is an array containing
fileItems objects.
@param post_id integer Post ID
@param media_id integer Optionnal media ID
@return array Array of fileItems
*/
public function getPostMedia($post_id,$media_id=null)
{
$params = array(
'post_id' => $post_id,
'media_path' => $this->path
);
if ($media_id) {
$params['media_id'] = (integer) $media_id;
}
$rs = $this->postmedia->getPostMedia($params);
$res = array();
while ($rs->fetch()) {
$f = $this->fileRecord($rs);
if ($f !== null) {
$res[] = $f;
}
}
return $res;
}
/**
@deprecated since version 2.4
@see dcPostMedia::addPostMedia
*/
public function addPostMedia($post_id,$media_id)
{
$this->postmedia->addPostMedia($post_id,$media_id);
}
/**
@deprecated since version 2.4
@see dcPostMedia::removePostMedia
*/
public function removePostMedia($post_id,$media_id)
{
$this->postmedia->removePostMedia($post_id,$media_id,"attachment");
}
/**
Rebuilds database items collection. Optional $pwd parameter is
the path where to start rebuild.
@param pwd string Directory to rebuild
*/
public function rebuild($pwd='')
{
if (!$this->core->auth->isSuperAdmin()) {
throw new Exception(__('You are not a super administrator.'));
}
$this->chdir($pwd);
parent::getDir();
$dir = $this->dir;
foreach ($dir['dirs'] as $d) {
if (!$d->parent) {
$this->rebuild($d->relname,false);
}
}
foreach ($dir['files'] as $f) {
$this->chdir(dirname($f->relname));
$this->createFile($f->basename);
}
$this->rebuildDB($pwd);
}
protected function rebuildDB($pwd)
{
$media_dir = $pwd ? $pwd : '.';
$strReq =
'SELECT media_file, media_id '.
'FROM '.$this->table.' '.
"WHERE media_path = '".$this->path."' ".
"AND media_dir = '".$this->con->escape($media_dir)."' ";
$rs = $this->con->select($strReq);
$delReq = 'DELETE FROM '.$this->table.' '.
'WHERE media_id IN (%s) ';
$del_ids = array();
while ($rs->fetch())
{
if (!is_file($this->root.'/'.$rs->media_file)) {
$del_ids[] = (integer) $rs->media_id;
}
}
if (!empty($del_ids)) {
$this->con->execute(sprintf($delReq,implode(',',$del_ids)));
}
}
public function makeDir($d)
{
$d = files::tidyFileName($d);
parent::makeDir($d);
}
/**
Creates or updates a file in database. Returns new media ID or false if
file does not exist.
@param name string File name (relative to working directory)
@param title string File title
@param private boolean File is private
@param dt string File date
@return integer New media ID
*/
public function createFile($name,$title=null,$private=false,$dt=null,$force=true)
{
if (!$this->core->auth->check('media,media_admin',$this->core->blog->id)) {
throw new Exception(__('Permission denied.'));
}
$file = $this->pwd.'/'.$name;
if (!file_exists($file)) {
return false;
}
$media_file = $this->relpwd ? path::clean($this->relpwd.'/'.$name) : path::clean($name);
$media_type = files::getMimeType($name);
$cur = $this->con->openCursor($this->table);
$strReq = 'SELECT media_id '.
'FROM '.$this->table.' '.
"WHERE media_path = '".$this->con->escape($this->path)."' ".
"AND media_file = '".$this->con->escape($media_file)."' ";
$rs = $this->con->select($strReq);
if ($rs->isEmpty())
{
$this->con->writeLock($this->table);
try
{
$rs = $this->con->select('SELECT MAX(media_id) FROM '.$this->table);
$media_id = (integer) $rs->f(0) + 1;
$cur->media_id = $media_id;
$cur->user_id = (string) $this->core->auth->userID();
$cur->media_path = (string) $this->path;
$cur->media_file = (string) $media_file;
$cur->media_dir = (string) dirname($media_file);
$cur->media_creadt = date('Y-m-d H:i:s');
$cur->media_upddt = date('Y-m-d H:i:s');
$cur->media_title = !$title ? (string) $name : (string) $title;
$cur->media_private = (integer) (boolean) $private;
if ($dt) {
$cur->media_dt = (string) $dt;
} else {
$cur->media_dt = strftime('%Y-%m-%d %H:%M:%S',filemtime($file));
}
try {
$cur->insert();
} catch (Exception $e) {
@unlink($name);
throw $e;
}
$this->con->unlock();
}
catch (Exception $e)
{
$this->con->unlock();
throw $e;
}
}
else
{
$media_id = (integer) $rs->media_id;
$cur->media_upddt = date('Y-m-d H:i:s');
$cur->update('WHERE media_id = '.$media_id);
}
$this->callFileHandler($media_type,'create',$cur,$name,$media_id,$force);
return $media_id;
}
/**
Updates a file in database.
@param file fileItem Current fileItem object
@param newFile fileItem New fileItem object
*/
public function updateFile($file,$newFile)
{
if (!$this->core->auth->check('media,media_admin',$this->core->blog->id)) {
throw new Exception(__('Permission denied.'));
}
$id = (integer) $file->media_id;
if (!$id) {
throw new Exception('No file ID');
}
if (!$this->core->auth->check('media_admin',$this->core->blog->id)
&& $this->core->auth->userID() != $file->media_user) {
throw new Exception(__('You are not the file owner.'));
}
$cur = $this->con->openCursor($this->table);
# We need to tidy newFile basename. If dir isn't empty, concat to basename
$newFile->relname = files::tidyFileName($newFile->basename);
if ($newFile->dir) {
$newFile->relname = $newFile->dir.'/'.$newFile->relname;
}
if ($file->relname != $newFile->relname) {
$newFile->file = $this->root.'/'.$newFile->relname;
if ($this->isFileExclude($newFile->relname)) {
throw new Exception(__('This file is not allowed.'));
}
if (file_exists($newFile->file)) {
throw new Exception(__('New file already exists.'));
}
$this->moveFile($file->relname,$newFile->relname);
$cur->media_file = (string) $newFile->relname;
$cur->media_dir = (string) dirname($newFile->relname);
}
$cur->media_title = (string) $newFile->media_title;
$cur->media_dt = (string) $newFile->media_dtstr;
$cur->media_upddt = date('Y-m-d H:i:s');
$cur->media_private = (integer) $newFile->media_priv;
$cur->update('WHERE media_id = '.$id);
$this->callFileHandler($file->type,'update',$file,$newFile);
}
/**
Uploads a file.
@param tmp string Full path of temporary uploaded file
@param name string File name (relative to working directory)
@param title string File title
@param private boolean File is private
*/
public function uploadFile($tmp,$name,$title=null,$private=false,$overwrite=false)
{
if (!$this->core->auth->check('media,media_admin',$this->core->blog->id)) {
throw new Exception(__('Permission denied.'));
}
$name = files::tidyFileName($name);
parent::uploadFile($tmp,$name,$overwrite);
return $this->createFile($name,$title,$private);
}
/**
Creates a file from binary content.
@param name string File name (relative to working directory)
@param bits string Binary file content
*/
public function uploadBits($name,$bits)
{
if (!$this->core->auth->check('media,media_admin',$this->core->blog->id)) {
throw new Exception(__('Permission denied.'));
}
$name = files::tidyFileName($name);
parent::uploadBits($name,$bits);
return $this->createFile($name,null,null);
}
/**
Removes a file.
@param f fileItem fileItem object
*/
public function removeFile($f)
{
if (!$this->core->auth->check('media,media_admin',$this->core->blog->id)) {
throw new Exception(__('Permission denied.'));
}
$media_file = $this->relpwd ? path::clean($this->relpwd.'/'.$f) : path::clean($f);
$strReq = 'DELETE FROM '.$this->table.' '.
"WHERE media_path = '".$this->con->escape($this->path)."' ".
"AND media_file = '".$this->con->escape($media_file)."' ";
if (!$this->core->auth->check('media_admin',$this->core->blog->id))
{
$strReq .= "AND user_id = '".$this->con->escape($this->core->auth->userID())."'";
}
$this->con->execute($strReq);
if ($this->con->changes() == 0) {
throw new Exception(__('File does not exist in the database.'));
}
parent::removeFile($f);
$this->callFileHandler(files::getMimeType($media_file),'remove',$f);
}
/**
Extract zip file in current location
@param f fileRecord fileRecord object
*/
public function inflateZipFile($f,$create_dir=true)
{
$zip = new fileUnzip($f->file);
$zip->setExcludePattern($this->exclude_pattern);
$zip->getList(false,'#(^|/)(__MACOSX|\.svn|\.DS_Store|\.directory|Thumbs\.db)(/|$)#');
if ($create_dir)
{
$zip_root_dir = $zip->getRootDir();
if ($zip_root_dir != false) {
$destination = $zip_root_dir;
$target = $f->dir;
} else {
$destination = preg_replace('/\.([^.]+)$/','',$f->basename);
$target = $f->dir.'/'.$destination;
}
if (is_dir($f->dir.'/'.$destination)) {
throw new Exception(sprintf(__('Extract destination directory %s already exists.'),dirname($f->relname).'/'.$destination));
}
}
else
{
$target = $f->dir;
$destination = '';
}
$zip->unzipAll($target);
$zip->close();
return dirname($f->relname).'/'.$destination;
}
/**
Returns zip file content
@param f fileRecord fileRecord object
@return array
*/
public function getZipContent($f)
{
$zip = new fileUnzip($f->file);
$list = $zip->getList(false,'#(^|/)(__MACOSX|\.svn|\.DS_Store|\.directory|Thumbs\.db)(/|$)#');
$zip->close();
return $list;
}
/**
Calls file handlers registered for recreate event
@param f fileItem fileItem object
*/
public function mediaFireRecreateEvent($f)
{
$media_type = files::getMimeType($f->basename);
$this->callFileHandler($media_type,'recreate',null,$f->basename); // Args list to be completed as necessary (Franck)
}
/* Image handlers
------------------------------------------------------- */
public function imageThumbCreate($cur,$f,$force=true)
{
$file = $this->pwd.'/'.$f;
if (!file_exists($file)) {
return false;
}
$p = path::info($file);
$thumb = sprintf($this->thumb_tp,$p['dirname'],$p['base'],'%s');
try
{
$img = new imageTools();
$img->loadImage($file);
$w = $img->getW();
$h = $img->getH();
if ($force) $this->imageThumbRemove($f);
foreach ($this->thumb_sizes as $suffix => $s) {
$thumb_file = sprintf($thumb,$suffix);
if (!file_exists($thumb_file) && $s[0] > 0 &&
($suffix == 'sq' || $w > $s[0] || $h > $s[0]))
{
$img->resize($s[0],$s[0],$s[1]);
$img->output('jpeg',$thumb_file,80);
}
}
$img->close();
}
catch (Exception $e)
{
if ($cur === null) { # Called only if cursor is null (public call)
throw $e;
}
}
}
protected function imageThumbUpdate($file,$newFile)
{
if ($file->relname != $newFile->relname)
{
$p = path::info($file->relname);
$thumb_old = sprintf($this->thumb_tp,$p['dirname'],$p['base'],'%s');
$p = path::info($newFile->relname);
$thumb_new = sprintf($this->thumb_tp,$p['dirname'],$p['base'],'%s');
foreach ($this->thumb_sizes as $suffix => $s) {
try {
parent::moveFile(sprintf($thumb_old,$suffix),sprintf($thumb_new,$suffix));
} catch (Exception $e) {}
}
}
}
protected function imageThumbRemove($f)
{
$p = path::info($f);
$thumb = sprintf($this->thumb_tp,'',$p['base'],'%s');
foreach ($this->thumb_sizes as $suffix => $s) {
try {
parent::removeFile(sprintf($thumb,$suffix));
} catch (Exception $e) {}
}
}
protected function imageMetaCreate($cur,$f,$id)
{
$file = $this->pwd.'/'.$f;
if (!file_exists($file)) {
return false;
}
$xml = new xmlTag('meta');
$meta = imageMeta::readMeta($file);
$xml->insertNode($meta);
$c = $this->core->con->openCursor($this->table);
$c->media_meta = $xml->toXML();
if ($cur->media_title !== null && $cur->media_title == basename($cur->media_file))
{
if ($meta['Title']) {
$c->media_title = $meta['Title'];
}
}
if ($meta['DateTimeOriginal'] && $cur->media_dt === '')
{
# We set picture time to user timezone
$media_ts = strtotime($meta['DateTimeOriginal']);
if ($media_ts !== false) {
$o = dt::getTimeOffset($this->core->auth->getInfo('user_tz'),$media_ts);
$c->media_dt = dt::str('%Y-%m-%d %H:%M:%S',$media_ts+$o);
}
}
$c->update('WHERE media_id = '.$id);
}
/**
Returns HTML code for MP3 player
@param url string MP3 URL to play
@param player string Player URL
@param args array Player parameters
@return string
*/
public static function mp3player($url,$player=null,$args=null)
{
if (!$player) {
$player = 'player_mp3.swf';
}
if (!is_array($args))
{
$args = array(
'showvolume' => 1,
'loadingcolor' => 'ff9900',
'bgcolor1' => 'eeeeee',
'bgcolor2' => 'cccccc',
'buttoncolor' => '0066cc',
'buttonovercolor' => 'ff9900',
'slidercolor1' => 'cccccc',
'slidercolor2' => '999999',
'sliderovercolor' => '0066cc'
);
}
$args['mp3'] = $url;
if (empty($args['width'])) {
$args['width'] = 200;
}
if (empty($args['height'])) {
$args['height'] = 20;
}
$vars = array();
foreach ($args as $k => $v) {
$vars[] = $k.'='.$v;
}
return
'';
}
public static function flvplayer($url,$player=null,$args=null)
{
if (!$player) {
$player = 'player_flv.swf';
}
if (!is_array($args))
{
$args = array(
'margin' => 1,
'showvolume' => 1,
'showtime' => 1,
'showfullscreen' => 1,
'buttonovercolor' => 'ff9900',
'slidercolor1' => 'cccccc',
'slidercolor2' => '999999',
'sliderovercolor' => '0066cc'
);
}
$args['flv'] = $url;
if (empty($args['width'])) {
$args['width'] = 400;
}
if (empty($args['height'])) {
$args['height'] = 300;
}
$vars = array();
foreach ($args as $k => $v) {
$vars[] = $k.'='.$v;
}
return
'';
}
}
?>