Browse Source

Merge pull request #7 from electerious/develop

Develop
Quentin Ligier 8 years ago
parent
commit
66bf883d7f
5 changed files with 104 additions and 44 deletions
  1. 1 1
      docs/Update.md
  2. 65 43
      php/Modules/Photo.php
  3. 7 0
      php/Modules/Settings.php
  4. 30 0
      php/helpers/getGPSCoordinate.php
  5. 1 0
      php/index.php

+ 1 - 1
docs/Update.md

@@ -11,7 +11,7 @@ Updating Lychee with `git` is the easiest way:
 
 ### Update manually
 
-1. Download the [newest Version](https://github.com/electerious/Lychee/release)
+1. Download the [newest Version](https://github.com/electerious/Lychee/releases)
 2. Replace all existing files, excluding `uploads/` and `data/`
 3. Open Lychee (and enter your database details)
 

+ 65 - 43
php/Modules/Photo.php

@@ -239,7 +239,7 @@ final class Photo {
 		}
 
 		// Save to DB
-		$values = array(LYCHEE_TABLE_PHOTOS, $id, $info['title'], $photo_name, $info['description'], '', $info['type'], $info['width'], $info['height'], $info['size'], $info['iso'], $info['aperture'], $info['make'], $info['model'], $info['shutter'], $info['focal'], $info['takestamp'], $path_thumb, $albumID, $public, $star, $checksum, $medium);
+		$values = array(LYCHEE_TABLE_PHOTOS, $id, $info['title'], $photo_name, $info['description'], $info['tags'], $info['type'], $info['width'], $info['height'], $info['size'], $info['iso'], $info['aperture'], $info['make'], $info['model'], $info['shutter'], $info['focal'], $info['takestamp'], $path_thumb, $albumID, $public, $star, $checksum, $medium);
 		$query  = Database::prepare(Database::get(), "INSERT INTO ? (id, title, url, description, tags, type, width, height, size, iso, aperture, make, model, shutter, focal, takestamp, thumbUrl, album, public, star, checksum, medium) VALUES ('?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?')", $values);
 		$result = Database::execute(Database::get(), $query, __METHOD__, __LINE__);
 
@@ -307,7 +307,7 @@ final class Photo {
 		$newUrl2x  = LYCHEE_UPLOADS_THUMB . $photoName[0] . '@2x.jpeg';
 
 		// Create thumbnails with Imagick
-		if(extension_loaded('imagick')&&Settings::get()['imagick']==='1') {
+		if(Settings::hasImagick()) {
 
 			// Read image
 			$thumb = new Imagick();
@@ -727,86 +727,108 @@ final class Photo {
 		$info      = getimagesize($url, $iptcArray);
 
 		// General information
-		$return['type']   = $info['mime'];
-		$return['width']  = $info[0];
-		$return['height'] = $info[1];
+		$return['type']        = $info['mime'];
+		$return['width']       = $info[0];
+		$return['height']      = $info[1];
+		$return['title']       = '';
+		$return['description'] = '';
+		$return['orientation'] = '';
+		$return['iso']         = '';
+		$return['aperture']    = '';
+		$return['make']        = '';
+		$return['model']       = '';
+		$return['shutter']     = '';
+		$return['focal']       = '';
+		$return['takestamp']   = 0;
+		$return['lens']        = '';
+		$return['tags']        = array();
+		$return['position']    = '';
+		$return['latitude']    = '';
+		$return['longitude']   = '';
+		$return['altitude']    = '';
 
 		// Size
 		$size = filesize($url)/1024;
 		if ($size>=1024) $return['size'] = round($size/1024, 1) . ' MB';
 		else $return['size'] = round($size, 1) . ' KB';
 
-		// IPTC Metadata Fallback
-		$return['title']       = '';
-		$return['description'] = '';
-
 		// IPTC Metadata
+		// See https://www.iptc.org/std/IIM/4.2/specification/IIMV4.2.pdf for mapping
 		if(isset($iptcArray['APP13'])) {
 
 			$iptcInfo = iptcparse($iptcArray['APP13']);
 			if (is_array($iptcInfo)) {
 
-				$temp = @$iptcInfo['2#105'][0];
-				if (isset($temp)&&strlen($temp)>0) $return['title'] = $temp;
+				// Title
+				if (!empty($iptcInfo['2#105'][0])) $return['title'] = $iptcInfo['2#105'][0];
+				else if (!empty($iptcInfo['2#005'][0])) $return['title'] = $iptcInfo['2#005'][0];
 
-				$temp = @$iptcInfo['2#120'][0];
-				if (isset($temp)&&strlen($temp)>0) $return['description'] = $temp;
+				// Description
+				if (!empty($iptcInfo['2#120'][0])) $return['description'] = $iptcInfo['2#120'][0];
 
-				$temp = @$iptcInfo['2#005'][0];
-				if (isset($temp)&&strlen($temp)>0&&$return['title']==='') $return['title'] = $temp;
+				// Tags
+				if (!empty($iptcInfo['2#025'])) $return['tags'] = implode(',', $iptcInfo['2#025']);
+
+				// Position
+				$fields = array();
+				if (!empty($iptcInfo['2#090'])) $fields[] = trim($iptcInfo['2#090'][0]);
+				if (!empty($iptcInfo['2#092'])) $fields[] = trim($iptcInfo['2#092'][0]);
+				if (!empty($iptcInfo['2#095'])) $fields[] = trim($iptcInfo['2#095'][0]);
+				if (!empty($iptcInfo['2#101'])) $fields[] = trim($iptcInfo['2#101'][0]);
+
+				if (!empty($fields)) $return['position'] = implode(', ', $fields);
 
 			}
 
 		}
 
-		// EXIF Metadata Fallback
-		$return['orientation'] = '';
-		$return['iso']         = '';
-		$return['aperture']    = '';
-		$return['make']        = '';
-		$return['model']       = '';
-		$return['shutter']     = '';
-		$return['focal']       = '';
-		$return['takestamp']   = 0;
-
 		// Read EXIF
-		if ($info['mime']=='image/jpeg') $exif = @exif_read_data($url, 'EXIF', 0);
+		if ($info['mime']=='image/jpeg') $exif = exif_read_data($url, 'EXIF', 0);
 		else $exif = false;
 
 		// EXIF Metadata
 		if ($exif!==false) {
 
+			// Orientation
 			if (isset($exif['Orientation'])) $return['orientation'] = $exif['Orientation'];
 			else if (isset($exif['IFD0']['Orientation'])) $return['orientation'] = $exif['IFD0']['Orientation'];
 
-			$temp = @$exif['ISOSpeedRatings'];
-			if (isset($temp)) $return['iso'] = $temp;
+			// ISO
+			if (!empty($exif['ISOSpeedRatings'])) $return['iso'] = $exif['ISOSpeedRatings'];
 
-			$temp = @$exif['COMPUTED']['ApertureFNumber'];
-			if (isset($temp)) $return['aperture'] = $temp;
+			// Aperture
+			if (!empty($exif['COMPUTED']['ApertureFNumber'])) $return['aperture'] = $exif['COMPUTED']['ApertureFNumber'];
 
-			$temp = @$exif['Make'];
-			if (isset($temp)) $return['make'] = trim($temp);
+			// Make
+			if (!empty($exif['Make'])) $return['make'] = trim($exif['Make']);
 
-			$temp = @$exif['Model'];
-			if (isset($temp)) $return['model'] = trim($temp);
+			// Model
+			if (!empty($exif['Model'])) $return['model'] = trim($exif['Model']);
 
-			$temp = @$exif['ExposureTime'];
-			if (isset($temp)) $return['shutter'] = $exif['ExposureTime'] . ' s';
+			// Exposure
+			if (!empty($exif['ExposureTime'])) $return['shutter'] = $exif['ExposureTime'] . ' s';
 
-			$temp = @$exif['FocalLength'];
-			if (isset($temp)) {
-				if (strpos($temp, '/')!==FALSE) {
-					$temp = explode('/', $temp, 2);
+			// Focal Length
+			if (!empty($exif['FocalLength'])) {
+				if (strpos($exif['FocalLength'], '/')!==false) {
+					$temp = explode('/', $exif['FocalLength'], 2);
 					$temp = $temp[0] / $temp[1];
 					$temp = round($temp, 1);
 					$return['focal'] = $temp . ' mm';
+				} else {
+					$return['focal'] = $exif['FocalLength'] . ' mm';
 				}
-				$return['focal'] = $temp . ' mm';
 			}
 
-			$temp = @$exif['DateTimeOriginal'];
-			if (isset($temp)) $return['takestamp'] = strtotime($temp);
+			// Takestamp
+			if (!empty($exif['DateTimeOriginal'])) $return['takestamp'] = strtotime($exif['DateTimeOriginal']);
+
+			// Lens field from Lightroom
+			if (!empty($exif['UndefinedTag:0xA434'])) $return['lens'] = trim($exif['UndefinedTag:0xA434']);
+
+			// Deal with GPS coordinates
+			if (!empty($exif['GPSLatitude']) && !empty($exif['GPSLatitudeRef'])) $return['latitude'] = getGPSCoordinate($exif['GPSLatitude'], $exif['GPSLatitudeRef']);
+			if (!empty($exif['GPSLongitude']) && !empty($exif['GPSLongitudeRef'])) $return['longitude'] = getGPSCoordinate($exif['GPSLongitude'], $exif['GPSLongitudeRef']);
 
 		}
 

+ 7 - 0
php/Modules/Settings.php

@@ -221,6 +221,13 @@ final class Settings {
 
 	}
 
+	/**
+	 * @return array Returns the Imagick setting.
+	 */
+	public static function hasImagick() {
+		return (bool)(extension_loaded('imagick') && self::get()['imagick'] === '1');
+	}
+
 }
 
 ?>

+ 30 - 0
php/helpers/getGPSCoordinate.php

@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * Returns the normalized coordinate from EXIF array.
+ * @return string Normalized coordinate as float number (degrees).
+ */
+function getGPSCoordinate($coordinate, $ref) {
+
+	$degrees = count($coordinate) > 0 ? formattedToFloatGPS($coordinate[0]) : 0;
+	$minutes = count($coordinate) > 1 ? formattedToFloatGPS($coordinate[1]) : 0;
+	$seconds = count($coordinate) > 2 ? formattedToFloatGPS($coordinate[2]) : 0;
+
+	$flip = ($ref == 'W' || $ref == 'S') ? -1 : 1;
+
+	return $flip * ($degrees + (float)$minutes / 60 + (float)$seconds / 3600);
+
+}
+
+function formattedToFloatGPS($coordinate) {
+
+	$parts = explode('/', $coordinate, 2);
+
+	if (count($parts) <= 0) return 0;
+	if (count($parts) == 1) return $parts[0];
+
+	return (float)$parts[0] / $parts[1];
+
+}
+
+?>

+ 1 - 0
php/index.php

@@ -22,6 +22,7 @@ require(__DIR__ . '/autoload.php');
 require(__DIR__ . '/helpers/fastImageCopyResampled.php');
 require(__DIR__ . '/helpers/generateID.php');
 require(__DIR__ . '/helpers/getExtension.php');
+require(__DIR__ . '/helpers/getGPSCoordinate.php');
 require(__DIR__ . '/helpers/getGraphHeader.php');
 require(__DIR__ . '/helpers/getHashedString.php');
 require(__DIR__ . '/helpers/hasPermissions.php');