UNPKG

34.2 kBSource Map (JSON)View Raw
1{"version":3,"file":"index.module.js","sources":["../src/snowplowEvents.ts","../src/constants.ts","../src/youtubeEvents.ts","../src/eventGroups.ts","../src/helperFunctions.ts","../src/buildYouTubeEvent.ts","../src/index.ts"],"sourcesContent":["export enum SnowplowEvent {\n PERCENTPROGRESS = 'percentprogress',\n SEEK = 'seek',\n VOLUMECHANGE = 'volumechange',\n}\n","export const YouTubeIFrameAPIURL = 'https://www.youtube.com/iframe_api';\n\n// The payload a YouTube player event emits has no identifier of what event it is\n// Some payloads can emit the same data\n// i.e. onError and onPlaybackRateChange can both emit '{data: 2}'\nexport enum YTPlayerEvent {\n ONSTATECHANGE = 'onStateChange',\n ONPLAYBACKQUALITYCHANGE = 'onPlaybackQualityChange',\n ONERROR = 'onError',\n ONAPICHANGE = 'onApiChange',\n ONPLAYBACKRATECHANGE = 'onPlaybackRateChange',\n ONREADY = 'onReady',\n}\n\nexport const YTStateEvent: Record<string, string> = {\n '-1': 'unstarted',\n '0': 'ended',\n '1': 'play',\n '2': 'pause',\n '3': 'buffering',\n '5': 'cued',\n};\n\nexport const CaptureEventToYouTubeEvent: Record<string, YTPlayerEvent> = {\n ready: YTPlayerEvent.ONREADY,\n playbackratechange: YTPlayerEvent.ONPLAYBACKRATECHANGE,\n playbackqualitychange: YTPlayerEvent.ONPLAYBACKQUALITYCHANGE,\n error: YTPlayerEvent.ONERROR,\n apichange: YTPlayerEvent.ONAPICHANGE,\n};\n\n// As every state event requires YTPlayerEvent.ONSTATECHANGE, they are added\n// to CaptureEventToYouTubeEvent with the below loop\nObject.keys(YTStateEvent).forEach((k) => (CaptureEventToYouTubeEvent[YTStateEvent[k]] = YTPlayerEvent.ONSTATECHANGE));\n\nexport enum YTState {\n UNSTARTED = 'unstarted',\n ENDED = 'ended',\n PLAYING = 'play',\n PAUSED = 'pause',\n BUFFERING = 'buffering',\n CUED = 'cued',\n}\n\nexport const YTError: Record<number, string> = {\n 2: 'INVALID_URL',\n 5: 'HTML5_ERROR',\n 100: 'VIDEO_NOT_FOUND',\n 101: 'MISSING_EMBED_PERMISSION',\n 150: 'MISSING_EMBED_PERMISSION',\n};\n","import { YTState } from './constants';\n\nexport enum YTEvent {\n STATECHANGE = 'statechange',\n PLAYBACKQUALITYCHANGE = 'playbackqualitychange',\n ERROR = 'error',\n APICHANGE = 'apichange',\n PLAYBACKRATECHANGE = 'playbackratechange',\n READY = 'ready',\n}\n\nexport const stateChangeEvents = [\n YTState.BUFFERING,\n YTState.CUED,\n YTState.ENDED,\n YTState.PAUSED,\n YTState.PLAYING,\n YTState.UNSTARTED,\n];\n","import { SnowplowEvent } from './snowplowEvents';\nimport { EventGroup } from './types';\nimport { YTPlayerEvent, YTState } from './constants';\nimport { YTEvent } from './youtubeEvents';\n\nexport const AllEvents: EventGroup = [\n ...Object.keys(YTEvent).map((k: string) => YTEvent[k as keyof typeof YTEvent]),\n ...Object.keys(SnowplowEvent).map((k: string) => SnowplowEvent[k as keyof typeof SnowplowEvent]),\n ...Object.keys(YTState).map((k: string) => YTState[k as keyof typeof YTState]),\n];\n\nexport const DefaultEvents: EventGroup = [\n YTState.PAUSED,\n YTState.PLAYING,\n YTState.ENDED,\n SnowplowEvent.SEEK,\n SnowplowEvent.VOLUMECHANGE,\n YTPlayerEvent.ONPLAYBACKQUALITYCHANGE,\n YTPlayerEvent.ONPLAYBACKRATECHANGE,\n SnowplowEvent.PERCENTPROGRESS,\n];\n\nexport const EventGroups: Record<string, EventGroup> = {\n AllEvents: AllEvents,\n DefaultEvents: DefaultEvents,\n};\n","import { AllEvents, DefaultEvents, EventGroups } from './eventGroups';\nimport { SnowplowEvent } from './snowplowEvents';\nimport { EventGroup, MediaTrackingOptions, TrackingOptions } from './types';\nimport { CaptureEventToYouTubeEvent, YTPlayerEvent } from './constants';\n\nexport function isElementFullScreen(mediaId: string): boolean {\n if (document.fullscreenElement) {\n return document.fullscreenElement.id === mediaId;\n }\n return false;\n}\n\nexport function trackingOptionsParser(mediaId: string, conf?: MediaTrackingOptions): TrackingOptions {\n const defaults: TrackingOptions = {\n mediaId: mediaId,\n captureEvents: DefaultEvents,\n youtubeEvents: [\n YTPlayerEvent.ONSTATECHANGE,\n YTPlayerEvent.ONPLAYBACKQUALITYCHANGE,\n YTPlayerEvent.ONERROR,\n YTPlayerEvent.ONPLAYBACKRATECHANGE,\n ],\n updateRate: 500,\n progress: {\n boundaries: [10, 25, 50, 75],\n boundaryTimeoutIds: [],\n },\n };\n\n if (!conf) return defaults;\n\n if (conf.updateRate) defaults.updateRate = conf.updateRate;\n\n if (conf.captureEvents) {\n let parsedEvents: EventGroup = [];\n for (let ev of conf.captureEvents) {\n // If an event is an EventGroup, get the events from that group\n if (EventGroups.hasOwnProperty(ev)) {\n parsedEvents = parsedEvents.concat(EventGroups[ev]);\n } else if (!Object.keys(AllEvents).filter((k) => k === ev)) {\n console.warn(`'${ev}' is not a valid event.`);\n } else {\n parsedEvents.push(ev);\n }\n }\n\n conf.captureEvents = parsedEvents;\n\n for (let ev of conf.captureEvents) {\n const youtubeEvent = CaptureEventToYouTubeEvent[ev];\n if (CaptureEventToYouTubeEvent.hasOwnProperty(ev) && defaults.youtubeEvents.indexOf(youtubeEvent) === -1) {\n defaults.youtubeEvents.push(youtubeEvent);\n }\n }\n\n if (conf.captureEvents.indexOf(SnowplowEvent.PERCENTPROGRESS) !== -1) {\n defaults.progress = {\n boundaries: conf?.boundaries || defaults.progress!.boundaries,\n boundaryTimeoutIds: [],\n };\n }\n }\n\n return { ...defaults, ...conf };\n}\n\n// URLSearchParams is not supported in IE\n// https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams\n\nexport function addUrlParam(url: string, key: string, value: string) {\n const urlParams = parseUrlParams(url);\n urlParams[key] = value;\n return `${url}?${urlParamsToString(urlParams)}`;\n}\n\nexport function parseUrlParams(url: string): Record<string, string> {\n const params: Record<string, string> = {};\n const urlParams = url.split('?')[1];\n if (!urlParams) return params;\n urlParams.split('&').forEach((p) => {\n const param = p.split('=');\n params[param[0]] = param[1];\n });\n return params;\n}\n\nfunction urlParamsToString(urlParams: Record<string, string>) {\n // convert an object of url parameters to a string\n let params = '';\n Object.keys(urlParams).forEach((p) => {\n params += `${p}=${urlParams[p]}&`;\n });\n return params.slice(0, -1);\n}\n","import { MediaPlayerEvent, YouTube } from './contexts';\nimport { SnowplowEvent } from './snowplowEvents';\nimport { EventData, MediaEntities, SnowplowMediaPlayer, TrackingOptions, UrlParameters } from './types';\nimport { YTStateEvent } from './constants';\n\nexport function buildYouTubeEvent(player: YT.Player, eventName: string, conf: TrackingOptions, eventData?: EventData) {\n const data: MediaPlayerEvent = { type: eventName };\n if (conf.hasOwnProperty('label')) data.label = conf.label;\n\n const context = [\n getYouTubeEntities(player, conf.urlParameters!, eventData),\n getMediaPlayerEntities(eventName, player, conf.urlParameters!, eventData),\n ];\n\n return {\n schema: 'iglu:com.snowplowanalytics.snowplow/media_player_event/jsonschema/1-0-0',\n data: data,\n context: context,\n };\n}\n\nfunction getYouTubeEntities(player: YT.Player, urlParameters: UrlParameters, eventData?: EventData): MediaEntities {\n const spherical: YT.SphericalProperties = player.getSphericalProperties();\n const playerStates: Record<string, boolean> = {\n buffering: false,\n cued: false,\n unstarted: false,\n };\n\n const state = player.getPlayerState();\n if (playerStates.hasOwnProperty(YTStateEvent[state])) {\n playerStates[YTStateEvent[state]] = true;\n }\n\n let data: YouTube = {\n autoPlay: urlParameters.autoplay === '1',\n avaliablePlaybackRates: player.getAvailablePlaybackRates(),\n buffering: playerStates.buffering,\n controls: urlParameters.controls !== '0',\n cued: playerStates.cued,\n loaded: parseInt(String(player.getVideoLoadedFraction() * 100)),\n playbackQuality: player.getPlaybackQuality(),\n playerId: player.getIframe().id,\n unstarted: playerStates.unstarted,\n url: player.getVideoUrl(),\n };\n\n if (spherical) data = { ...data, ...spherical };\n\n if (eventData?.error) data.error = eventData.error as YouTube['error'];\n\n const playlistIndex = player.getPlaylistIndex();\n if (playlistIndex !== -1) data.playlistIndex = playlistIndex;\n\n const playlist = player.getPlaylist();\n if (playlist) {\n data.playlist = playlist.map((item: string) => parseInt(item));\n }\n\n const qualityLevels = player.getAvailableQualityLevels();\n if (qualityLevels) data.avaliableQualityLevels = qualityLevels;\n\n return {\n schema: 'iglu:com.youtube/youtube/jsonschema/1-0-0',\n data: data,\n };\n}\n\nfunction getMediaPlayerEntities(\n e: string,\n player: YT.Player,\n urlParameters: UrlParameters,\n eventData?: EventData\n): MediaEntities {\n const playerStates: Record<string, boolean> = {\n ended: false,\n paused: false,\n };\n\n const state = player.getPlayerState();\n if (playerStates.hasOwnProperty(YTStateEvent[state])) {\n playerStates[YTStateEvent[state]] = true;\n }\n\n const data: SnowplowMediaPlayer = {\n currentTime: player.getCurrentTime(),\n duration: player.getDuration(),\n ended: playerStates.ended,\n loop: urlParameters.loop === '1',\n muted: player.isMuted(),\n paused: playerStates.paused,\n playbackRate: player.getPlaybackRate(),\n volume: player.getVolume(),\n };\n\n if (e === SnowplowEvent.PERCENTPROGRESS) {\n data.percentProgress = eventData!.percentThrough;\n }\n\n return {\n schema: 'iglu:com.snowplowanalytics.snowplow/media_player/jsonschema/1-0-0',\n data: data,\n };\n}\n","/*\n * Copyright (c) 2022 Snowplow Analytics Ltd\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * 3. Neither the name of the copyright holder nor the names of its\n * contributors may be used to endorse or promote products derived from\n * this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { trackingOptionsParser, addUrlParam, parseUrlParams } from './helperFunctions';\nimport { YouTubeIFrameAPIURL, YTError, YTPlayerEvent, YTState, YTStateEvent } from './constants';\nimport { EventData, MediaTrackingOptions, TrackedPlayer, TrackingOptions } from './types';\nimport { BrowserPlugin, BrowserTracker, dispatchToTrackersInCollection } from '@snowplow/browser-tracker-core';\nimport { buildSelfDescribingEvent, CommonEventProperties, Logger, SelfDescribingJson } from '@snowplow/tracker-core';\nimport { SnowplowEvent } from './snowplowEvents';\nimport { MediaPlayerEvent } from './contexts';\nimport { buildYouTubeEvent } from './buildYouTubeEvent';\nimport { YTEvent } from './youtubeEvents';\n\nconst _trackers: Record<string, BrowserTracker> = {};\nconst trackedPlayers: Record<string, TrackedPlayer> = {};\nconst trackingQueue: Array<TrackingOptions> = [];\nlet LOG: Logger;\n\nexport function YouTubeTrackingPlugin(): BrowserPlugin {\n return {\n activateBrowserPlugin: (tracker: BrowserTracker) => {\n _trackers[tracker.id] = tracker;\n },\n logger: (logger) => {\n LOG = logger;\n },\n };\n}\n\nfunction trackEvent(\n event: SelfDescribingJson<MediaPlayerEvent> & CommonEventProperties,\n trackers: Array<string> = Object.keys(_trackers)\n): void {\n dispatchToTrackersInCollection(trackers, _trackers, (t) => {\n t.core.track(buildSelfDescribingEvent({ event }), event.context, event.timestamp);\n });\n}\n\nexport function enableYouTubeTracking(args: { id: string; options?: MediaTrackingOptions }) {\n const conf: TrackingOptions = trackingOptionsParser(args.id, args.options);\n const el: HTMLIFrameElement = document.getElementById(args.id) as HTMLIFrameElement;\n if (!el) {\n LOG.error('Cannot find YouTube iframe');\n return;\n }\n\n // The 'enablejsapi' parameter is required to be '1' for the API to be able to communicate with the player\n\n if (el.src.indexOf('enablejsapi') === -1) {\n el.src = addUrlParam(el.src, 'enablejsapi', '1');\n }\n\n conf.urlParameters = parseUrlParams(el.src);\n\n // If the API is ready, we can immediately add the listeners\n if (typeof YT !== 'undefined' && typeof YT.Player !== 'undefined') {\n addListeners(conf);\n } else {\n // If not, we put them into a queue that will have listeners added once the API is ready\n // and start trying to load the iframe API\n trackingQueue.push(conf);\n handleYouTubeIframeAPI();\n }\n}\n\nlet iframeAPIRetryWait = 100;\nfunction handleYouTubeIframeAPI() {\n // First we check if the script tag exists in the DOM, and enable the API if not\n const scriptTags = Array.prototype.slice.call(document.getElementsByTagName('script'));\n if (!scriptTags.some((s) => s.src === YouTubeIFrameAPIURL)) {\n // Load the Iframe API\n // https://developers.google.com/youtube/iframe_api_reference\n const tag: HTMLScriptElement = document.createElement('script');\n tag.src = YouTubeIFrameAPIURL;\n const firstScriptTag = document.getElementsByTagName('script')[0];\n firstScriptTag.parentNode!.insertBefore(tag, firstScriptTag);\n }\n\n // Once the API is ready to use, 'YT.Player' will be defined\n // 'YT.Player' is not available immediately after 'YT' is defined,\n // so we need to wait until 'YT' is defined to then check 'YT.Player'\n if (typeof YT === 'undefined' || typeof YT.Player === 'undefined') {\n if (iframeAPIRetryWait <= 6400) {\n setTimeout(handleYouTubeIframeAPI, iframeAPIRetryWait);\n iframeAPIRetryWait *= 2;\n } else {\n LOG.error('YouTube iframe API failed to load.');\n }\n } else {\n // Once the API is avaliable, listeners are attached to anything sitting in the queue\n while (trackingQueue.length) {\n addListeners(trackingQueue.pop()!);\n }\n }\n}\n\nfunction addListeners(conf: TrackingOptions) {\n const builtInEvents: Record<string, Function> = {\n [YTPlayerEvent.ONREADY]: () => youtubeEvent(trackedPlayers[conf.mediaId].player, YTEvent.READY, conf),\n [YTPlayerEvent.ONSTATECHANGE]: (e: YT.OnStateChangeEvent) => {\n if (conf.captureEvents.indexOf(YTStateEvent[e.data.toString()]) !== -1) {\n youtubeEvent(trackedPlayers[conf.mediaId].player, YTStateEvent[e.data], conf);\n }\n },\n [YTPlayerEvent.ONPLAYBACKQUALITYCHANGE]: () =>\n youtubeEvent(trackedPlayers[conf.mediaId].player, YTEvent.PLAYBACKQUALITYCHANGE, conf),\n [YTPlayerEvent.ONAPICHANGE]: () => youtubeEvent(trackedPlayers[conf.mediaId].player, YTEvent.APICHANGE, conf),\n [YTPlayerEvent.ONERROR]: (e: YT.OnErrorEvent) =>\n youtubeEvent(trackedPlayers[conf.mediaId].player, YTEvent.ERROR, conf, { error: YTError[e.data] }),\n [YTPlayerEvent.ONPLAYBACKRATECHANGE]: () =>\n youtubeEvent(trackedPlayers[conf.mediaId].player, YTEvent.PLAYBACKRATECHANGE, conf),\n };\n\n const playerEvents: Record<string, Function> = {};\n conf.youtubeEvents.forEach((e) => {\n playerEvents[e] = builtInEvents[e];\n });\n\n trackedPlayers[conf.mediaId] = {\n player: new YT.Player(conf.mediaId, { events: { ...playerEvents } }),\n conf: conf,\n seekTracking: {\n prevTime: 0,\n enabled: false,\n },\n volumeTracking: {\n prevVolume: 0,\n enabled: false,\n },\n };\n}\n\nfunction youtubeEvent(player: YT.Player, eventName: string, conf: TrackingOptions, eventData?: EventData) {\n const playerInstance = trackedPlayers[conf.mediaId];\n if (!playerInstance.seekTracking.enabled && conf.captureEvents.indexOf('seek') !== 1) {\n enableSeekTracking(player, conf, eventData);\n }\n if (!playerInstance.volumeTracking.enabled && conf.captureEvents.indexOf('volume') !== 1) {\n enableVolumeTracking(player, conf, eventData);\n }\n\n if (conf.hasOwnProperty('boundaries')) {\n progressHandler(player, eventName, conf);\n }\n\n const event = buildYouTubeEvent(player, eventName, conf, eventData);\n trackEvent(event);\n}\n\n// Progress Tracking\n\nfunction progressHandler(player: YT.Player, eventName: string, conf: TrackingOptions) {\n const timeoutIds = conf.progress!.boundaryTimeoutIds;\n if (eventName === YTState.PAUSED) {\n timeoutIds.forEach((id) => clearTimeout(id));\n timeoutIds.length = 0;\n }\n\n if (eventName === YTState.PLAYING) {\n setPercentageBoundTimeouts(player, conf);\n }\n}\n\nfunction setPercentageBoundTimeouts(player: YT.Player, conf: TrackingOptions) {\n const currentTime = player.getCurrentTime();\n conf.progress?.boundaries!.forEach((p) => {\n let percentTime = player.getDuration() * 1000 * (p / 100);\n if (currentTime !== 0) {\n percentTime -= currentTime * 1000;\n }\n if (p < percentTime) {\n conf.progress?.boundaryTimeoutIds.push(\n setTimeout(() => waitAnyRemainingTimeAfterTimeout(player, conf, percentTime, p), percentTime)\n );\n }\n });\n}\n\n// The timeout in setPercentageBoundTimeouts fires ~100 - 300ms early\n// waitAnyRemainingTimeAfterTimeout ensures the event is fired accurately\n\nfunction waitAnyRemainingTimeAfterTimeout(player: YT.Player, conf: TrackingOptions, percentTime: number, p: number) {\n if (player.getCurrentTime() * 1000 < percentTime) {\n setTimeout(() => waitAnyRemainingTimeAfterTimeout(player, conf, percentTime, p), 10);\n } else {\n youtubeEvent(player, SnowplowEvent.PERCENTPROGRESS, conf, {\n percentThrough: p,\n });\n }\n}\n\n// Seek Tracking\n\nfunction enableSeekTracking(player: YT.Player, conf: TrackingOptions, eventData?: EventData) {\n trackedPlayers[conf.mediaId].seekTracking.enabled = true;\n setInterval(() => seekEventTracker(player, conf, eventData), conf.updateRate);\n}\n\nfunction seekEventTracker(player: YT.Player, conf: TrackingOptions, eventData?: EventData) {\n const playerInstance = trackedPlayers[conf.mediaId];\n const playerTime = player.getCurrentTime();\n if (Math.abs(playerTime - (playerInstance.seekTracking.prevTime + 0.5)) > 1) {\n youtubeEvent(player, SnowplowEvent.SEEK, conf, eventData);\n }\n playerInstance.seekTracking.prevTime = playerTime;\n}\n\n// Volume Tracking\n\nfunction enableVolumeTracking(player: YT.Player, conf: TrackingOptions, eventData?: EventData) {\n trackedPlayers[conf.mediaId].volumeTracking.enabled = true;\n trackedPlayers[conf.mediaId].volumeTracking.prevVolume = player.getVolume();\n setInterval(() => volumeEventTracker(player, conf, eventData), conf.updateRate);\n}\n\nfunction volumeEventTracker(player: YT.Player, conf: TrackingOptions, eventData?: EventData) {\n const playerVolumeTracking = trackedPlayers[conf.mediaId].volumeTracking;\n const playerVolume = player.getVolume();\n if (playerVolume !== playerVolumeTracking.prevVolume) {\n youtubeEvent(player, SnowplowEvent.VOLUMECHANGE, conf, eventData);\n }\n playerVolumeTracking.prevVolume = playerVolume;\n}\n"],"names":[],"mappings":"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"}
\No newline at end of file