diff --git a/appinfo/routes.php b/appinfo/routes.php index 403b9dd581..4efa999849 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -96,6 +96,12 @@ 'url' => '/preview/{fileId}', 'verb' => 'GET' ], + // exif of picture + [ + 'name' => 'files#exif', + 'url' => '/files/exif/{fileId}', + 'verb' => 'GET' + ], /** * Public services */ @@ -125,6 +131,12 @@ 'url' => '/preview.public/{fileId}', 'verb' => 'GET' ], + // exif of picture + [ + 'name' => 'files_public#exif', + 'url' => '/files.public/exif/{fileId}', + 'verb' => 'GET' + ], /** * API */ diff --git a/controller/files.php b/controller/files.php index 1777523e3a..264cde47ad 100644 --- a/controller/files.php +++ b/controller/files.php @@ -45,6 +45,33 @@ trait Files { /** @var ILogger */ private $logger; + /** + * @NoAdminRequired + * + * Returns a exif of picture + * + * @param string $location a path picture + * @return array + */ + public function exif($fileId){ + $file = $this->downloadService->getResourceFromId($fileId); + $path=$file->getInternalPath(); + $storage=$file->getStorage(); + $filename=$storage->getLocalFile($path); + $exif = false; + $iptc = false; + if (is_callable('exif_read_data')) { + $exif=@exif_read_data($filename); + } + getimagesize($filename,$blocks); + if (is_array($blocks)){ + foreach($blocks as $key => $block){ + $iptc[$key]=iptcparse($block); + } + } + return ['exif'=>$exif,'iptc'=>$iptc]; + } + /** * @NoAdminRequired * diff --git a/controller/filespubliccontroller.php b/controller/filespubliccontroller.php index 90c06a1a49..0359ebb422 100644 --- a/controller/filespubliccontroller.php +++ b/controller/filespubliccontroller.php @@ -22,6 +22,18 @@ */ class FilesPublicController extends FilesController { + /** + * @PublicPage + * + * Returns a exif of picture + * + * @param string $location a path picture + * @return array + */ + public function exif($fileId){ + return parent::exif($fileId); + } + /** * @PublicPage * diff --git a/css/slideshow.css b/css/slideshow.css index 4ce8677f45..e3c239855a 100644 --- a/css/slideshow.css +++ b/css/slideshow.css @@ -155,10 +155,14 @@ bottom: 18px; z-index: 1099; width: 100%; + height: 75px; } #slideshow > .name .title { - padding: 0 50px 3px; + position: absolute; + bottom: 0; + width: 100%; + padding: 0 1% 3px; text-align: center; color: #fff; text-shadow: 1px 1px 4px #333, 1px -1px 4px #333, -1px 1px 4px #333, -1px -1px 4px #333; @@ -166,7 +170,6 @@ line-height: normal; text-overflow: ellipsis; overflow: hidden; - white-space: nowrap; filter: alpha(opacity=75); opacity: .75; } diff --git a/js/gallery.js b/js/gallery.js index caea603191..8bb70c86ad 100644 --- a/js/gallery.js +++ b/js/gallery.js @@ -346,7 +346,7 @@ return { name: name, path: image.path, - file: image.fileId, + fileId: image.fileId, mimeType: image.mimeType, url: previewUrl, downloadUrl: downloadUrl diff --git a/js/slideshow.js b/js/slideshow.js index 8cd07b352c..4d5625cf2c 100644 --- a/js/slideshow.js +++ b/js/slideshow.js @@ -103,6 +103,42 @@ // check if we moved along while we were loading if (currentImageId === index) { + if (this.images[index].mimeType === 'image/jpeg' || this.images[index].mimeType === 'image/tiff'){ + // check if not in cache + if (this.images[index].desc===undefined){ + if (window.galleryFileAction){ + var url = window.galleryFileAction.buildGalleryUrl('files', '/exif/'+this.images[index].fileId,{}); + }else{ + var url = window.Gallery.utility.buildGalleryUrl('files', '/exif/'+this.images[index].fileId,{}); + } + $.getJSON(url).then(function(data){ + var desc; + if (data){ + // IPTC:Description (Picasa, Photoshop, Lightroom) + if (data['iptc']&&data['iptc']['APP13']&&data['iptc']['APP13']['2#120']){ + desc=data['iptc']['APP13']['2#120'][0]; + } + // EXIF:Description (old camera model) + if (!desc){ + if (data['exif']&&data['exif']['ImageDescription']) + desc=data['exif']['ImageDescription']; + } + if (desc){ + this.images[index].desc=desc; + this.controls.show(currentImageId); + this._initControlsAutoFader(); + this.container.removeClass('inactive'); + }else{ + this.images[index].desc=''; + } + } + }.bind(this)); + }else if (this.images[index].desc){ + this.controls.show(currentImageId); + this._initControlsAutoFader(); + this.container.removeClass('inactive'); + } + } var image = this.images[index]; var transparent = this._isTransparent(image.mimeType); this.controls.showActionButtons(transparent); diff --git a/js/slideshowcontrols.js b/js/slideshowcontrols.js index 3dead6e2e9..ef31df8eea 100644 --- a/js/slideshowcontrols.js +++ b/js/slideshowcontrols.js @@ -86,7 +86,12 @@ if (this.playing) { this._setTimeout(); } - this._setName(currentImage.name); + // check exif descr + if (currentImage.desc){ + this._setName(currentImage.desc); + }else{ + this._setName(currentImage.name); + } }, /**