]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
auto-claude: subtask-2-2 - Реализовать метод FileService::convertToMp4()
authorAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Thu, 19 Feb 2026 16:41:23 +0000 (19:41 +0300)
committerAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Thu, 19 Feb 2026 16:41:23 +0000 (19:41 +0300)
Добавлен метод для конвертации видео 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 <noreply@anthropic.com>
erp24/services/FileService.php

index 55a027fda4fef9ba668666c2911eccb62abb92a3..e6ce4e2ae43060e14509b422c71dc35712da949a 100755 (executable)
@@ -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)) {