<?php namespace App\Console\Commands; use Illuminate\Console\Command; use Illuminate\Foundation\Bus\DispatchesJobs; use App\Models\{Person,Photo,Tag}; use App\Traits\Files; class PhotoImport extends Command { use DispatchesJobs; use Files; /** * The name and signature of the console command. * * @var string */ protected $signature = 'photo:import {--dir= : Directory to Parse} {--file= : File to Import} {--ignoredupe : Ignore duplicate files} {--deletedupe : Delete duplicate files} {--people= : People to reference in photo} {--tags= : Add tag to photo}'; /** * The console command description. * * @var string */ protected $description = 'Import photos into the database'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { $files = $this->getFiles([ 'dir'=>$this->option('dir'), 'file'=>$this->option('file') ],'photo'); if (! count($files)) exit; // Show a progress bar $bar = $this->output->createProgressBar(count($files)); $bar->setFormat("%current%/%max% [%bar%] %percent:3s%% (%memory%) (%remaining%) "); $tags = NULL; $t = $p = array(); // Tags if ($this->option('tags')) { $tags = explode(',',$this->option('tags')); $t = Tag::whereIn('tag',$tags)->pluck('id')->toArray(); if (! $t OR count($t) != count($tags)) { $this->error(sprintf('Tag [%s] dont exist',join('|',$tags))); abort(501); } } // People if ($this->option('people')) { $tags = explode(',',$this->option('people')); $p = Person::whereIn('tag',$tags)->pluck('id')->toArray(); if (! $p OR count($p) != count($tags)) { $this->error(sprintf('People [%s] dont exist',join('|',$tags))); abort(501); } } $c = 0; foreach ($files as $file) { $bar->advance(); if (preg_match('/@__thumb/',$file) OR preg_match('/\/._/',$file)) { $this->warn(sprintf('Ignoring file [%s]',$file)); continue; } if (! in_array(strtolower(pathinfo($file,PATHINFO_EXTENSION)),config('photo.import.accepted'))) { $this->warn(sprintf('Ignoring [%s]',$file)); continue; } if ($this->option('verbose')) $this->info(sprintf('Processing file [%s]',$file)); $c++; $o = Photo::where('filename',$file)->first(); // The photo doesnt exist if (is_null($o)) { $o = new Photo; $o->filename = $file; } if ($o->exists) $this->warn(sprintf('%s [%s] already in DB: %s',$o->objectType(),$file,$o->id)); // Make sure we can read the photo. if (! is_readable($o->file_path())) { $this->warn(sprintf('Ignoring [%s], it is not readable',$o->file_path())); continue; } $o->save(); if ($o->wasRecentlyCreated) $this->info(sprintf('%s [%s] stored in DB: %s',$o->objectType(),$file,$o->id)); // Record our people and tags if ($p) $o->People()->sync($p); if ($t) $o->Tags()->sync($t); $this->dispatch((new \App\Jobs\CatalogScan($o))->onQueue('scan')); } $bar->finish(); return $this->info(sprintf('Photos processed: %s',$c)); } }