@financial-times/cp-content-pipeline-schema 2.0.0 → 2.0.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.0.1](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v2.0.0...cp-content-pipeline-schema-v2.0.1) (2024-02-02)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * use Origami Image Service for poster and fallback image for Clips ([68e75c3](https://github.com/Financial-Times/cp-content-pipeline/commit/68e75c3ebfa5b3afaa96c0375499aec5e904f2b5))
9
+
3
10
  ## [2.0.0](https://github.com/Financial-Times/cp-content-pipeline/compare/cp-content-pipeline-schema-v1.8.6...cp-content-pipeline-schema-v2.0.0) (2024-01-29)
4
11
 
5
12
 
@@ -19,7 +19,8 @@ export interface ClipVideo {
19
19
  }
20
20
  export declare class Clip implements ClipVideo {
21
21
  private clip;
22
- constructor(clip: ClipMetadata);
22
+ private layout?;
23
+ constructor(clip: ClipMetadata, layout?: string | undefined);
23
24
  type(): string;
24
25
  id(): string;
25
26
  format(): LiteralUnionScalarValues<typeof ClipFormat>;
package/lib/model/Clip.js CHANGED
@@ -1,12 +1,17 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.Clip = void 0;
4
7
  const metadata_1 = require("../helpers/metadata");
5
8
  const literal_union_1 = require("../resolvers/literal-union");
6
9
  const scalars_1 = require("../resolvers/scalars");
10
+ const imageService_1 = __importDefault(require("../helpers/imageService"));
7
11
  class Clip {
8
- constructor(clip) {
12
+ constructor(clip, layout) {
9
13
  this.clip = clip;
14
+ this.layout = layout;
10
15
  }
11
16
  type() {
12
17
  return 'clip';
@@ -44,7 +49,17 @@ class Clip {
44
49
  return dataSource;
45
50
  }
46
51
  poster() {
47
- return this.clip.poster?.members[0].binaryUrl ?? '';
52
+ const mapSizes = {
53
+ 'in-line': 700,
54
+ 'mid-grid': 900,
55
+ 'full-grid': 1200,
56
+ };
57
+ const url = this.clip.poster?.members[0].binaryUrl;
58
+ return url ? (0, imageService_1.default)({
59
+ url,
60
+ systemCode: 'cp-content-pipeline',
61
+ width: this.layout && mapSizes[this.layout] ? mapSizes[this.layout] : 700,
62
+ }) : '';
48
63
  }
49
64
  }
50
65
  exports.Clip = Clip;
@@ -1 +1 @@
1
- {"version":3,"file":"Clip.js","sourceRoot":"","sources":["../../src/model/Clip.ts"],"names":[],"mappings":";;;AAAA,kDAAiD;AAEjD,8DAGmC;AACnC,kDAAiD;AAoBjD,MAAa,IAAI;IACf,YAAoB,IAAkB;QAAlB,SAAI,GAAJ,IAAI,CAAc;IAAG,CAAC;IAE1C,IAAI;QACF,OAAO,MAAM,CAAA;IACf,CAAC;IAED,EAAE;QACA,MAAM,IAAI,GAAG,IAAA,sBAAW,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACtC,IAAI,CAAC,IAAI,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,qCAAqC,CAAC,CAAA;SACtE;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAA;YAEnC,IAAI,UAAU,KAAK,gBAAgB,EAAE;gBACnC,OAAO,iBAAiB,CAAA;aACzB;YAED,IAAI,IAAA,sCAAsB,EAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,oBAAU,CAAC,MAAM,CAAC,EAAE;gBAC/D,OAAO,UAAU,CAAA;aAClB;SACF;QAED,OAAO,iBAAiB,CAAA;IAC1B,CAAC;IAED,UAAU;QACR,kKAAkK;QAClK,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC5D,IAAI,CAAC,CAAC,SAAS,KAAK,WAAW,IAAI,CAAC,CAAC,SAAS,KAAK,WAAW,EAAE;gBAC9D,OAAO,CAAC,CAAC,CAAA;aACV;YACD,IAAI,CAAC,CAAC,SAAS,KAAK,WAAW,IAAI,CAAC,CAAC,SAAS,KAAK,WAAW,EAAE;gBAC9D,OAAO,CAAC,CAAA;aACT;YACD,OAAO,CAAC,CAAA;QACV,CAAC,CAAC,CAAA;QACF,OAAO,UAA0B,CAAA;IACnC,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAA;IACrD,CAAC;CACF;AAhDD,oBAgDC"}
1
+ {"version":3,"file":"Clip.js","sourceRoot":"","sources":["../../src/model/Clip.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAiD;AAEjD,8DAGmC;AACnC,kDAAiD;AACjD,2EAAqD;AAoBrD,MAAa,IAAI;IACf,YAAoB,IAAkB,EAAU,MAAe;QAA3C,SAAI,GAAJ,IAAI,CAAc;QAAU,WAAM,GAAN,MAAM,CAAS;IAAG,CAAC;IAEnE,IAAI;QACF,OAAO,MAAM,CAAA;IACf,CAAC;IAED,EAAE;QACA,MAAM,IAAI,GAAG,IAAA,sBAAW,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACtC,IAAI,CAAC,IAAI,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,qCAAqC,CAAC,CAAA;SACtE;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAA;YAEnC,IAAI,UAAU,KAAK,gBAAgB,EAAE;gBACnC,OAAO,iBAAiB,CAAA;aACzB;YAED,IAAI,IAAA,sCAAsB,EAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,oBAAU,CAAC,MAAM,CAAC,EAAE;gBAC/D,OAAO,UAAU,CAAA;aAClB;SACF;QAED,OAAO,iBAAiB,CAAA;IAC1B,CAAC;IAED,UAAU;QACR,kKAAkK;QAClK,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC5D,IAAI,CAAC,CAAC,SAAS,KAAK,WAAW,IAAI,CAAC,CAAC,SAAS,KAAK,WAAW,EAAE;gBAC9D,OAAO,CAAC,CAAC,CAAA;aACV;YACD,IAAI,CAAC,CAAC,SAAS,KAAK,WAAW,IAAI,CAAC,CAAC,SAAS,KAAK,WAAW,EAAE;gBAC9D,OAAO,CAAC,CAAA;aACT;YACD,OAAO,CAAC,CAAA;QACV,CAAC,CAAC,CAAA;QACF,OAAO,UAA0B,CAAA;IACnC,CAAC;IAED,MAAM;QACJ,MAAM,QAAQ,GAEV;YACF,SAAS,EAAE,GAAG;YACd,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,IAAI;SAClB,CAAA;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnD,OAAO,GAAG,CAAE,CAAC,CAAC,IAAA,sBAAe,EAAC;YAC5B,GAAG;YACH,UAAU,EAAE,qBAAqB;YACjC,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG;SAC1E,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACT,CAAC;CACF;AA7DD,oBA6DC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const Clip_1 = require("./Clip");
4
+ describe('Clip', () => {
5
+ describe('poster', () => {
6
+ it('uses the Origami Image Service when a url is provided', () => {
7
+ const clip = new Clip_1.Clip({
8
+ id: 'http://api.ft.com/things/1234',
9
+ type: "http://www.ft.com/ontology/content/Clip",
10
+ dataSource: [
11
+ {},
12
+ ],
13
+ poster: {
14
+ id: 'http://api.ft.com/things/1234',
15
+ type: 'http://www.ft.com/ontology/content/ImageSet',
16
+ members: [
17
+ {
18
+ id: 'http://api.ft.com/things/1234',
19
+ type: 'http://www.ft.com/ontology/content/Image',
20
+ binaryUrl: 'http://video.ft.com/1234.jpg',
21
+ },
22
+ ],
23
+ },
24
+ });
25
+ expect(clip.poster()).toContain('https://www.ft.com/__origami/service/image/v2/images/raw/');
26
+ expect(clip.poster()).toContain('source=cp-content-pipeline&fit=scale-down&quality=highest');
27
+ });
28
+ it('returns an empty string if an image url is not provided', () => {
29
+ const clip = new Clip_1.Clip({
30
+ id: 'http://api.ft.com/things/1234',
31
+ type: "http://www.ft.com/ontology/content/Clip",
32
+ dataSource: [
33
+ {},
34
+ ],
35
+ poster: {
36
+ id: 'http://api.ft.com/things/1234',
37
+ type: 'http://www.ft.com/ontology/content/ImageSet',
38
+ members: [
39
+ {
40
+ id: 'http://api.ft.com/things/1234',
41
+ type: 'http://www.ft.com/ontology/content/Image',
42
+ binaryUrl: '',
43
+ },
44
+ ],
45
+ },
46
+ });
47
+ expect(clip.poster()).toEqual('');
48
+ });
49
+ it('uses a default width if a layout is not provided', () => {
50
+ const clip = new Clip_1.Clip({
51
+ id: 'http://api.ft.com/things/1234',
52
+ type: "http://www.ft.com/ontology/content/Clip",
53
+ dataSource: [
54
+ {},
55
+ ],
56
+ poster: {
57
+ id: 'http://api.ft.com/things/1234',
58
+ type: 'http://www.ft.com/ontology/content/ImageSet',
59
+ members: [
60
+ {
61
+ id: 'http://api.ft.com/things/1234',
62
+ type: 'http://www.ft.com/ontology/content/Image',
63
+ binaryUrl: 'http://video.ft.com/1234.jpg',
64
+ },
65
+ ],
66
+ },
67
+ });
68
+ expect(clip.poster()).toContain('width=700');
69
+ });
70
+ it('uses a default width if a layout is not supported', () => {
71
+ const clip = new Clip_1.Clip({
72
+ id: 'http://api.ft.com/things/1234',
73
+ type: "http://www.ft.com/ontology/content/Clip",
74
+ dataSource: [
75
+ {},
76
+ ],
77
+ poster: {
78
+ id: 'http://api.ft.com/things/1234',
79
+ type: 'http://www.ft.com/ontology/content/ImageSet',
80
+ members: [
81
+ {
82
+ id: 'http://api.ft.com/things/1234',
83
+ type: 'http://www.ft.com/ontology/content/Image',
84
+ binaryUrl: 'http://video.ft.com/1234.jpg',
85
+ },
86
+ ],
87
+ },
88
+ }, 'I-dont-exist');
89
+ expect(clip.poster()).toEqual('https://www.ft.com/__origami/service/image/v2/images/raw/http%3A%2F%2Fvideo.ft.com%2F1234.jpg?source=cp-content-pipeline&fit=scale-down&quality=highest&width=700&dpr=1');
90
+ });
91
+ it('generates an image with the appropriate width for a `in-line` layout', () => {
92
+ const clip = new Clip_1.Clip({
93
+ id: 'http://api.ft.com/things/1234',
94
+ type: "http://www.ft.com/ontology/content/Clip",
95
+ dataSource: [
96
+ {},
97
+ ],
98
+ poster: {
99
+ id: 'http://api.ft.com/things/1234',
100
+ type: 'http://www.ft.com/ontology/content/ImageSet',
101
+ members: [
102
+ {
103
+ id: 'http://api.ft.com/things/1234',
104
+ type: 'http://www.ft.com/ontology/content/Image',
105
+ binaryUrl: 'http://video.ft.com/1234.jpg',
106
+ },
107
+ ],
108
+ },
109
+ }, 'in-line');
110
+ expect(clip.poster()).toContain('width=700');
111
+ });
112
+ it('generates an image with the appropriate width for a `mid-grid` layout', () => {
113
+ const clip = new Clip_1.Clip({
114
+ id: 'http://api.ft.com/things/1234',
115
+ type: "http://www.ft.com/ontology/content/Clip",
116
+ dataSource: [
117
+ {},
118
+ ],
119
+ poster: {
120
+ id: 'http://api.ft.com/things/1234',
121
+ type: 'http://www.ft.com/ontology/content/ImageSet',
122
+ members: [
123
+ {
124
+ id: 'http://api.ft.com/things/1234',
125
+ type: 'http://www.ft.com/ontology/content/Image',
126
+ binaryUrl: 'http://video.ft.com/1234.jpg',
127
+ },
128
+ ],
129
+ },
130
+ }, 'mid-grid');
131
+ expect(clip.poster()).toContain('width=900');
132
+ });
133
+ it('generates an image with the appropriate width for a `full-grid` layout', () => {
134
+ const clip = new Clip_1.Clip({
135
+ id: 'http://api.ft.com/things/1234',
136
+ type: "http://www.ft.com/ontology/content/Clip",
137
+ dataSource: [
138
+ {},
139
+ ],
140
+ poster: {
141
+ id: 'http://api.ft.com/things/1234',
142
+ type: 'http://www.ft.com/ontology/content/ImageSet',
143
+ members: [
144
+ {
145
+ id: 'http://api.ft.com/things/1234',
146
+ type: 'http://www.ft.com/ontology/content/Image',
147
+ binaryUrl: 'http://video.ft.com/1234.jpg',
148
+ },
149
+ ],
150
+ },
151
+ }, 'full-grid');
152
+ expect(clip.poster()).toContain('width=1200');
153
+ });
154
+ });
155
+ });
156
+ //# sourceMappingURL=Clip.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Clip.test.js","sourceRoot":"","sources":["../../src/model/Clip.test.ts"],"names":[],"mappings":"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"}
@@ -50,7 +50,7 @@ exports.ClipSet = {
50
50
  async clips(parent) {
51
51
  const clipSet = getClipSet(parent);
52
52
  return clipSet && clipSet.members && clipSet.members.length > 0
53
- ? clipSet.members.map((clip) => new Clip_1.Clip(clip))
53
+ ? clipSet.members.map((clip) => new Clip_1.Clip(clip, parent.reference.dataLayout))
54
54
  : null;
55
55
  },
56
56
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ClipSet.js","sourceRoot":"","sources":["../../../../src/resolvers/content-tree/references/ClipSet.ts"],"names":[],"mappings":";;;AAKA,wDAAuD;AACvD,8CAA0C;AAC1C,sDAAkD;AAIlD,SAAS,UAAU,CACjB,MAEC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc;QACpC,EAAE,MAAM,EAAE;QACV,EAAE,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAErD,CAAA;IAEN,MAAM,IAAI,GAAG,IAAA,sBAAW,EACtB,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,UAAU;QAClC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;QACrB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CACzB,CAAA;IACD,MAAM,OAAO,GAAG,QAAQ,EAAE,IAAI,CAC5B,CAAC,KAAkB,EAAE,EAAE,CAAC,IAAA,sBAAW,EAAC,KAAK,CAAC,EAAE,CAAC,KAAK,IAAI,CACvD,CAAA;IAED,OAAO,OAAsB,CAAA;AAC/B,CAAC;AAEY,QAAA,OAAO,GAAG;IACrB,yEAAyE;IACzE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CACb,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,UAAU;QAClC,CAAC,CAAC,IAAA,sBAAW,EAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,CAAC,CAAC,EAAE;IACR,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ;IAC/C,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,IAAI,IAAI;IACxD,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI;IACvC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK;IACzC,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU;IACnD,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CACjB,MAAM,CAAC,SAAgC,CAAC,OAAO;QAChD,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO;IAC7B,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE;QACxB,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,aAAa,CAAA;QACvD,IAAI,aAAa,EAAE;YACjB,OAAO;gBACL,GAAG,aAAa;gBAChB,UAAU,EAAE,aAAa,CAAC,UAAU;oBAClC,CAAC,CAAC,IAAI,mBAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,UAAU,CAAC;oBACtD,CAAC,CAAC,IAAI;aACT,CAAA;SACF;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CACrB,MAAM,CAAC,SAAgC,CAAC,WAAW;QACpD,UAAU,CAAC,MAAM,CAAC,EAAE,WAAW;IACjC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CACjB,MAAM,CAAC,SAAgC,CAAC,OAAO;QAChD,UAAU,CAAC,MAAM,CAAC,EAAE,aAAa;IACnC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,YAAY,IAAI,IAAI;IAClE,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,cAAc,IAAI,IAAI;IACtE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,IAAI;IACtD,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,QAAQ,IAAI,IAAI;IAC1D,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,aAAa,IAAI,IAAI;IACpE,KAAK,CAAC,KAAK,CAAC,MAAM;QAChB,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;QAElC,OAAO,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAC7D,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,WAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,CAAC,CAAC,IAAI,CAAA;IACV,CAAC;CACyB,CAAA"}
1
+ {"version":3,"file":"ClipSet.js","sourceRoot":"","sources":["../../../../src/resolvers/content-tree/references/ClipSet.ts"],"names":[],"mappings":";;;AAKA,wDAAuD;AACvD,8CAA0C;AAC1C,sDAAkD;AAIlD,SAAS,UAAU,CACjB,MAEC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc;QACpC,EAAE,MAAM,EAAE;QACV,EAAE,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAErD,CAAA;IAEN,MAAM,IAAI,GAAG,IAAA,sBAAW,EACtB,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,UAAU;QAClC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;QACrB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CACzB,CAAA;IACD,MAAM,OAAO,GAAG,QAAQ,EAAE,IAAI,CAC5B,CAAC,KAAkB,EAAE,EAAE,CAAC,IAAA,sBAAW,EAAC,KAAK,CAAC,EAAE,CAAC,KAAK,IAAI,CACvD,CAAA;IAED,OAAO,OAAsB,CAAA;AAC/B,CAAC;AAEY,QAAA,OAAO,GAAG;IACrB,yEAAyE;IACzE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CACb,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,UAAU;QAClC,CAAC,CAAC,IAAA,sBAAW,EAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,CAAC,CAAC,EAAE;IACR,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ;IAC/C,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,IAAI,IAAI;IACxD,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI;IACvC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK;IACzC,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU;IACnD,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CACjB,MAAM,CAAC,SAAgC,CAAC,OAAO;QAChD,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO;IAC7B,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE;QACxB,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,aAAa,CAAA;QACvD,IAAI,aAAa,EAAE;YACjB,OAAO;gBACL,GAAG,aAAa;gBAChB,UAAU,EAAE,aAAa,CAAC,UAAU;oBAClC,CAAC,CAAC,IAAI,mBAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,UAAU,CAAC;oBACtD,CAAC,CAAC,IAAI;aACT,CAAA;SACF;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IACD,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CACrB,MAAM,CAAC,SAAgC,CAAC,WAAW;QACpD,UAAU,CAAC,MAAM,CAAC,EAAE,WAAW;IACjC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CACjB,MAAM,CAAC,SAAgC,CAAC,OAAO;QAChD,UAAU,CAAC,MAAM,CAAC,EAAE,aAAa;IACnC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,YAAY,IAAI,IAAI;IAClE,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,cAAc,IAAI,IAAI;IACtE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,IAAI;IACtD,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,QAAQ,IAAI,IAAI;IAC1D,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,aAAa,IAAI,IAAI;IACpE,KAAK,CAAC,KAAK,CAAC,MAAM;QAChB,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;QAElC,OAAO,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAC7D,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,WAAI,CAAC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAC5E,CAAC,CAAC,IAAI,CAAA;IACV,CAAC;CACyB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@financial-times/cp-content-pipeline-schema",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -0,0 +1,154 @@
1
+ import { Clip } from './Clip';
2
+
3
+ describe('Clip', () => {
4
+ describe('poster', () => {
5
+ it('uses the Origami Image Service when a url is provided', () => {
6
+ const clip = new Clip({
7
+ id: 'http://api.ft.com/things/1234',
8
+ type: "http://www.ft.com/ontology/content/Clip",
9
+ dataSource: [
10
+ {},
11
+ ],
12
+ poster: {
13
+ id: 'http://api.ft.com/things/1234',
14
+ type: 'http://www.ft.com/ontology/content/ImageSet',
15
+ members: [
16
+ {
17
+ id: 'http://api.ft.com/things/1234',
18
+ type: 'http://www.ft.com/ontology/content/Image',
19
+ binaryUrl: 'http://video.ft.com/1234.jpg',
20
+ },
21
+ ],
22
+ },
23
+ });
24
+ expect(clip.poster()).toContain('https://www.ft.com/__origami/service/image/v2/images/raw/');
25
+ expect(clip.poster()).toContain('source=cp-content-pipeline&fit=scale-down&quality=highest');
26
+ });
27
+ it('returns an empty string if an image url is not provided', () => {
28
+ const clip = new Clip({
29
+ id: 'http://api.ft.com/things/1234',
30
+ type: "http://www.ft.com/ontology/content/Clip",
31
+ dataSource: [
32
+ {},
33
+ ],
34
+ poster: {
35
+ id: 'http://api.ft.com/things/1234',
36
+ type: 'http://www.ft.com/ontology/content/ImageSet',
37
+ members: [
38
+ {
39
+ id: 'http://api.ft.com/things/1234',
40
+ type: 'http://www.ft.com/ontology/content/Image',
41
+ binaryUrl: '',
42
+ },
43
+ ],
44
+ },
45
+ });
46
+ expect(clip.poster()).toEqual('');
47
+ });
48
+ it('uses a default width if a layout is not provided', () => {
49
+ const clip = new Clip({
50
+ id: 'http://api.ft.com/things/1234',
51
+ type: "http://www.ft.com/ontology/content/Clip",
52
+ dataSource: [
53
+ {},
54
+ ],
55
+ poster: {
56
+ id: 'http://api.ft.com/things/1234',
57
+ type: 'http://www.ft.com/ontology/content/ImageSet',
58
+ members: [
59
+ {
60
+ id: 'http://api.ft.com/things/1234',
61
+ type: 'http://www.ft.com/ontology/content/Image',
62
+ binaryUrl: 'http://video.ft.com/1234.jpg',
63
+ },
64
+ ],
65
+ },
66
+ });
67
+ expect(clip.poster()).toContain('width=700');
68
+ });
69
+ it('uses a default width if a layout is not supported', () => {
70
+ const clip = new Clip({
71
+ id: 'http://api.ft.com/things/1234',
72
+ type: "http://www.ft.com/ontology/content/Clip",
73
+ dataSource: [
74
+ {},
75
+ ],
76
+ poster: {
77
+ id: 'http://api.ft.com/things/1234',
78
+ type: 'http://www.ft.com/ontology/content/ImageSet',
79
+ members: [
80
+ {
81
+ id: 'http://api.ft.com/things/1234',
82
+ type: 'http://www.ft.com/ontology/content/Image',
83
+ binaryUrl: 'http://video.ft.com/1234.jpg',
84
+ },
85
+ ],
86
+ },
87
+ }, 'I-dont-exist');
88
+ expect(clip.poster()).toEqual('https://www.ft.com/__origami/service/image/v2/images/raw/http%3A%2F%2Fvideo.ft.com%2F1234.jpg?source=cp-content-pipeline&fit=scale-down&quality=highest&width=700&dpr=1');
89
+ });
90
+ it('generates an image with the appropriate width for a `in-line` layout', () => {
91
+ const clip = new Clip({
92
+ id: 'http://api.ft.com/things/1234',
93
+ type: "http://www.ft.com/ontology/content/Clip",
94
+ dataSource: [
95
+ {},
96
+ ],
97
+ poster: {
98
+ id: 'http://api.ft.com/things/1234',
99
+ type: 'http://www.ft.com/ontology/content/ImageSet',
100
+ members: [
101
+ {
102
+ id: 'http://api.ft.com/things/1234',
103
+ type: 'http://www.ft.com/ontology/content/Image',
104
+ binaryUrl: 'http://video.ft.com/1234.jpg',
105
+ },
106
+ ],
107
+ },
108
+ }, 'in-line');
109
+ expect(clip.poster()).toContain('width=700');
110
+ });
111
+ it('generates an image with the appropriate width for a `mid-grid` layout', () => {
112
+ const clip = new Clip({
113
+ id: 'http://api.ft.com/things/1234',
114
+ type: "http://www.ft.com/ontology/content/Clip",
115
+ dataSource: [
116
+ {},
117
+ ],
118
+ poster: {
119
+ id: 'http://api.ft.com/things/1234',
120
+ type: 'http://www.ft.com/ontology/content/ImageSet',
121
+ members: [
122
+ {
123
+ id: 'http://api.ft.com/things/1234',
124
+ type: 'http://www.ft.com/ontology/content/Image',
125
+ binaryUrl: 'http://video.ft.com/1234.jpg',
126
+ },
127
+ ],
128
+ },
129
+ }, 'mid-grid');
130
+ expect(clip.poster()).toContain('width=900');
131
+ });
132
+ it('generates an image with the appropriate width for a `full-grid` layout', () => {
133
+ const clip = new Clip({
134
+ id: 'http://api.ft.com/things/1234',
135
+ type: "http://www.ft.com/ontology/content/Clip",
136
+ dataSource: [
137
+ {},
138
+ ],
139
+ poster: {
140
+ id: 'http://api.ft.com/things/1234',
141
+ type: 'http://www.ft.com/ontology/content/ImageSet',
142
+ members: [
143
+ {
144
+ id: 'http://api.ft.com/things/1234',
145
+ type: 'http://www.ft.com/ontology/content/Image',
146
+ binaryUrl: 'http://video.ft.com/1234.jpg',
147
+ },
148
+ ],
149
+ },
150
+ }, 'full-grid');
151
+ expect(clip.poster()).toContain('width=1200');
152
+ });
153
+ });
154
+ });
package/src/model/Clip.ts CHANGED
@@ -5,6 +5,7 @@ import {
5
5
  validLiteralUnionValue,
6
6
  } from '../resolvers/literal-union'
7
7
  import { ClipFormat } from '../resolvers/scalars'
8
+ import imageServiceUrl from '../helpers/imageService'
8
9
 
9
10
  export type ClipSource = {
10
11
  binaryUrl: string
@@ -25,7 +26,7 @@ export interface ClipVideo {
25
26
  }
26
27
 
27
28
  export class Clip implements ClipVideo {
28
- constructor(private clip: ClipMetadata) {}
29
+ constructor(private clip: ClipMetadata, private layout?: string) {}
29
30
 
30
31
  type() {
31
32
  return 'clip'
@@ -70,6 +71,19 @@ export class Clip implements ClipVideo {
70
71
  }
71
72
 
72
73
  poster() {
73
- return this.clip.poster?.members[0].binaryUrl ?? ''
74
+ const mapSizes: {
75
+ [key: string]: number
76
+ } = {
77
+ 'in-line': 700,
78
+ 'mid-grid': 900,
79
+ 'full-grid': 1200,
80
+ }
81
+
82
+ const url = this.clip.poster?.members[0].binaryUrl;
83
+ return url ? imageServiceUrl({
84
+ url,
85
+ systemCode: 'cp-content-pipeline',
86
+ width: this.layout && mapSizes[this.layout] ? mapSizes[this.layout] : 700,
87
+ }) : ''
74
88
  }
75
89
  }
@@ -73,7 +73,7 @@ export const ClipSet = {
73
73
  const clipSet = getClipSet(parent)
74
74
 
75
75
  return clipSet && clipSet.members && clipSet.members.length > 0
76
- ? clipSet.members.map((clip) => new Clip(clip))
76
+ ? clipSet.members.map((clip) => new Clip(clip, parent.reference.dataLayout))
77
77
  : null
78
78
  },
79
79
  } satisfies ClipSetResolvers