Skip to content

Commit 1f42227

Browse files
authored
Merge pull request #4 from andreia/add_transcode_api
Add Transcode API
2 parents 632038d + a49c32d commit 1f42227

File tree

11 files changed

+289
-1
lines changed

11 files changed

+289
-1
lines changed

.github/CODEOWNERS

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@andreia

.github/ISSUE_TEMPLATE/bug.yml

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
name: Bug Report
2+
description: Report an Issue or Bug with the Package
3+
title: "[Bug]: "
4+
labels: ["bug"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
We're sorry to hear you have a problem. Can you help us solve it by providing the following details.
10+
- type: textarea
11+
id: what-happened
12+
attributes:
13+
label: What happened?
14+
description: What did you expect to happen?
15+
placeholder: I cannot currently do X thing because when I do, it breaks X thing.
16+
validations:
17+
required: true
18+
- type: textarea
19+
id: how-to-reproduce
20+
attributes:
21+
label: How to reproduce the bug
22+
description: How did this occur, please add any config values used and provide a set of reliable steps if possible.
23+
placeholder: When I do X I see Y.
24+
validations:
25+
required: true
26+
- type: input
27+
id: package-version
28+
attributes:
29+
label: Package Version
30+
description: What version of our Package are you running? Please be as specific as possible
31+
placeholder: 2.0.0
32+
validations:
33+
required: true
34+
- type: input
35+
id: php-version
36+
attributes:
37+
label: PHP Version
38+
description: What version of PHP are you running? Please be as specific as possible
39+
placeholder: 8.2.0
40+
validations:
41+
required: true
42+
- type: input
43+
id: laravel-version
44+
attributes:
45+
label: Laravel Version
46+
description: What version of Laravel are you running? Please be as specific as possible
47+
placeholder: 9.0.0
48+
validations:
49+
required: true
50+
- type: dropdown
51+
id: operating-systems
52+
attributes:
53+
label: Which operating systems does with happen with?
54+
description: You may select more than one.
55+
multiple: true
56+
options:
57+
- macOS
58+
- Windows
59+
- Linux
60+
- type: textarea
61+
id: notes
62+
attributes:
63+
label: Notes
64+
description: Use this field to provide any other notes that you feel might be relevant to the issue.
65+
validations:
66+
required: false

.github/ISSUE_TEMPLATE/config.yml

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
blank_issues_enabled: false
2+
contact_links:
3+
- name: Ask a question
4+
url: https://github.com/andreia/php-sdk-dolby-api/discussions/new?category=q-a
5+
about: Ask the community for help
6+
- name: Request a feature
7+
url: https://github.com/andreia/php-sdk-dolby-api/discussions/new?category=ideas
8+
about: Share ideas for new features
9+
- name: Report a security issue
10+
url: https://github.com/andreia/php-sdk-dolby-api/security/policy
11+
about: Learn how to notify us for sensitive bugs

README.md

+33-1
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,39 @@ $analyzeMusicStatusResponse->body(); // "{"path":"/media/analyze/music","status"
210210

211211
#### [Transcode API](https://docs.dolby.io/media-apis/docs/transcode-api-guide)
212212

213-
TODO
213+
[Start Transcoding](https://docs.dolby.io/media-apis/reference/media-transcode-post)
214+
215+
```php
216+
$transcodingResponse = $dolbyApi->api('media')->transcode('inputs-array', 'outputs-array', 'optional-storage-array', 'optional-on-complete-array');
217+
```
218+
219+
E.g.:
220+
```php
221+
$inputs = [
222+
'source' => 'https://dolbyio.s3-us-west-1.amazonaws.com/public/shelby/indoors.original.mp4'
223+
];
224+
225+
$outputs = [
226+
"id" => "my_mp4",
227+
"destination" => "dlb://out/airplane-transcoded.mp4",
228+
"kind" => "mp4",
229+
];
230+
231+
$transcodingResponse = $dolbyApi->api('media')->transcode($inputs, $outputs);
232+
$transcodingResponse->body(); // "{"job_id":"0c1fae6e-39e5-4a36-a076-bf3315d5179f"}"
233+
```
234+
235+
[Get Transcode Results](https://docs.dolby.io/media-apis/reference/media-transcode-get)
236+
237+
```php
238+
$transcodeResultsResponse = $dolbyApi->api('media')->transcodeResults('job-id');
239+
```
240+
241+
E.g.:
242+
```php
243+
$transcodeResultsResponse = $dolbyApi->api('media')->transcodeResults('0c1fae6e-39e5-4a36-a076-bf3315d5179f');
244+
$transcodeResultsResponse->body(); // {"path":"/media/transcode","status":"Success","progress":100,"api_version":"v1.7","result":{}}
245+
```
214246

215247
#### [Music Mastering API](https://docs.dolby.io/media-apis/docs/music-mastering-api-guide)
216248

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace DolbyApi\Requests\MediaApi;
6+
7+
use Saloon\Enums\Method;
8+
use Saloon\Http\Request;
9+
10+
class GetTranscodeResults extends Request
11+
{
12+
/**
13+
* HTTP Method
14+
*/
15+
protected Method $method = Method::GET;
16+
17+
public function __construct(
18+
protected string $jobId,
19+
) {}
20+
21+
protected function defaultQuery(): array
22+
{
23+
return [
24+
'job_id' => $this->jobId,
25+
];
26+
}
27+
28+
/**
29+
* Get Transcode Results
30+
*
31+
* For a given job_id, this method will check if the transcoding task
32+
* has completed and return transcoding results.
33+
*
34+
* @see https://docs.dolby.io/media-apis/reference/media-transcode-get
35+
*/
36+
public function resolveEndpoint(): string
37+
{
38+
return '/media/transcode';
39+
}
40+
}
+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace DolbyApi\Requests\MediaApi;
6+
7+
use Saloon\Contracts\Body\HasBody;
8+
use Saloon\Enums\Method;
9+
use Saloon\Http\Request;
10+
use Saloon\Traits\Body\HasJsonBody;
11+
12+
class StartTranscoding extends Request implements HasBody
13+
{
14+
use HasJsonBody;
15+
16+
/**
17+
* HTTP Method
18+
*/
19+
protected Method $method = Method::POST;
20+
21+
public function __construct(
22+
protected array $inputs,
23+
protected array $outputs,
24+
protected ?array $storage = null,
25+
protected ?array $onComplete = null,
26+
) {}
27+
28+
protected function defaultBody(): array
29+
{
30+
$body = [
31+
'inputs' => [$this->inputs],
32+
'outputs' => [$this->outputs],
33+
];
34+
35+
if ($this->storage !== null) {
36+
$body['storage'] = $this->storage;
37+
}
38+
39+
if ($this->onComplete !== null) {
40+
$body['on_complete'] = $this->onComplete;
41+
}
42+
43+
return $body;
44+
}
45+
46+
/**
47+
* Start Transcoding
48+
*
49+
* Start transcoding to modify the size, bitrates, and formats for your media.
50+
*
51+
* @see https://docs.dolby.io/media-apis/reference/media-transcode-post
52+
*/
53+
public function resolveEndpoint(): string
54+
{
55+
return '/media/transcode';
56+
}
57+
}

src/Resource/MediaApiResource.php

+12
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@
88
use DolbyApi\Requests\MediaApi\GetDiagnoseStatus;
99
use DolbyApi\Requests\MediaApi\GetDownloadUrl;
1010
use DolbyApi\Requests\MediaApi\GetEnhanceStatus;
11+
use DolbyApi\Requests\MediaApi\GetTranscodeResults;
1112
use DolbyApi\Requests\MediaApi\GetUploadUrl;
1213
use DolbyApi\Requests\MediaApi\StartAnalyze;
1314
use DolbyApi\Requests\MediaApi\StartAnalyzeMusic;
1415
use DolbyApi\Requests\MediaApi\StartAnalyzeSpeech;
1516
use DolbyApi\Requests\MediaApi\StartDiagnose;
1617
use DolbyApi\Requests\MediaApi\StartEnhance;
18+
use DolbyApi\Requests\MediaApi\StartTranscoding;
1719
use DolbyApi\Responses\DolbyResponse as Response;
1820

1921
class MediaApiResource extends Resource
@@ -77,4 +79,14 @@ public function analyzeMusicStatus(string $jobId): Response
7779
{
7880
return $this->connector->send(new GetAnalyzeMusicStatus($jobId));
7981
}
82+
83+
public function transcode(array $inputs, array $outputs, ?array $storage = null, ?array $onComplete = null): Response
84+
{
85+
return $this->connector->send(new StartTranscoding($inputs, $outputs, $storage, $onComplete));
86+
}
87+
88+
public function transcodeResults(string $jobId): Response
89+
{
90+
return $this->connector->send(new GetTranscodeResults($jobId));
91+
}
8092
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use DolbyApi\DolbyApi;
6+
use DolbyApi\Requests\MediaApi\GetTranscodeResults;
7+
use DolbyApi\Responses\DolbyResponse;
8+
use Saloon\Contracts\Request;
9+
use Saloon\Contracts\Response;
10+
11+
test('can retrieve transcoding results from the api', function () {
12+
$mockClient = mockClient();
13+
$dolbyApi = new DolbyApi('my-api-token');
14+
$dolbyApi->withMockClient($mockClient);
15+
16+
$jobId = 'tr988637-9fb8-4123-62lt-1485r04627st';
17+
18+
$response = $dolbyApi->send(new GetTranscodeResults($jobId));
19+
20+
$mockClient->assertSent(GetTranscodeResults::class);
21+
22+
$mockClient->assertSent(function (Request $request, Response $response) {
23+
return $request instanceof GetTranscodeResults
24+
&& $response->body() == '{"path":"/media/transcode","status":"Success","progress":100,"api_version":"v1.7","result":{}}';
25+
});
26+
27+
expect($response)->toBeInstanceOf(DolbyResponse::class);
28+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use DolbyApi\DolbyApi;
6+
use DolbyApi\Requests\MediaApi\StartTranscoding;
7+
use DolbyApi\Responses\DolbyResponse;
8+
use Saloon\Contracts\Request;
9+
use Saloon\Contracts\Response;
10+
11+
/**
12+
* @see https://docs.dolby.io/media-apis/docs/transcoding-media
13+
*/
14+
test('can post to transcode', function () {
15+
$mockClient = mockClient();
16+
$dolbyApi = new DolbyApi('my-api-token');
17+
$dolbyApi->withMockClient($mockClient);
18+
19+
$inputs = [
20+
'source' => 'https://dolbyio.s3-us-west-1.amazonaws.com/public/shelby/indoors.original.mp4',
21+
];
22+
23+
$outputs = [
24+
'id' => 'my_mp4',
25+
'destination' => 'dlb://out/airplane-transcoded.mp4',
26+
'kind' => 'mp4',
27+
];
28+
29+
$response = $dolbyApi->send(new StartTranscoding($inputs, $outputs));
30+
31+
$mockClient->assertSent(StartTranscoding::class);
32+
33+
$mockClient->assertSent(function (Request $request, Response $response) {
34+
return $request instanceof StartTranscoding
35+
&& $response->body() == '{"job_id":"tr988637-9fb8-4123-62lt-1485r04627st"}';
36+
});
37+
38+
expect($response)->toBeInstanceOf(DolbyResponse::class);
39+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"statusCode":200,"headers":{"Content-Type":"application\/json","Content-Length":"98","Connection":"keep-alive","Server":"CloudFront","Date":"Sun, 29 Sep 2024 17:29:05 GMT","Apigw-Requestid":"{\"0\": \"BNzjHhs-vHcESEA=\",\"1\":\"BNzjEjIFIAMEYnQ=\"}","x-cache":"Miss from cloudfront","Via":"1.1 071a100b70812281a393c7b4228a4288.cloudfront.net (CloudFront)","X-Amz-Cf-Pop":"GRU3-P2","X-Amz-Cf-Id":"LAmYbsQaWmZZcz7NkP5_fSMerBLTScPYQG0SQx6BwvzLTEHdZ_JTQ==","Vary":"Origin"},"data":"{\"path\":\"/media/transcode\",\"status\":\"Success\",\"progress\":100,\"api_version\":\"v1.7\",\"result\":{}}"}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"statusCode":200,"headers":{"Content-Type":"application\/json","Content-Length":"49","Connection":"keep-alive","Server":"CloudFront","Date":"Sun, 29 Sep 2024 17:29:05 GMT","Apigw-Requestid":"{\"0\": \"BNzjHhs-vHcESEA=\",\"1\":\"BNzjEjIFIAMEYnQ=\"}","x-cache":"Miss from cloudfront","Via":"1.1 071a100b70811081a393c7b4228a4288.cloudfront.net (CloudFront)","X-Amz-Cf-Pop":"GRU3-P6","X-Amz-Cf-Id":"LAmYbsQaWmZZcz7NkP5_fSDerBLTScPYQG1EWx6BwvzLTEHdZ_JTQ==","Vary":"Origin"},"data":"{\"job_id\":\"tr988637-9fb8-4123-62lt-1485r04627st\"}"}

0 commit comments

Comments
 (0)