<?php namespace App\Media\QuickTime; use Illuminate\Support\Collection; use App\Media\QuickTime; use App\Media\QuickTime\Atoms\moov\{mvhd,trak}; abstract class Atom extends QuickTime { use FindQuicktimeAtoms; protected int $offset; protected int $size; protected string $filename; protected Collection $atoms; public function __construct(int $offset,int $size,string $filename) { $this->offset = $offset; // Quick validation if ($size < 0) throw new \Exception(sprintf('Atom cannot be negative. (%d)',$size)); $this->size = $size; $this->filename = $filename; $this->cache = collect(); } public function __get(string $key): mixed { switch ($key) { // Create time is in the MOOV/MVHD atom case 'creation_date': case 'duration': case 'preferred_rate': case 'preferred_volume': $subatom = $this->find_atoms(mvhd::class,1); return $subatom->{$key}; // Height is in the moov/trak/tkhd atom case 'height': // Width is in the moov/trak/tkhd atom case 'width': $atom = $this->find_atoms(trak::class); return $atom->map(fn($item)=>$item->{$key}) ->filter() ->max(); // We need to pass our file handle requests to our parent case 'fh': return parent::__get($key); default: throw new \Exception('Unknown key: '.$key); } } }