@osaas/client-transcode 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -43
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -1
- package/lib/index.js.map +1 -1
- package/lib/vodpipeline.d.ts +19 -0
- package/lib/vodpipeline.d.ts.map +1 -0
- package/lib/vodpipeline.js +230 -0
- package/lib/vodpipeline.js.map +1 -0
- package/package.json +7 -5
package/README.md
CHANGED
|
@@ -6,7 +6,8 @@ SDK for transcoding with Encore in Open Source Cloud and transfer result to S3 b
|
|
|
6
6
|
|
|
7
7
|
Prerequisites
|
|
8
8
|
|
|
9
|
-
- An account on [Open Source Cloud](www.osaas.io)
|
|
9
|
+
- An account on [Eyevinn Open Source Cloud](www.osaas.io)
|
|
10
|
+
- Business subscription with 5 services remaining
|
|
10
11
|
|
|
11
12
|
```
|
|
12
13
|
npm install --save @osaas/client-transcode
|
|
@@ -16,53 +17,20 @@ Example code
|
|
|
16
17
|
|
|
17
18
|
```javascript
|
|
18
19
|
import { Context, Log } from '@osaas/client-core';
|
|
19
|
-
import {
|
|
20
|
+
import { createVod, createVodPipeline } from '@osaas/client-transcode';
|
|
20
21
|
|
|
21
22
|
async function main() {
|
|
22
23
|
const ctx = new Context();
|
|
23
24
|
|
|
24
25
|
try {
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
await
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
);
|
|
34
|
-
await pool.destroy();
|
|
35
|
-
} catch (err) {
|
|
36
|
-
Log().error(err);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
main();
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
Transcode and create streaming package
|
|
44
|
-
|
|
45
|
-
```javascript
|
|
46
|
-
import { Context, Log } from '@osaas/client-core';
|
|
47
|
-
import { QueuePool } from '@osaas/client-transcode';
|
|
48
|
-
|
|
49
|
-
async function main() {
|
|
50
|
-
const ctx = new Context();
|
|
51
|
-
|
|
52
|
-
try {
|
|
53
|
-
const pool = new QueuePool({ context: ctx, usePackagingQueue: true });
|
|
54
|
-
await pool.init();
|
|
55
|
-
await pool.transcode(
|
|
56
|
-
new URL(
|
|
57
|
-
'https://testcontent.eyevinn.technology/mp4/stswe-tvplus-promo.mp4'
|
|
58
|
-
),
|
|
59
|
-
new URL('s3://lab-testcontent-store/birme/'),
|
|
60
|
-
{
|
|
61
|
-
packageDestination: new URL(
|
|
62
|
-
's3://lab-testcontent-storate/birme/output/'
|
|
63
|
-
)
|
|
64
|
-
}
|
|
65
|
-
);
|
|
26
|
+
const ctx = new Context({ environment });
|
|
27
|
+
Log().info('Creating VOD pipeline');
|
|
28
|
+
const pipeline = await createVodPipeline(name, ctx);
|
|
29
|
+
Log().info('VOD pipeline created, starting job to create VOD');
|
|
30
|
+
const job = await createVod(pipeline, source, ctx);
|
|
31
|
+
if (job) {
|
|
32
|
+
Log().info('Created VOD will be available at: ' + job.vodUrl);
|
|
33
|
+
}
|
|
66
34
|
} catch (err) {
|
|
67
35
|
Log().error(err);
|
|
68
36
|
}
|
package/lib/index.d.ts
CHANGED
|
@@ -5,4 +5,5 @@ export { vmafCompare } from './vmaf';
|
|
|
5
5
|
export { createStreamingPackage } from './packager';
|
|
6
6
|
export { createLiveSingleBitrateHLS, removeLiveSingleBitrateHLS, listSingleBitrateHLS, createLiveMultiBitrateHLS, startLiveMultiBitrateHLS, stopLiveMultiBitrateHLS } from './live';
|
|
7
7
|
export { SubtitlingPool } from './subtitling';
|
|
8
|
+
export { createVodPipeline, removeVodPipeline, createVod } from './vodpipeline';
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SubtitlingPool = exports.stopLiveMultiBitrateHLS = exports.startLiveMultiBitrateHLS = exports.createLiveMultiBitrateHLS = exports.listSingleBitrateHLS = exports.removeLiveSingleBitrateHLS = exports.createLiveSingleBitrateHLS = exports.createStreamingPackage = exports.vmafCompare = exports.QueuePool = exports.Encore = exports.EncorePackager = exports.EncoreCallbackListener = void 0;
|
|
3
|
+
exports.createVod = exports.removeVodPipeline = exports.createVodPipeline = exports.SubtitlingPool = exports.stopLiveMultiBitrateHLS = exports.startLiveMultiBitrateHLS = exports.createLiveMultiBitrateHLS = exports.listSingleBitrateHLS = exports.removeLiveSingleBitrateHLS = exports.createLiveSingleBitrateHLS = exports.createStreamingPackage = exports.vmafCompare = exports.QueuePool = exports.Encore = exports.EncorePackager = exports.EncoreCallbackListener = void 0;
|
|
4
4
|
/** @module @osaas/client-transcode */
|
|
5
5
|
var encore_1 = require("./encore");
|
|
6
6
|
Object.defineProperty(exports, "EncoreCallbackListener", { enumerable: true, get: function () { return encore_1.EncoreCallbackListener; } });
|
|
@@ -21,4 +21,8 @@ Object.defineProperty(exports, "startLiveMultiBitrateHLS", { enumerable: true, g
|
|
|
21
21
|
Object.defineProperty(exports, "stopLiveMultiBitrateHLS", { enumerable: true, get: function () { return live_1.stopLiveMultiBitrateHLS; } });
|
|
22
22
|
var subtitling_1 = require("./subtitling");
|
|
23
23
|
Object.defineProperty(exports, "SubtitlingPool", { enumerable: true, get: function () { return subtitling_1.SubtitlingPool; } });
|
|
24
|
+
var vodpipeline_1 = require("./vodpipeline");
|
|
25
|
+
Object.defineProperty(exports, "createVodPipeline", { enumerable: true, get: function () { return vodpipeline_1.createVodPipeline; } });
|
|
26
|
+
Object.defineProperty(exports, "removeVodPipeline", { enumerable: true, get: function () { return vodpipeline_1.removeVodPipeline; } });
|
|
27
|
+
Object.defineProperty(exports, "createVod", { enumerable: true, get: function () { return vodpipeline_1.createVod; } });
|
|
24
28
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,sCAAsC;AACtC,mCAA0E;AAAjE,gHAAA,sBAAsB,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,gGAAA,MAAM,OAAA;AACvD,+BAAmC;AAA1B,iGAAA,SAAS,OAAA;AAClB,+BAAqC;AAA5B,mGAAA,WAAW,OAAA;AACpB,uCAAoD;AAA3C,kHAAA,sBAAsB,OAAA;AAC/B,+BAOgB;AANd,kHAAA,0BAA0B,OAAA;AAC1B,kHAAA,0BAA0B,OAAA;AAC1B,4GAAA,oBAAoB,OAAA;AACpB,iHAAA,yBAAyB,OAAA;AACzB,gHAAA,wBAAwB,OAAA;AACxB,+GAAA,uBAAuB,OAAA;AAEzB,2CAA8C;AAArC,4GAAA,cAAc,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,sCAAsC;AACtC,mCAA0E;AAAjE,gHAAA,sBAAsB,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,gGAAA,MAAM,OAAA;AACvD,+BAAmC;AAA1B,iGAAA,SAAS,OAAA;AAClB,+BAAqC;AAA5B,mGAAA,WAAW,OAAA;AACpB,uCAAoD;AAA3C,kHAAA,sBAAsB,OAAA;AAC/B,+BAOgB;AANd,kHAAA,0BAA0B,OAAA;AAC1B,kHAAA,0BAA0B,OAAA;AAC1B,4GAAA,oBAAoB,OAAA;AACpB,iHAAA,yBAAyB,OAAA;AACzB,gHAAA,wBAAwB,OAAA;AACxB,+GAAA,uBAAuB,OAAA;AAEzB,2CAA8C;AAArC,4GAAA,cAAc,OAAA;AACvB,6CAAgF;AAAvE,gHAAA,iBAAiB,OAAA;AAAE,gHAAA,iBAAiB,OAAA;AAAE,wGAAA,SAAS,OAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Context } from '@osaas/client-core';
|
|
2
|
+
export interface VodPipeline {
|
|
3
|
+
name: string;
|
|
4
|
+
jobs: string;
|
|
5
|
+
callbackUrl: string;
|
|
6
|
+
output: string;
|
|
7
|
+
endpoint: string;
|
|
8
|
+
}
|
|
9
|
+
export interface VodJob {
|
|
10
|
+
id: string;
|
|
11
|
+
vodUrl: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function createVodPipeline(name: string, ctx: Context): Promise<VodPipeline>;
|
|
14
|
+
export declare function removeVodPipeline(name: string, context: Context): Promise<void>;
|
|
15
|
+
export declare function createVod(pipeline: VodPipeline, source: string, context: Context): Promise<{
|
|
16
|
+
id: string;
|
|
17
|
+
vodUrl: string;
|
|
18
|
+
}>;
|
|
19
|
+
//# sourceMappingURL=vodpipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vodpipeline.d.ts","sourceRoot":"","sources":["../src/vodpipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAMR,MAAM,oBAAoB,CAAC;AAsB5B,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAqLD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,WAAW,CAAC,CA6BtB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,iBAyBrE;AAED,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO;;;GAsCjB"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.createVod = exports.removeVodPipeline = exports.createVodPipeline = void 0;
|
|
27
|
+
const client_core_1 = require("@osaas/client-core");
|
|
28
|
+
const client_services_1 = require("@osaas/client-services");
|
|
29
|
+
const Minio = __importStar(require("minio"));
|
|
30
|
+
const util_1 = require("./util");
|
|
31
|
+
const crypto_1 = require("crypto");
|
|
32
|
+
const node_path_1 = require("node:path");
|
|
33
|
+
function createPublicBucketPolicy(name) {
|
|
34
|
+
return {
|
|
35
|
+
Statement: [
|
|
36
|
+
{
|
|
37
|
+
Action: ['s3:GetBucketLocation', 's3:ListBucket'],
|
|
38
|
+
Effect: 'Allow',
|
|
39
|
+
Principal: {
|
|
40
|
+
AWS: ['*']
|
|
41
|
+
},
|
|
42
|
+
Resource: [`arn:aws:s3:::${name}`]
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
Action: ['s3:GetObject'],
|
|
46
|
+
Effect: 'Allow',
|
|
47
|
+
Principal: {
|
|
48
|
+
AWS: ['*']
|
|
49
|
+
},
|
|
50
|
+
Resource: [`arn:aws:s3:::${name}/*`]
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
Version: '2012-10-17'
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
async function createEncore(name, ctx) {
|
|
57
|
+
const sat = await ctx.getServiceAccessToken('encore');
|
|
58
|
+
let instance = await (0, client_core_1.getInstance)(ctx, 'encore', name, sat);
|
|
59
|
+
if (!instance) {
|
|
60
|
+
const config = { name };
|
|
61
|
+
const newInstance = await (0, client_services_1.createEncoreInstance)(ctx, config);
|
|
62
|
+
if (!newInstance) {
|
|
63
|
+
throw new Error('Failed to create new Encore instance');
|
|
64
|
+
}
|
|
65
|
+
instance = newInstance;
|
|
66
|
+
await (0, client_core_1.waitForInstanceReady)('encore', name, ctx);
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
jobs: new URL('/encoreJobs', instance.url).toString(),
|
|
70
|
+
url: instance.url.replace(/\/$/, '')
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async function createRedis(name, ctx) {
|
|
74
|
+
const sat = await ctx.getServiceAccessToken('valkey-io-valkey');
|
|
75
|
+
let instance = await (0, client_core_1.getInstance)(ctx, 'valkey-io-valkey', name, sat);
|
|
76
|
+
if (!instance) {
|
|
77
|
+
const config = { name };
|
|
78
|
+
const newInstance = await (0, client_services_1.createValkeyIoValkeyInstance)(ctx, config);
|
|
79
|
+
await (0, client_core_1.waitForInstanceReady)('valkey-io-valkey', name, ctx);
|
|
80
|
+
await (0, util_1.delay)(2000);
|
|
81
|
+
instance = newInstance;
|
|
82
|
+
await (0, client_core_1.waitForInstanceReady)('valkey-io-valkey', name, ctx);
|
|
83
|
+
}
|
|
84
|
+
const ports = await (0, client_core_1.getPortsForInstance)(ctx, 'valkey-io-valkey', name, sat);
|
|
85
|
+
const redisPort = ports.find((port) => port.internalPort == 6379);
|
|
86
|
+
if (!redisPort) {
|
|
87
|
+
throw new Error(`Failed to get redis port for instance ${name}`);
|
|
88
|
+
}
|
|
89
|
+
return `redis://${redisPort.externalIp}:${redisPort.externalPort}`;
|
|
90
|
+
}
|
|
91
|
+
async function createCallbackListener(name, redisUrl, encoreUrl, ctx) {
|
|
92
|
+
const sat = await ctx.getServiceAccessToken('eyevinn-encore-callback-listener');
|
|
93
|
+
let instance = await (0, client_core_1.getInstance)(ctx, 'eyevinn-encore-callback-listener', name, sat);
|
|
94
|
+
if (!instance) {
|
|
95
|
+
const config = {
|
|
96
|
+
name,
|
|
97
|
+
RedisUrl: redisUrl,
|
|
98
|
+
RedisQueue: 'package',
|
|
99
|
+
EncoreUrl: encoreUrl
|
|
100
|
+
};
|
|
101
|
+
const newInstance = await (0, client_services_1.createEyevinnEncoreCallbackListenerInstance)(ctx, config);
|
|
102
|
+
if (!newInstance) {
|
|
103
|
+
throw new Error('Failed to create new callback listener instance');
|
|
104
|
+
}
|
|
105
|
+
instance = newInstance;
|
|
106
|
+
await (0, client_core_1.waitForInstanceReady)('eyevinn-encore-callback-listener', name, ctx);
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
url: new URL('/encoreCallback', instance.url).toString()
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
async function createPackager(name, redisUrl, outputFolder, accessKeyId, secretAccessKey, s3EndpointUrl, ctx) {
|
|
113
|
+
const sat = await ctx.getServiceAccessToken('eyevinn-encore-packager');
|
|
114
|
+
let instance = await (0, client_core_1.getInstance)(ctx, 'eyevinn-encore-packager', name, sat);
|
|
115
|
+
if (!instance) {
|
|
116
|
+
const config = {
|
|
117
|
+
name,
|
|
118
|
+
RedisUrl: redisUrl,
|
|
119
|
+
RedisQueue: 'package',
|
|
120
|
+
OutputFolder: outputFolder,
|
|
121
|
+
AwsAccessKeyId: accessKeyId,
|
|
122
|
+
AwsSecretAccessKey: secretAccessKey,
|
|
123
|
+
S3EndpointUrl: s3EndpointUrl,
|
|
124
|
+
PersonalAccessToken: '{{secrets.osctoken}}'
|
|
125
|
+
};
|
|
126
|
+
const newInstance = await (0, client_services_1.createEyevinnEncorePackagerInstance)(ctx, config);
|
|
127
|
+
if (!newInstance) {
|
|
128
|
+
throw new Error('Failed to create new packager instance');
|
|
129
|
+
}
|
|
130
|
+
instance = newInstance;
|
|
131
|
+
await (0, client_core_1.waitForInstanceReady)('eyevinn-encore-packager', name, ctx);
|
|
132
|
+
}
|
|
133
|
+
return instance;
|
|
134
|
+
}
|
|
135
|
+
async function createStorageBucket(name, ctx) {
|
|
136
|
+
const sat = await ctx.getServiceAccessToken('minio-minio');
|
|
137
|
+
let instance = await (0, client_core_1.getInstance)(ctx, 'minio-minio', name, sat);
|
|
138
|
+
if (!instance) {
|
|
139
|
+
const rootPassword = (0, crypto_1.randomBytes)(16).toString('hex');
|
|
140
|
+
const config = {
|
|
141
|
+
name,
|
|
142
|
+
RootUser: 'root',
|
|
143
|
+
RootPassword: rootPassword
|
|
144
|
+
};
|
|
145
|
+
const newInstance = await (0, client_services_1.createMinioMinioInstance)(ctx, config);
|
|
146
|
+
if (!newInstance) {
|
|
147
|
+
throw new Error('Failed to create new Minio instance');
|
|
148
|
+
}
|
|
149
|
+
instance = newInstance;
|
|
150
|
+
await (0, client_core_1.waitForInstanceReady)('minio-minio', name, ctx);
|
|
151
|
+
await (0, util_1.delay)(2000);
|
|
152
|
+
const minioClient = new Minio.Client({
|
|
153
|
+
endPoint: new URL(instance.url).hostname,
|
|
154
|
+
accessKey: 'root',
|
|
155
|
+
secretKey: instance.RootPassword || ''
|
|
156
|
+
});
|
|
157
|
+
await minioClient.makeBucket(name);
|
|
158
|
+
await minioClient.setBucketPolicy(name, JSON.stringify(createPublicBucketPolicy(name)));
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
name: instance.name,
|
|
162
|
+
endpoint: instance.url,
|
|
163
|
+
accessKeyId: 'root',
|
|
164
|
+
secretAccessKey: instance.RootPassword || ''
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
async function createVodPipeline(name, ctx) {
|
|
168
|
+
if (!(0, client_core_1.isValidInstanceName)(name)) {
|
|
169
|
+
throw new Error(`Invalid instance name: ${name}`);
|
|
170
|
+
}
|
|
171
|
+
const storage = await createStorageBucket(name, ctx);
|
|
172
|
+
const redisUrl = await createRedis(name, ctx);
|
|
173
|
+
const transcoder = await createEncore(name, ctx);
|
|
174
|
+
const encoreCallback = await createCallbackListener(name, redisUrl, transcoder.url, ctx);
|
|
175
|
+
const packager = await createPackager(name, redisUrl, `s3://${name}/`, storage.accessKeyId, storage.secretAccessKey, storage.endpoint, ctx);
|
|
176
|
+
return {
|
|
177
|
+
name,
|
|
178
|
+
jobs: transcoder.jobs,
|
|
179
|
+
callbackUrl: encoreCallback.url,
|
|
180
|
+
output: packager.OutputFolder,
|
|
181
|
+
endpoint: storage.endpoint
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
exports.createVodPipeline = createVodPipeline;
|
|
185
|
+
async function removeVodPipeline(name, context) {
|
|
186
|
+
await (0, client_core_1.removeInstance)(context, 'encore', name, await context.getServiceAccessToken('encore'));
|
|
187
|
+
await (0, client_core_1.removeInstance)(context, 'eyevinn-encore-callback-listener', name, await context.getServiceAccessToken('eyevinn-encore-callback-listener'));
|
|
188
|
+
await (0, client_core_1.removeInstance)(context, 'eyevinn-encore-packager', name, await context.getServiceAccessToken('eyevinn-encore-packager'));
|
|
189
|
+
await (0, client_core_1.removeInstance)(context, 'valkey-io-valkey', name, await context.getServiceAccessToken('valkey-io-valkey'));
|
|
190
|
+
}
|
|
191
|
+
exports.removeVodPipeline = removeVodPipeline;
|
|
192
|
+
async function createVod(pipeline, source, context) {
|
|
193
|
+
const sat = await context.getServiceAccessToken('encore');
|
|
194
|
+
const externalId = pipeline.name + '-' + Math.random().toString(36).substring(7);
|
|
195
|
+
const job = {
|
|
196
|
+
externalId,
|
|
197
|
+
profile: 'program',
|
|
198
|
+
outputFolder: '/usercontent/',
|
|
199
|
+
baseName: externalId,
|
|
200
|
+
progressCallbackUri: pipeline.callbackUrl,
|
|
201
|
+
inputs: [
|
|
202
|
+
{
|
|
203
|
+
uri: source,
|
|
204
|
+
seekTo: 0,
|
|
205
|
+
copyTs: true,
|
|
206
|
+
type: 'AudioVideo'
|
|
207
|
+
}
|
|
208
|
+
]
|
|
209
|
+
};
|
|
210
|
+
const response = await fetch(pipeline.jobs, {
|
|
211
|
+
method: 'POST',
|
|
212
|
+
headers: {
|
|
213
|
+
Authorization: `Bearer ${sat}`,
|
|
214
|
+
'Content-Type': 'application/json'
|
|
215
|
+
},
|
|
216
|
+
body: JSON.stringify(job)
|
|
217
|
+
});
|
|
218
|
+
if (response.ok) {
|
|
219
|
+
const createdJob = (await response.json());
|
|
220
|
+
const sourceName = (0, node_path_1.basename)(source, (0, node_path_1.extname)(source));
|
|
221
|
+
const vod = {
|
|
222
|
+
id: createdJob.id,
|
|
223
|
+
vodUrl: `${pipeline.endpoint}/${pipeline.name}/${sourceName}/${createdJob.id}/index.m3u8`
|
|
224
|
+
};
|
|
225
|
+
return vod;
|
|
226
|
+
}
|
|
227
|
+
throw new Error(`Failed to create job: ${response.statusText}`);
|
|
228
|
+
}
|
|
229
|
+
exports.createVod = createVod;
|
|
230
|
+
//# sourceMappingURL=vodpipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vodpipeline.js","sourceRoot":"","sources":["../src/vodpipeline.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@osaas/client-transcode",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "Open Source Cloud Client SDK transcode library",
|
|
5
5
|
"author": "Eyevinn Open Source Cloud <osc@eyevinn.se>",
|
|
6
6
|
"homepage": "https://www.osaas.io",
|
|
@@ -25,12 +25,14 @@
|
|
|
25
25
|
"test": "jest --passWithNoTests"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@osaas/client-core": "^0.
|
|
29
|
-
"@osaas/client-db": "^0.3.
|
|
30
|
-
"
|
|
28
|
+
"@osaas/client-core": "^0.15.0",
|
|
29
|
+
"@osaas/client-db": "^0.3.2",
|
|
30
|
+
"@osaas/client-services": "^0.2.4",
|
|
31
|
+
"chalk": "4.1.2",
|
|
32
|
+
"minio": "^8.0.2"
|
|
31
33
|
},
|
|
32
34
|
"publishConfig": {
|
|
33
35
|
"access": "public"
|
|
34
36
|
},
|
|
35
|
-
"gitHead": "
|
|
37
|
+
"gitHead": "eb88400f144914fba52d8d37dfc9b26a7966a8bc"
|
|
36
38
|
}
|