{"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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"}