Skip to content

Commit

Permalink
Merge pull request #534 from electerious/develop
Browse files Browse the repository at this point in the history
Lychee 3.1.1
  • Loading branch information
electerious committed Apr 30, 2016
2 parents e832ff0 + 4dd2155 commit 75b11ac
Show file tree
Hide file tree
Showing 31 changed files with 317 additions and 131 deletions.
File renamed without changes.
2 changes: 1 addition & 1 deletion dist/main.css

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions dist/main.js
100755 → 100644

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions dist/view.js

Large diffs are not rendered by default.

14 changes: 14 additions & 0 deletions docs/Changelog.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
## v3.1.1

Released April 30, 2016

- `New` share button when logged out (#473)
- `New` Import of IPTC photo tags (Thanks @qligier, #514)
- `New` Added reset username and password to FAQ (#500 #128)
- `Improved` Removed will-change from the main image to improve the image rendering in Chrome (#501)
- `Improved ` scroll and rendering performance by removing will-change
- `Improved` Open Facebook and Twitter sharing sheet in new window
- `Improved` EXIF and IPTC extraction (Thanks @qligier, #518)
- `Fixed` broken URL in Update.md (#516)
- `Fixed` error 500 on database connect error (Thanks @tribut, #530)

## v3.1.0

Released March 29, 2016
Expand Down
9 changes: 6 additions & 3 deletions docs/FAQ.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
If Lychee is not working properly, try to open `plugins/Diagnostics/index.php`. This script will display all errors it can find.

#### What do I need to run Lychee on my server?
To run Lychee, everything you need is a web-server with PHP 5.3 or later and a MySQL-Database.
To run Lychee, everything you need is a web-server with PHP 5.5 or later and a MySQL-Database.

#### I can't upload photos
If you experience problems uploading large photos, you might want to change the PHP parameters in `.htaccess` (if you are using the PHP Apache module) or in `.user.ini` (if you are using PHP >= 5.3 with CGI or FastCGI).
If you experience problems uploading large photos, you might want to change the PHP parameters in `.htaccess` (if you are using the PHP Apache module) or in `.user.ini` (if you are using PHP >= 5.5 with CGI or FastCGI).

If possible, change these settings directly in your `php.ini`. We recommend to increase the values of the following properties:

Expand Down Expand Up @@ -55,4 +55,7 @@ Yes. Lychee uses ImageMagick when available.
There's a problem with images compressed by ImageOptim. [Read more.](https://github.com/electerious/Lychee/issues/175#issuecomment-47403992)

#### How to change the title of the site?
[#455](https://github.com/electerious/Lychee/issues/455)
[#455](https://github.com/electerious/Lychee/issues/455)

#### How to reset username and password?
Simply delete the whole `lychee_settings` table from the database. Lychee will regenerate it and ask you to enter a new username and password.
2 changes: 1 addition & 1 deletion docs/Update.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
11 changes: 10 additions & 1 deletion php/Modules/Database.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ private function __construct($host, $user, $password, $name = 'lychee', $dbTable
$connection = self::connect($host, $user, $password);

// Check if the connection was successful
if ($connection===false) Response::error($connection->connect_error);
if ($connection===false) Response::error(self::connect_error());

if (self::setCharset($connection)===false) Response::error('Could not set database charset!');

Expand Down Expand Up @@ -90,6 +90,15 @@ public static function connect($host = 'localhost', $user, $password) {

}

/**
* @return string Returns the string description of the last connect error
*/
private static function connect_error() {

return mysqli_connect_error();

}

/**
* @return boolean Returns true when successful.
*/
Expand Down
108 changes: 65 additions & 43 deletions php/Modules/Photo.php
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ public function add(array $files, $albumID = 0, $returnOnError = false) {
}

// 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__);

Expand Down Expand Up @@ -307,7 +307,7 @@ private function createThumb($url, $filename, $type, $width, $height) {
$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();
Expand Down Expand Up @@ -727,86 +727,108 @@ public function getInfo($url) {
$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'] = '';
$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', false, false);
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']);

}

Expand Down
7 changes: 7 additions & 0 deletions php/Modules/Settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,13 @@ public static function setSortingAlbums($type, $order) {

}

/**
* @return array Returns the Imagick setting.
*/
public static function hasImagick() {
return (bool)(extension_loaded('imagick') && self::get()['imagick'] === '1');
}

}

?>
30 changes: 30 additions & 0 deletions php/helpers/getGPSCoordinate.php
Original file line number Diff line number Diff line change
@@ -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 change: 1 addition & 0 deletions php/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
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');
Expand Down
1 change: 1 addition & 0 deletions src/gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ paths.view = {
],
scripts: [
'node_modules/jquery/dist/jquery.min.js',
'node_modules/basiccontext/dist/basicContext.min.js',
'../dist/_view--javascript.js'
],
svg: [
Expand Down
Binary file modified src/images/apple-touch-icon-ipad.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/images/apple-touch-icon-iphone-plus.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified src/images/apple-touch-icon-iphone.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion src/images/no_cover.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion src/images/no_images.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion src/images/password.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 75b11ac

Please sign in to comment.