Skip to content

Commit 98a09b5

Browse files
author
Nir Maoz
authored
Add ConcatenateAction.fromJson() (#498)
1 parent d3d3fb2 commit 98a09b5

File tree

11 files changed

+122
-8
lines changed

11 files changed

+122
-8
lines changed

__TESTS_BUNDLE_SIZE__/bundleSizeTestCases.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ const bundleSizeTestCases:ITestCase[] = [
8888
},
8989
{
9090
name: 'Import All Actions',
91-
sizeLimitInKB: 42,
91+
sizeLimitInKB: 43,
9292
importsArray: [
9393
importFromPackage('Actions')
9494
]
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import {fromJson} from "../../../src/internal/fromJson";
2+
import {IConcatenateActionModel} from "../../../src/internal/models/IConcatenateActionModel";
3+
4+
describe('concatenate.fromJson', () => {
5+
it('Should generate ConcatenateAction from model', ()=>{
6+
const concatenateModel: IConcatenateActionModel = {
7+
actionType: 'concatenate',
8+
source: {
9+
qualifierType: 'videoSource',
10+
sourceType: 'video',
11+
publicId: 'dog'
12+
},
13+
prepend: true,
14+
duration: 1
15+
};
16+
17+
const transformation = fromJson([concatenateModel]);
18+
19+
expect(transformation.toString()).toStrictEqual('du_1,fl_splice,l_video:dog/fl_layer_apply,so_0');
20+
});
21+
});

src/actions/videoEdit/ConcatenateAction.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ import {Transformation} from "../../transformation/Transformation.js";
33
import {VideoSource} from "../../qualifiers/source/sourceTypes/VideoSource.js";
44
import {ImageSource} from "../../qualifiers/source/sourceTypes/ImageSource.js";
55
import {FetchSource} from "../../qualifiers/source/sourceTypes/FetchSource.js";
6+
import {IActionModel} from "../../internal/models/IActionModel.js";
7+
import {IConcatenateActionModel} from "../../internal/models/IConcatenateActionModel.js";
8+
import {ITransformationFromJson} from "../../internal/models/IHasFromJson.js";
69

710
/**
811
* @description Class for Concatenating another video.
@@ -17,6 +20,7 @@ class ConcatenateAction extends Action {
1720
private _prepend: boolean;
1821
private _duration: number;
1922
private _transition: VideoSource;
23+
protected _actionModel: IConcatenateActionModel;
2024

2125
/**
2226
*
@@ -25,6 +29,11 @@ class ConcatenateAction extends Action {
2529
*/
2630
constructor(source: VideoSource | ImageSource | FetchSource) {
2731
super();
32+
this._actionModel = {
33+
actionType: 'concatenate',
34+
source: { sourceType: 'video' }
35+
};
36+
2837
this.concatSource = source;
2938
}
3039

@@ -124,6 +133,28 @@ class ConcatenateAction extends Action {
124133
close
125134
].filter((a) => a).join('/');
126135
}
136+
137+
static fromJson(actionModel: IActionModel, transformationFromJson: ITransformationFromJson): ConcatenateAction {
138+
const {source, transition, prepend, duration} = (actionModel as IConcatenateActionModel);
139+
140+
// We are using this() to allow inheriting classes to use super.fromJson.apply(this, [actionModel])
141+
// This allows the inheriting classes to determine the class to be created
142+
// @ts-ignore
143+
const result = new this(VideoSource.fromJson(source, transformationFromJson));
144+
if (transition){
145+
result.transition(VideoSource.fromJson(transition, transformationFromJson));
146+
}
147+
148+
if (prepend){
149+
result.prepend();
150+
}
151+
152+
if (duration){
153+
result.duration(duration);
154+
}
155+
156+
return result;
157+
}
127158
}
128159

129160
export default ConcatenateAction;

src/internal/fromJson.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {IActionModel} from "./models/IActionModel.js";
66
import {Action} from "./Action.js";
77
import {IErrorObject} from "./models/IErrorObject.js";
88
import {createUnsupportedError} from "./utils/unsupportedError.js";
9-
import {IHasFromJson} from "./models/IHasFromJson.js";
9+
import {IHasFromJson, ITransformationFromJson} from "./models/IHasFromJson.js";
1010
import {ResizeMinimumFitAction} from "../actions/resize/ResizeMinimumFitAction.js";
1111
import {ResizeCropAction} from "../actions/resize/ResizeCropAction.js";
1212
import {ResizeFillAction} from "../actions/resize/ResizeFillAction.js";
@@ -40,6 +40,7 @@ import {Pixelate} from "../actions/effect/pixelate/Pixelate.js";
4040
import {BlurAction} from "../actions/effect/blur/Blur.js";
4141
import {ImproveAction} from "../actions/adjust/ImproveAction.js";
4242
import {DeliveryDPRAction} from "../actions/delivery/DeliveryDPRAction.js";
43+
import ConcatenateAction from "../actions/videoEdit/ConcatenateAction.js";
4344

4445
const ActionModelMap: Record<string, IHasFromJson> = {
4546
scale: ResizeScaleAction,
@@ -90,7 +91,8 @@ const ActionModelMap: Record<string, IHasFromJson> = {
9091
dpr: DeliveryDPRAction,
9192
contrast: EffectActionWithLevel,
9293
brightness: EffectActionWithLevel,
93-
gamma: EffectActionWithLevel
94+
gamma: EffectActionWithLevel,
95+
concatenate: ConcatenateAction
9496
};
9597

9698
/**
@@ -105,7 +107,7 @@ function actions(actionModels: IActionModel[]): Action[] {
105107
throw createUnsupportedError(`unsupported action ${actionModel.actionType}`);
106108
}
107109

108-
return actionClass.fromJson(actionModel);
110+
return actionClass.fromJson(actionModel, fromJson as ITransformationFromJson);
109111
});
110112
}
111113

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import {IActionModel} from "./IActionModel.js";
2+
import {IVideoSourceModel} from "./IVideoSourceModel.js";
3+
import {ISourceModel} from "./ISourceModel.js";
4+
5+
export interface IConcatenateActionModel extends IActionModel{
6+
source: ISourceModel; // TODO: add and update source: IVideoSourceModel | IImageSourceModel | IFetchSourceModel
7+
transition?: IVideoSourceModel,
8+
prepend?: boolean;
9+
duration?: number;
10+
}
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import {IActionModel} from "./IActionModel.js";
22
import {Action} from "../Action.js";
3+
import {Transformation} from "../../transformation/Transformation.js";
34

4-
interface IHasFromJson {
5-
fromJson: (actionModel: IActionModel) => Action;
6-
}
5+
export type ITransformationFromJson = (actionModels: IActionModel[]) => Transformation;
76

8-
export {IHasFromJson};
7+
export interface IHasFromJson {
8+
fromJson: (actionModel: IActionModel, transformationFromJson?: ITransformationFromJson) => Action;
9+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export interface IQualifierModel {
2+
qualifierType?: string;
3+
[x: string]: unknown;
4+
}
5+
6+
/**
7+
* Validates obj is an instance of IQualifierModel
8+
* @param obj
9+
*/
10+
export function isIQualifierModel(obj: unknown): obj is IQualifierModel{
11+
const qualifierModel = obj as IQualifierModel;
12+
return ('qualifierType' in qualifierModel);
13+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import {IQualifierModel} from "./IQualifierModel.js";
2+
3+
export interface ISourceModel extends IQualifierModel {
4+
sourceType: string;
5+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import {ISourceModel} from "./ISourceModel.js";
2+
import {IVideoTransformationModel} from "./IVideoTransformationModel.js";
3+
4+
export interface IVideoSourceModel extends ISourceModel {
5+
qualifierType: "videoSource";
6+
sourceType: "video";
7+
publicId: string;
8+
transformation?: IVideoTransformationModel;
9+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import {IActionModel} from "./IActionModel.js";
2+
3+
export interface IVideoTransformationModel{
4+
actions: IActionModel[]; //
5+
}

0 commit comments

Comments
 (0)