import type { MediaPlayerAdapter, MediaLifecycleEvent, } from '@financial-times/media-tracking-sdk' class YoutubeMediaTrackerAdapter implements MediaPlayerAdapter { player: HTMLMediaElement private youtubePlayer: YT.Player private getLoopCountValue: () => number constructor( player: HTMLMediaElement, youtubePlayer: YT.Player, getLoopCount: () => number = () => 0 ) { this.player = player this.youtubePlayer = youtubePlayer this.getLoopCountValue = getLoopCount } private getVideoData() { try { return this.youtubePlayer.getVideoData() } catch { return undefined } } getCurrentTime(): number { try { return this.youtubePlayer.getCurrentTime() } catch { return 0 } } getDuration(): number { try { const duration = this.youtubePlayer.getDuration() return isNaN(duration) ? 0 : duration } catch { return 0 } } getMediaId() { return this.getVideoData()?.video_id } getMediaName() { return this.getVideoData()?.title } getVideoType() { return 'youtube-clip' } getSourceUrl() { try { return this.youtubePlayer.getVideoUrl() ?? '' } catch { return '' } } isAutoplay() { try { return this.youtubePlayer.getIframe().getAttribute('autoplay') === '1' } catch { return false } } // This is not passed by any options so assume it is always inline. getVideoLayout() { return 'in-line' } getLoopCount() { return this.getLoopCountValue() } on(event: MediaLifecycleEvent, callback: (e: Event) => void): void { this.player.addEventListener(event, callback) } off(event: MediaLifecycleEvent, callback: (e: Event) => void): void { this.player.removeEventListener(event, callback) } } export default YoutubeMediaTrackerAdapter