Skip to content

Commit

Permalink
provider/bitmovin: add mp4 output files metadata to finished jobs
Browse files Browse the repository at this point in the history
  • Loading branch information
Ke Xu committed Jan 9, 2018
1 parent ebb8fd4 commit 8676701
Show file tree
Hide file tree
Showing 2 changed files with 129 additions and 0 deletions.
55 changes: 55 additions & 0 deletions provider/bitmovin/bitmovin.go
Original file line number Diff line number Diff line change
Expand Up @@ -931,6 +931,11 @@ func (p *bitmovinProvider) JobStatus(job *db.Job) (*provider.JobStatus, error) {
if err != nil {
return nil, err
}

err = p.addOutputFilesInfo(job, &jobStatus)
if err != nil {
return nil, err
}
}

return &jobStatus, nil
Expand Down Expand Up @@ -987,6 +992,56 @@ func (p *bitmovinProvider) addOutputStatusInfo(job *db.Job, status *provider.Job
return nil
}

func (p *bitmovinProvider) addOutputFilesInfo(job *db.Job, status *provider.JobStatus) error {
// TODO: we only have info for MP4. Need to add for webm and mov.

muxings, err := p.listMP4Muxing(job.ProviderJobID)
if err != nil {
return err
}

var files []provider.OutputFile
for _, muxing := range muxings {
encodingS := services.NewEncodingService(p.client)
resp, err := encodingS.RetrieveMP4MuxingInformation(job.ProviderJobID, stringValue(muxing.ID))
if err != nil {
return err
}

info := resp.Data.Result
if len(info.VideoTracks) > 0 {
files = append(files, provider.OutputFile{
Path: status.Output.Destination + stringValue(muxing.Filename),
Container: stringValue(info.ContainerFormat),
FileSize: int64Value(info.FileSize),
VideoCodec: stringValue(info.VideoTracks[0].Codec),
Width: int64Value(info.VideoTracks[0].FrameWidth),
Height: int64Value(info.VideoTracks[0].FrameHeight),
})
}
}

status.Output.Files = append(status.Output.Files, files...)
return nil
}

func (p *bitmovinProvider) listMP4Muxing(jobID string) ([]models.MP4Muxing, error) {
encodingS := services.NewEncodingService(p.client)

var totalCount int64 = 1
var muxings []models.MP4Muxing
for int64(len(muxings)) < totalCount {
resp, err := encodingS.ListMP4Muxing(jobID, int64(len(muxings)), 100)
if err != nil {
return nil, err
}
totalCount = int64Value(resp.Data.Result.TotalCount)
muxings = append(muxings, resp.Data.Result.Items...)
}

return muxings, nil
}

func (p *bitmovinProvider) addSourceInfo(job *db.Job, status *provider.JobStatus) error {
encodingS := services.NewEncodingService(p.client)
resp, err := encodingS.ListStream(job.ProviderJobID, 0, 1)
Expand Down
74 changes: 74 additions & 0 deletions provider/bitmovin/bitmovin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1081,6 +1081,7 @@ func TestTranscodeFailsOnGenericError(t *testing.T) {
func TestJobStatusReturnsFinishedIfEncodeAndManifestAreFinished(t *testing.T) {
testJobID := "this_is_a_job_id"
manifestID := "this_is_the_underlying_manifest_id"
muxingID := "test_muxing_id"
customData := make(map[string]interface{})
customData["manifest"] = manifestID
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
Expand Down Expand Up @@ -1143,6 +1144,34 @@ func TestJobStatusReturnsFinishedIfEncodeAndManifestAreFinished(t *testing.T) {
},
}
json.NewEncoder(w).Encode(resp)
case "/encoding/encodings/" + testJobID + "/muxings/mp4":
resp := models.MP4MuxingListResponse{
Data: models.MP4MuxingListData{
Result: models.MP4MuxingListResult{
TotalCount: intToPtr(1),
Items: []models.MP4Muxing{{
ID: stringToPtr(muxingID),
Filename: stringToPtr("test_file.mp4"),
}},
},
},
}
json.NewEncoder(w).Encode(resp)
case "/encoding/encodings/" + testJobID + "/muxings/mp4/" + muxingID + "/information":
resp := models.MP4MuxingInformationResponse{
Data: models.MP4MuxingInformationData{
Result: models.MP4MuxingInformationResult{
ContainerFormat: stringToPtr("mpeg-4"),
FileSize: intToPtr(3),
VideoTracks: []models.VideoTrack{{
Codec: stringToPtr("h264"),
FrameWidth: intToPtr(1280),
FrameHeight: intToPtr(720),
}},
},
},
}
json.NewEncoder(w).Encode(resp)
default:
t.Fatalf("unexpected path hit: %v", r.URL.Path)
}
Expand Down Expand Up @@ -1171,6 +1200,14 @@ func TestJobStatusReturnsFinishedIfEncodeAndManifestAreFinished(t *testing.T) {
},
Output: provider.JobOutput{
Destination: "s3://some-output-bucket/job-123/",
Files: []provider.OutputFile{{
Path: "s3://some-output-bucket/job-123/test_file.mp4",
Container: "mpeg-4",
FileSize: 3,
VideoCodec: "h264",
Width: 1280,
Height: 720,
}},
},
}
if !reflect.DeepEqual(jobStatus, expectedJobStatus) {
Expand All @@ -1180,6 +1217,7 @@ func TestJobStatusReturnsFinishedIfEncodeAndManifestAreFinished(t *testing.T) {

func TestJobStatusReturnsFinishedIfEncodeIsFinishedAndNoManifestGenerationIsNeeded(t *testing.T) {
testJobID := "this_is_a_job_id"
muxingID := "test_muxing_id"
customData := make(map[string]interface{})
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch r.URL.Path {
Expand Down Expand Up @@ -1232,6 +1270,34 @@ func TestJobStatusReturnsFinishedIfEncodeIsFinishedAndNoManifestGenerationIsNeed
},
}
json.NewEncoder(w).Encode(resp)
case "/encoding/encodings/" + testJobID + "/muxings/mp4":
resp := models.MP4MuxingListResponse{
Data: models.MP4MuxingListData{
Result: models.MP4MuxingListResult{
TotalCount: intToPtr(1),
Items: []models.MP4Muxing{{
ID: stringToPtr(muxingID),
Filename: stringToPtr("test_file.mp4"),
}},
},
},
}
json.NewEncoder(w).Encode(resp)
case "/encoding/encodings/" + testJobID + "/muxings/mp4/" + muxingID + "/information":
resp := models.MP4MuxingInformationResponse{
Data: models.MP4MuxingInformationData{
Result: models.MP4MuxingInformationResult{
ContainerFormat: stringToPtr("mpeg-4"),
FileSize: intToPtr(3),
VideoTracks: []models.VideoTrack{{
Codec: stringToPtr("h264"),
FrameWidth: intToPtr(1280),
FrameHeight: intToPtr(720),
}},
},
},
}
json.NewEncoder(w).Encode(resp)
default:
t.Fatalf("unexpected path hit: %v", r.URL.Path)
}
Expand Down Expand Up @@ -1259,6 +1325,14 @@ func TestJobStatusReturnsFinishedIfEncodeIsFinishedAndNoManifestGenerationIsNeed
},
Output: provider.JobOutput{
Destination: "s3://some-output-bucket/job-123/",
Files: []provider.OutputFile{{
Path: "s3://some-output-bucket/job-123/test_file.mp4",
Container: "mpeg-4",
FileSize: 3,
VideoCodec: "h264",
Width: 1280,
Height: 720,
}},
},
}
if !reflect.DeepEqual(jobStatus, expectedJobStatus) {
Expand Down

0 comments on commit 8676701

Please sign in to comment.