From 21842e4841ce7c7b3d6eb8243f7f6f7844b660c5 Mon Sep 17 00:00:00 2001 From: Ret2Hell Date: Fri, 1 May 2026 12:13:49 +0100 Subject: [PATCH 1/2] better typing for media properties --- packages/core/src/index.ts | 1 + packages/core/src/types.ts | 21 ++++++++++++++++++- .../media-adapters/youtube/src/lib/events.ts | 6 +++--- .../media-adapters/youtube/src/lib/types.ts | 4 ++-- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 49d034e..5e958a4 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -42,6 +42,7 @@ export type { SessionContext, MediaAdapterApi, MediaAdapterInterface, + MediaEventProperties, MediaEventType, } from './types'; export type { TanilyticsConfig } from './config/types'; diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index b02698d..51a4132 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -74,12 +74,31 @@ export interface IngestionPayload { */ export type TrackingEvent = IngestionEvent; +/** + * Standard media event properties emitted by media adapters. + * These fields are extracted server-side for media engagement rollups. + */ +export interface MediaEventProperties extends EventProperties { + provider?: string; + video_id?: string; + video_url?: string; + title?: string; + current_time?: number; + duration?: number; + percent?: number; + buffered_fraction?: number; + delta_seconds?: number; + from_time?: number; + to_time?: number; + progress_percent?: number; +} + /** * Minimal API surface the core tracker exposes to media adapters. * Adapter events flow through the normal privacy, session, and queue pipeline. */ export interface MediaAdapterApi { - trackMedia(eventType: MediaEventType, properties?: EventProperties): void; + trackMedia(eventType: MediaEventType, properties?: MediaEventProperties): void; } /** diff --git a/packages/media-adapters/youtube/src/lib/events.ts b/packages/media-adapters/youtube/src/lib/events.ts index e538ac7..b89eef3 100644 --- a/packages/media-adapters/youtube/src/lib/events.ts +++ b/packages/media-adapters/youtube/src/lib/events.ts @@ -14,7 +14,7 @@ import type { YouTubePlayerEvent, VideoSnapshot, } from './types'; -import type { EventProperties } from 'tanilytics'; +import type { MediaEventProperties } from 'tanilytics'; interface CreatePlayerEventHandlersOptions { adapterApi: YouTubeMediaAdapterApi; @@ -620,14 +620,14 @@ function emit( adapterApi: YouTubeMediaAdapterApi, context: PlaybackContext, eventType: YouTubeMediaEventType, - extraProperties?: EventProperties, + extraProperties?: MediaEventProperties, ): void { if (context.player === null) { return; } const snapshot = readSnapshot(context.player); - const properties: EventProperties = { provider: 'youtube' }; + const properties: MediaEventProperties = { provider: 'youtube' }; if (snapshot.videoId !== undefined) { properties.video_id = snapshot.videoId; diff --git a/packages/media-adapters/youtube/src/lib/types.ts b/packages/media-adapters/youtube/src/lib/types.ts index c2b5d51..a34d9df 100644 --- a/packages/media-adapters/youtube/src/lib/types.ts +++ b/packages/media-adapters/youtube/src/lib/types.ts @@ -1,4 +1,4 @@ -import type { EventProperties } from 'tanilytics'; +import type { MediaEventProperties } from 'tanilytics'; export type YouTubeMediaEventType = | 'media_play' @@ -82,7 +82,7 @@ export interface PlaybackContext { export interface YouTubeMediaAdapterApi { trackMedia( eventType: YouTubeMediaEventType, - properties?: EventProperties, + properties?: MediaEventProperties, ): void; } From 6e462f15a2cf2f09eb968cd9776ceafe859351cb Mon Sep 17 00:00:00 2001 From: Ret2Hell Date: Fri, 1 May 2026 12:16:46 +0100 Subject: [PATCH 2/2] fix linting --- packages/core/src/types.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 51a4132..6de1c36 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -98,7 +98,10 @@ export interface MediaEventProperties extends EventProperties { * Adapter events flow through the normal privacy, session, and queue pipeline. */ export interface MediaAdapterApi { - trackMedia(eventType: MediaEventType, properties?: MediaEventProperties): void; + trackMedia( + eventType: MediaEventType, + properties?: MediaEventProperties, + ): void; } /**