photo/application/classes/Task/Photo/Import.php

187 lines
5.0 KiB
PHP

<?php defined('SYSPATH') or die('No direct access allowed.');
/**
* Import photo to the database
*
* @package Photo
* @category Tasks
* @author Deon George
* @copyright (c) 2014 Deon George
* @license http://dev.leenooks.net/license.html
*/
class Task_Photo_Import extends Minion_Task {
private $_log = '/tmp/photo_import.txt';
private $_accepted = array(
'jpg',
);
protected $_options = array(
'dir'=>NULL, // Directory of Photos to Import
'file'=>NULL, // Photo File to Import
'tags'=>NULL,
'people'=>NULL,
'ignoredupe'=>FALSE, // Skip duplicate photos
'deletedupe'=>FALSE, // Skip duplicate photos
'verbose'=>FALSE, // Photo File to Import
);
private function _adddir(&$value,$key,$path='') {
if ($path)
$value = sprintf('%s/%s',$path,$value);
}
protected function _execute(array $params) {
$tags = NULL;
$t = $p = array();
if (is_null($params['file']) AND is_null($params['dir']) OR ($params['file'] AND $params['dir']))
throw new Kohana_Exception('Missing filename, please use --file= OR --dir=');
if ($params['dir']) {
$files = array_diff(scandir($params['dir']),array('.','..'));
array_walk($files,'static::_adddir',$params['dir']);
} else
$files = array($params['file']);
// Tags
if ($params['tags']) {
$tags = explode(',',$params['tags']);
$t = ORM::factory('Tags')->where('tag','IN',$tags)->find_all();
}
// People
if ($params['people']) {
$tags = explode(',',$params['people']);
$p = ORM::factory('People')->where('tag','IN',$tags)->find_all();
}
$c = 0;
foreach ($files as $file) {
if ($params['verbose'])
printf("Processing file [%s]\n",$file);
if (preg_match('/@__thumb/',$file) OR preg_match('/\/._/',$file)) {
$this->writelog(sprintf("Ignoring file [%s]\n",$file));
continue;
}
if (! in_array(strtolower(pathinfo($file,PATHINFO_EXTENSION)),$this->_accepted)) {
$this->writelog(sprintf("Ignoring file [%s]\n",$file));
continue;
}
$c++;
$po = ORM::factory('Photo',array('filename'=>$file));
if (! $po->loaded())
$po->filename = realpath($file);
$po->date_taken = $this->dbcol(strtotime($po->io('exif:DateTime')));
$po->signature = $this->dbcol($po->io()->getImageSignature());
$po->make = $this->dbcol($po->io('exif:Make'));
$po->model = $this->dbcol($po->io('exif:Model'));
$po->height = $this->dbcol($po->io()->getImageheight());
$po->width = $this->dbcol($po->io()->getImageWidth());
$po->orientation = $this->dbcol($po->io()->getImageOrientation());
$po->subsectime = $this->dbcol($po->io('exif:SubSecTimeOriginal'));
$po->gps_lat = $this->dbcol($po->gps(preg_split('/,\s?/',$po->io()->getImageProperty('exif:GPSLatitude')),$po->io()->getImageProperty('exif:GPSLatitudeRef')));
$po->gps_lon = $this->dbcol($po->gps(preg_split('/,\s?/',$po->io()->getImageProperty('exif:GPSLongitude')),$po->io()->getImageProperty('exif:GPSLongitudeRef')));
try {
$po->thumbnail = $this->dbcol(exif_thumbnail($po->filename));
} catch (Exception $e) {
}
switch ($params['verbose']) {
case 1:
print_r($po->what_changed());
break;
case 2:
print_r($po->io()->getImageProperties());
break;
}
$x = $po->list_duplicate()->find_all();
if (count($x)) {
$skip = FALSE;
foreach ($x as $o) {
# We'll only ignore based on the same signature.
if ($params['ignoredupe'] AND ($po->signature == $o->signature)) {
$skip = TRUE;
$this->writelog(sprintf("Ignore file [%s], it's the same as [%s (%s)]\n",$po->filename,$o->id,$o->file_path()));
break;
} elseif ($params['deletedupe'] AND ($po->signature == $o->signature) AND ($po->filename != $o->filename)) {
$skip = TRUE;
$this->writelog(sprintf("Delete file [%s], it's the same as [%s (%s)] with signature [%s]\n",$po->filename,$o->id,$o->file_path(),$po->signature));
unlink($file);
}
}
unset($x);
if ($skip)
continue;
else
$po->duplicate = '1';
}
if (! $po->changed())
$this->writelog(sprintf("Image [%s] already in DB: %s\n",$file,$po->id));
$po->save();
if ($po->saved())
$this->writelog(sprintf("Image [%s] stored in DB: %s\n",$file,$po->id));
// Record our tags
foreach ($t as $o) {
$x = ORM::factory('Photo_Tag')->where('tag_id','=',$o->id)->where('photo_id','=',$po->id)->find();
$x->tag_id = $o->id;
$x->photo_id = $po->id;
$x->save();
}
// Record our people
foreach ($p as $o) {
$x = ORM::factory('Photo_People',array('people_id'=>$o->id,'photo_id'=>$po->id));
$x->people_id = $o->id;
$x->photo_id = $po->id;
$x->save();
}
unset($po);
unset($x);
unset($o);
}
if ($c > 1)
return sprintf("Images processed: %s\n",$c);
}
// Force the return of a string or NULL
private function dbcol($val,$noval=NULL) {
return $val ? (string)$val : $noval;
}
private function writelog($msg) {
if (! $this->_log)
return;
static $fh = NULL;
if (is_null($fh))
$fh = fopen($this->_log,'a+');
fwrite($fh,$msg);
}
}
?>