Dotclear

source: inc/core/class.dc.media.php @ 3357:9bbeb2691a23

Revision 3357:9bbeb2691a23, 36.9 KB checked in by franck <carnet.franck.paul@…>, 9 years ago (diff)

Merge fixes commited on stable 2.10 branch

RevLine 
[0]1<?php
2# -- BEGIN LICENSE BLOCK ---------------------------------------
3#
4# This file is part of Dotclear 2.
5#
[1179]6# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
[0]7# Licensed under the GPL version 2.0 license.
8# See LICENSE file or
9# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
10#
11# -- END LICENSE BLOCK -----------------------------------------
12if (!defined('DC_RC_PATH')) { return; }
13
14/**
15@ingroup DC_CORE
16@brief Dotclear media manage
17
18This class handles Dotclear media items.
19*/
20class dcMedia extends filemanager
21{
22     protected $core;         ///< <b>dcCore</b> dcCore instance
23     protected $con;          ///< <b>connection</b> Database connection
24     protected $table;        ///< <b>string</b> Media table name
25     protected $type;         ///< <b>string</b> Media type filter
[407]26     protected $postmedia;
[0]27     protected $file_sort = 'name-asc';
[2566]28
[0]29     protected $file_handler = array(); ///< <b>array</b> Array of callbacks
[2566]30
[0]31     public $thumb_tp = '%s/.%s_%s.jpg';     ///< <b>string</b> Thumbnail file pattern
[1381]32     public $thumb_tp_alpha = '%s/.%s_%s.png'; ///< <b>string</b> Thumbnail file pattern (with alpha layer)
[2566]33
[0]34     /**
35     <b>array</b> Tubmnail sizes:
36     - m: medium image
37     - s: small image
38     - t: thumbnail image
39     - sq: square image
40     */
[2566]41     public $thumb_sizes = array(
[0]42          'm' => array(448,'ratio','medium'),
43          's' => array(240,'ratio','small'),
44          't' => array(100,'ratio','thumbnail'),
45          'sq' => array(48,'crop','square')
46     );
[2566]47
[0]48     public $icon_img = 'images/media/%s.png';    ///< <b>string</b> Icon file pattern
[2566]49
[0]50     /**
51     Object constructor.
[2566]52
[0]53     @param    core      <b>dcCore</b>       dcCore instance
54     @param    type      <b>string</b>       Media type filter
55     */
56     public function __construct($core,$type='')
57     {
58          $this->core =& $core;
59          $this->con =& $core->con;
[407]60          $this->postmedia = new dcPostMedia($core);
[2566]61
[0]62          if ($this->core->blog == null) {
63               throw new Exception(__('No blog defined.'));
64          }
[2566]65
[0]66          $this->table = $this->core->prefix.'media';
67          $root = $this->core->blog->public_path;
[2566]68
[0]69          if (preg_match('#^http(s)?://#',$this->core->blog->settings->system->public_url)) {
70               $root_url = rawurldecode($this->core->blog->settings->system->public_url);
71          } else {
72               $root_url = rawurldecode($this->core->blog->host.path::clean($this->core->blog->settings->system->public_url));
73          }
[2566]74
[0]75          if (!is_dir($root)) {
[1705]76               # Check public directory
77               if ( $core->auth->isSuperAdmin() ) {
[1708]78                    throw new Exception(__("There is no writable directory /public/ at the location set in about:config \"public_path\". You must create this directory with sufficient rights (or change this setting)."));
[1705]79               } else {
[1708]80                    throw new Exception(__("There is no writable root directory for the media manager. You should contact your administrator."));
[1705]81               }
[0]82          }
[2566]83
[0]84          $this->type = $type;
[2566]85
[0]86          parent::__construct($root,$root_url);
87          $this->chdir('');
[2566]88
[0]89          $this->path = $this->core->blog->settings->system->public_path;
[2566]90
[0]91          $this->addExclusion(DC_RC_PATH);
92          $this->addExclusion(dirname(__FILE__).'/../');
[2566]93
[0]94          $this->exclude_pattern = $core->blog->settings->system->media_exclusion;
[2566]95
[0]96          # Event handlers
97          $this->addFileHandler('image/jpeg','create',array($this,'imageThumbCreate'));
98          $this->addFileHandler('image/png','create',array($this,'imageThumbCreate'));
99          $this->addFileHandler('image/gif','create',array($this,'imageThumbCreate'));
[2566]100
[0]101          $this->addFileHandler('image/png','update',array($this,'imageThumbUpdate'));
102          $this->addFileHandler('image/jpeg','update',array($this,'imageThumbUpdate'));
103          $this->addFileHandler('image/gif','update',array($this,'imageThumbUpdate'));
[2566]104
[0]105          $this->addFileHandler('image/png','remove',array($this,'imageThumbRemove'));
106          $this->addFileHandler('image/jpeg','remove',array($this,'imageThumbRemove'));
107          $this->addFileHandler('image/gif','remove',array($this,'imageThumbRemove'));
[2566]108
[0]109          $this->addFileHandler('image/jpeg','create',array($this,'imageMetaCreate'));
[2566]110
[2]111          $this->addFileHandler('image/jpeg','recreate',array($this,'imageThumbCreate'));
112          $this->addFileHandler('image/png','recreate',array($this,'imageThumbCreate'));
113          $this->addFileHandler('image/gif','recreate',array($this,'imageThumbCreate'));
[2566]114
[3]115          $this->addFileHandler('image/jpeg','recreate',array($this,'imageThumbCreate'));
116          $this->addFileHandler('image/png','recreate',array($this,'imageThumbCreate'));
117          $this->addFileHandler('image/gif','recreate',array($this,'imageThumbCreate'));
[2566]118
[0]119          # Thumbnails sizes
120          $this->thumb_sizes['m'][0] = abs($core->blog->settings->system->media_img_m_size);
121          $this->thumb_sizes['s'][0] = abs($core->blog->settings->system->media_img_s_size);
122          $this->thumb_sizes['t'][0] = abs($core->blog->settings->system->media_img_t_size);
[2566]123
[0]124          # Thumbnails sizes names
125          $this->thumb_sizes['m'][2] = __($this->thumb_sizes['m'][2]);
126          $this->thumb_sizes['s'][2] = __($this->thumb_sizes['s'][2]);
127          $this->thumb_sizes['t'][2] = __($this->thumb_sizes['t'][2]);
128          $this->thumb_sizes['sq'][2] = __($this->thumb_sizes['sq'][2]);
[2566]129
[0]130          # --BEHAVIOR-- coreMediaConstruct
[2566]131          $this->core->callBehavior('coreMediaConstruct',$this);
[0]132     }
[2566]133
[0]134     /**
135     Changes working directory.
[2566]136
[0]137     @param    dir       <b>string</b>       Directory name.
138     */
139     public function chdir($dir)
140     {
141          parent::chdir($dir);
142          $this->relpwd = preg_replace('/^'.preg_quote($this->root,'/').'\/?/','',$this->pwd);
143     }
[2566]144
[0]145     /**
146     Adds a new file handler for a given media type and event.
[2566]147
[0]148     Available events are:
149     - create: file creation
150     - update: file update
151     - remove: file deletion
[2566]152
[0]153     @param    type      <b>string</b>       Media type
154     @param    event     <b>string</b>       Event
155     @param    function  <b>callback</b>
156     */
157     public function addFileHandler($type,$event,$function)
158     {
159          if (is_callable($function)) {
160               $this->file_handler[$type][$event][] = $function;
161          }
162     }
[2566]163
[0]164     protected function callFileHandler($type,$event)
165     {
166          if (!empty($this->file_handler[$type][$event]))
167          {
168               $args = func_get_args();
169               array_shift($args);
170               array_shift($args);
[2566]171
[0]172               foreach ($this->file_handler[$type][$event] as $f)
173               {
174                    call_user_func_array($f,$args);
175               }
176          }
177     }
[2566]178
[0]179     /**
180     Returns HTML breadCrumb for media manager navigation.
[2566]181
[0]182     @param    href      <b>string</b>       URL pattern
[505]183     @param    last      <b>string</b>       Last item pattern
[0]184     @return   <b>string</b> HTML code
185     */
[505]186     public function breadCrumb($href,$last='')
[0]187     {
188          $res = '';
189          if ($this->relpwd && $this->relpwd != '.') {
190               $pwd = '';
[505]191               $arr = explode('/',$this->relpwd);
192               $count = count($arr);
193               foreach ($arr as $v) {
194                    if (($last != '') && (0 === --$count)) {
195                         $res .= sprintf($last,$v);
196                    } else {
197                         $pwd .= rawurlencode($v).'/';
198                         $res .= '<a href="'.sprintf($href,$pwd).'">'.$v.'</a> / ';
199                    }
[0]200               }
201          }
202          return $res;
[2566]203
[0]204     }
[2566]205
[0]206     protected function fileRecord($rs)
207     {
208          if ($rs->isEmpty()) { return null; }
[2566]209
[0]210          if (!$this->isFileExclude($this->root.'/'.$rs->media_file) && is_file($this->root.'/'.$rs->media_file))
211          {
212               $f = new fileItem($this->root.'/'.$rs->media_file,$this->root,$this->root_url);
[2566]213
[0]214               if ($this->type && $f->type_prefix != $this->type) {
215                    return null;
216               }
[2566]217
[0]218               $meta = @simplexml_load_string($rs->media_meta);
[2566]219
[0]220               $f->editable = true;
221               $f->media_id = $rs->media_id;
222               $f->media_title = $rs->media_title;
223               $f->media_meta =  $meta instanceof SimpleXMLElement ? $meta : simplexml_load_string('<meta></meta>');
224               $f->media_user = $rs->user_id;
225               $f->media_priv = (boolean) $rs->media_private;
226               $f->media_dt = strtotime($rs->media_dt);
227               $f->media_dtstr = dt::str('%Y-%m-%d %H:%M',$f->media_dt);
[2566]228
[0]229               $f->media_image = false;
[2566]230
[0]231               if (!$this->core->auth->check('media_admin',$this->core->blog->id)
232               && $this->core->auth->userID() != $f->media_user) {
233                    $f->del = false;
234                    $f->editable = false;
235               }
[2566]236
[0]237               $type_prefix = explode('/',$f->type);
238               $type_prefix = $type_prefix[0];
[2566]239
[0]240               switch ($type_prefix) {
241                    case 'image':
242                         $f->media_image = true;
243                         $f->media_icon = 'image';
244                         break;
245                    case 'audio':
246                         $f->media_icon = 'audio';
247                         break;
248                    case 'text':
249                         $f->media_icon = 'text';
250                         break;
251                    case 'video':
252                         $f->media_icon = 'video';
253                         break;
254                    default:
255                         $f->media_icon = 'blank';
256               }
257               switch ($f->type) {
258                    case 'application/msword':
259                    case 'application/vnd.oasis.opendocument.text':
260                    case 'application/vnd.sun.xml.writer':
261                    case 'application/pdf':
262                    case 'application/postscript':
263                         $f->media_icon = 'document';
264                         break;
265                    case 'application/msexcel':
266                    case 'application/vnd.oasis.opendocument.spreadsheet':
267                    case 'application/vnd.sun.xml.calc':
268                         $f->media_icon = 'spreadsheet';
269                         break;
270                    case 'application/mspowerpoint':
271                    case 'application/vnd.oasis.opendocument.presentation':
272                    case 'application/vnd.sun.xml.impress':
273                         $f->media_icon = 'presentation';
274                         break;
275                    case 'application/x-debian-package':
276                    case 'application/x-bzip':
277                    case 'application/x-gzip':
278                    case 'application/x-java-archive':
279                    case 'application/rar':
280                    case 'application/x-redhat-package-manager':
281                    case 'application/x-tar':
282                    case 'application/x-gtar':
283                    case 'application/zip':
284                         $f->media_icon = 'package';
285                         break;
286                    case 'application/octet-stream':
287                         $f->media_icon = 'executable';
288                         break;
289                    case 'application/x-shockwave-flash':
290                         $f->media_icon = 'video';
291                         break;
292                    case 'application/ogg':
293                         $f->media_icon = 'audio';
294                         break;
295                    case 'text/html':
296                         $f->media_icon = 'html';
297                         break;
298               }
[2566]299
[0]300               $f->media_type = $f->media_icon;
301               $f->media_icon = sprintf($this->icon_img,$f->media_icon);
[2566]302
[0]303               # Thumbnails
304               $f->media_thumb = array();
305               $p = path::info($f->relname);
[1677]306
[1381]307               $alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG');
[1677]308
[1381]309               $thumb = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$this->root.'/'.$p['dirname'],$p['base'],'%s');
310               $thumb_url = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$this->root_url.$p['dirname'],$p['base'],'%s');
[2566]311
[0]312               # Cleaner URLs
313               $thumb_url = preg_replace('#\./#','/',$thumb_url);
314               $thumb_url = preg_replace('#(?<!:)/+#','/',$thumb_url);
[1677]315
316               if ($alpha) {
317                    $thumb_alt = sprintf($this->thumb_tp,$this->root.'/'.$p['dirname'],$p['base'],'%s');
318                    $thumb_url_alt = sprintf($this->thumb_tp,$this->root_url.$p['dirname'],$p['base'],'%s');
319                    # Cleaner URLs
320                    $thumb_url_alt = preg_replace('#\./#','/',$thumb_url_alt);
321                    $thumb_url_alt = preg_replace('#(?<!:)/+#','/',$thumb_url_alt);
322               }
[2566]323
[0]324               foreach ($this->thumb_sizes as $suffix => $s) {
325                    if (file_exists(sprintf($thumb,$suffix))) {
326                         $f->media_thumb[$suffix] = sprintf($thumb_url,$suffix);
[1677]327                    } elseif ($alpha && file_exists(sprintf($thumb_alt,$suffix))) {
328                         $f->media_thumb[$suffix] = sprintf($thumb_url_alt,$suffix);
[0]329                    }
330               }
[2566]331
[0]332               if (isset($f->media_thumb['sq']) && $f->media_type == 'image') {
333                    $f->media_icon = $f->media_thumb['sq'];
334               }
[2566]335
[0]336               return $f;
337          }
[2566]338
[0]339          return null;
340     }
[2566]341
342
[0]343     public function setFileSort($type='name')
344     {
345          if (in_array($type,array('name-asc','name-desc','date-asc','date-desc'))) {
346               $this->file_sort = $type;
347          }
348     }
[2566]349
[0]350     protected function sortFileHandler($a,$b)
351     {
[3299]352          if (is_null($a) || is_null($b)) {
353               return (is_null($a) ? 1 : -1);
354          }
[0]355          switch ($this->file_sort)
356          {
357               case 'date-asc':
358                    if ($a->media_dt == $b->media_dt) {
359                         return 0;
360                    }
361                    return ($a->media_dt < $b->media_dt) ? -1 : 1;
362               case 'date-desc':
363                    if ($a->media_dt == $b->media_dt) {
364                         return 0;
365                    }
366                    return ($a->media_dt > $b->media_dt) ? -1 : 1;
367               case 'name-desc':
368                    return strcasecmp($b->basename,$a->basename);
369               case 'name-asc':
370               default:
371                    return strcasecmp($a->basename,$b->basename);
372          }
373     }
[2098]374
375     /**
376     Gets current working directory content (using filesystem)
377
378     */
379     public function getFSDir()
380     {
381          parent::getDir();
382     }
383
[0]384     /**
[2566]385     Gets current working directory content.
386
[0]387     @param    type      <b>string</b>       Media type filter
388     */
389     public function getDir($type=null)
390     {
391          if ($type) {
392               $this->type = $type;
393          }
[2566]394
[3340]395          $media_dir = $this->relpwd ?: '.';
[2566]396
[0]397          $strReq =
398          'SELECT media_file, media_id, media_path, media_title, media_meta, media_dt, '.
399          'media_creadt, media_upddt, media_private, user_id '.
400          'FROM '.$this->table.' '.
401          "WHERE media_path = '".$this->path."' ".
402          "AND media_dir = '".$this->con->escape($media_dir)."' ";
[2566]403
[0]404          if (!$this->core->auth->check('media_admin',$this->core->blog->id))
405          {
406               $strReq .= 'AND (media_private <> 1 ';
[2566]407
[0]408               if ($this->core->auth->userID()) {
409                    $strReq .= "OR user_id = '".$this->con->escape($this->core->auth->userID())."'";
410               }
411               $strReq .= ') ';
412          }
[2566]413
[0]414          $rs = $this->con->select($strReq);
[2566]415
[0]416          parent::getDir();
[2566]417
[0]418          $f_res = array();
419          $p_dir = $this->dir;
[2566]420
[0]421          # If type is set, remove items from p_dir
422          if ($this->type)
423          {
424               foreach ($p_dir['files'] as $k => $f) {
425                    if ($f->type_prefix != $this->type) {
426                         unset($p_dir['files'][$k]);
427                    }
428               }
429          }
[2566]430
[0]431          $f_reg = array();
[2566]432
[0]433          while ($rs->fetch())
434          {
435               # File in subdirectory, forget about it!
436               if (dirname($rs->media_file) != '.' && dirname($rs->media_file) != $this->relpwd) {
437                    continue;
438               }
[2566]439
[0]440               if ($this->inFiles($rs->media_file))
441               {
442                    $f = $this->fileRecord($rs);
443                    if ($f !== null) {
444                         if (isset($f_reg[$rs->media_file]))
445                         {
[2566]446                              # That media is duplicated in the database,
[0]447                              # time to do a bit of house cleaning.
448                              $this->con->execute(
449                                   'DELETE FROM '.$this->table.' '.
450                                   "WHERE media_id = ".$this->fileRecord($rs)->media_id
451                              );
452                         } else {
453                              $f_res[] = $this->fileRecord($rs);
454                              $f_reg[$rs->media_file] = 1;
455                         }
456                    }
457               }
458               elseif (!empty($p_dir['files']) && $this->relpwd == '')
459               {
460                    # Physical file does not exist remove it from DB
461                    # Because we don't want to erase everything on
462                    # dotclear upgrade, do it only if there are files
463                    # in directory and directory is root
464                    $this->con->execute(
465                         'DELETE FROM '.$this->table.' '.
466                         "WHERE media_path = '".$this->con->escape($this->path)."' ".
467                         "AND media_file = '".$this->con->escape($rs->media_file)."' "
468                    );
469                    $this->callFileHandler(files::getMimeType($rs->media_file),'remove',$this->pwd.'/'.$rs->media_file);
470               }
471          }
[2566]472
[0]473          $this->dir['files'] = $f_res;
474          foreach ($this->dir['dirs'] as $k => $v) {
[1855]475               $v->media_icon = sprintf($this->icon_img,($v->parent ? 'folder-up' : 'folder'));
[0]476          }
[2566]477
[0]478          # Check files that don't exist in database and create them
479          if ($this->core->auth->check('media,media_admin',$this->core->blog->id))
480          {
481               foreach ($p_dir['files'] as $f)
482               {
483                    if (!isset($f_reg[$f->relname])) {
484                         if (($id = $this->createFile($f->basename,null,false,null,false)) !== false) {
485                              $this->dir['files'][] = $this->getFile($id);
486                         }
487                    }
488               }
489          }
[3299]490          try {
491               usort($this->dir['files'],array($this,'sortFileHandler'));
492          } catch (Exception $e) {}
[0]493     }
[2566]494
[0]495     /**
496     Gets file by its id. Returns a filteItem object.
[2566]497
[0]498     @param    id        <b>integer</b>      File ID
499     @return   <b>fileItem</b>
500     */
501     public function getFile($id)
502     {
503          $strReq =
504          'SELECT media_id, media_path, media_title, '.
505          'media_file, media_meta, media_dt, media_creadt, '.
506          'media_upddt, media_private, user_id '.
507          'FROM '.$this->table.' '.
508          "WHERE media_path = '".$this->path."' ".
509          'AND media_id = '.(integer) $id.' ';
[2566]510
[0]511          if (!$this->core->auth->check('media_admin',$this->core->blog->id))
512          {
513               $strReq .= 'AND (media_private <> 1 ';
[2566]514
[0]515               if ($this->core->auth->userID()) {
516                    $strReq .= "OR user_id = '".$this->con->escape($this->core->auth->userID())."'";
517               }
518               $strReq .= ') ';
519          }
[2566]520
[0]521          $rs = $this->con->select($strReq);
522          return $this->fileRecord($rs);
523     }
[2566]524
[0]525     /**
[3099]526     Search into media db (only).
527
528     @param    query          <b>string</b>       Search query
529     @return boolean     true or false if nothing found
530     */
531     public function searchMedia($query)
532     {
533          if ($query == '') {
534               return false;
535          }
536
537          $strReq =
538          'SELECT media_file, media_id, media_path, media_title, media_meta, media_dt, '.
539          'media_creadt, media_upddt, media_private, user_id '.
540          'FROM '.$this->table.' '.
541          "WHERE media_path = '".$this->path."' ".
542          "AND (media_title LIKE '%".$this->con->escape($query)."%' ".
543          "    OR media_file LIKE '%".$this->con->escape($query)."%' ".
544          "    OR media_meta LIKE '<Description>%".$this->con->escape($query)."%</Description>')";
545
546          if (!$this->core->auth->check('media_admin',$this->core->blog->id))
547          {
548               $strReq .= 'AND (media_private <> 1 ';
549
550               if ($this->core->auth->userID()) {
551                    $strReq .= "OR user_id = '".$this->con->escape($this->core->auth->userID())."'";
552               }
553               $strReq .= ') ';
554          }
555
556          $rs = $this->con->select($strReq);
557
558          $this->dir = array('dirs' => array(),'files' => array());
559          $f_res = array();
560          while ($rs->fetch())
561          {
562               $fr = $this->fileRecord($rs);
563               if ($fr) {
564                    $f_res[] = $fr;
565               }
566          }
567          $this->dir['files'] = $f_res;
568
569          try {
570               usort($this->dir['files'],array($this,'sortFileHandler'));
571          } catch (Exception $e) {}
572
573          return (count($f_res) > 0 ? true : false);
574     }
575
576     /**
[0]577     Returns media items attached to a blog post. Result is an array containing
578     fileItems objects.
[2566]579
[3167]580     @param    post_id        <b>integer</b>      Post ID
[0]581     @param    media_id  <b>integer</b>      Optionnal media ID
[3167]582     @param    link_type <b>string</b>       Optionnal link type
[1280]583     @return   <b>array</b> Array of fileItems
[0]584     */
[3167]585     public function getPostMedia($post_id,$media_id=null,$link_type=null)
[0]586     {
[407]587          $params = array(
588               'post_id' => $post_id,
589               'media_path' => $this->path
590          );
[0]591          if ($media_id) {
[407]592               $params['media_id'] = (integer) $media_id;
[0]593          }
[3167]594          if ($link_type) {
595               $params['link_type'] = $link_type;
596          }
[407]597          $rs = $this->postmedia->getPostMedia($params);
[2566]598
[0]599          $res = array();
[2566]600
[0]601          while ($rs->fetch()) {
602               $f = $this->fileRecord($rs);
603               if ($f !== null) {
[1280]604                    $res[] = $f;
[0]605               }
606          }
[2566]607
[1280]608          return $res;
[0]609     }
[2566]610
[0]611     /**
[407]612     @deprecated since version 2.4
613     @see dcPostMedia::addPostMedia
[0]614     */
[3167]615     public function addPostMedia($post_id,$media_id,$link_type='attachment')
[0]616     {
[3167]617          $this->postmedia->addPostMedia($post_id,$media_id,$link_type);
[0]618     }
[2566]619
[0]620     /**
[407]621     @deprecated since version 2.4
622     @see dcPostMedia::removePostMedia
[0]623     */
[3167]624     public function removePostMedia($post_id,$media_id,$link_type='attachment')
[0]625     {
[3167]626          $this->postmedia->removePostMedia($post_id,$media_id,$link_type);
[0]627     }
[2566]628
[0]629     /**
630     Rebuilds database items collection. Optional <var>$pwd</var> parameter is
631     the path where to start rebuild.
[2566]632
[0]633     @param    pwd       <b>string</b>       Directory to rebuild
634     */
635     public function rebuild($pwd='')
636     {
637          if (!$this->core->auth->isSuperAdmin()) {
638               throw new Exception(__('You are not a super administrator.'));
639          }
[2566]640
[0]641          $this->chdir($pwd);
642          parent::getDir();
[2566]643
[0]644          $dir = $this->dir;
[2566]645
[0]646          foreach ($dir['dirs'] as $d) {
647               if (!$d->parent) {
648                    $this->rebuild($d->relname,false);
649               }
650          }
[2566]651
[0]652          foreach ($dir['files'] as $f) {
653               $this->chdir(dirname($f->relname));
654               $this->createFile($f->basename);
655          }
[2566]656
[0]657          $this->rebuildDB($pwd);
658     }
[2566]659
[0]660     protected function rebuildDB($pwd)
661     {
[3340]662          $media_dir = $pwd ?: '.';
[2566]663
[0]664          $strReq =
665          'SELECT media_file, media_id '.
666          'FROM '.$this->table.' '.
667          "WHERE media_path = '".$this->path."' ".
668          "AND media_dir = '".$this->con->escape($media_dir)."' ";
[2566]669
[0]670          $rs = $this->con->select($strReq);
[2566]671
[0]672          $delReq = 'DELETE FROM '.$this->table.' '.
673                    'WHERE media_id IN (%s) ';
674          $del_ids = array();
[2566]675
[0]676          while ($rs->fetch())
677          {
678               if (!is_file($this->root.'/'.$rs->media_file)) {
679                    $del_ids[] = (integer) $rs->media_id;
680               }
681          }
[2566]682
[0]683          if (!empty($del_ids)) {
684               $this->con->execute(sprintf($delReq,implode(',',$del_ids)));
685          }
686     }
[2566]687
[0]688     public function makeDir($d)
689     {
690          $d = files::tidyFileName($d);
691          parent::makeDir($d);
692     }
[2566]693
[0]694     /**
695     Creates or updates a file in database. Returns new media ID or false if
696     file does not exist.
[2566]697
[0]698     @param    name      <b>string</b>       File name (relative to working directory)
699     @param    title     <b>string</b>       File title
700     @param    private   <b>boolean</b>      File is private
701     @param    dt        <b>string</b>       File date
702     @return   <b>integer</b> New media ID
703     */
704     public function createFile($name,$title=null,$private=false,$dt=null,$force=true)
705     {
706          if (!$this->core->auth->check('media,media_admin',$this->core->blog->id)) {
707               throw new Exception(__('Permission denied.'));
708          }
[2566]709
[0]710          $file = $this->pwd.'/'.$name;
711          if (!file_exists($file)) {
712               return false;
713          }
[2566]714
[0]715          $media_file = $this->relpwd ? path::clean($this->relpwd.'/'.$name) : path::clean($name);
716          $media_type = files::getMimeType($name);
[2566]717
[0]718          $cur = $this->con->openCursor($this->table);
[2566]719
[0]720          $strReq = 'SELECT media_id '.
721                    'FROM '.$this->table.' '.
722                    "WHERE media_path = '".$this->con->escape($this->path)."' ".
723                    "AND media_file = '".$this->con->escape($media_file)."' ";
[2566]724
[0]725          $rs = $this->con->select($strReq);
[2566]726
[0]727          if ($rs->isEmpty())
728          {
729               $this->con->writeLock($this->table);
730               try
731               {
732                    $rs = $this->con->select('SELECT MAX(media_id) FROM '.$this->table);
733                    $media_id = (integer) $rs->f(0) + 1;
[2566]734
[0]735                    $cur->media_id = $media_id;
736                    $cur->user_id = (string) $this->core->auth->userID();
737                    $cur->media_path = (string) $this->path;
738                    $cur->media_file = (string) $media_file;
739                    $cur->media_dir = (string) dirname($media_file);
740                    $cur->media_creadt = date('Y-m-d H:i:s');
741                    $cur->media_upddt = date('Y-m-d H:i:s');
[2566]742
[0]743                    $cur->media_title = !$title ? (string) $name : (string) $title;
744                    $cur->media_private = (integer) (boolean) $private;
[2566]745
[0]746                    if ($dt) {
747                         $cur->media_dt = (string) $dt;
748                    } else {
749                         $cur->media_dt = strftime('%Y-%m-%d %H:%M:%S',filemtime($file));
750                    }
[2566]751
[0]752                    try {
753                         $cur->insert();
754                    } catch (Exception $e) {
755                         @unlink($name);
756                         throw $e;
757                    }
758                    $this->con->unlock();
759               }
760               catch (Exception $e)
761               {
762                    $this->con->unlock();
763                    throw $e;
764               }
765          }
766          else
767          {
768               $media_id = (integer) $rs->media_id;
[2566]769
[0]770               $cur->media_upddt = date('Y-m-d H:i:s');
[2566]771
[0]772               $cur->update('WHERE media_id = '.$media_id);
773          }
[2566]774
[0]775          $this->callFileHandler($media_type,'create',$cur,$name,$media_id,$force);
[2566]776
[0]777          return $media_id;
778     }
[2566]779
[0]780     /**
781     Updates a file in database.
[2566]782
[0]783     @param    file      <b>fileItem</b>     Current fileItem object
784     @param    newFile   <b>fileItem</b>     New fileItem object
785     */
786     public function updateFile($file,$newFile)
787     {
788          if (!$this->core->auth->check('media,media_admin',$this->core->blog->id)) {
789               throw new Exception(__('Permission denied.'));
790          }
[2566]791
[0]792          $id = (integer) $file->media_id;
[2566]793
[0]794          if (!$id) {
795               throw new Exception('No file ID');
796          }
[2566]797
[0]798          if (!$this->core->auth->check('media_admin',$this->core->blog->id)
799          && $this->core->auth->userID() != $file->media_user) {
800               throw new Exception(__('You are not the file owner.'));
801          }
[2566]802
[0]803          $cur = $this->con->openCursor($this->table);
[2566]804
[0]805          # We need to tidy newFile basename. If dir isn't empty, concat to basename
806          $newFile->relname = files::tidyFileName($newFile->basename);
807          if ($newFile->dir) {
808               $newFile->relname = $newFile->dir.'/'.$newFile->relname;
809          }
[2566]810
[0]811          if ($file->relname != $newFile->relname) {
812               $newFile->file = $this->root.'/'.$newFile->relname;
[2566]813
[0]814               if ($this->isFileExclude($newFile->relname)) {
815                    throw new Exception(__('This file is not allowed.'));
816               }
[2566]817
[0]818               if (file_exists($newFile->file)) {
819                    throw new Exception(__('New file already exists.'));
820               }
[2566]821
[0]822               $this->moveFile($file->relname,$newFile->relname);
[2566]823
[0]824               $cur->media_file = (string) $newFile->relname;
825               $cur->media_dir = (string) dirname($newFile->relname);
826          }
[2566]827
[0]828          $cur->media_title = (string) $newFile->media_title;
829          $cur->media_dt = (string) $newFile->media_dtstr;
830          $cur->media_upddt = date('Y-m-d H:i:s');
831          $cur->media_private = (integer) $newFile->media_priv;
[2566]832
[0]833          $cur->update('WHERE media_id = '.$id);
[2566]834
[0]835          $this->callFileHandler($file->type,'update',$file,$newFile);
836     }
[2566]837
[0]838     /**
839     Uploads a file.
[2566]840
[0]841     @param    tmp       <b>string</b>       Full path of temporary uploaded file
842     @param    name      <b>string</b>       File name (relative to working directory)
843     @param    title     <b>string</b>       File title
844     @param    private   <b>boolean</b>      File is private
845     */
846     public function uploadFile($tmp,$name,$title=null,$private=false,$overwrite=false)
847     {
848          if (!$this->core->auth->check('media,media_admin',$this->core->blog->id)) {
849               throw new Exception(__('Permission denied.'));
850          }
[2566]851
[0]852          $name = files::tidyFileName($name);
[2566]853
[0]854          parent::uploadFile($tmp,$name,$overwrite);
[2566]855
[0]856          return $this->createFile($name,$title,$private);
857     }
[2566]858
[0]859     /**
860     Creates a file from binary content.
[2566]861
[0]862     @param    name      <b>string</b>       File name (relative to working directory)
863     @param    bits      <b>string</b>       Binary file content
864     */
865     public function uploadBits($name,$bits)
866     {
867          if (!$this->core->auth->check('media,media_admin',$this->core->blog->id)) {
868               throw new Exception(__('Permission denied.'));
869          }
[2566]870
[0]871          $name = files::tidyFileName($name);
[2566]872
[0]873          parent::uploadBits($name,$bits);
[2566]874
[0]875          return $this->createFile($name,null,null);
876     }
[2566]877
[0]878     /**
879     Removes a file.
[2566]880
[0]881     @param    f         <b>fileItem</b>     fileItem object
882     */
883     public function removeFile($f)
884     {
885          if (!$this->core->auth->check('media,media_admin',$this->core->blog->id)) {
886               throw new Exception(__('Permission denied.'));
887          }
[2566]888
[0]889          $media_file = $this->relpwd ? path::clean($this->relpwd.'/'.$f) : path::clean($f);
[2566]890
[0]891          $strReq = 'DELETE FROM '.$this->table.' '.
892                    "WHERE media_path = '".$this->con->escape($this->path)."' ".
893                    "AND media_file = '".$this->con->escape($media_file)."' ";
[2566]894
[0]895          if (!$this->core->auth->check('media_admin',$this->core->blog->id))
896          {
897               $strReq .= "AND user_id = '".$this->con->escape($this->core->auth->userID())."'";
898          }
[2566]899
[0]900          $this->con->execute($strReq);
[2566]901
[0]902          if ($this->con->changes() == 0) {
903               throw new Exception(__('File does not exist in the database.'));
904          }
[2566]905
[0]906          parent::removeFile($f);
[2566]907
[0]908          $this->callFileHandler(files::getMimeType($media_file),'remove',$f);
909     }
[1103]910
911     /**
912     * Root directories
913     *
914     * Returns an array of directory under {@link $root} directory.
915     *
916     * @uses fileItem
917     * @return array
918     */
919     public function getDBDirs()
920     {
[3340]921          $media_dir = $this->relpwd ?: '.';
[2566]922
[1103]923          $strReq =
924          'SELECT distinct media_dir '.
925          'FROM '.$this->table.' '.
926          "WHERE media_path = '".$this->path."'";
927          $rs = $this->con->select($strReq);
928          while ($rs->fetch()) {
929               if (is_dir($this->root.'/'.$rs->media_dir))
[1123]930                    $dir[] = ($rs->media_dir == '.' ? '' : $rs->media_dir);
[1103]931          }
[2566]932
[1103]933          return $dir;
934     }
[2566]935
[0]936     /**
937     Extract zip file in current location
[2566]938
[0]939     @param    f         <b>fileRecord</b>   fileRecord object
940     */
941     public function inflateZipFile($f,$create_dir=true)
942     {
943          $zip = new fileUnzip($f->file);
[705]944          $zip->setExcludePattern($this->exclude_pattern);
[3354]945          $list = $zip->getList(false,'#(^|/)(__MACOSX|\.svn|\.DS_Store|\.directory|Thumbs\.db)(/|$)#');
[2566]946
[0]947          if ($create_dir)
948          {
949               $zip_root_dir = $zip->getRootDir();
950               if ($zip_root_dir != false) {
951                    $destination = $zip_root_dir;
952                    $target = $f->dir;
953               } else {
954                    $destination = preg_replace('/\.([^.]+)$/','',$f->basename);
955                    $target = $f->dir.'/'.$destination;
956               }
[2566]957
[0]958               if (is_dir($f->dir.'/'.$destination)) {
[2566]959                    throw new Exception(sprintf(__('Extract destination directory %s already exists.'),dirname($f->relname).'/'.$destination));
[0]960               }
961          }
962          else
963          {
964               $target = $f->dir;
965               $destination = '';
966          }
[2566]967
[0]968          $zip->unzipAll($target);
969          $zip->close();
[3354]970
971          // Clean-up all extracted filenames
972          $clean = function ($name) {
973               $n = text::deaccent($name);
974               $n = preg_replace('/^[.]/u','',$n);
975               return preg_replace('/[^A-Za-z0-9._\-\/]/u','_',$n);
976          };
977          foreach ($list as $zk => $zv) {
978               // Check if extracted file exists
979               $zf = $target.'/'.$zk;
980               if (!$zv['is_dir'] && file_exists($zf)) {
981                    $zt = $clean($zf);
982                    if ($zt != $zf) {
983                         rename($zf,$zt);
984                    }
985               }
986          }
987
[0]988          return dirname($f->relname).'/'.$destination;
989     }
[2566]990
[0]991     /**
992     Returns zip file content
[2566]993
[0]994     @param    f         <b>fileRecord</b>   fileRecord object
995     @return <b>array</b>
996     */
997     public function getZipContent($f)
998     {
999          $zip = new fileUnzip($f->file);
1000          $list = $zip->getList(false,'#(^|/)(__MACOSX|\.svn|\.DS_Store|\.directory|Thumbs\.db)(/|$)#');
1001          $zip->close();
1002          return $list;
1003     }
[2]1004
1005     /**
1006     Calls file handlers registered for recreate event
[2566]1007
[2]1008     @param    f    <b>fileItem</b>     fileItem object
1009     */
1010     public function mediaFireRecreateEvent($f)
1011     {
1012          $media_type = files::getMimeType($f->basename);
1013          $this->callFileHandler($media_type,'recreate',null,$f->basename); // Args list to be completed as necessary (Franck)
1014     }
[2566]1015
[0]1016     /* Image handlers
1017     ------------------------------------------------------- */
[3]1018     public function imageThumbCreate($cur,$f,$force=true)
[0]1019     {
1020          $file = $this->pwd.'/'.$f;
[2566]1021
[0]1022          if (!file_exists($file)) {
1023               return false;
1024          }
[2566]1025
[0]1026          $p = path::info($file);
[1381]1027          $alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG');
1028          $thumb = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$p['dirname'],$p['base'],'%s');
[2566]1029
[0]1030          try
1031          {
1032               $img = new imageTools();
1033               $img->loadImage($file);
[2566]1034
[0]1035               $w = $img->getW();
1036               $h = $img->getH();
[2566]1037
[0]1038               if ($force) $this->imageThumbRemove($f);
[2566]1039
[0]1040               foreach ($this->thumb_sizes as $suffix => $s) {
1041                    $thumb_file = sprintf($thumb,$suffix);
1042                    if (!file_exists($thumb_file) && $s[0] > 0 &&
1043                         ($suffix == 'sq' || $w > $s[0] || $h > $s[0]))
1044                    {
[909]1045                         $rate = ($s[0] < 100 ? 95 : ($s[0] < 600 ? 90 : 85));
[0]1046                         $img->resize($s[0],$s[0],$s[1]);
[1381]1047                         $img->output(($alpha ? 'png' : 'jpeg'),$thumb_file,$rate);
[1120]1048                         $img->loadImage($file);
[0]1049                    }
1050               }
1051               $img->close();
1052          }
1053          catch (Exception $e)
1054          {
1055               if ($cur === null) { # Called only if cursor is null (public call)
1056                    throw $e;
1057               }
1058          }
1059     }
[2566]1060
[397]1061     protected function imageThumbUpdate($file,$newFile)
[0]1062     {
1063          if ($file->relname != $newFile->relname)
1064          {
1065               $p = path::info($file->relname);
[1381]1066               $alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG');
1067               $thumb_old = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$p['dirname'],$p['base'],'%s');
[2566]1068
[0]1069               $p = path::info($newFile->relname);
[1381]1070               $alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG');
1071               $thumb_new = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),$p['dirname'],$p['base'],'%s');
[2566]1072
[0]1073               foreach ($this->thumb_sizes as $suffix => $s) {
1074                    try {
1075                         parent::moveFile(sprintf($thumb_old,$suffix),sprintf($thumb_new,$suffix));
1076                    } catch (Exception $e) {}
1077               }
1078          }
1079     }
[2566]1080
[2659]1081     public function imageThumbRemove($f)
[0]1082     {
1083          $p = path::info($f);
[1381]1084          $alpha = ($p['extension'] == 'png') || ($p['extension'] == 'PNG');
1085          $thumb = sprintf(($alpha ? $this->thumb_tp_alpha : $this->thumb_tp),'',$p['base'],'%s');
[2566]1086
[0]1087          foreach ($this->thumb_sizes as $suffix => $s) {
1088               try {
1089                    parent::removeFile(sprintf($thumb,$suffix));
1090               } catch (Exception $e) {}
1091          }
1092     }
[2566]1093
[0]1094     protected function imageMetaCreate($cur,$f,$id)
1095     {
1096          $file = $this->pwd.'/'.$f;
[2566]1097
[0]1098          if (!file_exists($file)) {
1099               return false;
1100          }
[2566]1101
[0]1102          $xml = new xmlTag('meta');
1103          $meta = imageMeta::readMeta($file);
1104          $xml->insertNode($meta);
[2566]1105
[0]1106          $c = $this->core->con->openCursor($this->table);
1107          $c->media_meta = $xml->toXML();
[2566]1108
[0]1109          if ($cur->media_title !== null && $cur->media_title == basename($cur->media_file))
1110          {
1111               if ($meta['Title']) {
1112                    $c->media_title = $meta['Title'];
1113               }
1114          }
[2566]1115
[0]1116          if ($meta['DateTimeOriginal'] && $cur->media_dt === '')
1117          {
1118               # We set picture time to user timezone
1119               $media_ts = strtotime($meta['DateTimeOriginal']);
1120               if ($media_ts !== false) {
1121                    $o = dt::getTimeOffset($this->core->auth->getInfo('user_tz'),$media_ts);
1122                    $c->media_dt = dt::str('%Y-%m-%d %H:%M:%S',$media_ts+$o);
1123               }
1124          }
[2566]1125
[0]1126          $c->update('WHERE media_id = '.$id);
1127     }
[2566]1128
[0]1129     /**
[2767]1130     Returns HTML code for audio player (HTML5 and if possible fallback Flash player)
1131
[3138]1132     @param  type        <b>string</b>       audio mime type
1133     @param    url            <b>string</b>       audio URL to play
1134     @param    player         <b>string</b>       Player URL (flash player fallback)
1135     @param    args      <b>array</b>        Player parameters (flash player fallback)
1136     @param  fallback    <b>boolean</b>      Include Flash player fallback
[3205]1137     @param    preload        <b>boolean</b>      Add preload="auto" attribute if true, else preload="none"
[2767]1138     @return   <b>string</b>
1139     */
[3205]1140     public static function audioPlayer($type,$url,$player=null,$args=null,$fallback=true,$preload=true)
[2767]1141     {
1142          $audio =
[3205]1143               '<audio controls preload="'.($preload ? 'auto' : 'none').'">'.
[2768]1144               '<source src="'.$url.'">';
[2767]1145
[3138]1146          if ($fallback && $type == 'audio/mpeg3') {
[2767]1147               // Include Flash player fallback
1148               if (!$player) {
1149                    $player = 'player_mp3.swf';
1150               }
1151
1152               if (!is_array($args))
1153               {
1154                    $args = array(
1155                         'showvolume' => 1,
1156                         'loadingcolor' => 'ff9900',
1157                         'bgcolor1' => 'eeeeee',
1158                         'bgcolor2' => 'cccccc',
1159                         'buttoncolor' => '0066cc',
1160                         'buttonovercolor' => 'ff9900',
1161                         'slidercolor1' => 'cccccc',
1162                         'slidercolor2' => '999999',
1163                         'sliderovercolor' => '0066cc'
1164                    );
1165               }
1166
1167               $args['mp3'] = $url;
1168
1169               if (empty($args['width'])) {
1170                    $args['width'] = 200;
1171               }
1172               if (empty($args['height'])) {
1173                    $args['height'] = 20;
1174               }
1175
1176               $vars = array();
1177               foreach ($args as $k => $v) {
1178                    $vars[] = $k.'='.$v;
1179               }
1180
1181               $audio .=
1182                    '<object type="application/x-shockwave-flash" '.
1183                    'data="'.$player.'" '.
1184                    'width="'.$args['width'].'" height="'.$args['height'].'">'.
1185                    '<param name="movie" value="'.$player.'" />'.
1186                    '<param name="wmode" value="transparent" />'.
1187                    '<param name="FlashVars" value="'.implode('&amp;',$vars).'" />'.
1188                    __('Embedded Audio Player').
[2768]1189                    '</object>';
[2767]1190          }
1191
1192          $audio .=
[2768]1193               '</audio>';
[2767]1194
1195          return $audio;
1196     }
1197
1198     /**
1199     Returns HTML code for video player (HTML5 and if possible fallback Flash player)
1200
[3138]1201     @param  type        <b>string</b>       video mime type
1202     @param    url            <b>string</b>       video URL to play
1203     @param    player         <b>string</b>       Player URL (flash player fallback)
1204     @param    args      <b>array</b>        Player parameters (flash player fallback)
1205     @param  fallback    <b>boolean</b>      Include Flash player fallback (if not .flv)
[3205]1206     @param    preload        <b>boolean</b>      Add preload="auto" attribute if true, else preload="none"
[2767]1207     @return   <b>string</b>
1208     */
[3205]1209     public static function videoPlayer($type,$url,$player=null,$args=null,$fallback=true,$preload=true)
[2767]1210     {
1211          $video = '';
[2768]1212
1213          // Cope with width and height, if given
1214          $width = 400;
1215          $height = 300;
1216          if (is_array($args)) {
1217               if (!empty($args['width']) && $args['width']) {
1218                    $width = (int) $args['width'];
1219               }
1220               if (!empty($args['height']) && $args['height']) {
1221                    $height = (int) $args['height'];
1222               }
1223          }
1224
[2767]1225          if ($type != 'video/x-flv') {
1226               $video =
[3205]1227                    '<video controls preload="'.($preload ? 'auto' : 'none').'"'.
1228                    ($width ? ' width="'.$width.'"' : '').
1229                    ($height ? ' height="'.$height.'"' : '').'>'.
[2768]1230                    '<source src="'.$url.'">';
[2767]1231          }
1232
[3138]1233          if ($type == 'video/x-flv' || ($fallback && ($type == 'video/mp4' || $type == 'video/x-m4v')))
[2767]1234          {
1235               // Include Flash player fallback
1236               if (!$player) {
1237                    $player = 'player_flv.swf';
1238               }
1239
1240               if (!is_array($args))
1241               {
1242                    $args = array(
1243                         'margin' => 1,
1244                         'showvolume' => 1,
1245                         'showtime' => 1,
1246                         'showfullscreen' => 1,
1247                         'buttonovercolor' => 'ff9900',
1248                         'slidercolor1' => 'cccccc',
1249                         'slidercolor2' => '999999',
1250                         'sliderovercolor' => '0066cc'
1251                    );
1252               }
1253
1254               $args['flv'] = $url;
1255
1256               if (empty($args['width'])) {
1257                    $args['width'] = 400;
1258               }
1259               if (empty($args['height'])) {
1260                    $args['height'] = 300;
1261               }
1262
1263               $vars = array();
1264               foreach ($args as $k => $v) {
1265                    $vars[] = $k.'='.$v;
1266               }
1267
1268               $video .=
1269                    '<object type="application/x-shockwave-flash" '.
1270                    'data="'.$player.'" '.
1271                    'width="'.$args['width'].'" height="'.$args['height'].'">'.
1272                    '<param name="movie" value="'.$player.'" />'.
1273                    '<param name="wmode" value="transparent" />'.
1274                    '<param name="allowFullScreen" value="true" />'.
1275                    '<param name="FlashVars" value="'.implode('&amp;',$vars).'" />'.
1276                    __('Embedded Video Player').
[2768]1277                    '</object>';
[2767]1278          }
1279
1280          if ($type != 'video/x-flv') {
1281               $video .=
[2768]1282                    '</video>';
[2767]1283          }
1284
1285          return $video;
1286     }
1287
1288     /**
[0]1289     Returns HTML code for MP3 player
[2566]1290
[3138]1291     @param    url            <b>string</b>       MP3 URL to play
1292     @param    player         <b>string</b>       Player URL
[0]1293     @param    args      <b>array</b>        Player parameters
[3138]1294     @param  fallback    <b>boolean</b>      Include Flash player fallback
[3205]1295     @param    preload        <b>boolean</b>      Add preload="auto" attribute if true, else preload="none"
[0]1296     @return   <b>string</b>
1297     */
[3205]1298     public static function mp3player($url,$player=null,$args=null,$fallback=true,$preload=true)
[0]1299     {
1300          if (!$player) {
1301               $player = 'player_mp3.swf';
1302          }
[2566]1303
[0]1304          if (!is_array($args))
1305          {
1306               $args = array(
1307                    'showvolume' => 1,
1308                    'loadingcolor' => 'ff9900',
1309                    'bgcolor1' => 'eeeeee',
1310                    'bgcolor2' => 'cccccc',
1311                    'buttoncolor' => '0066cc',
1312                    'buttonovercolor' => 'ff9900',
1313                    'slidercolor1' => 'cccccc',
1314                    'slidercolor2' => '999999',
1315                    'sliderovercolor' => '0066cc'
1316               );
1317          }
[2566]1318
[0]1319          $args['mp3'] = $url;
[2566]1320
[0]1321          if (empty($args['width'])) {
1322               $args['width'] = 200;
1323          }
1324          if (empty($args['height'])) {
1325               $args['height'] = 20;
1326          }
[2566]1327
[0]1328          $vars = array();
1329          foreach ($args as $k => $v) {
1330               $vars[] = $k.'='.$v;
1331          }
[2566]1332
[0]1333          return
[3205]1334          '<audio controls preload="'.($preload ? 'auto' : 'none').'">'.
[2763]1335          '<source src="'.$url.'" type="audio/mpeg">'.
[3138]1336          ($fallback ?
1337               '<object type="application/x-shockwave-flash" '.
1338               'data="'.$player.'" '.
1339               'width="'.$args['width'].'" height="'.$args['height'].'">'.
1340               '<param name="movie" value="'.$player.'" />'.
1341               '<param name="wmode" value="transparent" />'.
1342               '<param name="FlashVars" value="'.implode('&amp;',$vars).'" />'.
1343               __('Embedded Audio Player').
1344               '</object>' : '').
[2763]1345          '</audio>';
[0]1346     }
[2566]1347
[2767]1348     /**
1349     Returns HTML code for FLV player
1350
1351     @param    url       <b>string</b>       FLV URL to play
1352     @param    player    <b>string</b>       Player URL
1353     @param    args      <b>array</b>        Player parameters
1354     @return   <b>string</b>
1355     */
[0]1356     public static function flvplayer($url,$player=null,$args=null)
1357     {
1358          if (!$player) {
1359               $player = 'player_flv.swf';
1360          }
[2566]1361
[0]1362          if (!is_array($args))
1363          {
1364               $args = array(
1365                    'margin' => 1,
1366                    'showvolume' => 1,
1367                    'showtime' => 1,
1368                    'showfullscreen' => 1,
1369                    'buttonovercolor' => 'ff9900',
1370                    'slidercolor1' => 'cccccc',
1371                    'slidercolor2' => '999999',
1372                    'sliderovercolor' => '0066cc'
1373               );
1374          }
[2566]1375
[0]1376          $args['flv'] = $url;
[2566]1377
[0]1378          if (empty($args['width'])) {
1379               $args['width'] = 400;
1380          }
1381          if (empty($args['height'])) {
1382               $args['height'] = 300;
1383          }
[2566]1384
[0]1385          $vars = array();
1386          foreach ($args as $k => $v) {
1387               $vars[] = $k.'='.$v;
1388          }
[2566]1389
[0]1390          return
1391          '<object type="application/x-shockwave-flash" '.
1392          'data="'.$player.'" '.
1393          'width="'.$args['width'].'" height="'.$args['height'].'">'.
1394          '<param name="movie" value="'.$player.'" />'.
1395          '<param name="wmode" value="transparent" />'.
1396          '<param name="allowFullScreen" value="true" />'.
1397          '<param name="FlashVars" value="'.implode('&amp;',$vars).'" />'.
1398          __('Embedded Video Player').
1399          '</object>';
1400     }
1401}
Note: See TracBrowser for help on using the repository browser.

Sites map