128 lines
3.1 KiB
PHP
128 lines
3.1 KiB
PHP
<?php
|
|
/*****************************************************************************
|
|
* ViewPhoto.php
|
|
* Contains the view photo controller
|
|
*
|
|
* Kabuki CMS (C) 2013-2016, Aaron van Geffen
|
|
*****************************************************************************/
|
|
|
|
class ViewPhoto extends HTMLController
|
|
{
|
|
private Image $photo;
|
|
|
|
public function __construct()
|
|
{
|
|
// Ensure we're logged in at this point.
|
|
$user = Registry::get('user');
|
|
if (!$user->isLoggedIn())
|
|
throw new NotAllowedException();
|
|
|
|
$photo = Asset::fromSlug($_GET['slug']);
|
|
if (empty($photo))
|
|
throw new NotFoundException();
|
|
|
|
$this->photo = $photo->getImage();
|
|
|
|
Session::resetSessionToken();
|
|
|
|
parent::__construct($this->photo->getTitle() . ' - ' . SITE_TITLE);
|
|
|
|
if (!empty($_POST))
|
|
$this->handleTagging();
|
|
else
|
|
$this->handleViewPhoto();
|
|
}
|
|
|
|
private function handleViewPhoto()
|
|
{
|
|
$page = new PhotoPage($this->photo);
|
|
|
|
// Any (EXIF) meta data?
|
|
$metaData = $this->prepareMetaData();
|
|
$page->setMetaData($metaData);
|
|
|
|
// What tag are we browsing?
|
|
$tag = isset($_GET['in']) ? Tag::fromId($_GET['in']) : null;
|
|
if (isset($tag))
|
|
$page->setTag($tag);
|
|
|
|
// Keeping tabs on a filter?
|
|
if (isset($_GET['by']))
|
|
{
|
|
// Let's first verify that the filter is valid
|
|
$contributors = array_filter($tag->getContributorList(), fn($el) => $el['slug'] === $_GET['by']);
|
|
if (count($contributors) !== 1)
|
|
throw new UnexpectedValueException('Invalid filter for this album or tag.');
|
|
|
|
// Alright, let's run with it then
|
|
$filter = reset($contributors);
|
|
$page->setActiveFilter($filter['slug']);
|
|
}
|
|
|
|
$this->page->adopt($page);
|
|
$this->page->setCanonicalUrl($this->photo->getPageUrl());
|
|
}
|
|
|
|
private function handleTagging()
|
|
{
|
|
header('Content-Type: text/json; charset=utf-8');
|
|
|
|
// Are we tagging a photo?
|
|
if (!isset($_POST['id_tag']))
|
|
{
|
|
echo json_encode(['error' => true, 'msg' => 'Invalid tag request.']);
|
|
exit;
|
|
}
|
|
|
|
// We are!
|
|
if (!isset($_POST['delete']))
|
|
{
|
|
$this->photo->linkTags([(int) $_POST['id_tag']]);
|
|
echo json_encode(['success' => true]);
|
|
exit;
|
|
}
|
|
|
|
// ... deleting, that is.
|
|
else
|
|
{
|
|
$this->photo->unlinkTags([(int) $_POST['id_tag']]);
|
|
echo json_encode(['success' => true]);
|
|
exit;
|
|
}
|
|
}
|
|
|
|
private function prepareMetaData()
|
|
{
|
|
if (!($exif = EXIF::fromFile($this->photo->getFullPath())))
|
|
throw new UnexpectedValueException('Photo file not found!');
|
|
|
|
$metaData = [];
|
|
|
|
if (!empty($exif->created_timestamp))
|
|
$metaData['Date Taken'] = date("j M Y, H:i:s", $exif->created_timestamp);
|
|
|
|
if ($author = $this->photo->getAuthor())
|
|
$metaData['Uploaded by'] = $author->getfullName();
|
|
|
|
if (!empty($exif->camera))
|
|
$metaData['Camera Model'] = $exif->camera;
|
|
|
|
if (!empty($exif->shutter_speed))
|
|
$metaData['Shutter Speed'] = $exif->shutterSpeedFraction();
|
|
|
|
if (!empty($exif->aperture))
|
|
$metaData['Aperture'] = 'f/' . number_format($exif->aperture, 1);
|
|
|
|
if (!empty($exif->focal_length))
|
|
$metaData['Focal Length'] = $exif->focal_length . ' mm';
|
|
|
|
if (!empty($exif->iso))
|
|
$metaData['ISO Speed'] = $exif->iso;
|
|
|
|
if (!empty($exif->software))
|
|
$metaData['Software'] = $exif->software;
|
|
|
|
return $metaData;
|
|
}
|
|
}
|