| 1 | <?php |
||
| 2 | /** |
||
| 3 | * 又拍云 PHP-SDK |
||
| 4 | */ |
||
| 5 | namespace Upyun; |
||
| 6 | |||
| 7 | use Upyun\Api\Rest; |
||
| 8 | |||
| 9 | use GuzzleHttp\Client; |
||
| 10 | use GuzzleHttp\Psr7; |
||
| 11 | use GuzzleHttp; |
||
| 12 | use GuzzleHttp\Psr7\Utils; |
||
| 13 | |||
| 14 | /** |
||
| 15 | * Class Upyun |
||
| 16 | * |
||
| 17 | * 又拍云云存储、云处理接口 |
||
| 18 | * |
||
| 19 | * Upyun 类实现了又拍云云存储和云处理的所有接口,通过该类可以实现文件上传、下载;图片视频等多媒体资源云处理。 |
||
| 20 | * 本文档中,提到的"服务"是指又拍云文件加速回又拍云源类型的服务(即原先的存储类空间)。 |
||
| 21 | * |
||
| 22 | * @package Upyun |
||
| 23 | */ |
||
| 24 | class Upyun |
||
| 25 | { |
||
| 26 | |||
| 27 | /** |
||
| 28 | * @var Config: 服务配置 |
||
| 29 | */ |
||
| 30 | protected $config; |
||
| 31 | |||
| 32 | // 异步云处理任务类型 |
||
| 33 | /** |
||
| 34 | * @var string 异步音视频处理 |
||
| 35 | */ |
||
| 36 | public static $PROCESS_TYPE_MEDIA = 'media'; |
||
| 37 | /** |
||
| 38 | * @var string 文件压缩 |
||
| 39 | */ |
||
| 40 | public static $PROCESS_TYPE_ZIP = 'zip-file'; |
||
| 41 | /** |
||
| 42 | * @var string 解压缩 |
||
| 43 | */ |
||
| 44 | public static $PROCESS_TYPE_UNZIP = 'unzip-file'; |
||
| 45 | /** |
||
| 46 | * @var string 文件拉取 |
||
| 47 | */ |
||
| 48 | public static $PROCESS_TYPE_SYNC_FILE = 'sync-remote-file-to-upyun'; |
||
| 49 | /** |
||
| 50 | * @var string 文档转换 |
||
| 51 | */ |
||
| 52 | public static $PROCESS_TYPE_CONVERT = 'document-type-convert'; |
||
| 53 | /** |
||
| 54 | * @var string 异步图片拼接 |
||
| 55 | */ |
||
| 56 | public static $PROCESS_TYPE_STITCH = 'picture-stitch'; |
||
| 57 | |||
| 58 | /** |
||
| 59 | * Upyun constructor. |
||
| 60 | * |
||
| 61 | * @param Config $config 服务配置 |
||
| 62 | */ |
||
| 63 | 2 | public function __construct(Config $config) |
|
| 64 | { |
||
| 65 | 2 | $this->setConfig($config); |
|
| 66 | } |
||
| 67 | |||
| 68 | /** |
||
| 69 | * 配置服务信息 |
||
| 70 | * |
||
| 71 | * 当需要操作的新的服务时,使用该方法传入新的服务配置即可 |
||
| 72 | * |
||
| 73 | * @param Config $config 服务配置 |
||
| 74 | * |
||
| 75 | * @return $this |
||
| 76 | */ |
||
| 77 | 2 | public function setConfig(Config $config) |
|
| 78 | { |
||
| 79 | 2 | $this->config = $config; |
|
| 80 | 2 | return $this; |
|
| 81 | } |
||
| 82 | |||
| 83 | /** |
||
| 84 | * 上传一个文件到又拍云存储 |
||
| 85 | * |
||
| 86 | * 上传的文件格式支持文件流或者字符串方式上传。除简单的文件上传外,针对多媒体资源(图片、音视频),还可以设置同步/异步预处理多媒体资源,例如:图片的裁剪缩放,音视频的转码截图等等众多又拍云强大的云处理功能 |
||
| 87 | * |
||
| 88 | * @param string $path 被上传的文件在又拍云存储服务中保存的路径 |
||
| 89 | * @param string|resource $content 被上传的文件内容(字符串),或者打开该文件获得的文件句柄(文件流)。当上传本地大文件时,推荐使用文件流的方式上传 |
||
| 90 | * @param array $params 上传文件时,附加的自定义参数。支持 Content-MD5 Content-Type Content-Secret 等,详见 [上传参数](http://docs.upyun.com/api/rest_api/#_2),例如: |
||
| 91 | * - 设置文件[保护秘钥](http://docs.upyun.com/api/rest_api/#Content-Secret) `write($path, $content, array('Content-Secret' => 'my-secret'))`; |
||
| 92 | * - 添加[文件元信息](http://docs.upyun.com/api/rest_api/#metadata) `write($path, $content, array('X-Upyun-Meta-Foo' => |
||
| 93 | * 'bar'))` |
||
| 94 | * - [图片同步预处理](http://docs.upyun.com/cloud/image/#_5) `write($path, $content, array('x-gmkerl-thumb' => '/format/png'))` |
||
| 95 | * @param bool $withAsyncProcess 默认为 `false`,当上传图片或者音视频资源时,可以设置该参数为 `true`,开启图片音视频的[异步处理功能](http://docs.upyun.com/api/form_api/#_6) ,例如: |
||
| 96 | *``` |
||
| 97 | * // 以下参数会将新上传的图片,再异步生成另一份 png 格式的图片,原图不受影响 |
||
| 98 | * write($path, $content, array( |
||
| 99 | * 'apps' => array( |
||
| 100 | * array( |
||
| 101 | * 'name' => 'thumb', //异步图片处理任务 |
||
| 102 | * 'x-gmkerl-thumb' => '/format/png', // 格式化图片为 png 格式 |
||
| 103 | * 'save_as': '/iamge/png/new.png', // 处理成功后的图片保存路径 |
||
| 104 | * 'notify_url': 'http://your.notify.url' // 异步任务完成后的回调地址 |
||
| 105 | * ) |
||
| 106 | * ) |
||
| 107 | * ), true); |
||
| 108 | *``` |
||
| 109 | * |
||
| 110 | * |
||
| 111 | * |
||
| 112 | * @return array|bool 若文件是图片则返回图片基本信息,如:`array('x-upyun-width' => 123, 'x-upyun-height' => 50, 'x-upyun-frames' |
||
| 113 | * => 1, 'x-upyun-file-type' => 'JPEG')`,否则返回空数组。当使用异步预处理功能时,返回结果为布尔值,成功为 `true`。 |
||
| 114 | * |
||
| 115 | * @throws \Exception 上传失败时,抛出异常 |
||
| 116 | */ |
||
| 117 | 15 | public function write($path, $content, $params = array(), $withAsyncProcess = false) |
|
| 118 | { |
||
| 119 | 15 | if (!$content) { |
|
| 120 | throw new \Exception('write content can not be empty.'); |
||
| 121 | } |
||
| 122 | |||
| 123 | 15 | $upload = new Uploader($this->config); |
|
| 124 | 15 | $response = $upload->upload($path, $content, $params, $withAsyncProcess); |
|
| 125 | 14 | if ($withAsyncProcess) { |
|
| 126 | 1 | return $response; |
|
|
0 ignored issues
–
show
Bug
Best Practice
introduced
by
Loading history...
|
|||
| 127 | } |
||
| 128 | 13 | return Util::getHeaderParams($response->getHeaders()); |
|
| 129 | } |
||
| 130 | |||
| 131 | /** |
||
| 132 | * 读取云存储文件/目录内容 |
||
| 133 | * |
||
| 134 | * @param string $path 又拍云存储中的文件或者目录路径 |
||
| 135 | * @param resource $saveHandler 文件内容写入本地文件流。例如 `$saveHandler = fopen('/local/file', 'w') |
||
| 136 | * `。当设置该参数时,将以文件流的方式,直接将又拍云中的文件写入本地的文件流,或其他可以写入的流 |
||
| 137 | * @param array $params 可选参数,读取目录内容时,需要设置三个参数: `X-List-Iter` 分页开始位置(第一页不需要设置),`X-List-Limit` 获取的文件数量(默认 100,最大 |
||
| 138 | * 10000),`X-List-Order` 结果以时间正序或者倒序 |
||
| 139 | * |
||
| 140 | * @return mixed $return 当读取文件且没有设置 `$saveHandler` 参数时,返回一个字符串类型,表示文件内容;设置了 `$saveHandler` 参数时,返回布尔值 |
||
| 141 | * `true`。当读取目录时,返回一个数组,表示目录下的文件列表。目录下文件内容过多时,需要通过判断返回数组中的 `is_end` 属性,进行分页读取内容 |
||
| 142 | * |
||
| 143 | * @throws \Exception |
||
| 144 | */ |
||
| 145 | 3 | public function read($path, $saveHandler = null, $params = array()) |
|
| 146 | { |
||
| 147 | 3 | $req = new Rest($this->config); |
|
| 148 | 3 | $response = $req->request('GET', $path) |
|
| 149 | 3 | ->withHeaders($params) |
|
| 150 | 3 | ->send(); |
|
| 151 | |||
| 152 | |||
| 153 | 2 | $params = Util::getHeaderParams($response->getHeaders()); |
|
| 154 | |||
| 155 | |||
| 156 | 2 | if (! isset($params['x-upyun-list-iter'])) { |
|
| 157 | 1 | if (is_resource($saveHandler)) { |
|
| 158 | 1 | Utils::copyToStream($response->getBody(), Utils::streamFor($saveHandler)); |
|
| 159 | 1 | return true; |
|
| 160 | } else { |
||
| 161 | 1 | return $response->getBody()->getContents(); |
|
| 162 | } |
||
| 163 | } else { |
||
| 164 | 1 | $files = Util::parseDir($response->getBody()->getContents()); |
|
| 165 | 1 | return array('files' => $files, 'is_end' => $params['x-upyun-list-iter'] === 'g2gCZAAEbmV4dGQAA2VvZg', 'iter' => $params['x-upyun-list-iter']); |
|
| 166 | } |
||
| 167 | } |
||
| 168 | |||
| 169 | /** |
||
| 170 | * 判断文件是否存在于又拍云存储 |
||
| 171 | * |
||
| 172 | * 注意: 对刚删除的文件, 立即调用该方法可能会返回 true, 因为服务端执行删除操作后可能会有很短暂的延迟. |
||
| 173 | * |
||
| 174 | * @param string $path 云存储的文件路径 |
||
| 175 | * |
||
| 176 | * @return bool 存在时返回 `true`,否则返回 `false` |
||
| 177 | * @throws \Exception |
||
| 178 | */ |
||
| 179 | 4 | public function has($path) |
|
| 180 | { |
||
| 181 | 4 | $req = new Rest($this->config); |
|
| 182 | try { |
||
| 183 | 4 | $req->request('HEAD', $path) |
|
| 184 | 4 | ->send(); |
|
| 185 | 2 | } catch (GuzzleHttp\Exception\BadResponseException $e) { |
|
| 186 | 2 | $statusCode = $e->getResponse()->getStatusCode(); |
|
| 187 | 2 | if ($statusCode === 404) { |
|
| 188 | 2 | return false; |
|
| 189 | } else { |
||
| 190 | throw $e; |
||
| 191 | } |
||
| 192 | } |
||
| 193 | |||
| 194 | 4 | return true; |
|
| 195 | } |
||
| 196 | |||
| 197 | /** |
||
| 198 | * 获取云存储文件/目录的基本信息 |
||
| 199 | * |
||
| 200 | * @param string $path 云存储的文件路径 |
||
| 201 | * @param array $otherHeaders 设置了后,方法将返回其他 http header 中的信息,默认为空 |
||
| 202 | * |
||
| 203 | * @return array 返回一个数组,默认包含以下 key |
||
| 204 | * - `x-upyun-file-type` 当 $path 是目录时,值为 *folder*,当 $path 是文件时,值为 *file*, |
||
| 205 | * - `x-upyun-file-size` 文件大小 |
||
| 206 | * - `x-upyun-file-date` 文件的创建时间 |
||
| 207 | */ |
||
| 208 | 2 | public function info($path, $otherHeaders = array()) |
|
| 209 | { |
||
| 210 | 2 | $req = new Rest($this->config); |
|
| 211 | 2 | $response = $req->request('HEAD', $path) |
|
| 212 | 2 | ->send(); |
|
| 213 | 2 | return Util::getHeaderParams($response->getHeaders(), $otherHeaders); |
|
| 214 | } |
||
| 215 | |||
| 216 | /** |
||
| 217 | * 获取文件的文档类型 |
||
| 218 | * @param string $path 云存储文件路径 |
||
| 219 | * @return string 文档类型,e.g: `appcation/json`,获取失败返回空字符串 |
||
| 220 | */ |
||
| 221 | 1 | public function getMimetype($path) |
|
| 222 | { |
||
| 223 | 1 | $params = $this->info($path, array('content-type')); |
|
| 224 | 1 | if (isset($params['content-type'])) { |
|
| 225 | 1 | return explode(';', $params['content-type'])[0]; |
|
| 226 | } |
||
| 227 | return ''; |
||
| 228 | } |
||
| 229 | |||
| 230 | /** |
||
| 231 | * 删除文件或者目录 |
||
| 232 | * |
||
| 233 | * @param string $path 文件或目录在又拍云存储的路径 |
||
| 234 | * @param bool $async 是否异步删除,默认为 false,表示同步删除。当需要批量删除大量文件时,必须选择异步删除 |
||
| 235 | * |
||
| 236 | * @return bool 删除成功返回 true,否则 false |
||
| 237 | * @throws \Exception 删除不存在的文件将会抛出异常 |
||
| 238 | */ |
||
| 239 | 4 | public function delete($path, $async = false) |
|
| 240 | { |
||
| 241 | 4 | $req = new Rest($this->config); |
|
| 242 | 4 | $req->request('DELETE', $path); |
|
| 243 | 4 | if ($async) { |
|
| 244 | $req->withHeader('x-upyun-async', 'true'); |
||
| 245 | } |
||
| 246 | 4 | $res = $req->send(); |
|
| 247 | 3 | return $res->getStatusCode() === 200; |
|
| 248 | } |
||
| 249 | |||
| 250 | /** |
||
| 251 | * 创建目录 |
||
| 252 | * |
||
| 253 | * @param string $path 需要在又拍云存储创建的目录路径 |
||
| 254 | * |
||
| 255 | * @return bool 创建成功返回 true,否则返回 false |
||
| 256 | * @throws \Exception |
||
| 257 | */ |
||
| 258 | 2 | public function createDir($path) |
|
| 259 | { |
||
| 260 | 2 | $path = rtrim($path, '/') . '/'; |
|
| 261 | 2 | $req = new Rest($this->config); |
|
| 262 | 2 | $res = $req->request('POST', $path) |
|
| 263 | 2 | ->withHeader('folder', 'true') |
|
| 264 | 2 | ->send(); |
|
| 265 | 2 | return $res->getStatusCode() === 200; |
|
| 266 | } |
||
| 267 | |||
| 268 | /** |
||
| 269 | * 删除文件或者目录 |
||
| 270 | * |
||
| 271 | * @param string $path 需要被删除的云存储文件或目录路径 |
||
| 272 | * |
||
| 273 | * @return bool 成功返回 true,否则 false |
||
| 274 | * @throws \Exception |
||
| 275 | */ |
||
| 276 | 1 | public function deleteDir($path) |
|
| 277 | { |
||
| 278 | 1 | return $this->delete($path); |
|
| 279 | } |
||
| 280 | |||
| 281 | /** |
||
| 282 | * 获取目录下存储使用量 |
||
| 283 | * |
||
| 284 | * @param string $path 云存储目录路径,默认为根目录,表示整个云存储服务使用的空间大小 |
||
| 285 | * @return string 存储使用量,单位字节 |
||
| 286 | * @throws \Exception |
||
| 287 | */ |
||
| 288 | 1 | public function usage($path = '/') |
|
| 289 | { |
||
| 290 | 1 | $path = rtrim($path, '/') . '/'; |
|
| 291 | 1 | $req = new Rest($this->config); |
|
| 292 | 1 | $response = $req->request('GET', $path . '?usage') |
|
| 293 | 1 | ->send(); |
|
| 294 | |||
| 295 | 1 | return $response->getBody()->getContents(); |
|
| 296 | } |
||
| 297 | |||
| 298 | /** |
||
| 299 | * 复制文件。只能操作文件,不能操作文件夹。 |
||
| 300 | * |
||
| 301 | * @param string $source 源文件地址 |
||
| 302 | * @param string $target 目标文件地址 |
||
| 303 | * @return bool 复制成功返回 true,否则 false |
||
| 304 | * @throws \Exception |
||
| 305 | */ |
||
| 306 | 1 | public function copy($source, $target) |
|
| 307 | { |
||
| 308 | 1 | $source = '/' . $this->config->serviceName . '/' . ltrim($source, '/'); |
|
| 309 | 1 | $req = new Rest($this->config); |
|
| 310 | 1 | $response = $req->request('PUT', $target) |
|
| 311 | 1 | ->withHeader('X-Upyun-Copy-Source', $source) |
|
| 312 | 1 | ->send(); |
|
| 313 | 1 | return Util::isSuccess($response->getStatusCode()); |
|
| 314 | } |
||
| 315 | |||
| 316 | /** |
||
| 317 | * 移动文件。可以进行文件重命名、文件移动,只能操作文件,不能操作文件夹。 |
||
| 318 | * |
||
| 319 | * @param string $source 源文件地址 |
||
| 320 | * @param string $target 目标文件地址 |
||
| 321 | * @return bool 移动成功返回 true,否则 false |
||
| 322 | * @throws \Exception |
||
| 323 | */ |
||
| 324 | 1 | public function move($source, $target) |
|
| 325 | { |
||
| 326 | 1 | $source = '/' . $this->config->serviceName . '/' . ltrim($source, '/'); |
|
| 327 | 1 | $req = new Rest($this->config); |
|
| 328 | 1 | $response = $req->request('PUT', $target) |
|
| 329 | 1 | ->withHeader('X-Upyun-Move-Source', $source) |
|
| 330 | 1 | ->send(); |
|
| 331 | 1 | return Util::isSuccess($response->getStatusCode()); |
|
| 332 | } |
||
| 333 | |||
| 334 | /** |
||
| 335 | * 刷新缓存 |
||
| 336 | * |
||
| 337 | * @param array|string $urls 需要刷新的文件 url 列表 |
||
| 338 | * |
||
| 339 | * @return array 刷新失败的 url 列表,若全部刷新成功则为空数组 |
||
| 340 | */ |
||
| 341 | 1 | public function purge($urls) |
|
| 342 | { |
||
| 343 | 1 | $urlString = $urls; |
|
| 344 | 1 | if (is_array($urls)) { |
|
| 345 | $urlString = implode("\n", $urls); |
||
| 346 | } |
||
| 347 | |||
| 348 | 1 | $client = new Client([ |
|
| 349 | 1 | 'timeout' => $this->config->timeout |
|
| 350 | 1 | ]); |
|
| 351 | 1 | $response = $client->request('POST', Config::ED_PURGE, [ |
|
| 352 | 1 | 'headers' => Signature::getPurgeSignHeader($this->config, $urlString), |
|
| 353 | 1 | 'form_params' => ['purge' => $urlString] |
|
| 354 | 1 | ]); |
|
| 355 | 1 | $result = json_decode($response->getBody()->getContents(), true); |
|
| 356 | 1 | return $result['invalid_domain_of_url']; |
|
| 357 | } |
||
| 358 | |||
| 359 | /** |
||
| 360 | * 异步云处理 |
||
| 361 | * |
||
| 362 | * 该方法是基于[又拍云云处理](http://docs.upyun.com/cloud/) 服务实现,可以实现音视频的转码、切片、剪辑;文件的压缩解压缩;文件拉取功能 |
||
| 363 | * |
||
| 364 | * 注意: |
||
| 365 | * - 所有需要调用该方法处理的资源,必须已经上传到云存储服务 |
||
| 366 | * - 使用 `process` 之前,必须配置 `config->processNotifyUrl`,否则会提交任务失败 |
||
| 367 | * |
||
| 368 | * 例如视频转码: |
||
| 369 | * ``` |
||
| 370 | * process(array( |
||
| 371 | * array( |
||
| 372 | * 'type' => 'video', // video 表示视频任务, audio 表示音频任务 |
||
| 373 | * 'avopts' => '/s/240p(4:3)/as/1/r/30', // 处理参数,`s` 表示输出的分辨率,`r` 表示视频帧率,`as` 表示是否自动调整分辨率 |
||
| 374 | * 'save_as' => '/video/240/new.mp4', // 新视频在又拍云存储的保存路径 |
||
| 375 | * ), |
||
| 376 | * ... // 同时还可以添加其他任务 |
||
| 377 | * ), Upyun::$PROCESS_TYPE_MEDIA, $source) |
||
| 378 | * ``` |
||
| 379 | * |
||
| 380 | * @param array $tasks 需要处理的任务 |
||
| 381 | * @param string $type 异步云处理任务类型,可选值: |
||
| 382 | * - `Upyun::$PROCESS_TYPE_MEDIA` 异步音视频处理 |
||
| 383 | * - `Upyun::$PROCESS_TYPE_ZIP` 文件压缩 |
||
| 384 | * - `Upyun::$PROCESS_TYPE_UNZIP` 文件解压 |
||
| 385 | * - `Upyun::$PROCESS_TYPE_SYNC_FILE` 文件拉取 |
||
| 386 | * - `Upyun::$PROCESS_TYPE_STITCH` 图片拼接 |
||
| 387 | * @param string $source 可选参数,处理异步音视频任务时,需要传递该参数,表示需要处理的文件路径 |
||
| 388 | * |
||
| 389 | * @return array 任务 ID,提交了多少任务,便会返回多少任务 ID,与提交任务的顺序保持一致。可以通过任务 ID 查询处理进度。格式如下: |
||
| 390 | * ``` |
||
| 391 | * array( |
||
| 392 | * '35f0148d414a688a275bf915ba7cebb2', |
||
| 393 | * '98adbaa52b2f63d6d7f327a0ff223348', |
||
| 394 | * ) |
||
| 395 | * ``` |
||
| 396 | * @throws \Exception |
||
| 397 | */ |
||
| 398 | 1 | public function process($tasks, $type, $source = '') |
|
| 399 | { |
||
| 400 | 1 | $video = new Api\Pretreat($this->config); |
|
| 401 | |||
| 402 | 1 | $options = array(); |
|
| 403 | switch($type) { |
||
| 404 | 1 | case self::$PROCESS_TYPE_MEDIA: |
|
| 405 | 1 | $options['accept'] = 'json'; |
|
| 406 | 1 | $options['source'] = $source; |
|
| 407 | 1 | break; |
|
| 408 | 1 | case self::$PROCESS_TYPE_ZIP: |
|
| 409 | 1 | $options['app_name'] = 'compress'; |
|
| 410 | 1 | break; |
|
| 411 | case self::$PROCESS_TYPE_UNZIP: |
||
| 412 | $options['app_name'] = 'depress'; |
||
| 413 | break; |
||
| 414 | case self::$PROCESS_TYPE_SYNC_FILE: |
||
| 415 | $options['app_name'] = 'spiderman'; |
||
| 416 | break; |
||
| 417 | case self::$PROCESS_TYPE_CONVERT: |
||
| 418 | $options['app_name'] = 'uconvert'; |
||
| 419 | break; |
||
| 420 | case self::$PROCESS_TYPE_STITCH: |
||
| 421 | $options['app_name'] = 'jigsaw'; |
||
| 422 | break; |
||
| 423 | default: |
||
| 424 | throw new \Exception('upyun - not support process type.'); |
||
| 425 | |||
| 426 | } |
||
| 427 | 1 | return $video->process($tasks, $options); |
|
| 428 | } |
||
| 429 | |||
| 430 | /** |
||
| 431 | * 查询异步云处理任务进度 |
||
| 432 | * |
||
| 433 | * 根据 `process` 方法返回的任务 ID,通过该访问查询处理进度 |
||
| 434 | * |
||
| 435 | * @param array $taskIds 任务 ID |
||
| 436 | * |
||
| 437 | * @return bool|array 查询失败返回布尔值 `false`,否则返回每个任务的百分比进度信息,格式如下: |
||
| 438 | * ``` |
||
| 439 | * array( |
||
| 440 | * '35f0148d414a688a275bf915ba7cebb2' => 100, // 100 表示任务完成 |
||
| 441 | * 'c3103189fa906a5354d29bd807e8dc51' => 35, |
||
| 442 | * '98adbaa52b2f63d6d7f327a0ff223348' => null, // null 表示任务未开始,或异常 |
||
| 443 | * ) |
||
| 444 | * ``` |
||
| 445 | */ |
||
| 446 | 1 | public function queryProcessStatus($taskIds) |
|
| 447 | { |
||
| 448 | 1 | $video = new Api\Pretreat($this->config); |
|
| 449 | 1 | return $video->query($taskIds, '/status/'); |
|
| 450 | } |
||
| 451 | |||
| 452 | /** |
||
| 453 | * 查询异步云处理任务结果 |
||
| 454 | * |
||
| 455 | * 根据 `process` 方法返回的任务 ID,通过该访问查询处理结果,会包含每个任务详细信息 |
||
| 456 | * @param array $taskIds 任务 ID |
||
| 457 | * |
||
| 458 | * @return bool|mixed 查询失败返回 `false`,否则返回每个任务的处理结果,格式如下: |
||
| 459 | * ``` |
||
| 460 | * array( |
||
| 461 | * '9d9c32b63a1034834e77672c6f51f661' => array( |
||
| 462 | * 'path' => array('/v2.mp4'), |
||
| 463 | * 'signature' => '4042c1f07f546d28', |
||
| 464 | * 'status_code' => 200, |
||
| 465 | * 'service_name' => 'your_storage_service', |
||
| 466 | * 'description' => 'OK', |
||
| 467 | * 'task_id' => '9d9c32b63a1034834e77672c6f51f661', |
||
| 468 | * 'timestamp' => 1472010684 |
||
| 469 | * ) |
||
| 470 | * ) |
||
| 471 | * ``` |
||
| 472 | */ |
||
| 473 | 1 | public function queryProcessResult($taskIds) |
|
| 474 | { |
||
| 475 | 1 | $video = new Api\Pretreat($this->config); |
|
| 476 | 1 | return $video->query($taskIds, '/result/'); |
|
| 477 | } |
||
| 478 | |||
| 479 | /** |
||
| 480 | * 多个 m3u8 文件拼接 |
||
| 481 | * @param array $files 保存在又拍云云存储中的多个 m3u8 文件路径 |
||
| 482 | * @param string $saveAs 拼接生成的新 m3u8 文件保存路径 |
||
| 483 | * |
||
| 484 | * @return array 见 [m3u8 拼接 - 响应](http://docs.upyun.com/cloud/sync_video/#_3) |
||
| 485 | */ |
||
| 486 | public function m3u8Concat($files, $saveAs) |
||
| 487 | { |
||
| 488 | $p = new Api\SyncVideo($this->config); |
||
| 489 | return $p->process([ |
||
| 490 | 'm3u8s' => $files, |
||
| 491 | 'save_as' => $saveAs, |
||
| 492 | ], '/m3u8er/concat'); |
||
| 493 | } |
||
| 494 | |||
| 495 | /** |
||
| 496 | * 单个 m3u8 文件剪辑 |
||
| 497 | * @param string $file 需要剪辑的又拍云云存储中的 m3u8 文件路径 |
||
| 498 | * @param string $saveAs 剪辑完成后新的 m3u8 文件保存路径 |
||
| 499 | * @param array $slice 需要被保留或删除的片段。 |
||
| 500 | * @param bool $isInclude 默认为 `true` 表示 `$slice` 参数描述的片段被保留,否则表示 `$slice` 参数描述的片段被删除 |
||
| 501 | * @param bool $index 指定 `$slice` 参数的格式,默认为 `false` 表示使用时间范围描述片段,单位秒:`[<开始时间>, <结束时间>]`;`true` 表示使用 `m3u8` 文件的分片序号,从 0 开始,这种方式可以一次对多个片段操作 |
||
| 502 | * |
||
| 503 | * @return array 见 [m3u8 剪辑 - 响应](http://docs.upyun.com/cloud/sync_video/#_6) |
||
| 504 | */ |
||
| 505 | public function m3u8Clip($file, $saveAs, $slice = array(), $isInclude = true, $index = false) |
||
| 506 | { |
||
| 507 | $p = new Api\SyncVideo($this->config); |
||
| 508 | $params = [ |
||
| 509 | 'm3u8' => $file, |
||
| 510 | 'save_as' => $saveAs, |
||
| 511 | 'index' => $index, |
||
| 512 | ]; |
||
| 513 | if ($isInclude) { |
||
| 514 | $params['include'] = $slice; |
||
| 515 | } else { |
||
| 516 | $params['exclude'] = $slice; |
||
| 517 | } |
||
| 518 | return $p->process($params, '/m3u8er/clip'); |
||
| 519 | } |
||
| 520 | |||
| 521 | /** |
||
| 522 | * 获取单个 m3u8 文件描述信息 |
||
| 523 | * @param string $file 又拍云云存储的中的 m3u8 文件路径 |
||
| 524 | * |
||
| 525 | * @return array 见 [获取 m3u8 信息 - 响应](http://docs.upyun.com/cloud/sync_video/#_6) |
||
| 526 | */ |
||
| 527 | public function m3u8Meta($file) |
||
| 528 | { |
||
| 529 | $p = new Api\SyncVideo($this->config); |
||
| 530 | return $p->process([ |
||
| 531 | 'm3u8' => $file, |
||
| 532 | ], '/m3u8er/get_meta'); |
||
| 533 | } |
||
| 534 | |||
| 535 | /** |
||
| 536 | * 视频截图,可以对 mp4、m3u8 等视频文件进行截图 |
||
| 537 | * @param string $file 需要截图的又拍云云存储中的视频文件路径 |
||
| 538 | * @param string $saveAs 截图保存路径 |
||
| 539 | * @param string $point 截图时间点,`HH:MM:SS` 格式 |
||
| 540 | * @param string $size 截图尺寸 `宽x高` 格式的字符串。默认和视频尺寸一致 |
||
| 541 | * @param string $format 截图保存的格式,默认根据 `$saveAs` 参数的后缀生成,可以指定 `jpg | png | webp` 三种格式 |
||
| 542 | * |
||
| 543 | * @return array 见 [视频截图 - 响应](http://docs.upyun.com/cloud/sync_video/#m3u8_2) |
||
| 544 | */ |
||
| 545 | 1 | public function snapshot($file, $saveAs, $point, $size = '', $format = '') |
|
| 546 | { |
||
| 547 | 1 | $p = new Api\SyncVideo($this->config); |
|
| 548 | 1 | $params = [ |
|
| 549 | 1 | 'source' => $file, |
|
| 550 | 1 | 'save_as' => $saveAs, |
|
| 551 | 1 | 'point' => $point, |
|
| 552 | 1 | ]; |
|
| 553 | 1 | if ($size) { |
|
| 554 | 1 | $params['size'] = $size; |
|
| 555 | } |
||
| 556 | 1 | if ($format) { |
|
| 557 | 1 | $params['format'] = $format; |
|
| 558 | } |
||
| 559 | 1 | return $p->process($params, '/snapshot'); |
|
| 560 | } |
||
| 561 | |||
| 562 | /** |
||
| 563 | * 获取音视频文件元信息 |
||
| 564 | * @param string $file 又拍云云存储的中的音视频文件路径 |
||
| 565 | * |
||
| 566 | * @return array 见 [获取音视频文件信息 - 响应](http://docs.upyun.com/cloud/sync_video/#_16) |
||
| 567 | */ |
||
| 568 | 1 | public function avMeta($file) |
|
| 569 | { |
||
| 570 | 1 | $p = new Api\SyncVideo($this->config); |
|
| 571 | 1 | return $p->process([ |
|
| 572 | 1 | 'source' => $file, |
|
| 573 | 1 | ], '/avmeta/get_meta'); |
|
| 574 | } |
||
| 575 | } |
||
| 576 |