pull/37/head
Varun Patil 2022-08-20 02:08:54 +00:00
parent 6b211499f9
commit 83f4db77e8
1 changed files with 95 additions and 38 deletions

View File

@ -15,6 +15,11 @@ class Util {
$this->connection = $connection; $this->connection = $connection;
} }
/**
* Get the path to the user's configured photos directory.
* @param IConfig $config
* @param string $userId
*/
public static function getPhotosPath(IConfig $config, string $userId) { public static function getPhotosPath(IConfig $config, string $userId) {
$p = $config->getUserValue($userId, Application::APPNAME, 'timelinePath', ''); $p = $config->getUserValue($userId, Application::APPNAME, 'timelinePath', '');
if (empty($p)) { if (empty($p)) {
@ -23,43 +28,56 @@ class Util {
return $p; return $p;
} }
private static function getExif(File $file) { /**
// Attempt to read exif data * Get exif data as a JSON object from a Nextcloud file.
try { * @param File $file
// Start exiftool and output to json */
$pipes = []; public static function getExifFromFile(File &$file) {
$proc = proc_open('exiftool -json -', [ $handle = $file->fopen('rb');
0 => array('pipe', 'rb'), $exif = self::getExifFromStream($handle);
1 => array('pipe', 'w'), fclose($handle);
2 => array('pipe', 'w'), return $exif;
], $pipes);
// Write the file to exiftool's stdin
// Assume exif exists in the first 256 kb of the file
$handle = $file->fopen('rb');
stream_copy_to_stream($handle, $pipes[0], 256 * 1024);
fclose($handle);
fclose($pipes[0]);
// Get output from exiftool
$stdout = stream_get_contents($pipes[1]);
// Clean up
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($proc);
// Parse the json
$json = json_decode($stdout, true);
if (empty($json)) {
throw new \Exception('Could not read exif data');
}
return $json[0];
} catch (\Exception $e) {
return [];
}
} }
/**
* Get exif data as a JSON object from a stream.
* @param resource $handle
*/
public static function getExifFromStream(&$handle) {
// Start exiftool and output to json
$pipes = [];
$proc = proc_open('exiftool -json -', [
0 => array('pipe', 'rb'),
1 => array('pipe', 'w'),
2 => array('pipe', 'w'),
], $pipes);
// Write the file to exiftool's stdin
// Assume exif exists in the first 256 kb of the file
stream_copy_to_stream($handle, $pipes[0], 256 * 1024);
fclose($pipes[0]);
// Get output from exiftool
$stdout = stream_get_contents($pipes[1]);
// Clean up
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($proc);
// Parse the json
$json = json_decode($stdout, true);
if (!$json) {
throw new \Exception('Could not read exif data');
}
return $json[0];
}
/**
* Get the date taken from either the file or exif data if available.
* @param File $file
* @param array $exif
*/
public static function getDateTaken(File $file, array $exif) { public static function getDateTaken(File $file, array $exif) {
$dt = $exif['DateTimeOriginal']; $dt = $exif['DateTimeOriginal'];
if (!isset($dt) || empty($dt)) { if (!isset($dt) || empty($dt)) {
@ -89,6 +107,10 @@ class Util {
return $dateTaken; return $dateTaken;
} }
/**
* Process a file to insert Exif data into the database
* @param File $file
*/
public function processFile(File $file): void { public function processFile(File $file): void {
// There is no easy way to UPSERT in a standard SQL way, so just // There is no easy way to UPSERT in a standard SQL way, so just
// do multiple calls. The worst that can happen is more updates, // do multiple calls. The worst that can happen is more updates,
@ -122,7 +144,10 @@ class Util {
} }
// Get exif data // Get exif data
$exif = self::getExif($file); $exif = [];
try {
$exif = self::getExifFromFile($file);
} catch (\Exception) {}
// Get more parameters // Get more parameters
$dateTaken = $this->getDateTaken($file, $exif); $dateTaken = $this->getDateTaken($file, $exif);
@ -156,6 +181,10 @@ class Util {
} }
} }
/**
* Remove a file from the exif database
* @param File $file
*/
public function deleteFile(File $file) { public function deleteFile(File $file) {
$sql = 'DELETE $sql = 'DELETE
FROM *PREFIX*memories FROM *PREFIX*memories
@ -163,7 +192,11 @@ class Util {
$this->connection->executeStatement($sql, [$file->getId()], [\PDO::PARAM_INT]); $this->connection->executeStatement($sql, [$file->getId()], [\PDO::PARAM_INT]);
} }
public function processDays(&$days) { /**
* Process the days response
* @param array $days
*/
private function processDays(&$days) {
foreach($days as &$row) { foreach($days as &$row) {
$row["day_id"] = intval($row["day_id"]); $row["day_id"] = intval($row["day_id"]);
$row["count"] = intval($row["count"]); $row["count"] = intval($row["count"]);
@ -171,6 +204,11 @@ class Util {
return $days; return $days;
} }
/**
* Get the days response from the database for the timeline
* @param IConfig $config
* @param string $userId
*/
public function getDays( public function getDays(
IConfig $config, IConfig $config,
string $user, string $user,
@ -191,6 +229,10 @@ class Util {
return $this->processDays($rows); return $this->processDays($rows);
} }
/**
* Get the days response from the database for one folder
* @param int $folderId
*/
public function getDaysFolder(int $folderId) { public function getDaysFolder(int $folderId) {
$sql = 'SELECT day_id, COUNT(file_id) AS count $sql = 'SELECT day_id, COUNT(file_id) AS count
FROM `*PREFIX*memories` FROM `*PREFIX*memories`
@ -205,7 +247,11 @@ class Util {
return $this->processDays($rows); return $this->processDays($rows);
} }
public function processDay(&$day) { /**
* Process the single day response
* @param array $day
*/
private function processDay(&$day) {
foreach($day as &$row) { foreach($day as &$row) {
$row["file_id"] = intval($row["file_id"]); $row["file_id"] = intval($row["file_id"]);
$row["is_video"] = intval($row["is_video"]); $row["is_video"] = intval($row["is_video"]);
@ -216,6 +262,12 @@ class Util {
return $day; return $day;
} }
/**
* Get a day response from the database for the timeline
* @param IConfig $config
* @param string $userId
* @param int $dayId
*/
public function getDay( public function getDay(
IConfig $config, IConfig $config,
string $user, string $user,
@ -236,6 +288,11 @@ class Util {
return $this->processDay($rows); return $this->processDay($rows);
} }
/**
* Get a day response from the database for one folder
* @param int $folderId
* @param int $dayId
*/
public function getDayFolder( public function getDayFolder(
int $folderId, int $folderId,
int $dayId, int $dayId,