first commit
This commit is contained in:
		
							
								
								
									
										132
									
								
								vendor/miljar/php-exif/lib/PHPExif/Adapter/AdapterAbstract.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								vendor/miljar/php-exif/lib/PHPExif/Adapter/AdapterAbstract.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,132 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PHP Exif Reader Adapter Abstract: Common functionality for adapters | ||||
|  * | ||||
|  * @link        http://github.com/miljar/PHPExif for the canonical source repository | ||||
|  * @copyright   Copyright (c) 2013 Tom Van Herreweghe <tom@theanalogguy.be> | ||||
|  * @license     http://github.com/miljar/PHPExif/blob/master/LICENSE MIT License | ||||
|  * @category    PHPExif | ||||
|  * @package     Reader | ||||
|  */ | ||||
|  | ||||
| namespace PHPExif\Adapter; | ||||
|  | ||||
| use PHPExif\Mapper\MapperInterface; | ||||
| use PHPExif\Hydrator\HydratorInterface; | ||||
|  | ||||
| /** | ||||
|  * PHP Exif Reader Adapter Abstract | ||||
|  * | ||||
|  * Implements common functionality for the reader adapters | ||||
|  * | ||||
|  * @category    PHPExif | ||||
|  * @package     Reader | ||||
|  */ | ||||
| abstract class AdapterAbstract implements AdapterInterface | ||||
| { | ||||
|     /** | ||||
|      * @var string | ||||
|      */ | ||||
|     protected $hydratorClass = '\\PHPExif\\Hydrator\\Mutator'; | ||||
|  | ||||
|     /** | ||||
|      * @var \PHPExif\Mapper\MapperInterface | ||||
|      */ | ||||
|     protected $mapper; | ||||
|  | ||||
|     /** | ||||
|      * @var \PHPExif\Hydrator\HydratorInterface | ||||
|      */ | ||||
|     protected $hydrator; | ||||
|  | ||||
|     /** | ||||
|      * @var string | ||||
|      */ | ||||
|     protected $mapperClass = ''; | ||||
|  | ||||
|     /** | ||||
|      * Class constructor | ||||
|      * | ||||
|      * @param array $options Optional array of data to initialize the object with | ||||
|      */ | ||||
|     public function __construct(array $options = array()) | ||||
|     { | ||||
|         if (!empty($options)) { | ||||
|             $this->setOptions($options); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Mutator for the data mapper | ||||
|      * | ||||
|      * @param \PHPExif\Mapper\MapperInterface $mapper | ||||
|      * @return \PHPExif\Adapter\AdapterInterface | ||||
|      */ | ||||
|     public function setMapper(MapperInterface $mapper) | ||||
|     { | ||||
|         $this->mapper = $mapper; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Accessor for the data mapper | ||||
|      * | ||||
|      * @return \PHPExif\Mapper\MapperInterface | ||||
|      */ | ||||
|     public function getMapper() | ||||
|     { | ||||
|         if (null === $this->mapper) { | ||||
|             // lazy load one | ||||
|             $mapper = new $this->mapperClass; | ||||
|  | ||||
|             $this->setMapper($mapper); | ||||
|         } | ||||
|  | ||||
|         return $this->mapper; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Mutator for the hydrator | ||||
|      * | ||||
|      * @param \PHPExif\Hydrator\HydratorInterface $hydrator | ||||
|      * @return \PHPExif\Adapter\AdapterInterface | ||||
|      */ | ||||
|     public function setHydrator(HydratorInterface $hydrator) | ||||
|     { | ||||
|         $this->hydrator = $hydrator; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Accessor for the data hydrator | ||||
|      * | ||||
|      * @return \PHPExif\Hydrator\HydratorInterface | ||||
|      */ | ||||
|     public function getHydrator() | ||||
|     { | ||||
|         if (null === $this->hydrator) { | ||||
|             // lazy load one | ||||
|             $hydrator = new $this->hydratorClass; | ||||
|  | ||||
|             $this->setHydrator($hydrator); | ||||
|         } | ||||
|  | ||||
|         return $this->hydrator; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Set array of options in the current object | ||||
|      * | ||||
|      * @param array $options | ||||
|      * @return \PHPExif\Reader\AdapterAbstract | ||||
|      */ | ||||
|     public function setOptions(array $options) | ||||
|     { | ||||
|         $hydrator = $this->getHydrator(); | ||||
|         $hydrator->hydrate($this, $options); | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										33
									
								
								vendor/miljar/php-exif/lib/PHPExif/Adapter/AdapterInterface.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								vendor/miljar/php-exif/lib/PHPExif/Adapter/AdapterInterface.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PHP Exif Reader Adapter Interface: Defines the interface for reader adapters | ||||
|  * | ||||
|  * @link        http://github.com/miljar/PHPExif for the canonical source repository | ||||
|  * @copyright   Copyright (c) 2013 Tom Van Herreweghe <tom@theanalogguy.be> | ||||
|  * @license     http://github.com/miljar/PHPExif/blob/master/LICENSE MIT License | ||||
|  * @category    PHPExif | ||||
|  * @package     Reader | ||||
|  * @codeCoverageIgnore | ||||
|  */ | ||||
|  | ||||
| namespace PHPExif\Adapter; | ||||
|  | ||||
| /** | ||||
|  * PHP Exif Reader Adapter | ||||
|  * | ||||
|  * Defines the interface for reader adapters | ||||
|  * | ||||
|  * @category    PHPExif | ||||
|  * @package     Reader | ||||
|  */ | ||||
| interface AdapterInterface | ||||
| { | ||||
|     /** | ||||
|      * Reads & parses the EXIF data from given file | ||||
|      * | ||||
|      * @param string $file | ||||
|      * @return \PHPExif\Exif Instance of Exif object with data | ||||
|      * @throws \RuntimeException If the EXIF data could not be read | ||||
|      */ | ||||
|     public function getExifFromFile($file); | ||||
| } | ||||
							
								
								
									
										202
									
								
								vendor/miljar/php-exif/lib/PHPExif/Adapter/Exiftool.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										202
									
								
								vendor/miljar/php-exif/lib/PHPExif/Adapter/Exiftool.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,202 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PHP Exif Exiftool Reader Adapter | ||||
|  * | ||||
|  * @link        http://github.com/miljar/PHPExif for the canonical source repository | ||||
|  * @copyright   Copyright (c) 2013 Tom Van Herreweghe <tom@theanalogguy.be> | ||||
|  * @license     http://github.com/miljar/PHPExif/blob/master/LICENSE MIT License | ||||
|  * @category    PHPExif | ||||
|  * @package     Reader | ||||
|  */ | ||||
|  | ||||
| namespace PHPExif\Adapter; | ||||
|  | ||||
| use PHPExif\Exif; | ||||
| use InvalidArgumentException; | ||||
| use RuntimeException; | ||||
|  | ||||
| /** | ||||
|  * PHP Exif Exiftool Reader Adapter | ||||
|  * | ||||
|  * Uses native PHP functionality to read data from a file | ||||
|  * | ||||
|  * @category    PHPExif | ||||
|  * @package     Reader | ||||
|  */ | ||||
| class Exiftool extends AdapterAbstract | ||||
| { | ||||
|     const TOOL_NAME = 'exiftool'; | ||||
|  | ||||
|     /** | ||||
|      * Path to the exiftool binary | ||||
|      * | ||||
|      * @var string | ||||
|      */ | ||||
|     protected $toolPath; | ||||
|  | ||||
|     /** | ||||
|      * @var boolean | ||||
|      */ | ||||
|     protected $numeric = true; | ||||
|  | ||||
|     /** | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $encoding = array(); | ||||
|  | ||||
|     /** | ||||
|      * @var string | ||||
|      */ | ||||
|     protected $mapperClass = '\\PHPExif\\Mapper\\Exiftool'; | ||||
|  | ||||
|     /** | ||||
|      * Setter for the exiftool binary path | ||||
|      * | ||||
|      * @param string $path The path to the exiftool binary | ||||
|      * @return \PHPExif\Adapter\Exiftool Current instance | ||||
|      * @throws \InvalidArgumentException When path is invalid | ||||
|      */ | ||||
|     public function setToolPath($path) | ||||
|     { | ||||
|         if (!file_exists($path)) { | ||||
|             throw new InvalidArgumentException( | ||||
|                 sprintf( | ||||
|                     'Given path (%1$s) to the exiftool binary is invalid', | ||||
|                     $path | ||||
|                 ) | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         $this->toolPath = $path; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param boolean $numeric | ||||
|      */ | ||||
|     public function setNumeric($numeric) | ||||
|     { | ||||
|         $this->numeric = $numeric; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @see  http://www.sno.phy.queensu.ca/~phil/exiftool/faq.html#Q10 | ||||
|      * @param array $encoding encoding parameters in an array eg. ["exif" => "UTF-8"] | ||||
|      */ | ||||
|     public function setEncoding($encoding) | ||||
|     { | ||||
|         $possible_keys = array("exif", "iptc", "id3", "photoshop", "quicktime",); | ||||
|         $possible_values = array("UTF8", "cp65001", "UTF-8", "Thai", "cp874", "Latin", "cp1252", | ||||
|             "Latin1", "MacRoman", "cp10000", "Mac", "Roman", "Latin2", "cp1250", "MacLatin2", | ||||
|             "cp10029", "Cyrillic", "cp1251", "Russian", "MacCyrillic", "cp10007", "Greek", | ||||
|             "cp1253", "MacGreek", "cp10006", "Turkish", "cp1254", "MacTurkish", "cp10081", | ||||
|             "Hebrew", "cp1255", "MacRomanian", "cp10010", "Arabic", "cp1256", "MacIceland", | ||||
|             "cp10079", "Baltic", "cp1257", "MacCroatian", "cp10082", "Vietnam", "cp1258",); | ||||
|         foreach ($encoding as $type => $encoding) { | ||||
|             if (in_array($type, $possible_keys) && in_array($encoding, $possible_values)) { | ||||
|                 $this->encoding[$type] = $encoding; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Getter for the exiftool binary path | ||||
|      * Lazy loads the "default" path | ||||
|      * | ||||
|      * @return string | ||||
|      */ | ||||
|     public function getToolPath() | ||||
|     { | ||||
|         if (empty($this->toolPath)) { | ||||
|             $path = exec('which ' . self::TOOL_NAME); | ||||
|             $this->setToolPath($path); | ||||
|         } | ||||
|  | ||||
|         return $this->toolPath; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Reads & parses the EXIF data from given file | ||||
|      * | ||||
|      * @param string $file | ||||
|      * @return \PHPExif\Exif Instance of Exif object with data | ||||
|      * @throws \RuntimeException If the EXIF data could not be read | ||||
|      */ | ||||
|     public function getExifFromFile($file) | ||||
|     { | ||||
|         $encoding = ''; | ||||
|         if (!empty($this->encoding)) { | ||||
|             $encoding = '-charset '; | ||||
|             foreach ($this->encoding as $key => $value) { | ||||
|                 $encoding .= escapeshellarg($key).'='.escapeshellarg($value); | ||||
|             } | ||||
|         } | ||||
|         $result = $this->getCliOutput( | ||||
|             sprintf( | ||||
|                 '%1$s%3$s -j -a -G1 %5$s -c %4$s %2$s', | ||||
|                 $this->getToolPath(), | ||||
|                 escapeshellarg($file), | ||||
|                 $this->numeric ? ' -n' : '', | ||||
|                 escapeshellarg('%d deg %d\' %.4f"'), | ||||
|                 $encoding | ||||
|             ) | ||||
|         ); | ||||
|  | ||||
|         if (!mb_check_encoding($result, "utf-8")) { | ||||
|             $result = utf8_encode($result); | ||||
|         } | ||||
|         $data = json_decode($result, true); | ||||
|         if (!is_array($data)) { | ||||
|             throw new RuntimeException( | ||||
|                 'Could not decode exiftool output' | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         // map the data: | ||||
|         $mapper = $this->getMapper(); | ||||
|         $mapper->setNumeric($this->numeric); | ||||
|         $mappedData = $mapper->mapRawData(reset($data)); | ||||
|  | ||||
|         // hydrate a new Exif object | ||||
|         $exif = new Exif(); | ||||
|         $hydrator = $this->getHydrator(); | ||||
|         $hydrator->hydrate($exif, $mappedData); | ||||
|         $exif->setRawData(reset($data)); | ||||
|  | ||||
|         return $exif; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the output from given cli command | ||||
|      * | ||||
|      * @param string $command | ||||
|      * @return mixed | ||||
|      * @throws RuntimeException If the command can't be executed | ||||
|      */ | ||||
|     protected function getCliOutput($command) | ||||
|     { | ||||
|         $descriptorspec = array( | ||||
|             0 => array('pipe', 'r'), | ||||
|             1 => array('pipe', 'w'), | ||||
|             2 => array('pipe', 'a') | ||||
|         ); | ||||
|  | ||||
|         $process = proc_open($command, $descriptorspec, $pipes); | ||||
|  | ||||
|         if (!is_resource($process)) { | ||||
|             throw new RuntimeException( | ||||
|                 'Could not open a resource to the exiftool binary' | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         $result = stream_get_contents($pipes[1]); | ||||
|         fclose($pipes[0]); | ||||
|         fclose($pipes[1]); | ||||
|         fclose($pipes[2]); | ||||
|  | ||||
|         proc_close($process); | ||||
|  | ||||
|         return $result; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										235
									
								
								vendor/miljar/php-exif/lib/PHPExif/Adapter/Native.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										235
									
								
								vendor/miljar/php-exif/lib/PHPExif/Adapter/Native.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,235 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PHP Exif Native Reader Adapter | ||||
|  * | ||||
|  * @link        http://github.com/miljar/PHPExif for the canonical source repository | ||||
|  * @copyright   Copyright (c) 2013 Tom Van Herreweghe <tom@theanalogguy.be> | ||||
|  * @license     http://github.com/miljar/PHPExif/blob/master/LICENSE MIT License | ||||
|  * @category    PHPExif | ||||
|  * @package     Reader | ||||
|  */ | ||||
|  | ||||
| namespace PHPExif\Adapter; | ||||
|  | ||||
| use PHPExif\Exif; | ||||
|  | ||||
| /** | ||||
|  * PHP Exif Native Reader Adapter | ||||
|  * | ||||
|  * Uses native PHP functionality to read data from a file | ||||
|  * | ||||
|  * @category    PHPExif | ||||
|  * @package     Reader | ||||
|  */ | ||||
| class Native extends AdapterAbstract | ||||
| { | ||||
|     const INCLUDE_THUMBNAIL = true; | ||||
|     const NO_THUMBNAIL      = false; | ||||
|  | ||||
|     const SECTIONS_AS_ARRAYS    = true; | ||||
|     const SECTIONS_FLAT         = false; | ||||
|  | ||||
|     const SECTION_FILE      = 'FILE'; | ||||
|     const SECTION_COMPUTED  = 'COMPUTED'; | ||||
|     const SECTION_IFD0      = 'IFD0'; | ||||
|     const SECTION_THUMBNAIL = 'THUMBNAIL'; | ||||
|     const SECTION_COMMENT   = 'COMMENT'; | ||||
|     const SECTION_EXIF      = 'EXIF'; | ||||
|     const SECTION_ALL       = 'ANY_TAG'; | ||||
|     const SECTION_IPTC      = 'IPTC'; | ||||
|  | ||||
|     /** | ||||
|      * List of EXIF sections | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $requiredSections = array(); | ||||
|  | ||||
|     /** | ||||
|      * Include the thumbnail in the EXIF data? | ||||
|      * | ||||
|      * @var boolean | ||||
|      */ | ||||
|     protected $includeThumbnail = self::NO_THUMBNAIL; | ||||
|  | ||||
|     /** | ||||
|      * Parse the sections as arrays? | ||||
|      * | ||||
|      * @var boolean | ||||
|      */ | ||||
|     protected $sectionsAsArrays = self::SECTIONS_FLAT; | ||||
|  | ||||
|     /** | ||||
|      * @var string | ||||
|      */ | ||||
|     protected $mapperClass = '\\PHPExif\\Mapper\\Native'; | ||||
|  | ||||
|     /** | ||||
|      * Contains the mapping of names to IPTC field numbers | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $iptcMapping = array( | ||||
|         'title'     => '2#005', | ||||
|         'keywords'  => '2#025', | ||||
|         'copyright' => '2#116', | ||||
|         'caption'   => '2#120', | ||||
|         'headline'  => '2#105', | ||||
|         'credit'    => '2#110', | ||||
|         'source'    => '2#115', | ||||
|         'jobtitle'  => '2#085' | ||||
|     ); | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Getter for the EXIF sections | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getRequiredSections() | ||||
|     { | ||||
|         return $this->requiredSections; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Setter for the EXIF sections | ||||
|      * | ||||
|      * @param array $sections List of EXIF sections | ||||
|      * @return \PHPExif\Adapter\Native Current instance for chaining | ||||
|      */ | ||||
|     public function setRequiredSections(array $sections) | ||||
|     { | ||||
|         $this->requiredSections = $sections; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Adds an EXIF section to the list | ||||
|      * | ||||
|      * @param string $section | ||||
|      * @return \PHPExif\Adapter\Native Current instance for chaining | ||||
|      */ | ||||
|     public function addRequiredSection($section) | ||||
|     { | ||||
|         if (!in_array($section, $this->requiredSections)) { | ||||
|             array_push($this->requiredSections, $section); | ||||
|         } | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Define if the thumbnail should be included into the EXIF data or not | ||||
|      * | ||||
|      * @param boolean $value | ||||
|      * @return \PHPExif\Adapter\Native Current instance for chaining | ||||
|      */ | ||||
|     public function setIncludeThumbnail($value) | ||||
|     { | ||||
|         $this->includeThumbnail = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns if the thumbnail should be included into the EXIF data or not | ||||
|      * | ||||
|      * @return boolean | ||||
|      */ | ||||
|     public function getIncludeThumbnail() | ||||
|     { | ||||
|         return $this->includeThumbnail; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Define if the sections should be parsed as arrays | ||||
|      * | ||||
|      * @param boolean $value | ||||
|      * @return \PHPExif\Adapter\Native Current instance for chaining | ||||
|      */ | ||||
|     public function setSectionsAsArrays($value) | ||||
|     { | ||||
|         $this->sectionsAsArrays = (bool) $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns if the sections should be parsed as arrays | ||||
|      * | ||||
|      * @return boolean | ||||
|      */ | ||||
|     public function getSectionsAsArrays() | ||||
|     { | ||||
|         return $this->sectionsAsArrays; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Reads & parses the EXIF data from given file | ||||
|      * | ||||
|      * @param string $file | ||||
|      * @return \PHPExif\Exif|boolean Instance of Exif object with data | ||||
|      */ | ||||
|     public function getExifFromFile($file) | ||||
|     { | ||||
|         $sections   = $this->getRequiredSections(); | ||||
|         $sections   = implode(',', $sections); | ||||
|         $sections   = (empty($sections)) ? null : $sections; | ||||
|  | ||||
|         $data = @exif_read_data( | ||||
|             $file, | ||||
|             $sections, | ||||
|             $this->getSectionsAsArrays(), | ||||
|             $this->getIncludeThumbnail() | ||||
|         ); | ||||
|  | ||||
|         if (false === $data) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         $xmpData = $this->getIptcData($file); | ||||
|         $data = array_merge($data, array(self::SECTION_IPTC => $xmpData)); | ||||
|  | ||||
|         // map the data: | ||||
|         $mapper = $this->getMapper(); | ||||
|         $mappedData = $mapper->mapRawData($data); | ||||
|  | ||||
|         // hydrate a new Exif object | ||||
|         $exif = new Exif(); | ||||
|         $hydrator = $this->getHydrator(); | ||||
|         $hydrator->hydrate($exif, $mappedData); | ||||
|         $exif->setRawData($data); | ||||
|  | ||||
|         return $exif; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns an array of IPTC data | ||||
|      * | ||||
|      * @param string $file The file to read the IPTC data from | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getIptcData($file) | ||||
|     { | ||||
|         getimagesize($file, $info); | ||||
|         $arrData = array(); | ||||
|         if (isset($info['APP13'])) { | ||||
|             $iptc = iptcparse($info['APP13']); | ||||
|  | ||||
|             foreach ($this->iptcMapping as $name => $field) { | ||||
|                 if (!isset($iptc[$field])) { | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 if (count($iptc[$field]) === 1) { | ||||
|                     $arrData[$name] = reset($iptc[$field]); | ||||
|                 } else { | ||||
|                     $arrData[$name] = $iptc[$field]; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return $arrData; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										28
									
								
								vendor/miljar/php-exif/lib/PHPExif/Adapter/NoAdapterException.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								vendor/miljar/php-exif/lib/PHPExif/Adapter/NoAdapterException.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PHP Exif Reader Adapter Interface: Defines the interface for reader adapters | ||||
|  * | ||||
|  * @link        http://github.com/miljar/PHPExif for the canonical source repository | ||||
|  * @copyright   Copyright (c) 2013 Tom Van Herreweghe <tom@theanalogguy.be> | ||||
|  * @license     http://github.com/miljar/PHPExif/blob/master/LICENSE MIT License | ||||
|  * @category    PHPExif | ||||
|  * @package     Reader | ||||
|  * @codeCoverageIgnore | ||||
|  */ | ||||
|  | ||||
| namespace PHPExif\Adapter; | ||||
|  | ||||
| use Exception; | ||||
|  | ||||
| /** | ||||
|  * PHP Exif Reader Adapter | ||||
|  * | ||||
|  * Defines the interface for reader adapters | ||||
|  * | ||||
|  * @category    PHPExif | ||||
|  * @package     Reader | ||||
|  */ | ||||
| class NoAdapterException extends Exception | ||||
| { | ||||
|     //empty | ||||
| } | ||||
							
								
								
									
										843
									
								
								vendor/miljar/php-exif/lib/PHPExif/Exif.php
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										843
									
								
								vendor/miljar/php-exif/lib/PHPExif/Exif.php
									
									
									
									
										vendored
									
									
										Executable file
									
								
							| @@ -0,0 +1,843 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PHP Exif Reader: Reads EXIF metadata from a file, without having to install additional PHP modules | ||||
|  * | ||||
|  * @link        http://github.com/miljar/PHPExif for the canonical source repository | ||||
|  * @copyright   Copyright (c) 2013 Tom Van Herreweghe <tom@theanalogguy.be> | ||||
|  * @license     http://github.com/miljar/PHPExif/blob/master/LICENSE MIT License | ||||
|  * @category    PHPExif | ||||
|  * @package     Exif | ||||
|  */ | ||||
|  | ||||
| namespace PHPExif; | ||||
|  | ||||
| /** | ||||
|  * PHP Exif Reader | ||||
|  * | ||||
|  * Responsible for all the read operations on a file's EXIF metadata | ||||
|  * | ||||
|  * @category    PHPExif | ||||
|  * @package     Exif | ||||
|  * @ | ||||
|  */ | ||||
| class Exif | ||||
| { | ||||
|     const APERTURE              = 'aperture'; | ||||
|     const AUTHOR                = 'author'; | ||||
|     const CAMERA                = 'camera'; | ||||
|     const CAPTION               = 'caption'; | ||||
|     const COLORSPACE            = 'ColorSpace'; | ||||
|     const COPYRIGHT             = 'copyright'; | ||||
|     const CREATION_DATE         = 'creationdate'; | ||||
|     const CREDIT                = 'credit'; | ||||
|     const EXPOSURE              = 'exposure'; | ||||
|     const FILESIZE              = 'FileSize'; | ||||
|     const FOCAL_LENGTH          = 'focalLength'; | ||||
|     const FOCAL_DISTANCE        = 'focalDistance'; | ||||
|     const HEADLINE              = 'headline'; | ||||
|     const HEIGHT                = 'height'; | ||||
|     const HORIZONTAL_RESOLUTION = 'horizontalResolution'; | ||||
|     const ISO                   = 'iso'; | ||||
|     const JOB_TITLE             = 'jobTitle'; | ||||
|     const KEYWORDS              = 'keywords'; | ||||
|     const MIMETYPE              = 'MimeType'; | ||||
|     const ORIENTATION           = 'Orientation'; | ||||
|     const SOFTWARE              = 'software'; | ||||
|     const SOURCE                = 'source'; | ||||
|     const TITLE                 = 'title'; | ||||
|     const VERTICAL_RESOLUTION   = 'verticalResolution'; | ||||
|     const WIDTH                 = 'width'; | ||||
|     const GPS                   = 'gps'; | ||||
|  | ||||
|     /** | ||||
|      * The mapped EXIF data | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $data = array(); | ||||
|  | ||||
|     /** | ||||
|      * The raw EXIF data | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $rawData = array(); | ||||
|  | ||||
|     /** | ||||
|      * Class constructor | ||||
|      * | ||||
|      * @param array $data | ||||
|      */ | ||||
|     public function __construct(array $data = array()) | ||||
|     { | ||||
|         $this->setData($data); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the raw EXIF data | ||||
|      * | ||||
|      * @param array $data The data to set | ||||
|      * @return \PHPExif\Exif Current instance for chaining | ||||
|      */ | ||||
|     public function setRawData(array $data) | ||||
|     { | ||||
|         $this->rawData = $data; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns all EXIF data in the raw original format | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getRawData() | ||||
|     { | ||||
|         return $this->rawData; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the mapped EXIF data | ||||
|      * | ||||
|      * @param array $data The data to set | ||||
|      * @return \PHPExif\Exif Current instance for chaining | ||||
|      */ | ||||
|     public function setData(array $data) | ||||
|     { | ||||
|         $this->data = $data; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the mapped EXIF data | ||||
|      * | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getData() | ||||
|     { | ||||
|         return $this->data; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the Aperture F-number | ||||
|      * | ||||
|      * @return string|boolean | ||||
|      */ | ||||
|     public function getAperture() | ||||
|     { | ||||
|         if (!isset($this->data[self::APERTURE])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::APERTURE]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the Aperture F-number | ||||
|      * | ||||
|      * @param string $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setAperture($value) | ||||
|     { | ||||
|         $this->data[self::APERTURE] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the Author | ||||
|      * | ||||
|      * @return string|boolean | ||||
|      */ | ||||
|     public function getAuthor() | ||||
|     { | ||||
|         if (!isset($this->data[self::AUTHOR])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::AUTHOR]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the Author | ||||
|      * | ||||
|      * @param string $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setAuthor($value) | ||||
|     { | ||||
|         $this->data[self::AUTHOR] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the Headline | ||||
|      * | ||||
|      * @return string|boolean | ||||
|      */ | ||||
|     public function getHeadline() | ||||
|     { | ||||
|         if (!isset($this->data[self::HEADLINE])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::HEADLINE]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the Headline | ||||
|      * | ||||
|      * @param string $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setHeadline($value) | ||||
|     { | ||||
|         $this->data[self::HEADLINE] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the Credit | ||||
|      * | ||||
|      * @return string|boolean | ||||
|      */ | ||||
|     public function getCredit() | ||||
|     { | ||||
|         if (!isset($this->data[self::CREDIT])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::CREDIT]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the Credit | ||||
|      * | ||||
|      * @param string $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setCredit($value) | ||||
|     { | ||||
|         $this->data[self::CREDIT] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the source | ||||
|      * | ||||
|      * @return string|boolean | ||||
|      */ | ||||
|     public function getSource() | ||||
|     { | ||||
|         if (!isset($this->data[self::SOURCE])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::SOURCE]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the Source | ||||
|      * | ||||
|      * @param string $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setSource($value) | ||||
|     { | ||||
|         $this->data[self::SOURCE] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the Jobtitle | ||||
|      * | ||||
|      * @return string|boolean | ||||
|      */ | ||||
|     public function getJobtitle() | ||||
|     { | ||||
|         if (!isset($this->data[self::JOB_TITLE])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::JOB_TITLE]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the Jobtitle | ||||
|      * | ||||
|      * @param string $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setJobtitle($value) | ||||
|     { | ||||
|         $this->data[self::JOB_TITLE] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the ISO speed | ||||
|      * | ||||
|      * @return int|boolean | ||||
|      */ | ||||
|     public function getIso() | ||||
|     { | ||||
|         if (!isset($this->data[self::ISO])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::ISO]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the ISO | ||||
|      * | ||||
|      * @param int $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setIso($value) | ||||
|     { | ||||
|         $this->data[self::ISO] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the Exposure | ||||
|      * | ||||
|      * @return string|boolean | ||||
|      */ | ||||
|     public function getExposure() | ||||
|     { | ||||
|         if (!isset($this->data[self::EXPOSURE])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::EXPOSURE]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the Exposure | ||||
|      * | ||||
|      * @param string $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setExposure($value) | ||||
|     { | ||||
|         $this->data[self::EXPOSURE] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the Exposure | ||||
|      * | ||||
|      * @return float|boolean | ||||
|      */ | ||||
|     public function getExposureMilliseconds() | ||||
|     { | ||||
|         if (!isset($this->data[self::EXPOSURE])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         if (is_numeric($this->data[self::EXPOSURE])) { | ||||
|             return $this->data[self::EXPOSURE] + 0; | ||||
|         } | ||||
|  | ||||
|         $exposureParts = explode('/', $this->data[self::EXPOSURE]); | ||||
|  | ||||
|         return (int) reset($exposureParts) / (int) end($exposureParts); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the focus distance, if it exists | ||||
|      * | ||||
|      * @return string|boolean | ||||
|      */ | ||||
|     public function getFocusDistance() | ||||
|     { | ||||
|         if (!isset($this->data[self::FOCAL_DISTANCE])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::FOCAL_DISTANCE]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the focus distance | ||||
|      * | ||||
|      * @param string $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setFocusDistance($value) | ||||
|     { | ||||
|         $this->data[self::FOCAL_DISTANCE] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the width in pixels, if it exists | ||||
|      * | ||||
|      * @return int|boolean | ||||
|      */ | ||||
|     public function getWidth() | ||||
|     { | ||||
|         if (!isset($this->data[self::WIDTH])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::WIDTH]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the width | ||||
|      * | ||||
|      * @param int $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setWidth($value) | ||||
|     { | ||||
|         $this->data[self::WIDTH] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the height in pixels, if it exists | ||||
|      * | ||||
|      * @return int|boolean | ||||
|      */ | ||||
|     public function getHeight() | ||||
|     { | ||||
|         if (!isset($this->data[self::HEIGHT])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::HEIGHT]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the height | ||||
|      * | ||||
|      * @param int $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setHeight($value) | ||||
|     { | ||||
|         $this->data[self::HEIGHT] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the title, if it exists | ||||
|      * | ||||
|      * @return string|boolean | ||||
|      */ | ||||
|     public function getTitle() | ||||
|     { | ||||
|         if (!isset($this->data[self::TITLE])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::TITLE]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the title | ||||
|      * | ||||
|      * @param string $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setTitle($value) | ||||
|     { | ||||
|         $this->data[self::TITLE] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the caption, if it exists | ||||
|      * | ||||
|      * @return string|boolean | ||||
|      */ | ||||
|     public function getCaption() | ||||
|     { | ||||
|         if (!isset($this->data[self::CAPTION])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::CAPTION]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the caption | ||||
|      * | ||||
|      * @param string $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setCaption($value) | ||||
|     { | ||||
|         $this->data[self::CAPTION] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the copyright, if it exists | ||||
|      * | ||||
|      * @return string|boolean | ||||
|      */ | ||||
|     public function getCopyright() | ||||
|     { | ||||
|         if (!isset($this->data[self::COPYRIGHT])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::COPYRIGHT]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the copyright | ||||
|      * | ||||
|      * @param string $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setCopyright($value) | ||||
|     { | ||||
|         $this->data[self::COPYRIGHT] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the keywords, if they exists | ||||
|      * | ||||
|      * @return array|boolean | ||||
|      */ | ||||
|     public function getKeywords() | ||||
|     { | ||||
|         if (!isset($this->data[self::KEYWORDS])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::KEYWORDS]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the keywords | ||||
|      * | ||||
|      * @param array $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setKeywords($value) | ||||
|     { | ||||
|         $this->data[self::KEYWORDS] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the camera, if it exists | ||||
|      * | ||||
|      * @return string|boolean | ||||
|      */ | ||||
|     public function getCamera() | ||||
|     { | ||||
|         if (!isset($this->data[self::CAMERA])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::CAMERA]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the camera | ||||
|      * | ||||
|      * @param string $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setCamera($value) | ||||
|     { | ||||
|         $this->data[self::CAMERA] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the horizontal resolution in DPI, if it exists | ||||
|      * | ||||
|      * @return int|boolean | ||||
|      */ | ||||
|     public function getHorizontalResolution() | ||||
|     { | ||||
|         if (!isset($this->data[self::HORIZONTAL_RESOLUTION])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::HORIZONTAL_RESOLUTION]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the horizontal resolution in DPI | ||||
|      * | ||||
|      * @param int $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setHorizontalResolution($value) | ||||
|     { | ||||
|         $this->data[self::HORIZONTAL_RESOLUTION] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the vertical resolution in DPI, if it exists | ||||
|      * | ||||
|      * @return int|boolean | ||||
|      */ | ||||
|     public function getVerticalResolution() | ||||
|     { | ||||
|         if (!isset($this->data[self::VERTICAL_RESOLUTION])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::VERTICAL_RESOLUTION]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the vertical resolution in DPI | ||||
|      * | ||||
|      * @param int $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setVerticalResolution($value) | ||||
|     { | ||||
|         $this->data[self::VERTICAL_RESOLUTION] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the software, if it exists | ||||
|      * | ||||
|      * @return string|boolean | ||||
|      */ | ||||
|     public function getSoftware() | ||||
|     { | ||||
|         if (!isset($this->data[self::SOFTWARE])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::SOFTWARE]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the software | ||||
|      * | ||||
|      * @param string $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setSoftware($value) | ||||
|     { | ||||
|         $this->data[self::SOFTWARE] = trim($value); | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the focal length in mm, if it exists | ||||
|      * | ||||
|      * @return float|boolean | ||||
|      */ | ||||
|     public function getFocalLength() | ||||
|     { | ||||
|         if (!isset($this->data[self::FOCAL_LENGTH])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::FOCAL_LENGTH]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the focal length in mm | ||||
|      * | ||||
|      * @param float $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setFocalLength($value) | ||||
|     { | ||||
|         $this->data[self::FOCAL_LENGTH] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the creation datetime, if it exists | ||||
|      * | ||||
|      * @return \DateTime|boolean | ||||
|      */ | ||||
|     public function getCreationDate() | ||||
|     { | ||||
|         if (!isset($this->data[self::CREATION_DATE])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::CREATION_DATE]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the creation datetime | ||||
|      * | ||||
|      * @param \DateTime $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setCreationDate(\DateTime $value) | ||||
|     { | ||||
|         $this->data[self::CREATION_DATE] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Returns the colorspace, if it exists | ||||
|      * | ||||
|      * @return string|boolean | ||||
|      */ | ||||
|     public function getColorSpace() | ||||
|     { | ||||
|         if (!isset($this->data[self::COLORSPACE])) { | ||||
|             return false; | ||||
|         } | ||||
|          | ||||
|         return $this->data[self::COLORSPACE]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the colorspace | ||||
|      * | ||||
|      * @param string $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setColorSpace($value) | ||||
|     { | ||||
|         $this->data[self::COLORSPACE] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Returns the mimetype, if it exists | ||||
|      * | ||||
|      * @return string|boolean | ||||
|      */ | ||||
|     public function getMimeType() | ||||
|     { | ||||
|         if (!isset($this->data[self::MIMETYPE])) { | ||||
|             return false; | ||||
|         } | ||||
|          | ||||
|         return $this->data[self::MIMETYPE]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the mimetype | ||||
|      * | ||||
|      * @param string $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setMimeType($value) | ||||
|     { | ||||
|         $this->data[self::MIMETYPE] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Returns the filesize, if it exists | ||||
|      *  | ||||
|      * @return int|boolean | ||||
|      */ | ||||
|     public function getFileSize() | ||||
|     { | ||||
|         if (!isset($this->data[self::FILESIZE])) { | ||||
|             return false; | ||||
|         } | ||||
|          | ||||
|         return $this->data[self::FILESIZE]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the filesize | ||||
|      * | ||||
|      * @param int $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setFileSize($value) | ||||
|     { | ||||
|         $this->data[self::FILESIZE] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the orientation, if it exists | ||||
|      * | ||||
|      * @return int|boolean | ||||
|      */ | ||||
|     public function getOrientation() | ||||
|     { | ||||
|         if (!isset($this->data[self::ORIENTATION])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::ORIENTATION]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the orientation | ||||
|      * | ||||
|      * @param int $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setOrientation($value) | ||||
|     { | ||||
|         $this->data[self::ORIENTATION] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns GPS coordinates, if it exists | ||||
|      * | ||||
|      * @return array|boolean | ||||
|      */ | ||||
|     public function getGPS() | ||||
|     { | ||||
|         if (!isset($this->data[self::GPS])) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return $this->data[self::GPS]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the GPS coordinates | ||||
|      * | ||||
|      * @param string $value | ||||
|      * @return \PHPExif\Exif | ||||
|      */ | ||||
|     public function setGPS($value) | ||||
|     { | ||||
|         $this->data[self::GPS] = $value; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										33
									
								
								vendor/miljar/php-exif/lib/PHPExif/Hydrator/HydratorInterface.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								vendor/miljar/php-exif/lib/PHPExif/Hydrator/HydratorInterface.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PHP Exif Hydrator Interface: Defines the interface for a hydrator | ||||
|  * | ||||
|  * @link        http://github.com/miljar/PHPExif for the canonical source repository | ||||
|  * @copyright   Copyright (c) 2015 Tom Van Herreweghe <tom@theanalogguy.be> | ||||
|  * @license     http://github.com/miljar/PHPExif/blob/master/LICENSE MIT License | ||||
|  * @category    PHPExif | ||||
|  * @package     Hydrator | ||||
|  * @codeCoverageIgnore | ||||
|  */ | ||||
|  | ||||
| namespace PHPExif\Hydrator; | ||||
|  | ||||
| /** | ||||
|  * PHP Exif Hydrator | ||||
|  * | ||||
|  * Defines the interface for a hydrator | ||||
|  * | ||||
|  * @category    PHPExif | ||||
|  * @package     Hydrator | ||||
|  */ | ||||
| interface HydratorInterface | ||||
| { | ||||
|     /** | ||||
|      * Hydrates given array of data into the given Exif object | ||||
|      * | ||||
|      * @param object $object | ||||
|      * @param array $data | ||||
|      * @return void | ||||
|      */ | ||||
|     public function hydrate($object, array $data); | ||||
| } | ||||
							
								
								
									
										56
									
								
								vendor/miljar/php-exif/lib/PHPExif/Hydrator/Mutator.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								vendor/miljar/php-exif/lib/PHPExif/Hydrator/Mutator.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PHP Exif Mutator Hydrator: Hydrate an object | ||||
|  * by manipulating the object with its mutator methods | ||||
|  * | ||||
|  * @link        http://github.com/miljar/PHPExif for the canonical source repository | ||||
|  * @copyright   Copyright (c) 2015 Tom Van Herreweghe <tom@theanalogguy.be> | ||||
|  * @license     http://github.com/miljar/PHPExif/blob/master/LICENSE MIT License | ||||
|  * @category    PHPExif | ||||
|  * @package     Hydrator | ||||
|  */ | ||||
|  | ||||
| namespace PHPExif\Hydrator; | ||||
|  | ||||
| /** | ||||
|  * PHP Exif Mutator Hydrator | ||||
|  * | ||||
|  * Hydrates an object by setting data with | ||||
|  * the class mutator methods | ||||
|  * | ||||
|  * @category    PHPExif | ||||
|  * @package     Hydrator | ||||
|  */ | ||||
| class Mutator implements HydratorInterface | ||||
| { | ||||
|     /** | ||||
|      * Hydrates given array of data into the given Exif object | ||||
|      * | ||||
|      * @param object $object | ||||
|      * @param array $data | ||||
|      * @return void | ||||
|      */ | ||||
|     public function hydrate($object, array $data) | ||||
|     { | ||||
|         foreach ($data as $property => $value) { | ||||
|  | ||||
|             $mutator = $this->determineMutator($property); | ||||
|  | ||||
|             if (method_exists($object, $mutator)) { | ||||
|                 $object->$mutator($value); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Determines the name of the mutator method for given property name | ||||
|      * | ||||
|      * @param string $property  The property to determine the mutator for | ||||
|      * @return string   The name of the mutator method | ||||
|      */ | ||||
|     protected function determineMutator($property) | ||||
|     { | ||||
|         $method = 'set' . ucfirst($property); | ||||
|         return $method; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										210
									
								
								vendor/miljar/php-exif/lib/PHPExif/Mapper/Exiftool.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								vendor/miljar/php-exif/lib/PHPExif/Mapper/Exiftool.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,210 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PHP Exif Exiftool Mapper | ||||
|  * | ||||
|  * @link        http://github.com/miljar/PHPExif for the canonical source repository | ||||
|  * @copyright   Copyright (c) 2015 Tom Van Herreweghe <tom@theanalogguy.be> | ||||
|  * @license     http://github.com/miljar/PHPExif/blob/master/LICENSE MIT License | ||||
|  * @category    PHPExif | ||||
|  * @package     Mapper | ||||
|  */ | ||||
|  | ||||
| namespace PHPExif\Mapper; | ||||
|  | ||||
| use PHPExif\Exif; | ||||
| use DateTime; | ||||
|  | ||||
| /** | ||||
|  * PHP Exif Exiftool Mapper | ||||
|  * | ||||
|  * Maps Exiftool raw data to valid data for the \PHPExif\Exif class | ||||
|  * | ||||
|  * @category    PHPExif | ||||
|  * @package     Mapper | ||||
|  */ | ||||
| class Exiftool implements MapperInterface | ||||
| { | ||||
|     const APERTURE                 = 'Composite:Aperture'; | ||||
|     const APPROXIMATEFOCUSDISTANCE = 'XMP-aux:ApproximateFocusDistance'; | ||||
|     const ARTIST                   = 'IFD0:Artist'; | ||||
|     const CAPTION                  = 'XMP-acdsee'; | ||||
|     const CAPTIONABSTRACT          = 'IPTC:Caption-Abstract'; | ||||
|     const COLORSPACE               = 'ExifIFD:ColorSpace'; | ||||
|     const COPYRIGHT                = 'IFD0:Copyright'; | ||||
|     const DATETIMEORIGINAL         = 'ExifIFD:DateTimeOriginal'; | ||||
|     const CREDIT                   = 'IPTC:Credit'; | ||||
|     const EXPOSURETIME             = 'ExifIFD:ExposureTime'; | ||||
|     const FILESIZE                 = 'System:FileSize'; | ||||
|     const FOCALLENGTH              = 'ExifIFD:FocalLength'; | ||||
|     const HEADLINE                 = 'IPTC:Headline'; | ||||
|     const IMAGEHEIGHT              = 'File:ImageHeight'; | ||||
|     const IMAGEWIDTH               = 'File:ImageWidth'; | ||||
|     const ISO                      = 'ExifIFD:ISO'; | ||||
|     const JOBTITLE                 = 'IPTC:By-lineTitle'; | ||||
|     const KEYWORDS                 = 'IPTC:Keywords'; | ||||
|     const MIMETYPE                 = 'File:MIMEType'; | ||||
|     const MODEL                    = 'IFD0:Model'; | ||||
|     const ORIENTATION              = 'IFD0:Orientation'; | ||||
|     const SOFTWARE                 = 'IFD0:Software'; | ||||
|     const SOURCE                   = 'IPTC:Source'; | ||||
|     const TITLE                    = 'IPTC:ObjectName'; | ||||
|     const XRESOLUTION              = 'IFD0:XResolution'; | ||||
|     const YRESOLUTION              = 'IFD0:YResolution'; | ||||
|     const GPSLATITUDE              = 'GPS:GPSLatitude'; | ||||
|     const GPSLONGITUDE             = 'GPS:GPSLongitude'; | ||||
|  | ||||
|     /** | ||||
|      * Maps the ExifTool fields to the fields of | ||||
|      * the \PHPExif\Exif class | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $map = array( | ||||
|         self::APERTURE                 => Exif::APERTURE, | ||||
|         self::ARTIST                   => Exif::AUTHOR, | ||||
|         self::MODEL                    => Exif::CAMERA, | ||||
|         self::CAPTION                  => Exif::CAPTION, | ||||
|         self::COLORSPACE               => Exif::COLORSPACE, | ||||
|         self::COPYRIGHT                => Exif::COPYRIGHT, | ||||
|         self::DATETIMEORIGINAL         => Exif::CREATION_DATE, | ||||
|         self::CREDIT                   => Exif::CREDIT, | ||||
|         self::EXPOSURETIME             => Exif::EXPOSURE, | ||||
|         self::FILESIZE                 => Exif::FILESIZE, | ||||
|         self::FOCALLENGTH              => Exif::FOCAL_LENGTH, | ||||
|         self::APPROXIMATEFOCUSDISTANCE => Exif::FOCAL_DISTANCE, | ||||
|         self::HEADLINE                 => Exif::HEADLINE, | ||||
|         self::IMAGEHEIGHT              => Exif::HEIGHT, | ||||
|         self::XRESOLUTION              => Exif::HORIZONTAL_RESOLUTION, | ||||
|         self::ISO                      => Exif::ISO, | ||||
|         self::JOBTITLE                 => Exif::JOB_TITLE, | ||||
|         self::KEYWORDS                 => Exif::KEYWORDS, | ||||
|         self::MIMETYPE                 => Exif::MIMETYPE, | ||||
|         self::ORIENTATION              => Exif::ORIENTATION, | ||||
|         self::SOFTWARE                 => Exif::SOFTWARE, | ||||
|         self::SOURCE                   => Exif::SOURCE, | ||||
|         self::TITLE                    => Exif::TITLE, | ||||
|         self::YRESOLUTION              => Exif::VERTICAL_RESOLUTION, | ||||
|         self::IMAGEWIDTH               => Exif::WIDTH, | ||||
|         self::CAPTIONABSTRACT          => Exif::CAPTION, | ||||
|         self::GPSLATITUDE              => Exif::GPS, | ||||
|         self::GPSLONGITUDE             => Exif::GPS, | ||||
|     ); | ||||
|  | ||||
|     /** | ||||
|      * @var bool | ||||
|      */ | ||||
|     protected $numeric = true; | ||||
|  | ||||
|     /** | ||||
|      * Mutator method for the numeric property | ||||
|      * | ||||
|      * @param bool $numeric | ||||
|      * @return \PHPExif\Mapper\Exiftool | ||||
|      */ | ||||
|     public function setNumeric($numeric) | ||||
|     { | ||||
|         $this->numeric = (bool) $numeric; | ||||
|  | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Maps the array of raw source data to the correct | ||||
|      * fields for the \PHPExif\Exif class | ||||
|      * | ||||
|      * @param array $data | ||||
|      * @return array | ||||
|      */ | ||||
|     public function mapRawData(array $data) | ||||
|     { | ||||
|         $mappedData = array(); | ||||
|         $gpsData = array(); | ||||
|         foreach ($data as $field => $value) { | ||||
|             if (!array_key_exists($field, $this->map)) { | ||||
|                 // silently ignore unknown fields | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             $key = $this->map[$field]; | ||||
|  | ||||
|             // manipulate the value if necessary | ||||
|             switch ($field) { | ||||
|                 case self::APERTURE: | ||||
|                     $value = sprintf('f/%01.1f', $value); | ||||
|                     break; | ||||
|                 case self::APPROXIMATEFOCUSDISTANCE: | ||||
|                     $value = sprintf('%1$sm', $value); | ||||
|                     break; | ||||
|                 case self::DATETIMEORIGINAL: | ||||
|                     try { | ||||
|                         $value = new DateTime($value); | ||||
|                     } catch (\Exception $exception) { | ||||
|                         continue 2; | ||||
|                     } | ||||
|                     break; | ||||
|                 case self::EXPOSURETIME: | ||||
|                     // Based on the source code of Exiftool (PrintExposureTime subroutine): | ||||
|                     // http://cpansearch.perl.org/src/EXIFTOOL/Image-ExifTool-9.90/lib/Image/ExifTool/Exif.pm | ||||
|                     if ($value < 0.25001 && $value > 0) { | ||||
|                         $value = sprintf('1/%d', intval(0.5 + 1 / $value)); | ||||
|                     } else { | ||||
|                         $value = sprintf('%.1f', $value); | ||||
|                         $value = preg_replace('/.0$/', '', $value); | ||||
|                     } | ||||
|                     break; | ||||
|                 case self::FOCALLENGTH: | ||||
|                     if (!$this->numeric || strpos($value, ' ') !== false) { | ||||
|                         $focalLengthParts = explode(' ', $value); | ||||
|                         $value = reset($focalLengthParts); | ||||
|                     } | ||||
|                     break; | ||||
|                 case self::GPSLATITUDE: | ||||
|                     $gpsData['lat']  = $this->extractGPSCoordinates($value); | ||||
|                     break; | ||||
|                 case self::GPSLONGITUDE: | ||||
|                     $gpsData['lon']  = $this->extractGPSCoordinates($value); | ||||
|                     break; | ||||
|             } | ||||
|  | ||||
|             // set end result | ||||
|             $mappedData[$key] = $value; | ||||
|         } | ||||
|  | ||||
|         // add GPS coordinates, if available | ||||
|         if (count($gpsData) === 2 && $gpsData['lat'] !== false && $gpsData['lon'] !== false) { | ||||
|             $latitudeRef = empty($data['GPS:GPSLatitudeRef'][0]) ? 'N' : $data['GPS:GPSLatitudeRef'][0]; | ||||
|             $longitudeRef = empty($data['GPS:GPSLongitudeRef'][0]) ? 'E' : $data['GPS:GPSLongitudeRef'][0]; | ||||
|  | ||||
|             $gpsLocation = sprintf( | ||||
|                 '%s,%s', | ||||
|                 (strtoupper($latitudeRef) === 'S' ? -1 : 1) * $gpsData['lat'], | ||||
|                 (strtoupper($longitudeRef) === 'W' ? -1 : 1) * $gpsData['lon'] | ||||
|             ); | ||||
|  | ||||
|             $mappedData[Exif::GPS] = $gpsLocation; | ||||
|         } else { | ||||
|             unset($mappedData[Exif::GPS]); | ||||
|         } | ||||
|  | ||||
|         return $mappedData; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Extract GPS coordinates from formatted string | ||||
|      * | ||||
|      * @param string $coordinates | ||||
|      * @return array | ||||
|      */ | ||||
|     protected function extractGPSCoordinates($coordinates) | ||||
|     { | ||||
|         if ($this->numeric === true) { | ||||
|             return abs((float) $coordinates); | ||||
|         } else { | ||||
|             if (!preg_match('!^([0-9.]+) deg ([0-9.]+)\' ([0-9.]+)"!', $coordinates, $matches)) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             return floatval($matches[1]) + (floatval($matches[2]) / 60) + (floatval($matches[3]) / 3600); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										33
									
								
								vendor/miljar/php-exif/lib/PHPExif/Mapper/MapperInterface.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								vendor/miljar/php-exif/lib/PHPExif/Mapper/MapperInterface.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PHP Exif Mapper Interface: Defines the interface for data mappers | ||||
|  * | ||||
|  * @link        http://github.com/miljar/PHPExif for the canonical source repository | ||||
|  * @copyright   Copyright (c) 2015 Tom Van Herreweghe <tom@theanalogguy.be> | ||||
|  * @license     http://github.com/miljar/PHPExif/blob/master/LICENSE MIT License | ||||
|  * @category    PHPExif | ||||
|  * @package     Mapper | ||||
|  * @codeCoverageIgnore | ||||
|  */ | ||||
|  | ||||
| namespace PHPExif\Mapper; | ||||
|  | ||||
| /** | ||||
|  * PHP Exif Mapper | ||||
|  * | ||||
|  * Defines the interface for data mappers | ||||
|  * | ||||
|  * @category    PHPExif | ||||
|  * @package     Mapper | ||||
|  */ | ||||
| interface MapperInterface | ||||
| { | ||||
|     /** | ||||
|      * Maps the array of raw source data to the correct | ||||
|      * fields for the \PHPExif\Exif class | ||||
|      * | ||||
|      * @param array $data | ||||
|      * @return array | ||||
|      */ | ||||
|     public function mapRawData(array $data); | ||||
| } | ||||
							
								
								
									
										289
									
								
								vendor/miljar/php-exif/lib/PHPExif/Mapper/Native.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										289
									
								
								vendor/miljar/php-exif/lib/PHPExif/Mapper/Native.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,289 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PHP Exif Native Mapper | ||||
|  * | ||||
|  * @link        http://github.com/miljar/PHPExif for the canonical source repository | ||||
|  * @copyright   Copyright (c) 2015 Tom Van Herreweghe <tom@theanalogguy.be> | ||||
|  * @license     http://github.com/miljar/PHPExif/blob/master/LICENSE MIT License | ||||
|  * @category    PHPExif | ||||
|  * @package     Mapper | ||||
|  */ | ||||
|  | ||||
| namespace PHPExif\Mapper; | ||||
|  | ||||
| use PHPExif\Exif; | ||||
| use DateTime; | ||||
| use Exception; | ||||
|  | ||||
| /** | ||||
|  * PHP Exif Native Mapper | ||||
|  * | ||||
|  * Maps native raw data to valid data for the \PHPExif\Exif class | ||||
|  * | ||||
|  * @category    PHPExif | ||||
|  * @package     Mapper | ||||
|  */ | ||||
| class Native implements MapperInterface | ||||
| { | ||||
|     const APERTUREFNUMBER  = 'ApertureFNumber'; | ||||
|     const ARTIST           = 'Artist'; | ||||
|     const CAPTION          = 'caption'; | ||||
|     const COLORSPACE       = 'ColorSpace'; | ||||
|     const COPYRIGHT        = 'copyright'; | ||||
|     const DATETIMEORIGINAL = 'DateTimeOriginal'; | ||||
|     const CREDIT           = 'credit'; | ||||
|     const EXPOSURETIME     = 'ExposureTime'; | ||||
|     const FILESIZE         = 'FileSize'; | ||||
|     const FOCALLENGTH      = 'FocalLength'; | ||||
|     const FOCUSDISTANCE    = 'FocusDistance'; | ||||
|     const HEADLINE         = 'headline'; | ||||
|     const HEIGHT           = 'Height'; | ||||
|     const ISOSPEEDRATINGS  = 'ISOSpeedRatings'; | ||||
|     const JOBTITLE         = 'jobtitle'; | ||||
|     const KEYWORDS         = 'keywords'; | ||||
|     const MIMETYPE         = 'MimeType'; | ||||
|     const MODEL            = 'Model'; | ||||
|     const ORIENTATION      = 'Orientation'; | ||||
|     const SOFTWARE         = 'Software'; | ||||
|     const SOURCE           = 'source'; | ||||
|     const TITLE            = 'title'; | ||||
|     const WIDTH            = 'Width'; | ||||
|     const XRESOLUTION      = 'XResolution'; | ||||
|     const YRESOLUTION      = 'YResolution'; | ||||
|     const GPSLATITUDE      = 'GPSLatitude'; | ||||
|     const GPSLONGITUDE     = 'GPSLongitude'; | ||||
|  | ||||
|     const SECTION_FILE      = 'FILE'; | ||||
|     const SECTION_COMPUTED  = 'COMPUTED'; | ||||
|     const SECTION_IFD0      = 'IFD0'; | ||||
|     const SECTION_THUMBNAIL = 'THUMBNAIL'; | ||||
|     const SECTION_COMMENT   = 'COMMENT'; | ||||
|     const SECTION_EXIF      = 'EXIF'; | ||||
|     const SECTION_ALL       = 'ANY_TAG'; | ||||
|     const SECTION_IPTC      = 'IPTC'; | ||||
|  | ||||
|     /** | ||||
|      * A list of section names | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $sections = array( | ||||
|         self::SECTION_FILE, | ||||
|         self::SECTION_COMPUTED, | ||||
|         self::SECTION_IFD0, | ||||
|         self::SECTION_THUMBNAIL, | ||||
|         self::SECTION_COMMENT, | ||||
|         self::SECTION_EXIF, | ||||
|         self::SECTION_ALL, | ||||
|         self::SECTION_IPTC, | ||||
|     ); | ||||
|  | ||||
|     /** | ||||
|      * Maps the ExifTool fields to the fields of | ||||
|      * the \PHPExif\Exif class | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $map = array( | ||||
|         self::APERTUREFNUMBER  => Exif::APERTURE, | ||||
|         self::FOCUSDISTANCE    => Exif::FOCAL_DISTANCE, | ||||
|         self::HEIGHT           => Exif::HEIGHT, | ||||
|         self::WIDTH            => Exif::WIDTH, | ||||
|         self::CAPTION          => Exif::CAPTION, | ||||
|         self::COPYRIGHT        => Exif::COPYRIGHT, | ||||
|         self::CREDIT           => Exif::CREDIT, | ||||
|         self::HEADLINE         => Exif::HEADLINE, | ||||
|         self::JOBTITLE         => Exif::JOB_TITLE, | ||||
|         self::KEYWORDS         => Exif::KEYWORDS, | ||||
|         self::SOURCE           => Exif::SOURCE, | ||||
|         self::TITLE            => Exif::TITLE, | ||||
|         self::ARTIST           => Exif::AUTHOR, | ||||
|         self::MODEL            => Exif::CAMERA, | ||||
|         self::COLORSPACE       => Exif::COLORSPACE, | ||||
|         self::DATETIMEORIGINAL => Exif::CREATION_DATE, | ||||
|         self::EXPOSURETIME     => Exif::EXPOSURE, | ||||
|         self::FILESIZE         => Exif::FILESIZE, | ||||
|         self::FOCALLENGTH      => Exif::FOCAL_LENGTH, | ||||
|         self::ISOSPEEDRATINGS  => Exif::ISO, | ||||
|         self::MIMETYPE         => Exif::MIMETYPE, | ||||
|         self::ORIENTATION      => Exif::ORIENTATION, | ||||
|         self::SOFTWARE         => Exif::SOFTWARE, | ||||
|         self::XRESOLUTION      => Exif::HORIZONTAL_RESOLUTION, | ||||
|         self::YRESOLUTION      => Exif::VERTICAL_RESOLUTION, | ||||
|         self::GPSLATITUDE      => Exif::GPS, | ||||
|         self::GPSLONGITUDE     => Exif::GPS, | ||||
|     ); | ||||
|  | ||||
|     /** | ||||
|      * Maps the array of raw source data to the correct | ||||
|      * fields for the \PHPExif\Exif class | ||||
|      * | ||||
|      * @param array $data | ||||
|      * @return array | ||||
|      */ | ||||
|     public function mapRawData(array $data) | ||||
|     { | ||||
|         $mappedData = array(); | ||||
|         $gpsData = array(); | ||||
|         foreach ($data as $field => $value) { | ||||
|             if ($this->isSection($field) && is_array($value)) { | ||||
|                 $subData = $this->mapRawData($value); | ||||
|  | ||||
|                 $mappedData = array_merge($mappedData, $subData); | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             if (!$this->isFieldKnown($field)) { | ||||
|                 // silently ignore unknown fields | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             $key = $this->map[$field]; | ||||
|  | ||||
|             // manipulate the value if necessary | ||||
|             switch ($field) { | ||||
|                 case self::DATETIMEORIGINAL: | ||||
|                     try { | ||||
|                         $value = new DateTime($value); | ||||
|                     } catch (Exception $exception) { | ||||
|                         continue 2; | ||||
|                     } | ||||
|                     break; | ||||
|                 case self::EXPOSURETIME: | ||||
|                     if (!is_float($value)) { | ||||
|                         $value = $this->normalizeComponent($value); | ||||
|                     } | ||||
|  | ||||
|                     // Based on the source code of Exiftool (PrintExposureTime subroutine): | ||||
|                     // http://cpansearch.perl.org/src/EXIFTOOL/Image-ExifTool-9.90/lib/Image/ExifTool/Exif.pm | ||||
|                     if ($value < 0.25001 && $value > 0) { | ||||
|                         $value = sprintf('1/%d', intval(0.5 + 1 / $value)); | ||||
|                     } else { | ||||
|                         $value = sprintf('%.1f', $value); | ||||
|                         $value = preg_replace('/.0$/', '', $value); | ||||
|                     } | ||||
|                     break; | ||||
|                 case self::FOCALLENGTH: | ||||
|                     $parts = explode('/', $value); | ||||
|                     // Avoid division by zero if focal length is invalid | ||||
|                     if (end($parts) == '0') { | ||||
|                         $value = 0; | ||||
|                     } else { | ||||
|                         $value = (int) reset($parts) / (int) end($parts); | ||||
|                     } | ||||
|                     break; | ||||
|                 case self::XRESOLUTION: | ||||
|                 case self::YRESOLUTION: | ||||
|                     $resolutionParts = explode('/', $value); | ||||
|                     $value = (int) reset($resolutionParts); | ||||
|                     break; | ||||
|                 case self::GPSLATITUDE: | ||||
|                     $gpsData['lat'] = $this->extractGPSCoordinate($value); | ||||
|                     break; | ||||
|                 case self::GPSLONGITUDE: | ||||
|                     $gpsData['lon'] = $this->extractGPSCoordinate($value); | ||||
|                     break; | ||||
|             } | ||||
|  | ||||
|             // set end result | ||||
|             $mappedData[$key] = $value; | ||||
|         } | ||||
|  | ||||
|         // add GPS coordinates, if available | ||||
|         if (count($gpsData) === 2) { | ||||
|             $latitudeRef = empty($data['GPSLatitudeRef'][0]) ? 'N' : $data['GPSLatitudeRef'][0]; | ||||
|             $longitudeRef = empty($data['GPSLongitudeRef'][0]) ? 'E' : $data['GPSLongitudeRef'][0]; | ||||
|  | ||||
|             $gpsLocation = sprintf( | ||||
|                 '%s,%s', | ||||
|                 (strtoupper($latitudeRef) === 'S' ? -1 : 1) * $gpsData['lat'], | ||||
|                 (strtoupper($longitudeRef) === 'W' ? -1 : 1) * $gpsData['lon'] | ||||
|             ); | ||||
|  | ||||
|             $mappedData[Exif::GPS] = $gpsLocation; | ||||
|         } else { | ||||
|             unset($mappedData[Exif::GPS]); | ||||
|         } | ||||
|  | ||||
|         return $mappedData; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Determines if given field is a section | ||||
|      * | ||||
|      * @param string $field | ||||
|      * @return bool | ||||
|      */ | ||||
|     protected function isSection($field) | ||||
|     { | ||||
|         return (in_array($field, $this->sections)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Determines if the given field is known, | ||||
|      * in a case insensitive way for its first letter. | ||||
|      * Also update $field to keep it valid against the known fields. | ||||
|      * | ||||
|      * @param  string  &$field | ||||
|      * @return bool | ||||
|      */ | ||||
|     protected function isFieldKnown(&$field) | ||||
|     { | ||||
|         $lcfField = lcfirst($field); | ||||
|         if (array_key_exists($lcfField, $this->map)) { | ||||
|             $field = $lcfField; | ||||
|  | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         $ucfField = ucfirst($field); | ||||
|         if (array_key_exists($ucfField, $this->map)) { | ||||
|             $field = $ucfField; | ||||
|  | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Extract GPS coordinates from components array | ||||
|      * | ||||
|      * @param array|string $components | ||||
|      * @return float | ||||
|      */ | ||||
|     protected function extractGPSCoordinate($components) | ||||
|     { | ||||
|         if (!is_array($components)) { | ||||
|             $components = array($components); | ||||
|         } | ||||
|         $components = array_map(array($this, 'normalizeComponent'), $components); | ||||
|  | ||||
|         if (count($components) > 2) { | ||||
|             return floatval($components[0]) + (floatval($components[1]) / 60) + (floatval($components[2]) / 3600); | ||||
|         } | ||||
|  | ||||
|         return reset($components); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Normalize component | ||||
|      * | ||||
|      * @param mixed $component | ||||
|      * @return int|float | ||||
|      */ | ||||
|     protected function normalizeComponent($component) | ||||
|     { | ||||
|         $parts = explode('/', $component); | ||||
|  | ||||
|         if (count($parts) > 1) { | ||||
|             if ($parts[1]) { | ||||
|                 return intval($parts[0]) / intval($parts[1]); | ||||
|             } | ||||
|  | ||||
|             return 0; | ||||
|         } | ||||
|  | ||||
|         return floatval(reset($parts)); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										111
									
								
								vendor/miljar/php-exif/lib/PHPExif/Reader/Reader.php
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										111
									
								
								vendor/miljar/php-exif/lib/PHPExif/Reader/Reader.php
									
									
									
									
										vendored
									
									
										Executable file
									
								
							| @@ -0,0 +1,111 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PHP Exif Reader: Reads EXIF metadata from a file | ||||
|  * | ||||
|  * @link        http://github.com/miljar/PHPExif for the canonical source repository | ||||
|  * @copyright   Copyright (c) 2013 Tom Van Herreweghe <tom@theanalogguy.be> | ||||
|  * @license     http://github.com/miljar/PHPExif/blob/master/LICENSE MIT License | ||||
|  * @category    PHPExif | ||||
|  * @package     Reader | ||||
|  */ | ||||
|  | ||||
| namespace PHPExif\Reader; | ||||
|  | ||||
| use PHPExif\Adapter\AdapterInterface; | ||||
| use PHPExif\Adapter\NoAdapterException; | ||||
| use PHPExif\Adapter\Exiftool as ExiftoolAdapter; | ||||
| use PHPExif\Adapter\Native as NativeAdapter; | ||||
|  | ||||
| /** | ||||
|  * PHP Exif Reader | ||||
|  * | ||||
|  * Responsible for all the read operations on a file's EXIF metadata | ||||
|  * | ||||
|  * @category    PHPExif | ||||
|  * @package     Reader | ||||
|  * @ | ||||
|  */ | ||||
| class Reader implements ReaderInterface | ||||
| { | ||||
|     const TYPE_NATIVE   = 'native'; | ||||
|     const TYPE_EXIFTOOL = 'exiftool'; | ||||
|  | ||||
|     /** | ||||
|      * The current adapter | ||||
|      * | ||||
|      * @var \PHPExif\Adapter\AdapterInterface | ||||
|      */ | ||||
|     protected $adapter; | ||||
|  | ||||
|     /** | ||||
|      * Reader constructor | ||||
|      * | ||||
|      * @param \PHPExif\Adapter\AdapterInterface $adapter | ||||
|      */ | ||||
|     public function __construct(AdapterInterface $adapter) | ||||
|     { | ||||
|         $this->adapter = $adapter; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Getter for the reader adapter | ||||
|      * | ||||
|      * @return \PHPExif\Adapter\AdapterInterface | ||||
|      * @throws NoAdapterException When no adapter is set | ||||
|      */ | ||||
|     public function getAdapter() | ||||
|     { | ||||
|         if (empty($this->adapter)) { | ||||
|             throw new NoAdapterException('No adapter set in the reader'); | ||||
|         } | ||||
|  | ||||
|         return $this->adapter; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Factory for the reader | ||||
|      * | ||||
|      * @param string $type | ||||
|      * @return $this | ||||
|      * @throws \InvalidArgumentException When given type is invalid | ||||
|      */ | ||||
|     public static function factory($type) | ||||
|     { | ||||
|         $classname = get_called_class(); | ||||
|         switch ($type) { | ||||
|             case self::TYPE_NATIVE: | ||||
|                 $adapter = new NativeAdapter(); | ||||
|                 break; | ||||
|             case self::TYPE_EXIFTOOL: | ||||
|                 $adapter = new ExiftoolAdapter(); | ||||
|                 break; | ||||
|             default: | ||||
|                 throw new \InvalidArgumentException( | ||||
|                     sprintf('Unknown type "%1$s"', $type) | ||||
|                 ); | ||||
|         } | ||||
|         return new $classname($adapter); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Reads & parses the EXIF data from given file | ||||
|      * | ||||
|      * @param string $file | ||||
|      * @return \PHPExif\Exif Instance of Exif object with data | ||||
|      */ | ||||
|     public function read($file) | ||||
|     { | ||||
|         return $this->getAdapter()->getExifFromFile($file); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * alias to read method | ||||
|      * | ||||
|      * @param string $file | ||||
|      * @return \PHPExif\Exif Instance of Exif object with data | ||||
|      */ | ||||
|     public function getExifFromFile($file) | ||||
|     { | ||||
|         return $this->read($file); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										33
									
								
								vendor/miljar/php-exif/lib/PHPExif/Reader/ReaderInterface.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								vendor/miljar/php-exif/lib/PHPExif/Reader/ReaderInterface.php
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| <?php | ||||
| /** | ||||
|  * PHP Exif Reader Interface: Defines the interface for | ||||
|  * the Reader functionality | ||||
|  * | ||||
|  * @link        http://github.com/miljar/PHPExif for the canonical source repository | ||||
|  * @copyright   Copyright (c) 2015 Tom Van Herreweghe <tom@theanalogguy.be> | ||||
|  * @license     http://github.com/miljar/PHPExif/blob/master/LICENSE MIT License | ||||
|  * @category    PHPExif | ||||
|  * @package     Reader | ||||
|  * @codeCoverageIgnore | ||||
|  */ | ||||
|  | ||||
| namespace PHPExif\Reader; | ||||
|  | ||||
| /** | ||||
|  * PHP Exif Reader | ||||
|  * | ||||
|  * Defines the interface for reader functionality | ||||
|  * | ||||
|  * @category    PHPExif | ||||
|  * @package     Reader | ||||
|  */ | ||||
| interface ReaderInterface | ||||
| { | ||||
|     /** | ||||
|      * Reads & parses the EXIF data from given file | ||||
|      * | ||||
|      * @param string $file | ||||
|      * @return \PHPExif\Exif Instance of Exif object with data | ||||
|      */ | ||||
|     public function read($file); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user