HTMLLinkAttribute($this->id,'v/info'); } public function getHtmlImageURL() { return sprintf('',url('/v/view/'.$this->id)); } /** * Return an GetID3 object or attribute * */ protected function o($attr=NULL) { if (! $this->filename OR ! file_exists($this->file_path()) OR ! is_readable($this->file_path())) return FALSE; if (is_null($this->_o)) { /* * @todo There is a bug with getID3, where the second iteration yields different results * this is problematic when video:scanall is run from a queue and there is more than 1 job. * It also appears that only 1.9.18 gets date/gps data, a later version doesnt get gps data. */ $this->_o = new \getID3; $this->_o->analyze($this->file_path()); $this->_o->getHashdata('sha1'); } return is_null($attr) ? $this->_o : (array_key_exists($attr,$this->_o->info) ? $this->_o->info[$attr] : NULL); } public function property(string $property) { if (! $this->o()) return NULL; switch ($property) { case 'creationdate': // Try creation_Data $x = Arr::get($this->_o->info,'quicktime.comments.creation_date.0'); // Try creation_Data if (is_null($x)) $x = Arr::get($this->_o->info,'quicktime.comments.creationdate.0'); return $x; case 'make': return Arr::get($this->_o->info,'quicktime.comments.make.0'); case 'model': return Arr::get($this->_o->info,'quicktime.comments.model.0'); case 'software': return Arr::get($this->_o->info,'quicktime.comments.software.0'); case 'signature': return Arr::get($this->_o->info,'sha1_data'); #case 'height': return $this->subatomsearch('quicktime.moov.subatoms',['trak','tkhd'],'height'); break; #case 'width': return $this->subatomsearch('quicktime.moov.subatoms',['trak','tkhd'],'width'); break; case 'height': return Arr::get($this->_o->info,'video.resolution_y'); case 'width': return Arr::get($this->_o->info,'video.resolution_x'); case 'length': return Arr::get($this->_o->info,'playtime_seconds'); case 'type': return Arr::get($this->_o->info,'video.dataformat'); case 'codec': return Arr::get($this->_o->info,'audio.codec'); case 'audiochannels': return Arr::get($this->_o->info,'audio.channels'); case 'samplerate': return Arr::get($this->_o->info,'audio.sample_rate'); case 'channelmode': return Arr::get($this->_o->info,'audio.channelmode'); case 'gps_lat': return Arr::get($this->_o->info,'quicktime.comments.gps_latitude.0'); case 'gps_lon': return Arr::get($this->_o->info,'quicktime.comments.gps_longitude.0'); case 'gps_altitude': return Arr::get($this->_o->info,'quicktime.comments.gps_altitude.0'); case 'identifier': if ($x=Arr::get($this->_o->info,'quicktime.comments')) { return Arr::get(Arr::flatten(Arr::only($x,'content.identifier')),0); } break; default: return NULL; } } public function properties() { return $this->o() ? $this->_o->info : []; } /** * Navigate through ID3 data to find the value. */ private function subatomsearch($atom,array $paths,$key,array $data=[]) { if (! $data AND is_null($data = Arr::get($this->_o->info,$atom))) { // Didnt find it. return NULL; } foreach ($paths as $path) { $found = FALSE; foreach ($data as $array) { if ($array['name'] === $path) { $found = TRUE; if ($path != last($paths)) $data = $array['subatoms']; else $data = $array; break; } } if (! $found) break; } return isset($data[$key]) ? $data[$key] : NULL; } public function setDateCreated() { $this->created = strtotime($this->property('creationdate')); } public function setLocation() { $this->gps_lat = $this->property('gps_lat'); $this->gps_lon = $this->property('gps_lon'); $this->gps_altitude = $this->property('gps_altitude'); } public function setMakeModel() { $ma = NULL; if ($this->property('make')) $ma = Make::firstOrCreate([ 'name'=>$this->property('make'), ]); $mo = Model::firstOrCreate([ 'name'=>$this->property('model') ?: NULL, 'make_id'=>$ma ? $ma->id : NULL, ]); $so = Software::firstOrCreate([ 'name'=>$this->property('software') ?: NULL, 'model_id'=>$mo->id, ]); $this->software_id = $so->id; $this->type = $this->property('type'); $this->length = round($this->property('length'),2); $this->codec = $this->property('codec'); $this->audiochannels = $this->property('audiochannels'); $this->channelmode = $this->property('channelmode'); $this->samplerate = $this->property('samplerate'); } public function setSignature() { parent::setSignature(); $this->identifier = $this->property('identifier'); } public function setSubSecTime() { // NOOP } public function setThumbnail() { // NOOP } /** * Return the extension of the image */ public function type($mime=FALSE) { return strtolower($mime ? File::mime_by_ext(pathinfo($this->filename,PATHINFO_EXTENSION)) : pathinfo($this->filename,PATHINFO_EXTENSION)); } }