UNPKG

@ngx-telly/plugin-hls

Version:
1 lines 13.2 kB
{"version":3,"file":"ngx-telly-plugin-hls.mjs","sources":["../../../../libs/plugin-hls/src/lib/hls.directive.ts","../../../../libs/plugin-hls/src/ngx-telly-plugin-hls.ts"],"sourcesContent":["import {\n AfterViewInit,\n Directive,\n EventEmitter,\n inject,\n input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { PlayerComponent } from '@ngx-telly/player';\nimport Hls, {\n AudioTrackSwitchedData,\n ErrorData,\n HlsConfig,\n Level,\n LevelSwitchedData,\n LevelUpdatedData,\n ManifestParsedData,\n MediaAttachingData,\n SubtitleTrackSwitchData,\n} from 'hls.js';\nimport { ScteTriggerData } from './types';\n\n@Directive({\n selector: '[tellyHls]',\n standalone: true,\n})\nexport class HlsDirective implements AfterViewInit, OnDestroy, OnChanges {\n tellyHls = input.required<string>();\n config = input<Partial<HlsConfig>>({});\n scte = input<string>();\n\n @Output() hlsCreated = new EventEmitter<Hls>();\n @Output() mediaAttached = new EventEmitter<[Hls | undefined, MediaAttachingData]>();\n @Output() manifestParsed = new EventEmitter<[Hls | undefined, ManifestParsedData]>();\n @Output() levelUpdated = new EventEmitter<[Hls | undefined, LevelUpdatedData]>();\n @Output() offsetParsed = new EventEmitter<[Hls | undefined, number, number]>();\n @Output() audioSwitched = new EventEmitter<[Hls | undefined, AudioTrackSwitchedData]>();\n @Output() levelSwitched = new EventEmitter<[Hls | undefined, LevelSwitchedData]>();\n @Output() captionSwitched = new EventEmitter<[Hls | undefined, SubtitleTrackSwitchData]>();\n @Output() scteParsed = new EventEmitter<[Hls | undefined, ScteTriggerData[]]>();\n @Output() manifestFailed = new EventEmitter<[Hls | undefined, ErrorData]>();\n\n player = inject(PlayerComponent);\n // eventService = inject(TellyEventsService);\n hls?: Hls;\n offset = 0;\n timestamp = 0;\n\n ngAfterViewInit(): void {\n if (!this.hls && this.tellyHls()) {\n this.create(this.tellyHls());\n }\n }\n\n ngOnChanges({ tellyHls }: SimpleChanges): void {\n if (tellyHls && tellyHls.currentValue && !tellyHls.isFirstChange()) {\n this.create(tellyHls.currentValue);\n }\n }\n\n date() {\n return new Date(this.timestamp + this.player.media.time * 1000);\n }\n\n private create(url: string): void {\n if (!url) return;\n\n if (Hls.isSupported()) {\n if (this.hls) {\n this.hls.destroy();\n }\n\n const config = this.config();\n\n config.autoStartLoad ??= this.player.preload() === 'auto';\n config.startPosition ??= this.player.startFrom();\n config.xhrSetup ??= (xhr: XMLHttpRequest) => {\n xhr.withCredentials = this.player.crossOrigin() === 'use-credentials';\n };\n\n this.hls = new Hls(config);\n this.hlsCreated.emit(this.hls);\n\n this.hls.loadSource(url);\n this.hls.attachMedia(this.player.video.nativeElement);\n\n this.bindEvents();\n } else if (this.player.video.nativeElement.canPlayType('application/vnd.apple.mpegurl')) {\n this.player.video.nativeElement.src = url;\n }\n }\n\n private bindEvents(): void {\n this.hls?.on(Hls.Events.MEDIA_ATTACHED, (_, data) => {\n this.mediaAttached.emit([this.hls, data]);\n });\n\n this.hls?.on(Hls.Events.MANIFEST_PARSED, (_, data) => {\n this.offset = 0;\n this.timestamp = 0;\n this.offsetParsed.emit([this.hls, this.offset, this.timestamp]);\n this.manifestParsed.emit([this.hls, data]);\n });\n\n this.hls?.on(Hls.Events.LEVEL_UPDATED, (_, data) => {\n this.levelUpdated.emit([this.hls, data]);\n const level = this.hls?.levels[data.level];\n if (level != null) {\n this.extractDuration(level);\n this.extractDrift(level);\n this.extractOffset(level);\n\n if (this.scte()) {\n this.extractScte(level);\n }\n }\n });\n\n this.hls?.on(Hls.Events.LEVEL_SWITCHED, (_, data) => {\n const level = this.hls?.levels[data.level];\n if (level != null) this.extractDuration(level);\n this.levelSwitched.emit([this.hls, data]);\n });\n\n this.hls?.on(Hls.Events.AUDIO_TRACK_SWITCHED, (_, data) => {\n this.audioSwitched.emit([this.hls, data]);\n });\n\n this.hls?.on(Hls.Events.SUBTITLE_TRACK_SWITCH, (_, data) => {\n this.captionSwitched.emit([this.hls, data]);\n });\n\n this.hls?.on(Hls.Events.ERROR, (_, data) => {\n if (data.details === Hls.ErrorDetails.MANIFEST_LOAD_ERROR) {\n this.manifestFailed.emit([this.hls, data]);\n }\n });\n }\n\n private extractDuration(lvl: Level) {\n if (lvl.details?.totalduration != null && !isNaN(lvl.details.totalduration)) {\n this.player.media.duration = lvl.details.totalduration;\n }\n }\n\n private extractDrift(lvl: Level) {\n this.player.media.drift = lvl.details?.fragments[0].start ?? this.player.media.drift;\n }\n\n private extractOffset(lvl: Level) {\n if (!this.offset && lvl.details) {\n this.timestamp = lvl.details?.fragments[0].programDateTime ?? 0;\n this.offset = (this.timestamp / 1000) % 86400;\n this.offsetParsed.emit([this.hls, this.offset, this.timestamp]);\n }\n }\n\n private extractScte(lvl: Level) {\n const frags = lvl.details?.fragments.filter((x) => x.tagList.some((x) => x[0].includes('CUE')));\n\n if (!frags) return;\n\n const parsed: ScteTriggerData[] = frags.map((f) => {\n const tags = Object.fromEntries(f.tagList);\n\n return {\n timestamp: new Date(tags['PROGRAM-DATE-TIME']).getTime(),\n cueIn: Object.keys(tags).includes('EXT-X-CUE-IN'),\n cueOut: Object.keys(tags).includes('EXT-X-CUE-OUT'),\n duration: tags['EXT-X-CUE-OUT'] != null ? +tags['EXT-X-CUE-OUT'] : undefined,\n data: tags[this.scte() as string],\n dateTime: tags['PROGRAM-DATE-TIME'],\n } as ScteTriggerData;\n });\n\n this.scteParsed.emit([this.hls, parsed]);\n }\n\n ngOnDestroy(): void {\n this.hls?.destroy();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}