. // }}} /** * Audio template and metadata support via PHP-FFMpeg * * @package GNUsocial * * @author Diogo Peralta Cordeiro * @copyright 2021 Free Software Foundation, Inc http://www.fsf.org * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later * * @see http://www.gnu.org/software/social/ */ namespace Plugin\AudioEncoder; use App\Core\Event; use App\Core\GSFile; use function App\Core\I18n\_m; use App\Core\Modules\Plugin; use App\Util\Exception\ServerException; use App\Util\Formatting; use EventResult; use FFMpeg\FFProbe as ffprobe; use SplFileInfo; class AudioEncoder extends Plugin { public static function version(): string { return '0.1.0'; } public static function shouldHandle(string $mimetype): bool { return GSFile::mimetypeMajor($mimetype) === 'audio'; } public function onFileMetaAvailable(array &$event_map, string $mimetype): EventResult { if (!self::shouldHandle($mimetype)) { return Event::next; } $event_map['audio'][] = [$this, 'fileMeta']; return Event::next; } /** * Adds duration metadata to audios * * @param null|string $mimetype in/out * @param null|int $width out audio duration * * @return bool true if metadata filled */ public function fileMeta(SplFileInfo &$file, ?string &$mimetype, ?int &$width, ?int &$height): bool { // Create FFProbe instance // Need to explicitly tell the drivers' location, or it won't find them $ffprobe = ffprobe::create([ 'ffmpeg.binaries' => exec('which ffmpeg'), 'ffprobe.binaries' => exec('which ffprobe'), ]); $metadata = $ffprobe->streams($file->getRealPath()) // extracts streams informations ->audios() // filters audios streams ->first(); // returns the first audio stream $width = (int) ceil((float) $metadata->get('duration')); return true; } /** * Generates the view for attachments of type Video */ public function onViewAttachment(array $vars, array &$res): EventResult { if (!self::shouldHandle($vars['attachment']->getMimetype())) { return Event::next; } $res[] = Formatting::twigRenderFile( 'audioEncoder/audioEncoderView.html.twig', [ 'attachment' => $vars['attachment'], 'note' => $vars['note'], 'title' => $vars['title'], ], ); return Event::stop; } /** * @throws ServerException */ public function onPluginVersion(array &$versions): EventResult { $versions[] = [ 'name' => 'AudioEncoder', 'version' => self::version(), 'author' => 'Diogo Peralta Cordeiro', 'rawdescription' => _m('Use PHP-FFMpeg for some more audio support.'), ]; return Event::next; } }