diff --git a/MEDIA_MIGRATION_CHANGES.md b/MEDIA_MIGRATION_CHANGES.md new file mode 100644 index 0000000..6b426d2 --- /dev/null +++ b/MEDIA_MIGRATION_CHANGES.md @@ -0,0 +1,71 @@ +# 0.13.0 + +## `unlinkStoredTitleImages()` + +Возвращает не `int`, а `Result` с полями: + +- `KEY->deleted_count` - количество удаленных файлов + +DATA содержит массив `[ file => путь, success => статус удаления]` + +## `getYoutubeVideoTitle()` + +Возвращает не строку, а Result с полем `title` + +В случае ошибки поля `video_info` и `player_response` содержат ответы сервера + +## `prepareMediaProperties()` + +Сигнатура метода в библиотеке: +```php +prepareMediaProperties( + array $row = [], + bool $is_report = false, + bool $prepend_domain = false, + bool $target_is_mobile = false, + string $domain_prefix = ''):array +``` + +В админке сигнатура метода: +```php +prepareMediaProperties( + $row, + $is_report = false, + $prepend_domain = false, + $domain_prefix = '' + ) +``` +Таким образом, библиотечный метод нужно вызывать, передавая ему в `target_is_mobile` строго false. + +## uploadImage() + +Возвращает не строчку имени файла, а структуру Result, в которой нас интересует DATA: +```php +[ + 'thumbnails' => [[ $fn_target, $method, $max_width, $max_height, $quality ]] /* массив сгенерированных превью */ + 'fn_resource' => "{$radix}.{$source_extension}", + 'radix' => $radix, + 'extension' => $source_extension, + 'fn_origin' => $fn_origin, + 'status' => 'pending', + 'type' => self::MEDIA_TYPE_PHOTOS +] +``` +Прежней строчке эквивалентно поле `fn_resource` (сумма `radix` + `extension`) + +## uploadAudio() + +Возвращает не строчку имени загруженного файла (`{$radix}.mp3`), а Result-структуру: +```php +[ + 'filename' => $fn_origin, /* оригинальный файл с внутренним именем, сохраненный на диск */ + 'radix' => $radix, /* корень имени */ + 'extension' => $source_extension, /* расширение файла (на основе MIME-типа) */ + 'status' => 'pending', + 'type' => self::MEDIA_TYPE_AUDIO +] +``` + +## uploadVideo() + +Уже используется Result. \ No newline at end of file diff --git a/README.md b/README.md index b27352f..b0d9bd6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,6 @@ # FSNews Media +```bash +composer require ajur-media/fsnews.media +``` + diff --git a/composer.json b/composer.json index 1e8f830..c7a40d2 100644 --- a/composer.json +++ b/composer.json @@ -15,13 +15,16 @@ } ], "require": { + "php": "^7.4 || 8.*", "ext-json": "*", "ext-fileinfo": "*", + "ext-curl": "*", "psr/log": "*", "karelwintersky/arris": "^2.12", "karelwintersky/arris.toolkit.mimetypes": "^1.99", "ajur-media/php_gdwrapper": "^1.99", - "karelwintersky/arris.entity": "^0.99" + "karelwintersky/arris.entity": "^0.99", + "curl/curl": "^2.5" }, "require-dev": { "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5" diff --git a/src/Media.php b/src/Media.php index b21af6b..75ab21b 100644 --- a/src/Media.php +++ b/src/Media.php @@ -2,15 +2,16 @@ namespace AJUR\FSNews; -use AJUR\FSNews\Constants\AllowedMimeTypes; -use AJUR\FSNews\Constants\ContentDirs; -use AJUR\FSNews\Constants\ConvertSizes; -use AJUR\FSNews\Helpers\DTHelper; -use AJUR\FSNews\Helpers\MediaHelpers; +use AJUR\FSNews\Media\Constants\AllowedMimeTypes; +use AJUR\FSNews\Media\Constants\ContentDirs; +use AJUR\FSNews\Media\Constants\ConvertSizes; +use AJUR\FSNews\Media\Helpers\DTHelper; +use AJUR\FSNews\Media\Helpers\MediaHelpers; use AJUR\Wrappers\GDWrapper; use Arris\Entity\Result; use Arris\Path; use Arris\Toolkit\MimeTypes; +use Exception; use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; use RuntimeException; @@ -53,11 +54,11 @@ public static function init(array $options = [], array $content_dirs = [], Logge * @param $watermark_corner * @param LoggerInterface|null $logger * @return Result - * @throws \Exception + * @throws Exception */ - public static function uploadImage($fn_source, $watermark_corner, LoggerInterface $logger = null): Result + public static function uploadImage($fn_source, $watermark_corner, LoggerInterface $logger = null):Result { - $logger = $logger ?? self::$logger; + $logger = $logger ?? self::$logger ?? new NullLogger(); $logger->debug('[PHOTO] Обрабатываем как фото (image/*)'); @@ -66,17 +67,17 @@ public static function uploadImage($fn_source, $watermark_corner, LoggerInterfac return new Result(false, 'Invalid source file.'); } - $path = self::getAbsoluteResourcePath('photos', 'now'); + $result = new Result(); + $result->setData('thumbnails', []); + $path = self::getAbsoluteResourcePath('photos', 'now'); self::validatePath($path); - $radix = self::getRandomFilename(20); - $source_extension = MimeTypes::fromExtension( MimeTypes::fromFilename($fn_source) ); - $original_filename = "{$radix}.{$source_extension}"; + $resource_filename = "{$radix}.{$source_extension}"; - $logger->debug("[PHOTO] Загруженное изображение будет иметь корень имени:", [ $original_filename ]); + $logger->debug("[PHOTO] Загруженное изображение будет иметь корень имени:", [ $resource_filename ]); $available_photo_sizes = self::getConvertSizes('photos'); @@ -87,18 +88,19 @@ public static function uploadImage($fn_source, $watermark_corner, LoggerInterfac $quality = $params['quality']; $prefix = $params['prefix']; - $fn_target = Path::create($path)->joinName("{$prefix}{$original_filename}")->toString(); // ПРЕФИКС УЖЕ СОДЕРЖИТ `_` + $fn_target = Path::create($path)->joinName("{$prefix}{$resource_filename}")->toString(); // ПРЕФИКС УЖЕ СОДЕРЖИТ `_` if (!call_user_func_array($method, [ $fn_source, $fn_target, $max_width, $max_height, $quality ])) { foreach ($available_photo_sizes as $inner_size => $inner_params) { - @unlink( Path::create($path)->joinName("{$inner_params['prefix']}{$original_filename}")); + @unlink( Path::create($path)->joinName("{$inner_params['prefix']}{$resource_filename}")); } $logger->error('[PHOTO] Не удалось сгенерировать превью с параметрами: ', [ $method, $max_width, $max_height, $quality, $fn_target ]); throw new RuntimeException("Ошибка конвертации загруженного изображения в размер [$prefix]", -1); } - $logger->debug('[PHOTO] Сгенерировано превью: ', [ $method, $max_width, $max_height, $quality, $fn_target ]); + $result->addData('thumbnails', [[ $fn_target, $method, $max_width, $max_height, $quality ]]); + if (!is_null($watermark_corner) && isset($params['wmFile']) && $watermark_corner > 0) { $fn_watermark = Path::create( self::$options['watermarks'] )->joinName($params['wmFile'])->toString(); @@ -112,13 +114,14 @@ public static function uploadImage($fn_source, $watermark_corner, LoggerInterfac } // сохраняем оригинал (в конфиг?) - $fn_origin = Path::create($path)->joinName("origin_{$original_filename}")->toString(); + $prefix_origin = "origin_"; + $fn_origin = Path::create($path)->joinName("{$prefix_origin}{$resource_filename}")->toString(); if (!move_uploaded_file($fn_source, $fn_origin)) { $logger->error("[PHOTO] Не удалось сохранить сохранить загруженный файл {$fn_source} как файл оригинала {$fn_origin}", [ $fn_source, $fn_origin ]); // но тогда нужно удалить и все превьюшки foreach ($available_photo_sizes as $inner_size => $inner_params) { - @unlink( Path::create($path)->joinName("{$inner_params['prefix']}{$original_filename}")); + @unlink( Path::create($path)->joinName("{$inner_params['prefix']}{$resource_filename}")); } throw new MediaException("Не удалось сохранить сохранить загруженный файл {$fn_source} как файл оригинала {$fn_origin}", -1); @@ -126,24 +129,39 @@ public static function uploadImage($fn_source, $watermark_corner, LoggerInterfac $logger->debug("[PHOTO] Загруженный файл {$fn_source} сохранён как оригинал в файл {$fn_origin}: ", [ $fn_source, $fn_origin ]); - return (new Result())->setData([ - 'filename' => $fn_origin, - 'radix' => $radix, - 'status' => 'pending', - 'type' => self::MEDIA_TYPE_AUDIO + $result->setData([ + 'fn_resource' => "{$radix}.{$source_extension}", + 'radix' => $radix, + 'extension' => $source_extension, + 'fn_origin' => $fn_origin, + 'status' => 'pending', + 'type' => self::MEDIA_TYPE_PHOTOS ]); + + return $result; } + /** + * Upload Audio + * + * @param $fn_source + * @param LoggerInterface $logger + * @return Result + * @throws Exception + */ public static function uploadAudio($fn_source, LoggerInterface $logger = null) { - $logger = $logger ?? self::$logger; + $logger = $logger ?? self::$logger ?? new NullLogger(); $logger->debug('[AUDIO] Обрабатываем как аудио (audio/*)'); - $path = self::getAbsoluteResourcePath('audios', 'now'); + if (empty($fn_source) || !is_file($fn_source)) { + $logger->error('Invalid source file for image upload.', ['fn_source' => $fn_source]); + return new Result(false, 'Invalid source file.'); + } + $path = self::getAbsoluteResourcePath('audios', 'now'); self::validatePath($path); - $radix = self::getRandomFilename(20); $source_extension = MimeTypes::fromExtension( MimeTypes::fromFilename($fn_source) ); @@ -152,7 +170,8 @@ public static function uploadAudio($fn_source, LoggerInterface $logger = null) $logger->debug("[AUDIO] Загруженный аудиофайл будет иметь корень имени:", [ $filename_original ]); - $prefix = current(self::$convert_sizes['audios'])['prefix']; + // $prefix = current(self::$convert_sizes['audios'])['prefix']; + $prefix = ConvertSizes::getConvertSizes('audios._.prefix'); // ничего не конвертируем, этим займется крон-скрипт $fn_origin = Path::create($path)->joinName("{$prefix}{$filename_original}")->toString(); // ПРЕФИКС УЖЕ СОДЕРЖИТ `_` @@ -170,35 +189,40 @@ public static function uploadAudio($fn_source, LoggerInterface $logger = null) return (new Result())->setData([ 'filename' => $fn_origin, 'radix' => $radix, + 'extension' => $source_extension, 'status' => 'pending', 'type' => self::MEDIA_TYPE_AUDIO ]); } - public static function uploadAnyFile($fn_source, LoggerInterface $logger = null) + /** + * Upload Abstract File + * + * @param $fn_source + * @param LoggerInterface|null $logger + * @return Result + * @throws Exception + */ + public static function uploadAnyFile($fn_source, LoggerInterface $logger = null):Result { - $logger = $logger ?? self::$logger; + $logger = $logger ?? self::$logger ?? new NullLogger(); $logger->debug('[FILE] Обрабатываем как аудио (audio/*)'); $path = self::getAbsoluteResourcePath('audios', 'now'); - self::validatePath($path); - $radix = self::getRandomFilename(20); - $source_extension = MimeTypes::fromExtension( MimeTypes::fromFilename($fn_source) ); - $filename_origin = "{$radix}.{$source_extension}"; $logger->debug("[FILE] Загруженный аудиофайл будет иметь корень имени:", [ $filename_origin ]); - $prefix = current(self::$convert_sizes['audios'])['prefix']; + // $prefix = current(self::$convert_sizes['files'])['prefix']; + $prefix = ConvertSizes::getConvertSizes('files._.prefix'); - // ничего не конвертируем, этим займется крон-скрипт + // никаких действий над файлом не совершается $fn_target = Path::create($path)->joinName("{$prefix}{$filename_origin}")->toString(); // ПРЕФИКС УЖЕ СОДЕРЖИТ `_` - if (!move_uploaded_file($fn_source, $fn_target)) { $logger->error("[FILE] Не удалось сохранить сохранить загруженный файл {$fn_source} как файл оригинала {$fn_target}", [ $fn_source, $fn_target ]); throw new MediaException("Не удалось сохранить сохранить загруженный файл {$fn_source} как файл оригинала {$fn_target}", -1); @@ -217,9 +241,20 @@ public static function uploadAnyFile($fn_source, LoggerInterface $logger = null) ]); } - public static function uploadVideo($fn_source, LoggerInterface $logger = null) + /** + * Загружает видео и строит превью + * + * Можно использовать https://packagist.org/packages/php-ffmpeg/php-ffmpeg, + * но я предпочел нативный метод, через прямые вызовы shell_exec() + * + * @param $fn_source + * @param LoggerInterface|null $logger + * @return Result + * @throws Exception + */ + public static function uploadVideo($fn_source, LoggerInterface $logger = null): Result { - $logger = $logger ?? self::$logger; + $logger = $logger ?? self::$logger ?? new NullLogger(); $logger->debug('[VIDEO] Обрабатываем как видео (video/*)'); @@ -264,11 +299,8 @@ public static function uploadVideo($fn_source, LoggerInterface $logger = null) // готовим имя основного файла $path = self::getAbsoluteResourcePath('videos', 'now'); - self::validatePath($path); - $radix = self::getRandomFilename(20); - $source_extension = MimeTypes::fromExtension( MimeTypes::fromFilename($fn_source) ); $fn_original = Path::create( $path )->joinName("{$radix}.{$source_extension}")->toString(); @@ -329,49 +361,18 @@ public static function uploadVideo($fn_source, LoggerInterface $logger = null) } // uploadVideo /** - * Загружает с ютуба название видео. Точно работает с видео, с shorts не проверялось. + * Удаляет тайтловое изображение и все его превьюшки * - * @param string $video_id - * @param string $default + * @param $filename + * @param $cdate + * @param LoggerInterface|null $logger * @return Result */ - public static function getYoutubeVideoTitle(string $video_id, string $default = ''):Result + public static function unlinkStoredTitleImages($filename, $cdate, LoggerInterface $logger = null):Result { - $r = new Result(); - $r->title = $default; - - //@todo: curl? - $video_info = @file_get_contents("http://youtube.com/get_video_info?video_id={$video_id}"); - - if (!$video_info) { - $r->error("Invalid [http://youtube.com/get_video_info] response"); - return $r; - } - - parse_str($video_info, $vi_array); - $r->video_info = $video_info; + $logger = $logger ?? self::$logger ?? new NullLogger(); - if (!array_key_exists('player_response', $vi_array)) { - $r->error("No [player_response] in youtube answer"); - return $r; - } - - $video_info = json_decode($vi_array['player_response']); - $r->player_response = $vi_array['player_response']; - - if (is_null($video_info)) { - $r->error("Can't decode player_response from youtube answer"); - return $r; - } - - $r->title = $video_info->videoDetails->title ?: $default; - - return $r; - } - - public static function unlinkStoredTitleImages($filename, $cdate, LoggerInterface $logger = null):int - { - $logger = $logger ?? self::$logger; + $r = new Result(); $path = self::getAbsoluteResourcePath('titles', $cdate, false); @@ -383,11 +384,19 @@ public static function unlinkStoredTitleImages($filename, $cdate, LoggerInterfac foreach ($prefixes as $prefix) { $fn = $path->joinName($prefix . $filename)->toString(); - $logger->debug("[unlinkStoredTitleImage] Удалятся файл:", [ $fn, @unlink($fn) ]); + $success = @unlink($fn); + $logger->debug("[unlinkStoredTitleImages] Удалятся файл:", [ $fn, $success ]); + + $r->addData('list', [[ + 'file' => $fn, + 'success' => $success + ]]); + $deleted_count++; } + $r->deleted_count = $deleted_count; - return $deleted_count; + return $r; } /** @@ -428,11 +437,14 @@ public static function prepareMediaProperties( $row['cdate_rus'] = DTHelper::convertDate($row['cdate']); } + // префикс идет без `_` и в /var/www/47news_v1_admin/www/frontend/js/jquery.file-manager.js он тоже без `_` + // (подставляется в коде) $row['prefix'] = $is_report ? "440x300" : "100x100"; $row['report_prefix'] = "590x440"; + // $is_report используется только на сайте + if ($row['type'] === "photos") { - // $this->report NEVER DECLARED (в админке уж точно) if ($is_report) { if ($target_is_mobile) { $row['sizes'] = [590, 440]; // "590x440" -- mobile_report_tn @@ -453,7 +465,8 @@ public static function prepareMediaProperties( $row['sizes_prev'] = [150, 100]; // "150x100" $row['sizes_large'] = [1280, 1024]; // "1280x1024" - $row['orig_file'] = "590x440_" . $row['file']; // "590x440_" + // $row['orig_file'] = "590x440_" . $row['file']; // было удалено + $row['orig_file'] = ConvertSizes::$convert_sizes['photos']["630x465"]['prefix'] . $row['file']; } if ($row['type'] === "videos") { @@ -461,7 +474,8 @@ public static function prepareMediaProperties( $row['sizes'] = [640, 352]; $row['sizes_thumb'] = "640x352"; // $k[2] $row['sizes_video'] = array(640, 352 + 25); //minWidth, minHeight - $row['orig_file'] = "440x248_" . $row['thumb']; + // $row['orig_file'] = "440x248_" . $row['thumb']; + $row['orig_file'] = ConvertSizes::$convert_sizes['videos']["640x352"]['prefix'] . $row['thumb']; } if ($row['type'] === "audios") { diff --git a/src/Constants/AllowedMimeTypes.php b/src/Media/Constants/AllowedMimeTypes.php similarity index 93% rename from src/Constants/AllowedMimeTypes.php rename to src/Media/Constants/AllowedMimeTypes.php index 07bac40..85a2056 100644 --- a/src/Constants/AllowedMimeTypes.php +++ b/src/Media/Constants/AllowedMimeTypes.php @@ -1,6 +1,6 @@ debug("[VIDEO] Таймштамп для превью:", [ $tn_timestamp ]); @@ -130,6 +148,8 @@ public static function resizePreview($source, $target, array $params = [], $logg return false; } + $logger = $logger ?? self::$logger ?? new NullLogger(); + $logger->debug("[VIDEO] Генерируем превью {$params['prefix']} ({$target}) на основе {$source}", [ $params ]); $generate_result = GDWrapper::getFixedPicture( diff --git a/src/Media/Workers/Any.php b/src/Media/Workers/Any.php new file mode 100644 index 0000000..66d43e9 --- /dev/null +++ b/src/Media/Workers/Any.php @@ -0,0 +1,14 @@ + result + + /** + * @var LoggerInterface + */ + private LoggerInterface $logger; + + public function __construct($logger) + { + $this->logger = $logger; + } + + /** + * Загружает с ютуба название видео. Точно работает с видео, с shorts не проверялось. + * + * @param string $video_id + * @param string $default + * @return Result [title] + */ + public function getYoutubeVideoTitle(string $video_id, string $default = ''):Result + { + $r = new Result(); + $r->title = $default; + + //@todo: curl? + $video_info = @file_get_contents("http://youtube.com/get_video_info?video_id={$video_id}"); + + if (!$video_info) { + $r->error("Invalid [http://youtube.com/get_video_info] response"); + return $r; + } + + parse_str($video_info, $vi_array); + $r->video_info = $video_info; + + if (!array_key_exists('player_response', $vi_array)) { + $r->error("No [player_response] in youtube answer"); + return $r; + } + + $video_info = json_decode($vi_array['player_response']); + $r->player_response = $vi_array['player_response']; + + if (is_null($video_info)) { + $r->error("Can't decode player_response from youtube answer"); + return $r; + } + + $r->title = $video_info->videoDetails->title ?: $default; + + return $r; + } + + /** + * @param $url - URL скачиваемого видео + * @param $fn_default_preview - путь к дефолтному превью, для админки 47 = Path::create(config('PATH.WEB'))->join("/frontend/images/")->joinName('youtube_video_emptypreview.jpg')->toString() + * @return Result + */ + public function getYoutubeVideoPreview($url, $fn_default_preview):Result + { + $result = new Result(); + + try { + $url_matches = parse_url($url); + + if (array_key_exists('query', $url_matches) && preg_match("/v=([A-Za-z0-9\_\-]{11})/i", $url_matches["query"], $match_result)) { + // это youtube.com/?v= + $video_url_hash = $match_result[1]; + } elseif (strpos($url, '/shorts/') > 0 && preg_match("/\/([A-Za-z0-9\_\-]{11})/i", $url, $match_result)) { + // это youtube shorts + $video_url_hash = $match_result[1]; + } elseif (strpos($url, 'youtu.be') > 0 && preg_match("/youtu\.be\/([A-Za-z0-9\_\-]{11})/i", $url, $match_result)) { + // это короткая ссылка youtu.be/?v= + $video_url_hash = $match_result[1]; + } else { + // в противном случае URL нераспознан + throw new \RuntimeException("Передан URL неизвестного типа" . $url ); + } + + $result->addMessage("Для загрузки передан корректный URL [{$url}]"); + + $storage_path = Media::getAbsoluteResourcePath('youtube'); + Media::validatePath($storage_path); + + $target_filename = Media::generateNewFile($storage_path); //@todo: если мы решим добавлять суффикс к имени файла - то можно указать его при вызове + $target_file = "{$storage_path}/{$target_filename}"; + + $result->addMessage("Сгенерировано новое уникальное имя файла: " . $target_file); + + // работаем с ютубом через CURL (напрямую, не через библиотеку, это некошерно, но...) + $target_file_handler = fopen($target_file, 'w+');// Try to load high quality preview + $source_url = "https://i.ytimg.com/vi/{$video_url_hash}/hqdefault.jpg"; + $curl = new \Curl\Curl(); + $curl->setOpt(CURLOPT_FILE, $target_file_handler); + $curl->setOpt(CURLOPT_SSL_VERIFYHOST, 2); + $curl->setOpt(CURLOPT_SSL_VERIFYPEER, true); + $curl->get($source_url); + $httpCode = $curl->getOpt(CURLINFO_RESPONSE_CODE); + $curl->close(); + if (404 === $httpCode) { + $source_url = "https://i.ytimg.com/vi/{$video_url_hash}/mqdefault.jpg"; + + $curl = new \Curl\Curl(); + $curl->setOpt(CURLOPT_FILE, $target_file_handler); + $curl->setOpt(CURLOPT_SSL_VERIFYHOST, 2); + $curl->setOpt(CURLOPT_SSL_VERIFYPEER, true); + $curl->get($source_url); + $httpCode = $curl->getOpt(CURLINFO_RESPONSE_CODE); + $curl->close(); + + if (404 == $httpCode) { + $source_url = $fn_default_preview; + } + } else { + // иначе ставим $source_url = имени файла + $source_url = $target_file; + } + fclose($target_file_handler); + + $result->setData('thumbnails', []); + + foreach (Media::$convert_sizes['youtube'] as $size => $params) { + $prefix = $params['prefix']; + GDWrapper::getFixedPicture($source_url, "{$storage_path}/{$prefix}{$target_filename}", $params['maxWidth'], $params['maxHeight'], $params['quality']); + $this->logger->debug('Generating image', [$source_url, "{$storage_path}/{$prefix}{$target_filename}", $params['maxWidth'], $params['maxHeight'], $params['quality']]); + + $result->addData('thumbnails', [[ + 'file' => "{$storage_path}/{$prefix}{$target_filename}", + 'width' => $params['maxWidth'], + 'height' => $params['maxHeight'], + 'quality' => $params['quality'] + ]]); + } + + $result->setData([ + 'url' => $url, + 'target_filename' => $target_filename, + 'target_file' => $target_file, + 'status' => 'pending', + 'type' => MediaInterface::MEDIA_TYPE_YOUTUBE + ]); + + } catch (\RuntimeException | \Exception $e) { + $result->error($e->getMessage()); + } + + return $result; + } + +} \ No newline at end of file diff --git a/src/MediaException.php b/src/MediaException.php index 2d38b10..ec28804 100644 --- a/src/MediaException.php +++ b/src/MediaException.php @@ -2,4 +2,6 @@ namespace AJUR\FSNews; -class MediaException extends \RuntimeException { } \ No newline at end of file +use RuntimeException; + +class MediaException extends RuntimeException { } \ No newline at end of file diff --git a/src/MediaInterface.php b/src/MediaInterface.php index b64a2b7..390e472 100644 --- a/src/MediaInterface.php +++ b/src/MediaInterface.php @@ -3,6 +3,7 @@ namespace AJUR\FSNews; use Arris\Entity\Result; +use Exception; use Psr\Log\LoggerInterface; interface MediaInterface @@ -36,52 +37,13 @@ public static function init(array $options = [], array $content_dirs = [], Logge public static function uploadImage($fn_source, $watermark_corner, LoggerInterface $logger); - /** - * Upload Audio - * - * @param $fn_source - * @param LoggerInterface $logger - * @return Result - * @throws \Exception - */ public static function uploadAudio($fn_source, LoggerInterface $logger = null); - /** - * Upload Abstract File - * - * @param $fn_source - * @param LoggerInterface $logger - * @return Result - * @throws \Exception - */ public static function uploadAnyFile($fn_source, LoggerInterface $logger = null); - /** - * Загружает видео и строит превью - * - * Можно использовать https://packagist.org/packages/php-ffmpeg/php-ffmpeg , но я предпочел нативный метод, через - * прямые вызовы shell_exec() - * - * @param $fn_source - * @param LoggerInterface $logger - * @return Result - * @throws \Exception - */ public static function uploadVideo($fn_source, LoggerInterface $logger = null); - - public static function getYoutubeVideoTitle(string $video_id, string $default = ''):Result; - - /** - * Удаляет тайтловое изображение и все его превьюшки - * - * @param $radix - * @param $cdate - * @param LoggerInterface $logger - * @return int - */ - public static function unlinkStoredTitleImages($filename, $cdate, LoggerInterface $logger = null):int; - + public static function unlinkStoredTitleImages($filename, $cdate, LoggerInterface $logger = null):Result; public static function prepareMediaProperties(array $row = [], bool $is_report = false, bool $prepend_domain = false, bool $target_is_mobile = false, string $domain_prefix = ''):array; } \ No newline at end of file diff --git a/tests/MediaTest.php b/tests/MediaTest.php index 421a0f8..c21c27d 100644 --- a/tests/MediaTest.php +++ b/tests/MediaTest.php @@ -42,7 +42,7 @@ public function testGetRelativeResourcePath() */ public function testDeserialize1() { - $this->assertEquals(['a' => 1 ], \AJUR\FSNews\Helpers\MediaHelpers::deserialize('{"a": 1}', [])); + $this->assertEquals(['a' => 1 ], Media\Helpers\MediaHelpers::deserialize('{"a": 1}', [])); } } \ No newline at end of file