From: Aleksey Filippov Date: Thu, 19 Feb 2026 16:41:23 +0000 (+0300) Subject: auto-claude: subtask-2-2 - Реализовать метод FileService::convertToMp4() X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=1b01339df4fe5f2d2d66d5c641e88292c9a9f76d;p=erp24_rep%2Fyii-erp24%2F.git auto-claude: subtask-2-2 - Реализовать метод FileService::convertToMp4() Добавлен метод для конвертации видео MOV/AVI в MP4 через FFmpeg: - Проверка наличия FFmpeg через `which ffmpeg` - Проверка существования исходного файла - Использование безопасного escapeshellarg() для shell-команд - Флаг -y для перезаписи без подтверждения - Флаг -movflags +faststart для быстрого старта воспроизведения - Graceful fallback: возвращает null при ошибках без исключений - Логирование через Yii::warning() с категорией 'video' Co-Authored-By: Claude Opus 4.5 --- diff --git a/erp24/services/FileService.php b/erp24/services/FileService.php index 55a027fd..e6ce4e2a 100755 --- a/erp24/services/FileService.php +++ b/erp24/services/FileService.php @@ -495,6 +495,45 @@ class FileService return $uploaded; } + /** + * Конвертирует видео в MP4 через FFmpeg. + * Возвращает путь к MP4 или null при ошибке/отсутствии FFmpeg. + * + * @param string $sourcePath Путь к исходному видеофайлу (MOV, AVI) + * @param string $targetPath Путь для сохранения MP4 файла + * @return string|null Путь к сконвертированному MP4 или null при ошибке + */ + public static function convertToMp4(string $sourcePath, string $targetPath): ?string + { + // Проверяем наличие FFmpeg + exec('which ffmpeg 2>/dev/null', $output, $returnCode); + if ($returnCode !== 0) { + Yii::warning('FFmpeg не установлен, конвертация пропущена: ' . $sourcePath, 'video'); + return null; + } + + // Проверяем существование исходного файла + if (!file_exists($sourcePath)) { + Yii::warning('Исходный файл не найден: ' . $sourcePath, 'video'); + return null; + } + + // Формируем команду FFmpeg + $cmd = sprintf( + 'ffmpeg -y -i %s -vcodec h264 -acodec aac -movflags +faststart %s 2>/dev/null', + escapeshellarg($sourcePath), + escapeshellarg($targetPath) + ); + exec($cmd, $cmdOutput, $returnCode); + + if ($returnCode === 0 && file_exists($targetPath)) { + return $targetPath; + } + + Yii::warning('Ошибка конвертации FFmpeg: ' . $sourcePath, 'video'); + return null; + } + public static function saveFromUrlToUploads(string $url, int $adminId): ?array { if (!filter_var($url, FILTER_VALIDATE_URL)) {