62 lines
1.3 KiB
PHP
62 lines
1.3 KiB
PHP
<?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 $cache;
|
|
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();
|
|
|
|
// Signatures are calculated by the sha of the MDAT atom.
|
|
case 'signature':
|
|
return $this->signature();
|
|
|
|
default:
|
|
throw new \Exception('Unknown key: '.$key);
|
|
}
|
|
}
|
|
} |