@growth-labs/video 0.3.9 → 0.3.11

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 CHANGED
@@ -88,8 +88,8 @@ video/<videoId>/hls/<rendition>/index.m3u8
88
88
  video/<videoId>/hls/<rendition>/init.mp4
89
89
  video/<videoId>/hls/<rendition>/segment-00001.m4s
90
90
  video/<videoId>/poster.jpg
91
- video/<videoId>/captions_en.vtt
92
- video/<videoId>/chapters.vtt
91
+ video/<videoId>/text/captions_en.vtt
92
+ video/<videoId>/text/chapters.vtt
93
93
  ```
94
94
 
95
95
  ## Ingest Helpers
@@ -116,6 +116,6 @@ await writeChaptersVtt({ bucket: env.MEDIA_BUCKET, videoId: 'intro-video', vtt:
116
116
 
117
117
  The ingestion helper validates `master.m3u8`, referenced rendition playlists, segment paths, and local HLS `URI="..."` attributes such as `EXT-X-MAP`, `EXT-X-MEDIA`, `EXT-X-I-FRAME-STREAM-INF`, and `EXT-X-KEY` before writing to R2. Absolute/external URLs and unsafe relative paths are rejected. Transcoding is out of scope; pass already-generated HLS and VTT files.
118
118
 
119
- All R2 key helpers normalize `videoId` with the same safe contract: IDs must start with an ASCII letter or number and then contain only ASCII letters, numbers, `_`, or `-`. Text-track helpers write only under `video/<videoId>/captions_<lang>.vtt` and `video/<videoId>/chapters.vtt`.
119
+ All R2 key helpers normalize `videoId` with the same safe contract: IDs must start with an ASCII letter or number and then contain only ASCII letters, numbers, `_`, or `-`. Text-track helpers write only under `video/<videoId>/text/captions_<lang>.vtt` and `video/<videoId>/text/chapters.vtt`.
120
120
 
121
121
  Injected routes read bindings from `cloudflare:workers` `env`; no `locals.runtime` shim is required.
@@ -19,11 +19,11 @@ export function captionsKey(videoId, lang = 'en') {
19
19
  .trim()
20
20
  .toLowerCase()
21
21
  .replace(/[^a-z0-9-]/g, '_') || 'en';
22
- return `video/${safeVideoId}/captions_${normalized}.vtt`;
22
+ return `video/${safeVideoId}/text/captions_${normalized}.vtt`;
23
23
  }
24
24
  export function chaptersKey(videoId) {
25
25
  const safeVideoId = normalizeVideoId(videoId);
26
- return `video/${safeVideoId}/chapters.vtt`;
26
+ return `video/${safeVideoId}/text/chapters.vtt`;
27
27
  }
28
28
  export function chaptersJsonKey(videoId) {
29
29
  const safeVideoId = normalizeVideoId(videoId);
@@ -1 +1 @@
1
- {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/utils/keys.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;IACjC,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,UAAU,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC/C,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,SAAS,WAAW,kBAAkB,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACxC,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,SAAS,WAAW,aAAa,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,OAAe,IAAI;IAC/D,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7C,MAAM,UAAU,GACf,IAAI;SACF,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,IAAI,IAAI,CAAA;IACtC,OAAO,SAAS,WAAW,aAAa,UAAU,MAAM,CAAA;AACzD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IAC1C,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,SAAS,WAAW,eAAe,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC9C,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,SAAS,WAAW,gBAAgB,CAAA;AAC5C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC9C,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,SAAS,WAAW,OAAO,CAAA;AACnC,CAAC"}
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/utils/keys.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;IACjC,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,UAAU,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC/C,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,SAAS,WAAW,kBAAkB,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACxC,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,SAAS,WAAW,aAAa,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,OAAe,IAAI;IAC/D,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7C,MAAM,UAAU,GACf,IAAI;SACF,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,IAAI,IAAI,CAAA;IACtC,OAAO,SAAS,WAAW,kBAAkB,UAAU,MAAM,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IAC1C,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,SAAS,WAAW,oBAAoB,CAAA;AAChD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC9C,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,SAAS,WAAW,gBAAgB,CAAA;AAC5C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC9C,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,SAAS,WAAW,OAAO,CAAA;AACnC,CAAC"}
package/dist/utils/url.js CHANGED
@@ -9,10 +9,10 @@ export function captionsUrl(publicDomain, videoId, lang = 'en') {
9
9
  .trim()
10
10
  .toLowerCase()
11
11
  .replace(/[^a-z0-9-]/g, '_') || 'en';
12
- return `https://${publicDomain}/video/${videoId}/captions_${normalized}.vtt`;
12
+ return `https://${publicDomain}/video/${videoId}/text/captions_${normalized}.vtt`;
13
13
  }
14
14
  export function chaptersUrl(publicDomain, videoId) {
15
- return `https://${publicDomain}/video/${videoId}/chapters.vtt`;
15
+ return `https://${publicDomain}/video/${videoId}/text/chapters.vtt`;
16
16
  }
17
17
  export function chaptersJsonUrl(publicDomain, videoId) {
18
18
  return `https://${publicDomain}/video/${videoId}/chapters.json`;
@@ -1 +1 @@
1
- {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,YAAoB,EAAE,OAAe;IAChE,OAAO,WAAW,YAAY,UAAU,OAAO,kBAAkB,CAAA;AAClE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,YAAoB,EAAE,OAAe;IAC9D,OAAO,WAAW,YAAY,+EAA+E,OAAO,aAAa,CAAA;AAClI,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,YAAoB,EAAE,OAAe,EAAE,OAAe,IAAI;IACrF,MAAM,UAAU,GACf,IAAI;SACF,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,IAAI,IAAI,CAAA;IACtC,OAAO,WAAW,YAAY,UAAU,OAAO,aAAa,UAAU,MAAM,CAAA;AAC7E,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,YAAoB,EAAE,OAAe;IAChE,OAAO,WAAW,YAAY,UAAU,OAAO,eAAe,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,YAAoB,EAAE,OAAe;IACpE,OAAO,WAAW,YAAY,UAAU,OAAO,gBAAgB,CAAA;AAChE,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACpC,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,aAAqB,EAAE,OAAe;IACxE,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,IAAI,OAAO,kBAAkB,CAAA;AACrE,CAAC;AAED,MAAM,UAAU,kBAAkB,CACjC,aAAqB,EACrB,OAAe,EACf,OAAe;IAEf,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IACpE,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,IAAI,OAAO,IAAI,OAAO,EAAE,CAAA;AAChE,CAAC"}
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,YAAoB,EAAE,OAAe;IAChE,OAAO,WAAW,YAAY,UAAU,OAAO,kBAAkB,CAAA;AAClE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,YAAoB,EAAE,OAAe;IAC9D,OAAO,WAAW,YAAY,+EAA+E,OAAO,aAAa,CAAA;AAClI,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,YAAoB,EAAE,OAAe,EAAE,OAAe,IAAI;IACrF,MAAM,UAAU,GACf,IAAI;SACF,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,IAAI,IAAI,CAAA;IACtC,OAAO,WAAW,YAAY,UAAU,OAAO,kBAAkB,UAAU,MAAM,CAAA;AAClF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,YAAoB,EAAE,OAAe;IAChE,OAAO,WAAW,YAAY,UAAU,OAAO,oBAAoB,CAAA;AACpE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,YAAoB,EAAE,OAAe;IACpE,OAAO,WAAW,YAAY,UAAU,OAAO,gBAAgB,CAAA;AAChE,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACpC,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,aAAqB,EAAE,OAAe;IACxE,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,IAAI,OAAO,kBAAkB,CAAA;AACrE,CAAC;AAED,MAAM,UAAU,kBAAkB,CACjC,aAAqB,EACrB,OAAe,EACf,OAAe;IAEf,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IACpE,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,IAAI,OAAO,IAAI,OAAO,EAAE,CAAA;AAChE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@growth-labs/video",
3
- "version": "0.3.9",
3
+ "version": "0.3.11",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -14,6 +14,7 @@ interface Props {
14
14
  title: string
15
15
  premium?: boolean
16
16
  poster?: string
17
+ contentSlug?: string
17
18
  captions?: boolean
18
19
  chapters?: boolean
19
20
  captionsLang?: string
@@ -26,6 +27,7 @@ const {
26
27
  videoId,
27
28
  title,
28
29
  premium = false,
30
+ contentSlug,
29
31
  captionsLang = 'en',
30
32
  class: className,
31
33
  } = Astro.props
@@ -61,6 +63,7 @@ const playerBoolAttrs = buildPlayerBooleanAttrs({
61
63
 
62
64
  <media-player
63
65
  data-video-id={videoId}
66
+ data-content-slug={contentSlug}
64
67
  data-premium={premium ? 'true' : 'false'}
65
68
  data-session-route={premium ? config.premium?.sessionRoute : undefined}
66
69
  data-pending-src={premium ? src : undefined}
package/src/utils/keys.ts CHANGED
@@ -23,12 +23,12 @@ export function captionsKey(videoId: string, lang: string = 'en'): string {
23
23
  .trim()
24
24
  .toLowerCase()
25
25
  .replace(/[^a-z0-9-]/g, '_') || 'en'
26
- return `video/${safeVideoId}/captions_${normalized}.vtt`
26
+ return `video/${safeVideoId}/text/captions_${normalized}.vtt`
27
27
  }
28
28
 
29
29
  export function chaptersKey(videoId: string): string {
30
30
  const safeVideoId = normalizeVideoId(videoId)
31
- return `video/${safeVideoId}/chapters.vtt`
31
+ return `video/${safeVideoId}/text/chapters.vtt`
32
32
  }
33
33
 
34
34
  export function chaptersJsonKey(videoId: string): string {
package/src/utils/url.ts CHANGED
@@ -12,11 +12,11 @@ export function captionsUrl(publicDomain: string, videoId: string, lang: string
12
12
  .trim()
13
13
  .toLowerCase()
14
14
  .replace(/[^a-z0-9-]/g, '_') || 'en'
15
- return `https://${publicDomain}/video/${videoId}/captions_${normalized}.vtt`
15
+ return `https://${publicDomain}/video/${videoId}/text/captions_${normalized}.vtt`
16
16
  }
17
17
 
18
18
  export function chaptersUrl(publicDomain: string, videoId: string): string {
19
- return `https://${publicDomain}/video/${videoId}/chapters.vtt`
19
+ return `https://${publicDomain}/video/${videoId}/text/chapters.vtt`
20
20
  }
21
21
 
22
22
  export function chaptersJsonUrl(publicDomain: string, videoId: string): string {