From: <li...@us...> - 2012-09-21 05:47:25
|
Revision: 43072 http://tikiwiki.svn.sourceforge.net/tikiwiki/?rev=43072&view=rev Author: lindonb Date: 2012-09-21 05:47:18 +0000 (Fri, 21 Sep 2012) Log Message: ----------- [REF] Some minor refactoring, part 1 Modified Paths: -------------- trunk/lib/filegals/filegallib.php trunk/lib/images/abstract.php trunk/lib/wiki-plugins/wikiplugin_img.php Added Paths: ----------- trunk/lib/metadata/datatypes/ trunk/lib/metadata/datatypes/index.php trunk/lib/metadata/filetypes/ trunk/lib/metadata/filetypes/imagefile.php trunk/lib/metadata/filetypes/index.php trunk/lib/metadata/filetypes/jpeg.php trunk/lib/metadata/metadatalib.php Removed Paths: ------------- trunk/lib/metadata/imagefile.php trunk/lib/metadata/jpeg.php trunk/lib/metadata/metadata.php Modified: trunk/lib/filegals/filegallib.php =================================================================== --- trunk/lib/filegals/filegallib.php 2012-09-20 21:05:17 UTC (rev 43071) +++ trunk/lib/filegals/filegallib.php 2012-09-21 05:47:18 UTC (rev 43072) @@ -3346,11 +3346,11 @@ $data = ''; $fhash = ''; if ($prefs['fgal_use_db'] == 'n') { + //get metadata + $filemeta = $this->extractMetadataJson($file['tmp_name']); $fhash = $this->find_unique_name($savedir, $file['name']); if ($prefs['feature_file_galleries_save_draft'] == 'y') { $fhash .= '.' . $user . '.draft'; - //Add metadata - $filemeta = $this->extractMetadataJson($file['tmp_name']); } if (! move_uploaded_file($file['tmp_name'], $savedir . $fhash)) { @@ -3756,7 +3756,7 @@ */ function extractMetadataJson($file, $ispath = true, $extended = true) { - include_once 'lib/metadata/metadata.php'; + include_once 'lib/metadata/metadatalib.php'; $metadata = new FileMetadata; $filemeta = json_encode($metadata->getMetadata($file, $ispath, $extended)->typemeta['best']); return $filemeta; Modified: trunk/lib/images/abstract.php =================================================================== --- trunk/lib/images/abstract.php 2012-09-20 21:05:17 UTC (rev 43071) +++ trunk/lib/images/abstract.php 2012-09-21 05:47:18 UTC (rev 43072) @@ -242,7 +242,7 @@ function getMetadata($filename = null, $ispath = true, $extended = true, $bestarray = true) { - include_once('lib/metadata/metadata.php'); + include_once('lib/metadata/metadatalib.php'); if ($filename === null) { if (!empty($this->filename)) { $filename = $this->filename; Copied: trunk/lib/metadata/datatypes/index.php (from rev 43019, trunk/lib/metadata/index.php) =================================================================== --- trunk/lib/metadata/datatypes/index.php (rev 0) +++ trunk/lib/metadata/datatypes/index.php 2012-09-21 05:47:18 UTC (rev 43072) @@ -0,0 +1,10 @@ +<?php +// (c) Copyright 2002-2012 by authors of the Tiki Wiki CMS Groupware Project +// +// All Rights Reserved. See copyright.txt for details and a complete list of authors. +// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. +// $Id$ + +// This redirects to the sites root to prevent directory browsing +header("location: ../../../index.php"); +die; Copied: trunk/lib/metadata/filetypes/imagefile.php (from rev 43019, trunk/lib/metadata/imagefile.php) =================================================================== --- trunk/lib/metadata/filetypes/imagefile.php (rev 0) +++ trunk/lib/metadata/filetypes/imagefile.php 2012-09-21 05:47:18 UTC (rev 43072) @@ -0,0 +1,39 @@ +<?php +// (c) Copyright 2002-2012 by authors of the Tiki Wiki CMS Groupware Project +// +// All Rights Reserved. See copyright.txt for details and a complete list of authors. +// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. +// $Id$ + +//this script may only be included - so its better to die if called directly. +if (strpos($_SERVER['SCRIPT_NAME'], basename(__FILE__)) !== false) { + header('location: index.php'); + exit; +} + +/** + * Reads metadata common to image files + * Called by the FileMetadata class at metadata/metadata.php, which handles generic file metadata + * Image-specific classes (like Jpeg) extend this class + */ +class ImageFile +{ + var $header = null; + var $width = null; + var $height = null; + var $otherinfo = null; + + /** + * Assign common image metadata information to properties + * + * @param FileMetadata object $metaObj + */ + function __construct($metaObj) + { + $this->header = getimagesize($metaObj->currname, $otherinfo); + $this->width = $this->header[0]; + $this->height = $this->header[1]; + $this->otherinfo = $otherinfo; + } +} + Property changes on: trunk/lib/metadata/filetypes/imagefile.php ___________________________________________________________________ Added: svn:keywords + Id Added: trunk/lib/metadata/filetypes/index.php =================================================================== --- trunk/lib/metadata/filetypes/index.php (rev 0) +++ trunk/lib/metadata/filetypes/index.php 2012-09-21 05:47:18 UTC (rev 43072) @@ -0,0 +1,10 @@ +<?php +// (c) Copyright 2002-2012 by authors of the Tiki Wiki CMS Groupware Project +// +// All Rights Reserved. See copyright.txt for details and a complete list of authors. +// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. +// $Id$ + +// This redirects to the sites root to prevent directory browsing +header("location: ../../../index.php"); +die; Property changes on: trunk/lib/metadata/filetypes/index.php ___________________________________________________________________ Added: svn:keywords + Id Copied: trunk/lib/metadata/filetypes/jpeg.php (from rev 43019, trunk/lib/metadata/jpeg.php) =================================================================== --- trunk/lib/metadata/filetypes/jpeg.php (rev 0) +++ trunk/lib/metadata/filetypes/jpeg.php 2012-09-21 05:47:18 UTC (rev 43072) @@ -0,0 +1,170 @@ +<?php +// (c) Copyright 2002-2012 by authors of the Tiki Wiki CMS Groupware Project +// +// All Rights Reserved. See copyright.txt for details and a complete list of authors. +// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. +// $Id$ + +//this script may only be included - so its better to die if called directly. +if (strpos($_SERVER['SCRIPT_NAME'], basename(__FILE__)) !== false) { + header('location: index.php'); + exit; +} + +require_once('lib/metadata/filetypes/imagefile.php'); + +/** + * Reads JPEG-specific metadata from a JPEG file + * Called by the FileMetadata class at metadata/metadata.php, which handles generic file metadata + * Extends the ImageFile class which obtains metadata common to image files + */ +class Jpeg extends ImageFile +{ + + /** + * @param object $metaObj Object from the FileMetadata class which calls this function + * + * @return array $metadata Returns an array of metadata + */ + function getExtendedData($metaObj) + { + /* + * these properties can be accessed similarly for all image files and were set in the ImageFile class that + * this class extends + */ + $metadata['header'] = $this->header; + $metadata['width'] = $this->width; + $metadata['height'] = $this->height; + $metadata['otherinfo'] = $this->otherinfo; + + /* + * these following types of metadata are also common to other types of files but may need to be accessed + * differently based on file type + */ + + + //EXIF + //get raw exif + $metadata['exifraw'] = function_exists('exif_read_data') ? exif_read_data($metaObj->currname, 0, true) : false; + //interpret and add tags + if ($metadata['exifraw']) { + require_once('lib/metadata/exif.php'); + $exif = new Exif; + $metadata['exif'] = $exif->processRawData($metadata['exifraw']); + //add EXIF to combined metadata array that is not reconciled + $metadata['combined']['exif'] = $metadata['exif']; + } else { + $metadata['exif'] = false; + } + + + //IPTC + //get raw iptc and place in an iptc key so that iptc array has same number of levels as exif and xmp + //and to distinguish from digest key added later + $metadata['iptcraw']['iptc'] = !empty($this->otherinfo['APP13']) ? iptcparse($this->otherinfo['APP13']) : false; + //process raw iptc + if (is_array($metadata['iptcraw']['iptc'])) { + //first prepare for processing + foreach ($metadata['iptcraw']['iptc'] as $fieldname => $value) { + if (count($value) > 1) { + $metadata['iptcraw']['iptc'][$fieldname] = $value; + } else { + $metadata['iptcraw']['iptc'][$fieldname] = $value[0]; + } + } + //process raw data + require_once('lib/metadata/iptc.php'); + $iptc = new Iptc; + $metadata['iptc'] = $iptc->processRawData($metadata['iptcraw']); + //add IPTC to combined metadata array that is not reconciled + $metadata['combined']['iptc'] = $metadata['iptc']; + + //check stored and create current hash + /* + * add stored iptc hash if it exists + * The IPTC block is within the APP13 (Photoshop) segment, which is at $this->otherinfo['APP13'] + * The stored checksum is at hex marker \x38\x42\x49\x4D\x04\x25\x00\x00\x00\x00 (resource ID 1061) + */ + $hashstored = $metaObj->getDataSegment($this->otherinfo['APP13'], + "\x38\x42\x49\x4D\x04\x25\x00\x00\x00\x00", 10, 2); + if (!empty($hashstored)) { + $metadata['iptc']['digest']['iptchashstored'] = array( + 'newval' => bin2hex($hashstored), + 'label' => 'Stored IPTC Hash' + ); + } + /* + * add calculated current hash of the IPTC block, + * which starts at hex marker \x38\x42\x49\x4D\x04\x04\x00\x00\x00\x00 within the APP13 segment + */ + $iptcblock = $metaObj->getDataSegment($this->otherinfo['APP13'], + "\x38\x42\x49\x4D\x04\x04\x00\x00\x00\x00", 10, 2); + if (!empty($iptcblock)) { + $metadata['iptc']['digest']['iptchashcurrent'] = array( + 'newval' => md5($iptcblock), + 'label' => 'Computed IPTC Hash' + ); + } + + if (!isset($metadata['iptc']['digest']['iptchashstored']['newval']) || + (strlen($metadata['iptc']['digest']['iptchashstored']['newval']) > 0 + && $metadata['iptc']['digest']['iptchashstored']['newval'] == + $metadata['iptc']['digest']['iptchashcurrent']['newval'])) + { + if (isset($metadata['iptc']['digest']['iptchashstored']['newval'])) { + $metadata['iptc']['digest']['match']['newval'] = ''; + //place text in suffix so it can be translated + $metadata['iptc']['digest']['match']['suffix'] = + 'IPTC stored and actual hash match - indication that metadata editors were compliant'; + $metadata['iptc']['digest']['match']['label'] = 'Note'; + } + } else { + $metadata['iptc']['digest']['mismatch']['newval'] = ''; + $metadata['iptc']['digest']['mismatch']['suffix'] = + 'Metadata has been edited by a noncompliant editor - IPTC stored and actual hash do not match'; + $metadata['iptc']['digest']['mismatch']['label'] = 'Warning'; + } + + /* + * In case we needed to get the individual APP13 records, below are a couple of examples + * each record starts with the tag marker of hex 1c (13), followed by record number and dataset number + * + * Example: record number is 02 and dataset number is hex 74 (116), so this is IPTC field 2#116 (or 2:116) + * $single = $metaObj->getDataSegment($this->otherinfo['APP13'], "\x1c\x02\x74", 3, 2); + * + * Example2: record number is 01 and dataset number is hex 5a (90), so this is IPTC field 1#090 (or 1:090) + * $single2 = $metaObj->getDataSegment($this->otherinfo['APP13'], "\x1c\x01\x5a", 3, 2); + * + * next two bytes after the record and dataset number are the size of the dataset + */ + } else { + $metadata['iptc'] = false; + } + + //XMP + //get raw xmp DOM, convert to an array add tags and interpret + if (isset($metaObj->content)) { + require_once('lib/metadata/xmp.php'); + $xmp = new Xmp; + $metadata['xmpraw'] = $xmp->getXmp($metaObj->content, $metaObj->basicraw['type']); + $metadata['xmp'] = $xmp->processRawData($metadata['xmpraw']); + } else { + $metadata['xmpraw'] = false; + $metadata['xmp'] = false; + } + //add XMP to combined unreconciled metadata array + if ($metadata['xmp'] !== false) { + $metadata['combined']['xmp'] = $metadata['xmp']; + } + + //Reconcile extended metadata in accordance with the Metadata Working Group standards + require_once('lib/metadata/reconcile.php'); + $rec = new ReconcileExifIptcXmp; + $metadata['reconciled'] = $rec->reconcileAllMeta($metadata); + + //Add basic info + $metadata = $metaObj->mergeBasicInfo($metaObj, $metadata); + + return $metadata; + } +} Property changes on: trunk/lib/metadata/filetypes/jpeg.php ___________________________________________________________________ Added: svn:keywords + Id Deleted: trunk/lib/metadata/imagefile.php =================================================================== --- trunk/lib/metadata/imagefile.php 2012-09-20 21:05:17 UTC (rev 43071) +++ trunk/lib/metadata/imagefile.php 2012-09-21 05:47:18 UTC (rev 43072) @@ -1,39 +0,0 @@ -<?php -// (c) Copyright 2002-2012 by authors of the Tiki Wiki CMS Groupware Project -// -// All Rights Reserved. See copyright.txt for details and a complete list of authors. -// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. -// $Id$ - -//this script may only be included - so its better to die if called directly. -if (strpos($_SERVER['SCRIPT_NAME'], basename(__FILE__)) !== false) { - header('location: index.php'); - exit; -} - -/** - * Reads metadata common to image files - * Called by the FileMetadata class at metadata/metadata.php, which handles generic file metadata - * Image-specific classes (like Jpeg) extend this class - */ -class ImageFile -{ - var $header = null; - var $width = null; - var $height = null; - var $otherinfo = null; - - /** - * Assign common image metadata information to properties - * - * @param FileMetadata object $metaObj - */ - function __construct($metaObj) - { - $this->header = getimagesize($metaObj->currname, $otherinfo); - $this->width = $this->header[0]; - $this->height = $this->header[1]; - $this->otherinfo = $otherinfo; - } -} - Deleted: trunk/lib/metadata/jpeg.php =================================================================== --- trunk/lib/metadata/jpeg.php 2012-09-20 21:05:17 UTC (rev 43071) +++ trunk/lib/metadata/jpeg.php 2012-09-21 05:47:18 UTC (rev 43072) @@ -1,170 +0,0 @@ -<?php -// (c) Copyright 2002-2012 by authors of the Tiki Wiki CMS Groupware Project -// -// All Rights Reserved. See copyright.txt for details and a complete list of authors. -// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. -// $Id$ - -//this script may only be included - so its better to die if called directly. -if (strpos($_SERVER['SCRIPT_NAME'], basename(__FILE__)) !== false) { - header('location: index.php'); - exit; -} - -require_once('lib/metadata/imagefile.php'); - -/** - * Reads JPEG-specific metadata from a JPEG file - * Called by the FileMetadata class at metadata/metadata.php, which handles generic file metadata - * Extends the ImageFile class which obtains metadata common to image files - */ -class Jpeg extends ImageFile -{ - - /** - * @param object $metaObj Object from the FileMetadata class which calls this function - * - * @return array $metadata Returns an array of metadata - */ - function getExtendedData($metaObj) - { - /* - * these properties can be accessed similarly for all image files and were set in the ImageFile class that - * this class extends - */ - $metadata['header'] = $this->header; - $metadata['width'] = $this->width; - $metadata['height'] = $this->height; - $metadata['otherinfo'] = $this->otherinfo; - - /* - * these following types of metadata are also common to other types of files but may need to be accessed - * differently based on file type - */ - - - //EXIF - //get raw exif - $metadata['exifraw'] = function_exists('exif_read_data') ? exif_read_data($metaObj->currname, 0, true) : false; - //interpret and add tags - if ($metadata['exifraw']) { - require_once('lib/metadata/exif.php'); - $exif = new Exif; - $metadata['exif'] = $exif->processRawData($metadata['exifraw']); - //add EXIF to combined metadata array that is not reconciled - $metadata['combined']['exif'] = $metadata['exif']; - } else { - $metadata['exif'] = false; - } - - - //IPTC - //get raw iptc and place in an iptc key so that iptc array has same number of levels as exif and xmp - //and to distinguish from digest key added later - $metadata['iptcraw']['iptc'] = !empty($this->otherinfo['APP13']) ? iptcparse($this->otherinfo['APP13']) : false; - //process raw iptc - if (is_array($metadata['iptcraw']['iptc'])) { - //first prepare for processing - foreach ($metadata['iptcraw']['iptc'] as $fieldname => $value) { - if (count($value) > 1) { - $metadata['iptcraw']['iptc'][$fieldname] = $value; - } else { - $metadata['iptcraw']['iptc'][$fieldname] = $value[0]; - } - } - //process raw data - require_once('lib/metadata/iptc.php'); - $iptc = new Iptc; - $metadata['iptc'] = $iptc->processRawData($metadata['iptcraw']); - //add IPTC to combined metadata array that is not reconciled - $metadata['combined']['iptc'] = $metadata['iptc']; - - //check stored and create current hash - /* - * add stored iptc hash if it exists - * The IPTC block is within the APP13 (Photoshop) segment, which is at $this->otherinfo['APP13'] - * The stored checksum is at hex marker \x38\x42\x49\x4D\x04\x25\x00\x00\x00\x00 (resource ID 1061) - */ - $hashstored = $metaObj->getDataSegment($this->otherinfo['APP13'], - "\x38\x42\x49\x4D\x04\x25\x00\x00\x00\x00", 10, 2); - if (!empty($hashstored)) { - $metadata['iptc']['digest']['iptchashstored'] = array( - 'newval' => bin2hex($hashstored), - 'label' => 'Stored IPTC Hash' - ); - } - /* - * add calculated current hash of the IPTC block, - * which starts at hex marker \x38\x42\x49\x4D\x04\x04\x00\x00\x00\x00 within the APP13 segment - */ - $iptcblock = $metaObj->getDataSegment($this->otherinfo['APP13'], - "\x38\x42\x49\x4D\x04\x04\x00\x00\x00\x00", 10, 2); - if (!empty($iptcblock)) { - $metadata['iptc']['digest']['iptchashcurrent'] = array( - 'newval' => md5($iptcblock), - 'label' => 'Computed IPTC Hash' - ); - } - - if (!isset($metadata['iptc']['digest']['iptchashstored']['newval']) || - (strlen($metadata['iptc']['digest']['iptchashstored']['newval']) > 0 - && $metadata['iptc']['digest']['iptchashstored']['newval'] == - $metadata['iptc']['digest']['iptchashcurrent']['newval'])) - { - if (isset($metadata['iptc']['digest']['iptchashstored']['newval'])) { - $metadata['iptc']['digest']['match']['newval'] = ''; - //place text in suffix so it can be translated - $metadata['iptc']['digest']['match']['suffix'] = - 'IPTC stored and actual hash match - indication that metadata editors were compliant'; - $metadata['iptc']['digest']['match']['label'] = 'Note'; - } - } else { - $metadata['iptc']['digest']['mismatch']['newval'] = ''; - $metadata['iptc']['digest']['mismatch']['suffix'] = - 'Metadata has been edited by a noncompliant editor - IPTC stored and actual hash do not match'; - $metadata['iptc']['digest']['mismatch']['label'] = 'Warning'; - } - - /* - * In case we needed to get the individual APP13 records, below are a couple of examples - * each record starts with the tag marker of hex 1c (13), followed by record number and dataset number - * - * Example: record number is 02 and dataset number is hex 74 (116), so this is IPTC field 2#116 (or 2:116) - * $single = $metaObj->getDataSegment($this->otherinfo['APP13'], "\x1c\x02\x74", 3, 2); - * - * Example2: record number is 01 and dataset number is hex 5a (90), so this is IPTC field 1#090 (or 1:090) - * $single2 = $metaObj->getDataSegment($this->otherinfo['APP13'], "\x1c\x01\x5a", 3, 2); - * - * next two bytes after the record and dataset number are the size of the dataset - */ - } else { - $metadata['iptc'] = false; - } - - //XMP - //get raw xmp DOM, convert to an array add tags and interpret - if (isset($metaObj->content)) { - require_once('lib/metadata/xmp.php'); - $xmp = new Xmp; - $metadata['xmpraw'] = $xmp->getXmp($metaObj->content, $metaObj->basicraw['type']); - $metadata['xmp'] = $xmp->processRawData($metadata['xmpraw']); - } else { - $metadata['xmpraw'] = false; - $metadata['xmp'] = false; - } - //add XMP to combined unreconciled metadata array - if ($metadata['xmp'] !== false) { - $metadata['combined']['xmp'] = $metadata['xmp']; - } - - //Reconcile extended metadata in accordance with the Metadata Working Group standards - require_once('lib/metadata/reconcile.php'); - $rec = new ReconcileExifIptcXmp; - $metadata['reconciled'] = $rec->reconcileAllMeta($metadata); - - //Add basic info - $metadata = $metaObj->mergeBasicInfo($metaObj, $metadata); - - return $metadata; - } -} Deleted: trunk/lib/metadata/metadata.php =================================================================== --- trunk/lib/metadata/metadata.php 2012-09-20 21:05:17 UTC (rev 43071) +++ trunk/lib/metadata/metadata.php 2012-09-21 05:47:18 UTC (rev 43072) @@ -1,312 +0,0 @@ -<?php -// (c) Copyright 2002-2012 by authors of the Tiki Wiki CMS Groupware Project -// -// All Rights Reserved. See copyright.txt for details and a complete list of authors. -// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. -// $Id$ - -//this script may only be included - so its better to die if called directly. -if (strpos($_SERVER['SCRIPT_NAME'], basename(__FILE__)) !== false) { - header('location: index.php'); - exit; -} - -/** - * Reads and manipulates metadata included within a file - * For separate classes for specific file types are called from here - */ -class FileMetadata -{ - var $currname = null; //working file path used to access file, may not be the same as embedded in file metadata - var $content = null; //file content - var $basicraw = null; //for basic file information - var $basicinfo = null; //processed basic file information - var $typemeta = null; //array used to store metadata beyond generic file data - var $error = null; //error messages stored here - var $types = array ( //files types handled for extended metadata with values used for class and file name - 'image/jpeg' => 'jpeg', - 'image/jpg' => 'jpeg', - ); - - /** - * Get basic and extended metadata included in the file itself - * - * @param string $file path to file or content of file - * @param bool $ispath indicates whether $file is a path (true) or the file contents (false) - * @param bool $extended indicates whether to retrieve extended metadata information - * - * @return \FileMetadata FileMetadata object with properties for the various types of metadata - */ - function getMetadata($file, $ispath = true, $extended = true) - { - if (empty($file)) { - return false; - //set contents and current name as well as type in some situations - } elseif (!$ispath) { - //when $file is actual file contents rather than a path - create a temporary file name - // needed for some php functions - $temppath = $this->temppathFromContent($file); - $leavelink = false; - if (!$temppath) { - $this->error = 'The file is empty'; - } else { - $this->content = $file; - $this->currname = $temppath; - } - } else { - //when $file is a path - if (is_readable($file)) { - $this->currname = $file; - $this->content = file_get_contents($file); - $temppath = $file; - $leavelink = true; - if (empty($this->content)) { - $this->error = 'The file is empty'; - } - //if not readable, see if it's an external file - } elseif (strpos($file, 'http') !== false) { - $filegallib = TikiLib::lib('filegal'); - $externalinfo = $filegallib->get_info_from_url($file); - $temppath = $this->temppathFromContent($externalinfo['data']); - $leavelink = false; - if (!$temppath) { - $this->error = 'The file is not readable'; - } else { - $this->currname = $file; - $this->content = $externalinfo['data']; - //set type here for external files - $this->type = $externalinfo['type']; - } - } else { - $this->error = 'The file is not readable'; - $leavelink = true; - } - } - - //set basic info - $this->basicraw['size'] = function_exists('mb_strlen') ? mb_strlen($this->content, '8bit') - : strlen($this->content); - if (class_exists('finfo') && is_readable($temppath)) { - $finfo = new finfo(FILEINFO_MIME); - $type_charset = $finfo->file($temppath); - $type_charset = explode(';', $type_charset); - //external file tyes may already be set at this point - $this->basicraw['type'] = empty($this->type) ? $type_charset[0] : $this->type; - $this->basicraw['charset'] = trim($type_charset[1]); - $finfo = new finfo(FILEINFO_DEVICES); - $this->basicraw['devices'] = $finfo->file($temppath); - } - - //process basic info - if (is_array($this->basicraw)) { - require_once('basicinfo.php'); - $basic = new BasicInfo; - $this->basicinfo = $basic->processRawData($this->basicraw); - } - - //from this point, additional metadata is obtained from classes specific to the file type in separate php files - //all results for this additional metadata go into the $this->typemeta array - if ($extended && $this->canProcessExtended()) { - //used for name of class and the file the class is in - $type = $this->types[$this->basicraw['type']]; - //file must be named based on $type - include_once($type . '.php'); - //class name is same as file name except first letter is capitalized - $type = ucfirst($type); - $typeObj = new $type($this); - $this->typemeta = $typeObj->getExtendedData($this); - } - $this->setBestMetadata(); - if (!$leavelink) { - unlink($temppath); - } - return $this; - } - - /** - * Set the most complete and reconciled metadata array. Called by getMetadata. - */ - private function setBestMetadata() - { - if (isset($this->typemeta['reconciled']) && count($this->typemeta['reconciled']) > 0) { - $this->typemeta['best'] = $this->typemeta['reconciled']; - } elseif (isset($this->typemeta['combined']) && count($this->typemeta['combined']) > 0) { - $this->typemeta['best'] = $this->typemeta['combined']; - } elseif (isset($this->basicinfo) && count($this->basicinfo) > 0) { - $this->typemeta['best'] = array('basiconly' => true, 'Basic Information' => - array ('File Data' => $this->basicinfo)); - } else { - $this->typemeta['best'] = false; - } - } - - - /** - * Merge basic file information into the reconciled or combined metadata array. Also adds data extraction time - * - * @param object $metaObj a FileMetadata object that has had metadata extracted and reconciled - * @param array $metarray the metadata array that is being built from the object - * - * @return array $metarray metarray with merged basic file data and extraction time - */ - function mergeBasicInfo($metaObj, $metarray) - { - $sumtab = 'Summary of Basic Information'; - $timeheader = 'Metadata Extraction Time'; - $bheader = 'File Data'; - //set time of data extraction as now - global $tikilib, $user; - $extracttime = $tikilib->get_long_datetime(null, $user); - $extractarray = array ( - $timeheader => array( - 'Extraction Time' => array( - 'label' => '', - 'newval' => $extracttime, - ) - ) - ); - - if (isset($metaObj->basicinfo) && $metaObj->basicinfo !== false) { - if (isset($metarray['reconciled']) && $metarray['reconciled'] !== false) { - //if summary tab is already set - if (isset($metarray['reconciled'][$sumtab][$bheader])) { - //merge in basic info to file data section - array_merge($metarray['reconciled'][$sumtab][$bheader], $metaObj->basicinfo); - } else { - $metarray['reconciled'] = - array($sumtab => array($bheader => $metaObj->basicinfo)) + $metarray['reconciled']; - $metarray['reconciled'][$sumtab][$bheader] = $metaObj->basicinfo; - } - //add extraction time - $metarray['reconciled'][$sumtab] = $extractarray + $metarray['reconciled'][$sumtab]; - } - if (is_array($metarray['combined'])) { - $metarray['combined'] = array($sumtab => array($bheader => $metaObj->basicinfo)) + $metarray['combined']; - } else { - $metarray['combined'][$sumtab][$bheader] = $metaObj->basicinfo; - } - $metarray['combined'][$sumtab] = $extractarray + $metarray['combined'][$sumtab]; - } - return $metarray; - } - - /** - * Used to create a temporary path to a file when only the contents are available - * Necessary because some php functions used to extract metadata require a file path - * @param string $content contents of a file - * - * @return bool|string $temppath path to a temporary file in the temp directory or false if $content is - * empty or file is not writeable - */ - private function temppathFromContent($content) - { - if (!empty($content)) { - $cwd = getcwd(); - $temppath = tempnam("$cwd/temp", 'temp_file_'); - if (!is_writeable($temppath)) { - return false; - } - $temphandle = fopen($temppath, 'w'); - fwrite($temphandle, $content); - fclose($temphandle); - return $temppath; - } else { - return false; - } - } - - /** - * Checks to see if Tiki handles the processing of extended metadata for this file type - * - * @return bool - */ - function canProcessExtended() - { - if (isset($this->basicraw['type']) && array_key_exists($this->basicraw['type'], $this->types)) { - return true; - } else { - return false; - } - } - - /** - * To get a segment of binary content based on segment information - * - * @param $binarycontent the binary content that the segment will be extracted from - * @param $marker the marker denoting the beginning of the segment data - * @param $markerlength length of marker, after which the segment size is assumed to be indicated - * @param $sizelength length of the size indicator. actual content assumed to start after marker, - * and size indicator - * - * @return bool|string segment portion is returned - */ - function getDataSegment($binarycontent, $marker, $markerlength, $sizelength) - { - //find position of segment marker - $markerpos = strpos($binarycontent, $marker); - if ($markerpos === false) { - return false; - } else { - //get the binary value of the size indicator - $rawsize = substr($binarycontent, $markerpos + $markerlength, $sizelength); - //convert the binary string into the size number - $size = unpack('nsize', $rawsize); - //extract the desired segment of data - $segdata = substr($binarycontent, $markerpos + $markerlength + $sizelength, $size['size']); - return $segdata; - } - } - - /** - * Creates a Jquery tabbed dialog window for metadata. Assumes a 3-level array: first level is type of data, - * second represents categories or groupings for that type, and third is the fields - * - * @param FileMetadata object $metadata Object or array with necessary properties to be displayed set - * @param string $id HTML id attribute to identify the table - * @param string $id_link HTML id attribute to identify the dialog table link - * @param string $filename Used in the title of the dialog box - * @param bool $mwg_compliant Whether to reconcile extended metadata according to - * the Metadata Working Group guidelines - * - * Calls a smarty template to render the dialog box. The template will require a newval value for each field and - * will check for label and suffix values - */ - function dialogTabs($metadata, $id, $id_link, $filename) - { - global $smarty; - $smarty->assign('id', $id); - $smarty->assign('id_link', $id_link); - $smarty->assign('filename', $filename); - if (is_array($metadata) && count($metadata) > 0) { - $metarray = $metadata; - } elseif (!empty($metadata)) { - $metarray = json_decode($metadata, true); - } - if (is_array($metarray) && count($metarray) > 0) { - $smarty->assign('metarray', $metarray); - $smarty->assign('type', 'data'); - } else { - $smarty->assign('type', 'nodata'); - } - $smarty->display('metadata/meta_view_dialog.tpl'); - } - - function pageTabs($metadata) - { - global $smarty; - if (is_array($metadata) && count($metadata) > 0) { - $metarray = $metadata; - } elseif (!empty($metadata)) { - $metarray = json_decode($metadata, true); - } - if (is_array($metarray) && count($metarray) > 0) { - $smarty->assign('metarray', $metarray); - $smarty->assign('type', 'data'); - } else { - $smarty->assign('type', 'nodata'); - } - $smarty->assign('extended', $this->canProcessExtended() ? 'y' : 'n'); - $smarty->display('metadata/meta_view_tabs.tpl'); - } - -} //end of class Copied: trunk/lib/metadata/metadatalib.php (from rev 43019, trunk/lib/metadata/metadata.php) =================================================================== --- trunk/lib/metadata/metadatalib.php (rev 0) +++ trunk/lib/metadata/metadatalib.php 2012-09-21 05:47:18 UTC (rev 43072) @@ -0,0 +1,312 @@ +<?php +// (c) Copyright 2002-2012 by authors of the Tiki Wiki CMS Groupware Project +// +// All Rights Reserved. See copyright.txt for details and a complete list of authors. +// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. +// $Id$ + +//this script may only be included - so its better to die if called directly. +if (strpos($_SERVER['SCRIPT_NAME'], basename(__FILE__)) !== false) { + header('location: index.php'); + exit; +} + +/** + * Reads and manipulates metadata included within a file + * For separate classes for specific file types are called from here + */ +class FileMetadata +{ + var $currname = null; //working file path used to access file, may not be the same as embedded in file metadata + var $content = null; //file content + var $basicraw = null; //for basic file information + var $basicinfo = null; //processed basic file information + var $typemeta = null; //array used to store metadata beyond generic file data + var $error = null; //error messages stored here + var $types = array ( //files types handled for extended metadata with values used for class and file name + 'image/jpeg' => 'jpeg', + 'image/jpg' => 'jpeg', + ); + + /** + * Get basic and extended metadata included in the file itself + * + * @param string $file path to file or content of file + * @param bool $ispath indicates whether $file is a path (true) or the file contents (false) + * @param bool $extended indicates whether to retrieve extended metadata information + * + * @return \FileMetadata FileMetadata object with properties for the various types of metadata + */ + function getMetadata($file, $ispath = true, $extended = true) + { + if (empty($file)) { + return false; + //set contents and current name as well as type in some situations + } elseif (!$ispath) { + //when $file is actual file contents rather than a path - create a temporary file name + // needed for some php functions + $temppath = $this->temppathFromContent($file); + $leavelink = false; + if (!$temppath) { + $this->error = 'The file is empty'; + } else { + $this->content = $file; + $this->currname = $temppath; + } + } else { + //when $file is a path + if (is_readable($file)) { + $this->currname = $file; + $this->content = file_get_contents($file); + $temppath = $file; + $leavelink = true; + if (empty($this->content)) { + $this->error = 'The file is empty'; + } + //if not readable, see if it's an external file + } elseif (strpos($file, 'http') !== false) { + $filegallib = TikiLib::lib('filegal'); + $externalinfo = $filegallib->get_info_from_url($file); + $temppath = $this->temppathFromContent($externalinfo['data']); + $leavelink = false; + if (!$temppath) { + $this->error = 'The file is not readable'; + } else { + $this->currname = $file; + $this->content = $externalinfo['data']; + //set type here for external files + $this->type = $externalinfo['type']; + } + } else { + $this->error = 'The file is not readable'; + $leavelink = true; + } + } + + //set basic info + $this->basicraw['size'] = function_exists('mb_strlen') ? mb_strlen($this->content, '8bit') + : strlen($this->content); + if (class_exists('finfo') && is_readable($temppath)) { + $finfo = new finfo(FILEINFO_MIME); + $type_charset = $finfo->file($temppath); + $type_charset = explode(';', $type_charset); + //external file tyes may already be set at this point + $this->basicraw['type'] = empty($this->type) ? $type_charset[0] : $this->type; + $this->basicraw['charset'] = trim($type_charset[1]); + $finfo = new finfo(FILEINFO_DEVICES); + $this->basicraw['devices'] = $finfo->file($temppath); + } + + //process basic info + if (is_array($this->basicraw)) { + require_once('basicinfo.php'); + $basic = new BasicInfo; + $this->basicinfo = $basic->processRawData($this->basicraw); + } + + //from this point, additional metadata is obtained from classes specific to the file type in separate php files + //all results for this additional metadata go into the $this->typemeta array + if ($extended && $this->canProcessExtended()) { + //used for name of class and the file the class is in + $type = $this->types[$this->basicraw['type']]; + //file must be named based on $type + include_once('lib/metadata/filetypes/' . $type . '.php'); + //class name is same as file name except first letter is capitalized + $type = ucfirst($type); + $typeObj = new $type($this); + $this->typemeta = $typeObj->getExtendedData($this); + } + $this->setBestMetadata(); + if (!$leavelink) { + unlink($temppath); + } + return $this; + } + + /** + * Set the most complete and reconciled metadata array. Called by getMetadata. + */ + private function setBestMetadata() + { + if (isset($this->typemeta['reconciled']) && count($this->typemeta['reconciled']) > 0) { + $this->typemeta['best'] = $this->typemeta['reconciled']; + } elseif (isset($this->typemeta['combined']) && count($this->typemeta['combined']) > 0) { + $this->typemeta['best'] = $this->typemeta['combined']; + } elseif (isset($this->basicinfo) && count($this->basicinfo) > 0) { + $this->typemeta['best'] = array('basiconly' => true, 'Basic Information' => + array ('File Data' => $this->basicinfo)); + } else { + $this->typemeta['best'] = false; + } + } + + + /** + * Merge basic file information into the reconciled or combined metadata array. Also adds data extraction time + * + * @param object $metaObj a FileMetadata object that has had metadata extracted and reconciled + * @param array $metarray the metadata array that is being built from the object + * + * @return array $metarray metarray with merged basic file data and extraction time + */ + function mergeBasicInfo($metaObj, $metarray) + { + $sumtab = 'Summary of Basic Information'; + $timeheader = 'Metadata Extraction Time'; + $bheader = 'File Data'; + //set time of data extraction as now + global $tikilib, $user; + $extracttime = $tikilib->get_long_datetime(null, $user); + $extractarray = array ( + $timeheader => array( + 'Extraction Time' => array( + 'label' => '', + 'newval' => $extracttime, + ) + ) + ); + + if (isset($metaObj->basicinfo) && $metaObj->basicinfo !== false) { + if (isset($metarray['reconciled']) && $metarray['reconciled'] !== false) { + //if summary tab is already set + if (isset($metarray['reconciled'][$sumtab][$bheader])) { + //merge in basic info to file data section + array_merge($metarray['reconciled'][$sumtab][$bheader], $metaObj->basicinfo); + } else { + $metarray['reconciled'] = + array($sumtab => array($bheader => $metaObj->basicinfo)) + $metarray['reconciled']; + $metarray['reconciled'][$sumtab][$bheader] = $metaObj->basicinfo; + } + //add extraction time + $metarray['reconciled'][$sumtab] = $extractarray + $metarray['reconciled'][$sumtab]; + } + if (is_array($metarray['combined'])) { + $metarray['combined'] = array($sumtab => array($bheader => $metaObj->basicinfo)) + $metarray['combined']; + } else { + $metarray['combined'][$sumtab][$bheader] = $metaObj->basicinfo; + } + $metarray['combined'][$sumtab] = $extractarray + $metarray['combined'][$sumtab]; + } + return $metarray; + } + + /** + * Used to create a temporary path to a file when only the contents are available + * Necessary because some php functions used to extract metadata require a file path + * @param string $content contents of a file + * + * @return bool|string $temppath path to a temporary file in the temp directory or false if $content is + * empty or file is not writeable + */ + private function temppathFromContent($content) + { + if (!empty($content)) { + $cwd = getcwd(); + $temppath = tempnam("$cwd/temp", 'temp_file_'); + if (!is_writeable($temppath)) { + return false; + } + $temphandle = fopen($temppath, 'w'); + fwrite($temphandle, $content); + fclose($temphandle); + return $temppath; + } else { + return false; + } + } + + /** + * Checks to see if Tiki handles the processing of extended metadata for this file type + * + * @return bool + */ + function canProcessExtended() + { + if (isset($this->basicraw['type']) && array_key_exists($this->basicraw['type'], $this->types)) { + return true; + } else { + return false; + } + } + + /** + * To get a segment of binary content based on segment information + * + * @param $binarycontent the binary content that the segment will be extracted from + * @param $marker the marker denoting the beginning of the segment data + * @param $markerlength length of marker, after which the segment size is assumed to be indicated + * @param $sizelength length of the size indicator. actual content assumed to start after marker, + * and size indicator + * + * @return bool|string segment portion is returned + */ + function getDataSegment($binarycontent, $marker, $markerlength, $sizelength) + { + //find position of segment marker + $markerpos = strpos($binarycontent, $marker); + if ($markerpos === false) { + return false; + } else { + //get the binary value of the size indicator + $rawsize = substr($binarycontent, $markerpos + $markerlength, $sizelength); + //convert the binary string into the size number + $size = unpack('nsize', $rawsize); + //extract the desired segment of data + $segdata = substr($binarycontent, $markerpos + $markerlength + $sizelength, $size['size']); + return $segdata; + } + } + + /** + * Creates a Jquery tabbed dialog window for metadata. Assumes a 3-level array: first level is type of data, + * second represents categories or groupings for that type, and third is the fields + * + * @param FileMetadata object $metadata Object or array with necessary properties to be displayed set + * @param string $id HTML id attribute to identify the table + * @param string $id_link HTML id attribute to identify the dialog table link + * @param string $filename Used in the title of the dialog box + * @param bool $mwg_compliant Whether to reconcile extended metadata according to + * the Metadata Working Group guidelines + * + * Calls a smarty template to render the dialog box. The template will require a newval value for each field and + * will check for label and suffix values + */ + function dialogTabs($metadata, $id, $id_link, $filename) + { + global $smarty; + $smarty->assign('id', $id); + $smarty->assign('id_link', $id_link); + $smarty->assign('filename', $filename); + if (is_array($metadata) && count($metadata) > 0) { + $metarray = $metadata; + } elseif (!empty($metadata)) { + $metarray = json_decode($metadata, true); + } + if (is_array($metarray) && count($metarray) > 0) { + $smarty->assign('metarray', $metarray); + $smarty->assign('type', 'data'); + } else { + $smarty->assign('type', 'nodata'); + } + $smarty->display('metadata/meta_view_dialog.tpl'); + } + + function pageTabs($metadata) + { + global $smarty; + if (is_array($metadata) && count($metadata) > 0) { + $metarray = $metadata; + } elseif (!empty($metadata)) { + $metarray = json_decode($metadata, true); + } + if (is_array($metarray) && count($metarray) > 0) { + $smarty->assign('metarray', $metarray); + $smarty->assign('type', 'data'); + } else { + $smarty->assign('type', 'nodata'); + } + $smarty->assign('extended', $this->canProcessExtended() ? 'y' : 'n'); + $smarty->display('metadata/meta_view_tabs.tpl'); + } + +} //end of class Property changes on: trunk/lib/metadata/metadatalib.php ___________________________________________________________________ Added: svn:keywords + Id Modified: trunk/lib/wiki-plugins/wikiplugin_img.php =================================================================== --- trunk/lib/wiki-plugins/wikiplugin_img.php 2012-09-20 21:05:17 UTC (rev 43071) +++ trunk/lib/wiki-plugins/wikiplugin_img.php 2012-09-21 05:47:18 UTC (rev 43072) @@ -1203,7 +1203,7 @@ $id_meta = 'imgdialog-' . ++$lastval; $id_link = $id_meta . '-link'; //use metadata stored in file gallery db if available - include_once 'lib/metadata/metadata.php'; + include_once 'lib/metadata/metadatalib.php'; $meta = new FileMetadata; $dialog = $meta->dialogTabs($metadata, $id_meta, $id_link, $filename); $repl .= $dialog; @@ -1387,7 +1387,7 @@ $metarray = json_decode($dbinfo['metadata'], true); } elseif (isset($dbinfo['fileId'])) { $filegallib = TikiLib::lib('filegal'); - $metarray = $filegallib->getOrExtractMetadataArray($dbinfo['fileId']); + $metarray = $filegallib->metadataAction($dbinfo['fileId']); } else { $metarray = $imageObj->getMetadata()->typemeta['best']; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |