From 005354d1e093e2c5e86c5d05df7f2f49f3f7ba6b Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Sun, 15 Dec 2024 14:43:55 +0100 Subject: [PATCH 1/2] `@remotion/webcodecs`: Send usage event with `@remotion/licensing` --- .../licensing/src/register-usage-point.ts | 4 +-- packages/licensing/src/test/register.test.ts | 22 ++++++++++++---- packages/webcodecs/package.json | 3 ++- packages/webcodecs/src/convert-media.ts | 14 ++++++++++ .../webcodecs/src/send-telemetry-event.ts | 26 +++++++++++++++++++ packages/webcodecs/tsconfig.json | 3 +++ pnpm-lock.yaml | 3 +++ 7 files changed, 67 insertions(+), 8 deletions(-) create mode 100644 packages/webcodecs/src/send-telemetry-event.ts diff --git a/packages/licensing/src/register-usage-point.ts b/packages/licensing/src/register-usage-point.ts index 79311e79673..b22be8a6a8e 100644 --- a/packages/licensing/src/register-usage-point.ts +++ b/packages/licensing/src/register-usage-point.ts @@ -26,8 +26,8 @@ export const registerUsageEvent = async ({ succeeded, event, }: { - apiKey: string; - host: string; + apiKey: string | null; + host: string | null; succeeded: boolean; event: UsageEventType; }): Promise => { diff --git a/packages/licensing/src/test/register.test.ts b/packages/licensing/src/test/register.test.ts index f6cf10dd432..0b44f2254db 100644 --- a/packages/licensing/src/test/register.test.ts +++ b/packages/licensing/src/test/register.test.ts @@ -7,7 +7,7 @@ import {registerUsageEvent} from '../register-usage-point'; test('Should be able to track production usage', async () => { const result = await registerUsageEvent({ - apiKey: 'rm_pub_1dd7193534bbe72571b55bd43926654ddaaca3dd6f07772b', + apiKey: 'rm_pub_cbbf1d1e7f07cb0b86daa0247693d6c9af4740463768f2f6', host: 'http://localhost:50955', succeeded: true, event: 'webcodec-conversion', @@ -20,7 +20,7 @@ test('Should be able to track production usage', async () => { test('Should be able to track development usage', async () => { const result = await registerUsageEvent({ - apiKey: 'rm_pub_1dd7193534bbe72571b55bd43926654ddaaca3dd6f07772b', + apiKey: 'rm_pub_cbbf1d1e7f07cb0b86daa0247693d6c9af4740463768f2f6', host: 'https://remotion.dev', succeeded: true, event: 'webcodec-conversion', @@ -30,8 +30,20 @@ test('Should be able to track development usage', async () => { classification: 'billable', }); }); +test('Should be able to track without host', async () => { + const result = await registerUsageEvent({ + apiKey: 'rm_pub_cbbf1d1e7f07cb0b86daa0247693d6c9af4740463768f2f6', + host: null, + succeeded: true, + event: 'webcodec-conversion', + }); + expect(result).toEqual({ + billable: true, + classification: 'billable', + }); +}); -test('Should reject invalid API key', async () => { +test('Should reject invalid API key', () => { const result = registerUsageEvent({ apiKey: 'rm_pub_1dd719b', host: 'http://localhost:50955', @@ -63,7 +75,7 @@ test('should require secret key for usage', () => { test('should be able to get usage', async () => { const result = await getUsage({ - apiKey: 'rm_sec_7cef7338672c2b474729ac081134a6ded7dc360baf0068fe', + apiKey: 'rm_sec_b776a51f683c850101ece5c580c7db7281397d1864e076a9', since: null, }); @@ -75,7 +87,7 @@ test('should be able to get usage', async () => { expect(result.cloudRenders.failed).toBeGreaterThanOrEqual(0); }); -test('should not be able to get usage older than 90 says', async () => { +test('should not be able to get usage older than 90 says', () => { const result = getUsage({ apiKey: 'rm_sec_7cef7338672c2b474729ac081134a6ded7dc360baf0068fe', since: new Date().getTime() - 1000 * 60 * 60 * 24 * 700, diff --git a/packages/webcodecs/package.json b/packages/webcodecs/package.json index 4064c3e16a9..32ea1ace9a3 100644 --- a/packages/webcodecs/package.json +++ b/packages/webcodecs/package.json @@ -24,7 +24,8 @@ "author": "Jonny Burger ", "license": "Remotion License (See https://remotion.dev/docs/webcodecs#license)", "dependencies": { - "@remotion/media-parser": "workspace:*" + "@remotion/media-parser": "workspace:*", + "@remotion/licensing": "workspace:*" }, "peerDependencies": {}, "devDependencies": { diff --git a/packages/webcodecs/src/convert-media.ts b/packages/webcodecs/src/convert-media.ts index 86697a3c83b..5face19d435 100644 --- a/packages/webcodecs/src/convert-media.ts +++ b/packages/webcodecs/src/convert-media.ts @@ -26,11 +26,13 @@ import {generateOutputFilename} from './generate-output-filename'; import type {ConvertMediaAudioCodec} from './get-available-audio-codecs'; import type {ConvertMediaContainer} from './get-available-containers'; import type {ConvertMediaVideoCodec} from './get-available-video-codecs'; +import {Log} from './log'; import {makeAudioTrackHandler} from './on-audio-track'; import {type ConvertMediaOnAudioTrackHandler} from './on-audio-track-handler'; import {makeVideoTrackHandler} from './on-video-track'; import {type ConvertMediaOnVideoTrackHandler} from './on-video-track-handler'; import {selectContainerCreator} from './select-container-creator'; +import {sendUsageEvent} from './send-telemetry-event'; import {throttledStateUpdate} from './throttled-state-update'; export type ConvertMediaProgress = { @@ -74,6 +76,7 @@ export const convertMedia = async function < writer, progressIntervalInMs, rotate, + apiKey, ...more }: { src: ParseMediaOptions['src']; @@ -90,6 +93,7 @@ export const convertMedia = async function < writer?: WriterInterface; progressIntervalInMs?: number; rotate?: number; + apiKey?: string | null; } & ParseMediaDynamicOptions): Promise { if (userPassedAbortSignal?.aborted) { return Promise.reject(new Error('Aborted')); @@ -243,7 +247,17 @@ export const convertMedia = async function < finalState: throttledState.get(), }); }) + .then(() => { + sendUsageEvent({succeeded: true, apiKey: apiKey ?? null}).catch((err) => { + Log.error('Failed to send usage event', err); + }); + }) .catch((err) => { + sendUsageEvent({succeeded: false, apiKey: apiKey ?? null}).catch( + (err2) => { + Log.error('Failed to send usage event hmm', err2); + }, + ); reject(err); }) .finally(() => { diff --git a/packages/webcodecs/src/send-telemetry-event.ts b/packages/webcodecs/src/send-telemetry-event.ts new file mode 100644 index 00000000000..fa6e4f3eaaa --- /dev/null +++ b/packages/webcodecs/src/send-telemetry-event.ts @@ -0,0 +1,26 @@ +import {registerUsageEvent} from '@remotion/licensing'; + +export const sendUsageEvent = async ({ + apiKey, + succeeded, +}: { + apiKey: string | null; + succeeded: boolean; +}) => { + const host = + typeof window === 'undefined' + ? null + : typeof window.location === 'undefined' + ? null + : (window.location.origin ?? null); + if (host === null) { + return; + } + + await registerUsageEvent({ + apiKey, + event: 'webcodec-conversion', + host, + succeeded, + }); +}; diff --git a/packages/webcodecs/tsconfig.json b/packages/webcodecs/tsconfig.json index 1d969cbacb0..2aee3f8f2a2 100644 --- a/packages/webcodecs/tsconfig.json +++ b/packages/webcodecs/tsconfig.json @@ -10,6 +10,9 @@ "references": [ { "path": "../media-parser" + }, + { + "path": "../licensing" } ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5e7fb293e87..26fccb75560 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3024,6 +3024,9 @@ importers: packages/webcodecs: dependencies: + '@remotion/licensing': + specifier: workspace:* + version: link:../licensing '@remotion/media-parser': specifier: workspace:* version: link:../media-parser From c8d9d7e8a2a3c1993ac669ffe3e63ef50ec9d422 Mon Sep 17 00:00:00 2001 From: Jonny Burger Date: Mon, 16 Dec 2024 11:02:18 +0100 Subject: [PATCH 2/2] add docs --- .../docs/docs/media-parser/parse-media.mdx | 10 ++- .../docs/docs/webcodecs/convert-media.mdx | 8 +++ packages/docs/docs/webcodecs/telemetry.mdx | 61 ++++++++++++++++++ packages/docs/sidebars.js | 1 + packages/docs/src/data/articles.ts | 7 ++ .../articles-docs-webcodecs-telemetry.png | Bin 0 -> 54331 bytes 6 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 packages/docs/docs/webcodecs/telemetry.mdx create mode 100644 packages/docs/static/generated/articles-docs-webcodecs-telemetry.png diff --git a/packages/docs/docs/media-parser/parse-media.mdx b/packages/docs/docs/media-parser/parse-media.mdx index 46fc73744cd..2940cf9a3c9 100644 --- a/packages/docs/docs/media-parser/parse-media.mdx +++ b/packages/docs/docs/media-parser/parse-media.mdx @@ -243,8 +243,10 @@ If the signal is aborted, the parser will stop reading the media and stop the de ### Callbacks -Each field also has a callback that allows you to retrieve the value as soon as it is obtained without waiting for the function to resolve. -You must pass `true` as the value for the field in order for the callback to be called. +Each field also has a callback that allows you to retrieve the value as soon as it is obtained without waiting for the function to resolve. + +You do not have to add the field to the [`fields`](#fields) object if you use the callback. +However, just like with [`fields`](#fields), adding a callback for a [slow field](/docs/media-parser/fast-and-slow) may require reading more of the file. ```tsx twoslash title="Using a callback" // @module: es2022 @@ -254,10 +256,6 @@ import {parseMedia} from '@remotion/media-parser'; const result = await parseMedia({ src: 'https://example.com/my-video.mp4', - fields: { - durationInSeconds: true, - dimensions: true, - }, onDurationInSeconds: (durationInSeconds) => { console.log(durationInSeconds); }, diff --git a/packages/docs/docs/webcodecs/convert-media.mdx b/packages/docs/docs/webcodecs/convert-media.mdx index 97a9a112457..340eea3b950 100644 --- a/packages/docs/docs/webcodecs/convert-media.mdx +++ b/packages/docs/docs/webcodecs/convert-media.mdx @@ -77,6 +77,14 @@ _number_ The number of degrees to rotate the video. See [Rotate a video](/docs/webcodecs/rotate-a-video) for more information. +### `apiKey?` + +If you are a customer of a [Remotion Company License](https://remotion.pro/license), you can provide an API key from your dashboard to track your conversions. + +:::note +[Telemetry is enabled](/docs/webcodecs/telemetry) even if you don't provide an API key. +::: + ### `logLevel?` _string_ diff --git a/packages/docs/docs/webcodecs/telemetry.mdx b/packages/docs/docs/webcodecs/telemetry.mdx new file mode 100644 index 00000000000..619950c497f --- /dev/null +++ b/packages/docs/docs/webcodecs/telemetry.mdx @@ -0,0 +1,61 @@ +--- +image: /generated/articles-docs-webcodecs-telemetry.png +id: telemetry +title: Telemetry in @remotion/webcodecs +slug: /webcodecs/telemetry +crumb: '@remotion/webcodecs' +--- + +Upon finishing a conversion with [`convertMedia()`](/docs/webcodecs/convert-media), a HTTP request is sent to an endpoint on [`remotion.pro`](https://remotion.pro), registering the domain and whether the conversion was successful. + +Telemetry will never cause any conversions to fail. + +import {LicenseDisclaimer} from './LicenseDisclaimer'; + +
+ 💼 Important License Disclaimer + +
+ +## Data collection + +No user data is collected, however the IP address may be used to reject invalid telemetry. + +## Use of data + +Telemetry data helps Remotion understand which sites use the [`@remotion/webcodecs`](/docs/webcodecs) package. + +Historically, it's been difficult to understand which sites use Remotion and various sizable companies have been using it without getting the appropriate license. + +Hence we have decided to add telemetry to this new package. + +Remotion will not share any telemetry data with others. + +## Track conversions with an API key + +You may add an API key that you obtained from [`remotion.pro`](https://remotion.pro) to the [`convertMedia()`](/docs/webcodecs/convert-media) function. + +```tsx twoslash title="Adding an API key" +// @module: es2022 +// @target: es2017 +import {convertMedia} from '@remotion/webcodecs'; + +await convertMedia({ + src: 'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4', + container: 'webm', + apiKey: 'rm_pub_abcdefghijklo', +}); +``` + +You will then be able to see the amount of conversions you did on your dashboard. +For now, you still need to adjust the license manually to cover your WebCodecs conversions. + +## Disabling telemetry + +A version of [`@remotion/webcodecs`](/docs/webcodecs) without telemetry can be obtained with an Remotion Enterprise License. +Contact hi@remotion.dev to request an Enterprise License. + +## See also + +- [`@remotion/licensing`](/docs/licensing) +- [`convertMedia()`](/docs/webcodecs/convert-media) diff --git a/packages/docs/sidebars.js b/packages/docs/sidebars.js index 09f515ac88a..4f061d5e30d 100644 --- a/packages/docs/sidebars.js +++ b/packages/docs/sidebars.js @@ -927,6 +927,7 @@ module.exports = { 'webcodecs/convert-a-video', 'webcodecs/rotate-a-video', 'webcodecs/fix-mediarecorder-video', + 'webcodecs/telemetry', ], }, { diff --git a/packages/docs/src/data/articles.ts b/packages/docs/src/data/articles.ts index 3339f00ebe6..6c99e513b5c 100644 --- a/packages/docs/src/data/articles.ts +++ b/packages/docs/src/data/articles.ts @@ -3382,6 +3382,13 @@ export const articles = [ compId: 'articles-docs-webcodecs-fix-a-mediarecorder-video', crumb: '@remotion/webcodecs', }, + { + id: 'telemetry', + title: 'Telemetry in @remotion/webcodecs', + relativePath: 'docs/webcodecs/telemetry.mdx', + compId: 'articles-docs-webcodecs-telemetry', + crumb: '@remotion/webcodecs', + }, { id: 'convert-a-video', title: 'Convert a video', diff --git a/packages/docs/static/generated/articles-docs-webcodecs-telemetry.png b/packages/docs/static/generated/articles-docs-webcodecs-telemetry.png new file mode 100644 index 0000000000000000000000000000000000000000..787a8355ec2c351b5e7ffc6ba422c910ba24df67 GIT binary patch literal 54331 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𝔛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

TM$qIt#xlMCOi@dTyJ#^J$1)O^hbVb72qkXQB z>SB9zF8j9Hz;8?N*Dn29jz+?K73)7+pr~L))%hD5k+*|uH@U#xgMvL!nJ!25gtjbq2ELXfUA?bBdKK%#W5j(0EgSWi?=H%}()QiYTQF~0 z`OvPtZwuP*afW~XVd8@V@x8)5NYS#Bs0D$qGfa~3F}|2dJ5~)*^8V7iEzpI0r>M)_ z;wK3g>|HLdw=r`4<;Cfk=4ABb**_XP7s=h@N_SS(-znsW&5b$XfT4S) zX(Vwjt}AJ46AUy%BFeJuXJxC%yc#j5kfjt}>GNRL)NeNHCiumCL!GL{6`f17XPl?f zCofJXL94M#Npw9K@v5g~|2(0j{)Ap86xkXMA-|Gh*Q_m~RpZ=HD87ScWIn$1OVrlY z6vm%zEN85WX@xvf^+Ch1 zCo~}&&M~$Z!H8D))cTByg?s+UhLpn8xe^u(ybAh_Y zgwL3R9-(4b6a7>Sy7hX?m-3yPTaCw zmshgAEw6QwD~^Q$O3`7fv$SlVQ6|t|iD%$4>pJ$&>aaX{oyk_k(fcZ)(D;>`RW_HA z@!S?ltT=8@w{ai*ewLw9OPl*ahIW}wh7PA(6m7;#>HhHnf0ecZo&t=znKb*Flcn$t z9ih^NT&a3n_FG^J;5m(-hX?WBH-PHD0YK`1ufRX$lk-Q}9D}T!THNyTafWXm_^(?g z*#9#v|LdWEACL57mVVgM|JN1wDLF{)&V#x%xjojipfga6O`|9JC1%>KU% z9{l9Tn*ZVOzT@hF|Nr6be{6N%+2p~_|6`y3zYKCl_ZT?#(Dd^IRbzDEpT>0^m11Sf GNB;v1