diff --git a/docs/Update.md b/docs/Update.md index ad8529c..0995733 100644 --- a/docs/Update.md +++ b/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) diff --git a/php/Modules/Photo.php b/php/Modules/Photo.php index 587cb8e..dc4a9c7 100755 --- a/php/Modules/Photo.php +++ b/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']); } diff --git a/php/Modules/Settings.php b/php/Modules/Settings.php index 018dc7c..681b621 100755 --- a/php/Modules/Settings.php +++ b/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'); + } + } ?> \ No newline at end of file diff --git a/php/helpers/getGPSCoordinate.php b/php/helpers/getGPSCoordinate.php new file mode 100644 index 0000000..93dab4c --- /dev/null +++ b/php/helpers/getGPSCoordinate.php @@ -0,0 +1,30 @@ + 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]; + +} + +?> \ No newline at end of file diff --git a/php/index.php b/php/index.php index 4bacbd7..174c6ef 100755 --- a/php/index.php +++ b/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');