{"version":3,"file":"ng-plyr.mjs","sources":["../../../projects/ng-plyr/src/lib/models/error.model.ts","../../../projects/ng-plyr/src/lib/models/playlist.model.ts","../../../projects/ng-plyr/src/lib/services/ng-plyr.service.ts","../../../projects/ng-plyr/src/lib/services/cast.service.ts","../../../projects/ng-plyr/src/lib/models/media.model.ts","../../../projects/ng-plyr/src/lib/directive/stop-click-propagation.directive.ts","../../../projects/ng-plyr/src/lib/ng-plyr.component.ts","../../../projects/ng-plyr/src/lib/ng-plyr.component.html","../../../projects/ng-plyr/src/lib/ng-plyr.module.ts","../../../projects/ng-plyr/src/public-api.ts","../../../projects/ng-plyr/src/ng-plyr.ts"],"sourcesContent":["export class Error {\r\n    message?:string;\r\n    code?:string|number;\r\n\r\n    constructor(message?:string, code?:string|number) {\r\n        this.message = message;\r\n        this.code = code;\r\n    }\r\n}\r\n\r\nexport enum ErrorCodes {\r\n    'player/not-initialized' = 'Player not yet initialized',\r\n    'video/element-not-initialized' = 'Video element is not yet initialized'\r\n}\r\n","import { Media } from \"./media.model\";\r\n\r\nexport class PlaylistItem {\r\n    media:Media;\r\n    next?:PlaylistItem;\r\n    prev?:PlaylistItem;\r\n    \r\n    constructor(media:Media) {\r\n        this.media = media;\r\n    }\r\n\r\n    static hasSameMediaSrc(p1:PlaylistItem, p2:PlaylistItem) {\r\n        return p1.media.src === p2.media.src;\r\n    }\r\n    \r\n    // Inquiry functions\r\n    hasNext() { return this.next ? true : false; }\r\n\r\n    hasPrev() { return this.prev ? true : false; }\r\n}\r\n\r\nexport class Playlist {\r\n    id?:string;\r\n    // Current will store currently playing item, on stopping it will be null\r\n    current?:PlaylistItem;\r\n    head?:PlaylistItem;\r\n    tail?:PlaylistItem;\r\n    itemCount:number = 0;\r\n\r\n    constructor(item?:PlaylistItem) {\r\n        if (item) {\r\n            this.head = item;\r\n            this.updateTail(item);\r\n        }\r\n    }\r\n\r\n    static getLastItemFrom(item:PlaylistItem):PlaylistItem {\r\n        while (item.hasNext()) {\r\n            item = item.next!;\r\n        }\r\n        return item;\r\n    }\r\n\r\n    static getItemsCount(item:PlaylistItem):number {\r\n        let count = 1;\r\n        while (item.hasNext()) {\r\n            item = item.next!;\r\n            count++;\r\n        }\r\n        return count;\r\n    }\r\n\r\n    static mediaArrToPaylistItems(playlist:Media[]):PlaylistItem {\r\n        let pl = new PlaylistItem(playlist[playlist.length-1]);\r\n\t\tfor (let i = playlist.length-2; i>=0;  i--) {\r\n\t\t\tlet tempPl = new PlaylistItem(playlist[i]);\r\n\t\t\ttempPl.next = pl;\r\n\t\t\tpl.prev = tempPl;\r\n\t\t\tpl = tempPl;\r\n\t\t}\r\n        return pl;\r\n    }\r\n\r\n\r\n    // Reset this playlist\r\n    resetPlaylist() {\r\n        this.head = undefined;\r\n        this.tail = undefined;\r\n        this.current = undefined;\r\n        this.itemCount = 0;\r\n    }\r\n\r\n    // Initialize playlist with mediaItems\r\n    initializePlaylist(mediaItems:Media[]) {\r\n        // Reseting\r\n        this.resetPlaylist();\r\n        // Adding new items to playlist\r\n        let playlistItems = Playlist.mediaArrToPaylistItems(mediaItems);\r\n\t\tthis.appendPlaylist(playlistItems);\r\n        this.current = this.head;\r\n    }\r\n\r\n    // Update head to add items at beginning\r\n    updateHead(item:PlaylistItem) {\r\n        let oldHead = this.head;\r\n        this.head = item;\r\n        this.itemCount++;\r\n        while (item.hasNext()) {\r\n            item = item.next!;\r\n            this.itemCount++;\r\n        }\r\n        if (oldHead) {\r\n            oldHead.prev = item;\r\n            item.next = oldHead;\r\n        } else { this.tail = item; }\r\n    }\r\n\r\n    // Update tail after item is added at end\r\n    updateTail(item:PlaylistItem) {\r\n        while (item.hasNext()) {\r\n            item = item.next!;\r\n            this.itemCount++;\r\n        }\r\n        this.tail = item;\r\n        this.itemCount++;\r\n    }\r\n\r\n    // Add items at end\r\n    appendPlaylist(item:PlaylistItem, atHead?:boolean) {\r\n        if (atHead) return this.updateHead(item);\r\n        \r\n        if (this.isEmpty()) {\r\n            this.head = item;\r\n        } else if (this.tail) {\r\n            item.prev = this.tail;\r\n            this.tail.next = item;\r\n        }\r\n        this.updateTail(item);\r\n    }\r\n\r\n    // Append item after current, update tail if req, update itemCount\r\n    addNext(item:PlaylistItem) {\r\n        if (this.current) {\r\n            this.itemCount += Playlist.getItemsCount(item);\r\n            let tempNext = this.current.next;\r\n            item.prev = this.current;\r\n            this.current.next = item;\r\n            // Update links at end of item\r\n            let lastItem = Playlist.getLastItemFrom(item);\r\n            if (tempNext) {\r\n                tempNext.prev = lastItem;\r\n                lastItem.next = tempNext;\r\n            } else {\r\n                this.tail = lastItem;\r\n            }\r\n        } else {\r\n            this.appendPlaylist(item, true);\r\n            this.current = item;\r\n        }\r\n    }\r\n\r\n    // Remove an existing PlaylistItem from Playlist\r\n    remove(item:PlaylistItem) {\r\n        if (!this.contains(item)) return;\r\n        \r\n        let prev = item.prev;\r\n        let next = item.next;\r\n        if (next) { next.prev = prev; }\r\n        if (prev) { prev.next = next; }\r\n        this.itemCount--;\r\n        return item.media;\r\n    }\r\n    \r\n    // Inquiry functions\r\n    // Check if Playlist is empty\r\n    isEmpty():boolean { return this.head ? false : true; }\r\n\r\n    // Check whether this playlist contains the item\r\n    contains(item:PlaylistItem):boolean {\r\n        let start = this.head;\r\n        while(start) {\r\n            if (item === start) return true;\r\n            start = start.next;\r\n        }\r\n        return false;\r\n    }\r\n\r\n    // Get PlaylistItem at index\r\n    getPlaylistItemAt(index:number):PlaylistItem | undefined {\r\n        let item = this.head;\r\n        while (index > 0 && item?.hasNext()) {\r\n            item = item.next;\r\n            index--;\r\n        }\r\n        return item;\r\n    }\r\n\r\n    // Count number of items in this playlist\r\n    countPlaylistItems():number {\r\n        let item = this.head;\r\n        let count = 0;\r\n        while(item) {\r\n            count++;\r\n            item = item.next;\r\n        }\r\n        this.itemCount = count;\r\n        return count;\r\n    }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ErrorCodes } from '../models/error.model';\r\nimport { Media } from '../models/media.model';\r\nimport { Playlist } from '../models/playlist.model';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class PlayerService {\r\n  private _plyr:any;\r\n\r\n  constructor() { }\r\n\r\n  private _checkForErrors(elements?:Array<any>) {\r\n    let check = new Set(elements);\r\n    \r\n    if (!this._plyr) throw new Error(ErrorCodes['player/not-initialized']);\r\n    if (check?.has('video') && !this._plyr.video) throw new Error(ErrorCodes['video/element-not-initialized']);\r\n  }\r\n\r\n  // Accessing `this` from player component\r\n  addComponentRef(plyrComponent:any) {\r\n    this._plyr = plyrComponent;\r\n  }\r\n  removeComponentRef() {\r\n    this._plyr = undefined;\r\n  }\r\n  \r\n  // Public functions\r\n\t// Actions\r\n\tplay() {\r\n    this._checkForErrors(['video']);\r\n    this._plyr.video?.nativeElement.play();\r\n\t}\r\n\tpause() {\r\n    this._checkForErrors(['video']);\r\n\t\tthis._plyr.video?.nativeElement.pause();\r\n\t}\r\n\r\n\tnext() {\r\n    this._checkForErrors();\r\n    this._plyr.playNextMedia();\r\n  }\r\n\tprev() {\r\n    this._checkForErrors();\r\n    this._plyr.playPrevMedia();\r\n  }\r\n\r\n\tenableMediaLooping(loop:boolean = true) {\r\n    this._checkForErrors();\r\n    this._plyr.isLoopingEnabled = loop;\r\n  }\r\n\tenablePlaylistLooping(loop:boolean = true) {\r\n    this._checkForErrors();\r\n    this._plyr.loopPlaylist = loop;\r\n  }\r\n\r\n  changeVolume(level:number) {\r\n    this._checkForErrors(['video']);\r\n    this._plyr.changeVolume(level);\r\n  }\r\n  seekTo(atSecond:number) {\r\n    this._checkForErrors(['video']);\r\n    this._plyr.seekTo(atSecond);\r\n  }\r\n\r\n  setPlaybackSpeed(rate:number) {\r\n    this._checkForErrors();\r\n    this._plyr.setPlaybackSpeed(rate);\r\n  }\r\n\r\n\t// Getter functions\r\n\tgetCurrentlyPlaying() {\r\n    this._checkForErrors();\r\n\t\treturn this._plyr.media;\r\n\t}\r\n\tgetNextMedia() {\r\n    this._checkForErrors();\r\n\t\treturn this._plyr.nextMedia;\r\n\t}\r\n\tgetNumOfMediaInPlaylist() {\r\n    this._checkForErrors();\r\n\t\treturn this._plyr.playlist.itemCount;\r\n\t}\r\n\r\n\t// Modify playlist\r\n  addToPlaylist(mediaItems:Media[], atStart?:boolean) {\r\n    this._checkForErrors();\r\n    let items = Playlist.mediaArrToPaylistItems(mediaItems);\r\n    this._plyr.playlist.appendPlaylist(items, atStart);\r\n  }\r\n  playNext(media:Media[]) {\r\n    this._checkForErrors();\r\n    let items = Playlist.mediaArrToPaylistItems([...media]);\r\n    this._plyr.playlist.addNext(items);\r\n  }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\ndeclare const cast: any;\r\ndeclare const chrome: any;\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class CastService {\r\n  private isInitialized = false;\r\n  private castContext: any;\r\n  private currentSession: any;\r\n  player:any;\r\n  playerController:any;\r\n\r\n  constructor() {}\r\n\r\n  \r\n  isSdkAvailable(): boolean {\r\n    return !!cast?.framework;\r\n  }\r\n\r\n  initializeCastApi() {\r\n    // Check if the Cast SDK is already initialized\r\n    if (this.isInitialized) return;\r\n\r\n    console.log('Initializing Cast API...');\r\n\r\n    // Initialize the Cast SDK\r\n    cast.framework.CastContext.getInstance().setOptions({\r\n      receiverApplicationId: chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,\r\n      autoJoinPolicy: chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED\r\n    });\r\n\r\n    // Store the CastContext object\r\n    this.castContext = cast.framework.CastContext.getInstance();\r\n    \r\n    // Initializing Remote Player\r\n    this.player = new cast.framework.RemotePlayer();\r\n    this.playerController = new cast.framework.RemotePlayerController(this.player);\r\n    \r\n    this.isInitialized = true;\r\n  }\r\n  \r\n  // Cast Media to receiver\r\n  loadMedia(mediaURL?:string, contentType:string = 'video/mp4') {\r\n    if (!mediaURL) {\r\n      this.currentSession.endSession(false);\r\n    }\r\n\r\n    let mediaInfo = new chrome.cast.media.MediaInfo(mediaURL, contentType);\r\n    let request = new chrome.cast.media.LoadRequest(mediaInfo);\r\n\r\n    this.currentSession = this.castContext.getCurrentSession();\r\n    \r\n    if (this.currentSession) {\r\n      this.currentSession.loadMedia(request).then(\r\n        ()=> {\r\n          console.log('Media load succeed');\r\n        },\r\n      ).catch((error: string)=> {\r\n        console.error('Error in casting media: ' + error);\r\n      });\r\n    } else {\r\n      console.log('Session ended or not present.');\r\n    }\r\n  }\r\n\r\n  getCastContext(): any {\r\n    return this.castContext;\r\n  }\r\n\r\n  // getCurrentSession(): any {\r\n  //   return this.currentSession;\r\n  // }\r\n\r\n  isCasting(): boolean {\r\n    return !!this.currentSession;\r\n  }\r\n\r\n  // Stop casting or just stop session\r\n  endCurrentSession(stopCasting: boolean) {\r\n    this.currentSession?.endSession(stopCasting);\r\n    this.stopListeningRemotePlayerEvents();\r\n  }\r\n\r\n\t// Remote Player controls\r\n\tprivate playOrPauseCasting() {\r\n\t\tif (this.currentSession && !this.player.isPlayingBreak) {\r\n\t\t\tthis.playerController.playOrPause();\r\n\t\t}\r\n\t}\r\n\r\n  play() {\r\n    if (this.player?.isPaused) {\r\n      this.playOrPauseCasting();\r\n    }\r\n  }\r\n\r\n  pause() {\r\n    if (!this.player?.isPaused) {\r\n      this.playOrPauseCasting();\r\n    }\r\n  }\r\n\t\r\n\tstopCasting() {\r\n    if (this.currentSession) {\r\n      this.playerController.stop();\r\n    }\r\n\t}\r\n\r\n  // Seeks the media item to player currentTime value\r\n\tseekTo(toSec: number) {\r\n    if (this.currentSession && this.player.canSeek) {\r\n      this.player.currentTime = toSec;\r\n      this.playerController.seek();\r\n    }\r\n  }\r\n  \r\n  private muteOrUnmute() {\r\n    if (this.currentSession) {\r\n      this.playerController.muteOrUnmute();\r\n    }\r\n  }\r\n  \r\n  mute() {\r\n    if (!this.player?.isMuted) {\r\n      this.muteOrUnmute();\r\n    }\r\n  }\r\n  \r\n  unmute() {\r\n    if (this.player?.isMuted) {\r\n      this.muteOrUnmute();\r\n    }\r\n  }\r\n  \r\n  setVolumeLevel(volume:number) {\r\n    if (this.currentSession) {\r\n      // Sets the volume level of the connected device to the player volumeLevel value.\r\n      this.player.volumeLevel = volume;\r\n      this.playerController.setVolumeLevel();\r\n    }\r\n  }\r\n  \r\n  // Skip the ad currently playing on the receiver\r\n  skipAd() {\r\n    if (this.currentSession) {\r\n      this.playerController.skipAd();\r\n    }\r\n  }\r\n\r\n  // Create RemotePlayer events\r\n  onCastEvent(eventName:string, cb:Function) {\r\n    return new Promise((resolve, reject)=> {\r\n      this.playerController.addEventListener(cast.framework.RemotePlayerEventType[eventName], ()=> {\r\n        try {\r\n          cb();\r\n        } catch (error) {\r\n          reject(error);\r\n        }\r\n      });\r\n      resolve('Added event listener on ' + eventName);\r\n    });\r\n  }\r\n\r\n  // Stop all event listeners on playerController\r\n  stopListeningRemotePlayerEvents() {\r\n    console.info('Stopped listening to cast events');\r\n    this.playerController.removeEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, ()=> {});\r\n    this.playerController.removeEventListener(cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED, ()=> {});\r\n    this.playerController.removeEventListener(cast.framework.RemotePlayerEventType.CURRENT_TIME_CHANGED, ()=> {});\r\n    this.playerController.removeEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, ()=> {});\r\n    this.playerController.removeEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, ()=> {});\r\n  }\r\n}\r\n","export class Media {\r\n    id?:string;\r\n    src: string;\r\n    sources?: Array<string>;\r\n    type: MediaType;\r\n    title?:string;\r\n    description?:string;\r\n    thumb?:string;\r\n    poster?:string;\r\n    playFrom?: number = 0;\r\n    duration?: number;\r\n    captions?: Array<{path:string, lang:string}>;\r\n    bookmarks?: Array<number>;\r\n    paused?: boolean = true;\r\n\r\n    constructor(src:string, type?:MediaType) {\r\n        this.src = src;\r\n        this.type = type || MediaType.VIDEO;\r\n    }\r\n}\r\n\r\nexport enum MediaType {\r\n    'VIDEO', 'AUDIO'\r\n}\r\n","import { Directive, HostListener } from '@angular/core';\r\n\r\n@Directive({\r\n  selector: '[stopClickPropagation]'\r\n})\r\nexport class StopClickPropagationDirective {\r\n\r\n  constructor() { }\r\n\r\n  @HostListener('click', [\"$event\"])\r\n  public onClick(event:InputEvent) {\r\n    event?.stopPropagation();\r\n  }\r\n\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport { AfterViewInit, Component, ElementRef, EventEmitter, HostListener, Inject, Input, OnChanges, OnInit, OnDestroy, Output, SimpleChanges, ViewChild, ChangeDetectorRef } from '@angular/core';\r\nimport { Media, MediaType } from './models/media.model';\r\nimport { Playlist, PlaylistItem } from './models/playlist.model';\r\nimport { PlayerService } from './services/ng-plyr.service';\r\nimport { CastService } from './services/cast.service';\r\n\r\n@Component({\r\n\tselector: 'ng-plyr',\r\n\ttemplateUrl: './ng-plyr.component.html',\r\n\tstyleUrls: [ './ng-plyr.component.scss' ]\r\n})\r\nexport class NgPlyrComponent implements AfterViewInit, OnChanges, OnInit, OnDestroy {\r\n\t// Flags\r\n\tisPlaying = false;\r\n\tisMuted = false;\r\n\tisFullscreen = false;\r\n\tisPIP = false;\r\n\tisCasting = false;\r\n\t// isAutoplayEnabled = false;\r\n\tisLoopingEnabled = false;\r\n\tisControlSettingsOpen = false;\r\n\tisMenuSettingsOpen = false;\r\n\r\n\t// Variables\r\n\tseekStepInSec = 5;\r\n\tplayerVolume = 1;\r\n\tcurrentTime = '0:00';\r\n\ttotalTime = '0:00';\r\n\tprogressPercent = 0;\r\n\tmediaBuffers: Array<{ start: number; end: number }> = [];\r\n\tisMediaLoading = true;\r\n\tmedia!:Media;\r\n\tprevMedia?:Media;\r\n\tnextMedia?:Media;\r\n\tplaylist:Playlist = new Playlist();\r\n\tplayingTrack:number = 0;\r\n\t// TODO:\r\n\tmediaMarkers: [] = [];\r\n\r\n\t// Keeping input changes to trigger required actions on other events (like, after VideoInfoLoaded)\r\n\tinpChanges?: SimpleChanges;\r\n\t// Inputs\r\n\t@Input('src') mediaURL: string = '';\r\n\t@Input('type') mediaType?:MediaType;\r\n\t@Input('preload') preload:string = 'none';\r\n\t@Input('playFrom') playFrom?: number;\r\n\t@Input('loadingImgSrc') loadingImgSrc?: string;\r\n\t@Input('captions') captions?: Array<{ path: string, lang: string }>;\r\n\t@Input('bookmarks') bookmarks?: Array<number>;\r\n\t@Input('volume') volume?: number;\r\n\t@Input('loop') loopMedia?: boolean;\r\n\t@Input('autoplay') isAutoplayEnabled?: boolean;\r\n\t@Input('nextMedia') nextMediaToAdd?: Media;\r\n\t@Input('playlist') mediaItems?: Media[];\r\n\t@Input('loopPlaylist') loopPlaylist?: boolean;\r\n\t@Input('poster') posterUrl?: string;\r\n\t@Input('controls') enableControls: boolean = true;\r\n\r\n\t// Output events\r\n\t@Output() playing = new EventEmitter<boolean>();\r\n\t@Output() paused = new EventEmitter<boolean>();\r\n\t@Output() ended = new EventEmitter<boolean>();\r\n\t@Output() onprev = new EventEmitter<Media>();\r\n\t@Output() onnext = new EventEmitter<Media>();\r\n\t@Output() fullscreen = new EventEmitter<boolean>();\r\n\t@Output() volumechange = new EventEmitter<object>();\r\n\t// @Output() error = new EventEmitter<object>();\r\n\t// @Output() pip = new EventEmitter<boolean>();\r\n\r\n\t// HTML element references\r\n\t@ViewChild('videoContainer') videoContainer!: ElementRef;\r\n\t@ViewChild('video') video!: ElementRef;\r\n\r\n\tconstructor(@Inject(DOCUMENT) private document: any,\r\n\t\t\t\tprivate _plyrService:PlayerService,\r\n\t\t\t\tprivate _castService:CastService,\r\n\t\t\t\tprivate _cd: ChangeDetectorRef) { }\r\n\r\n\t// Lifecycle hooks\r\n\t// OnChanges LC hook\r\n\tngOnChanges(changes: SimpleChanges) {\r\n\t\tthis.inpChanges = changes;\r\n\r\n\t\t// When both mediaURL & mediaItems are present, media will be set from mediaItems\r\n\t\tif (changes['mediaURL'] && !changes['mediaItems']) { this.changeMedia(); }\r\n\t\tif (changes['mediaItems']) { this.createPlaylist(this.mediaItems!); }\r\n\r\n\t\t// nextMediaToAdd after playlist is initialized, or not present in same changes\r\n\t\tif (changes['nextMediaToAdd'] && !changes['mediaItems']) { this.onNextMediaInput(); }\r\n\t\t\r\n\t\tthis.mediaMarkers = changes['bookmarks']?.currentValue;\r\n\t\tthis.isLoopingEnabled = changes['loopMedia']?.currentValue;\r\n\t}\r\n\t\r\n\tngOnInit() {\r\n\t\tthis._plyrService.addComponentRef(this);\r\n\t}\r\n\r\n\tngAfterViewInit() {\r\n\t\tthis.isPlaying = !this.video.nativeElement.paused;\r\n\t\tthis.isMuted = this.video.nativeElement.muted;\r\n\t\tthis.isFullscreen = this.document.fullscreenElement ? true : false;\r\n\r\n\t\tthis.document.addEventListener('fullscreenchange', () => {\r\n\t\t\tif (!this.document.fullscreenElement) this.isFullscreen = false;\r\n\t\t});\r\n\t}\r\n\r\n\tngOnDestroy() {\r\n\t\tthis._plyrService.removeComponentRef();\r\n\t}\r\n\t\r\n\t\r\n\tresetPlayer() {\r\n\t\tthis.currentTime = '0:00';\r\n\t\tthis.totalTime = '0:00';\r\n\t\tthis.progressPercent = 0;\r\n\t\tthis.mediaBuffers = [];\r\n\t\tthis.isMediaLoading = true;\r\n\t\tthis.mediaMarkers = [];\r\n\t}\r\n\r\n\tchangeMedia(media?:Media) {\r\n\t\tthis.resetPlayer();\r\n\t\tthis.media = media ? media : new Media(this.mediaURL, this.mediaType);\r\n\t\tif(this.isCasting) this._castService.loadMedia(this.media.src);\r\n\t}\r\n\r\n\t// Playlist functions\r\n\t// Create new playlist / reinitialize playlist\r\n\tcreatePlaylist(mediaItems:Media[]) {\r\n\t\tif (mediaItems) {\r\n\t\t\tthis.playlist.initializePlaylist(mediaItems);\r\n\t\t\tthis.media = this.playlist.current?.media!;\r\n\t\t\tif (this.nextMediaToAdd) {\r\n\t\t\t\tthis.playlist.addNext(new PlaylistItem(this.nextMediaToAdd));\r\n\t\t\t}\r\n\t\t\tthis.nextMedia = this.playlist.current?.next?.media;\r\n\t\t}\r\n\t}\r\n\r\n\t// nextMedia will be used to play next inboth src and playlist cases\r\n\tonNextMediaInput() {\r\n\t\tif (this.playlist.current && this.nextMediaToAdd) {\r\n\t\t\tthis.playlist.addNext(new PlaylistItem(this.nextMediaToAdd));\r\n\t\t}\r\n\t\tthis.nextMedia = this.nextMediaToAdd;\r\n\t}\r\n\r\n\t// Output events for media\r\n\tonPlay(event:Event) {\r\n\t\tthis.playing.emit(true);\r\n\t\tthis.paused.emit(false);\r\n\t\tthis.isPlaying = true;\r\n\t\tthis.media.paused = false;\r\n\t\tif(this.isCasting) this.video.nativeElement.pause();\r\n\t}\r\n\r\n\tonPause(event:Event) {\r\n\t\tthis.playing.emit(false);\r\n\t\tthis.paused.emit(true);\r\n\t\tthis.media.paused = true;\r\n\t\tif(!this.isCasting) this.isPlaying = false;\r\n\t}\r\n\r\n\tonEnd(event?:Event) {\r\n\t\tthis.ended.emit(true);\r\n\t\tif (this.isAutoplayEnabled) {\r\n\t\t\tthis.playNextMedia();\r\n\t\t}\r\n\t}\r\n\r\n\tonVolumeChange(event:Event) {\r\n\t\tthis.volumechange.emit({\r\n\t\t\tlevel: this.video.nativeElement.volume,\r\n\t\t\tmuted: this.video.nativeElement.muted\r\n\t\t});\r\n\t}\r\n\r\n\t// TODO: Emit custom error\r\n\tonError(event:Event) {\r\n\t\tconsole.error(event);\r\n\t}\r\n\r\n\t// Shortcut keys\r\n\t@HostListener('window:keydown', ['$event'])\r\n\tdoShortcutKeyAction(event: KeyboardEvent) {\r\n\t\tif (this.enableControls === false) return;\r\n\r\n\t\tconst tagName = this.document.activeElement.tagName.toLowerCase();\r\n\t\tif (tagName === 'input') return;\r\n\r\n\t\tconst key = event.key.toLowerCase();\r\n\t\tif ((key === ' ' && tagName != 'button') || key === 'k') {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tthis.togglePlay();\r\n\t\t} else if (key === 'm') {\r\n\t\t\tthis.toggleMute();\r\n\t\t} else if (key === 'f') {\r\n\t\t\tthis.toggleFullscreen();\r\n\t\t} else if (key === 'i') {\r\n\t\t\tthis.togglePIP();\r\n\t\t} else if (key === 'arrowleft') {\r\n\t\t\tthis.seekTo(Math.max(0, this.video.nativeElement.currentTime - 5));\r\n\t\t} else if (key === 'arrowright') {\r\n\t\t\tthis.seekTo(Math.min(this.video.nativeElement.duration, this.video.nativeElement.currentTime + 5));\r\n\t\t} else if (key === 'arrowup') {\r\n\t\t\tthis.changeVolume((this.playerVolume * 100 + 5) / 100);\r\n\t\t} else if (key === 'arrowdown') {\r\n\t\t\tconst vol = (this.playerVolume * 100 - 5) / 100;\r\n\t\t\tthis.changeVolume(vol < 0 ? 0 : vol);\r\n\t\t} else if (key === '0' || key === 'home') {\r\n\t\t\tthis.seekTo(0);\r\n\t\t} else if (Number(key) > 0 && Number(key) < 10 && this.media?.duration) {\r\n\t\t\tthis.seekTo(this.media.duration * Number(key)/10);\r\n\t\t} else if (key === 'end') {\r\n\t\t\tthis.stopVideo();\r\n\t\t} else if (event.key === 'N') {\r\n\t\t\tthis.playNextMedia();\r\n\t\t} else if (event.key === 'P') {\r\n\t\t\tthis.playPrevMedia();\r\n\t\t} else if (event.key === '<') {\r\n\t\t\tthis.setPlaybackSpeed(this.video.nativeElement.playbackRate - .25);\r\n\t\t} else if (event.key === '>') {\r\n\t\t\tthis.setPlaybackSpeed(this.video.nativeElement.playbackRate + .25);\r\n\t\t}\r\n\t}\r\n\r\n\t// Volume control\r\n\tchangeVolume(value: any) {\r\n\t\tvalue = Number(value).toPrecision(2);\r\n\t\tif (!this.video || value > 1 || value < 0) return;\r\n\r\n\t\tif (this.isCasting) {\r\n\t\t\t// Not yet working\r\n\t\t\tthis._castService.setVolumeLevel(value);\r\n\t\t} else {\r\n\t\t\tthis.video.nativeElement.volume = value;\r\n\t\t\tthis.playerVolume = value;\r\n\t\t\tif (this.video.nativeElement.muted && value > 0) {\r\n\t\t\t\tthis.toggleMute();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Update video metadata in player\r\n\tupdateAfterVideoInfoLoaded() {\r\n\t\tif (this.inpChanges && this.inpChanges[\"mediaURL\"]) {\r\n\t\t\tthis.video.nativeElement.currentTime = 0;\r\n\t\t\tthis.media.playFrom = this.playFrom;\r\n\t\t\tthis.media.duration = this.video.nativeElement.duration ? this.video.nativeElement.duration : this.video.nativeElement.currentTime;\r\n\t\t\tthis.media.captions = this.captions;\r\n\t\t}\r\n\t\tif (this.inpChanges && this.inpChanges['volume']?.currentValue) {\r\n\t\t\tthis.changeVolume(this.inpChanges['volume'].currentValue);\r\n\t\t}\r\n\t\tif (this.inpChanges && this.inpChanges['playFrom']?.currentValue) {\r\n\t\t\tthis.seekTo(this.inpChanges['playFrom'].currentValue);\r\n\t\t}\r\n\t\tif (this.isAutoplayEnabled) this.video.nativeElement.play();\r\n\t\t\r\n\t\tthis.isPlaying = !this.video.nativeElement.paused;\r\n\t\tthis.currentTime = this.formatDuration(this.media.playFrom);\r\n\t\tthis.totalTime = this.formatDuration(this.media.duration);\r\n\t\tthis.showBuffers();\r\n\t}\r\n\r\n\t// Display video buffers on timeline\r\n\tshowBuffers() {\r\n\t\tconst buf = this.video.nativeElement.buffered;\r\n\t\tif (buf.length === 1 && buf.end(0) - buf.start(0) === this.video.nativeElement.duration) {\r\n\t\t\tthis.isMediaLoading = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.isMediaLoading = true;\r\n\r\n\t\tthis.mediaBuffers = [];\r\n\t\tfor (let i = 0; i < buf.length; i++) {\r\n\t\t\tlet start = Number((buf.start(i) / this.video.nativeElement.duration).toPrecision(3)) * 100;\r\n\t\t\tlet end = Number((buf.end(i) / this.video.nativeElement.duration).toPrecision(3)) * 100;\r\n\t\t\tthis.mediaBuffers.push({ start, end });\r\n\t\t\tif (this.video.nativeElement.currentTime >= buf.start(i) && this.video.nativeElement.currentTime <= buf.end(i)) {\r\n\t\t\t\tthis.isMediaLoading = false;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Seek to specific time\r\n\tseekTo(atSecond: number | string) {\r\n\t\tif (!this.video) return;\r\n\t\tif (atSecond > this.video.nativeElement.duration) {\r\n\t\t\tthis.stopVideo();\r\n\t\t\treturn;\r\n\t\t} else if (Number(atSecond) < 0) {\r\n\t\t\tthis.video.nativeElement.currentTime = 0;\r\n\t\t\tthis._castService.seekTo(0);\r\n\t\t} else {\r\n\t\t\tthis.video.nativeElement.currentTime = Number(atSecond).toPrecision(3);\r\n\t\t\tthis._castService.seekTo(Number(atSecond));\r\n\t\t}\r\n\t\tthis.progressPercent =\r\n\t\t\tNumber((this.video.nativeElement.currentTime / this.video.nativeElement.duration).toPrecision(3)) * 100;\r\n\t}\r\n\r\n\t// Call seekTo fn in specific direction and set count to 0\r\n\tseekAfterTimeout(direction:string) {\r\n\t\tif (direction === 'fwd') {\r\n\t\t\tthis.seekTo(this.video.nativeElement.currentTime + this.seekStepInSec * this.fwdClickCount);\r\n\t\t\tthis.fwdClickCount = 0;\r\n\t\t} else if (direction === 'bwd') {\r\n\t\t\tthis.seekTo(this.video.nativeElement.currentTime - this.seekStepInSec * this.bwdClickCount);\r\n\t\t\tthis.bwdClickCount = 0;\r\n\t\t}\r\n\t}\r\n\r\n\t// Seek backward on mouseclick\r\n\tbwdClickCount = 0;\r\n\tbwdClickTimeout = setTimeout(() => this.bwdClickCount = 0, 500);\r\n\tseekBwd(e: MouseEvent | PointerEvent) {\r\n\t\tif (e.type === 'dblclick') {\r\n\t\t\tthis.bwdClickCount = 1;\r\n\t\t\tclearTimeout(this.bwdClickTimeout);\r\n\t\t\tthis.bwdClickTimeout = setTimeout(() => this.seekAfterTimeout('bwd'), 500);\r\n\t\t} else if (e.type === 'click' && this.bwdClickCount > 0) {\r\n\t\t\tthis.bwdClickCount++;\r\n\t\t\tclearTimeout(this.bwdClickTimeout);\r\n\t\t\tthis.bwdClickTimeout = setTimeout(() => this.seekAfterTimeout('bwd'), 500);\r\n\t\t}\r\n\t}\r\n\r\n\t// Seek forward on mouseclick\r\n\tfwdClickCount = 0;\r\n\tfwdClickTimeout = setTimeout(() => this.fwdClickCount = 0, 500);\r\n\tseekFwd(e: MouseEvent | PointerEvent) {\r\n\t\tif (e.type === 'dblclick') {\r\n\t\t\tthis.fwdClickCount = 1;\r\n\t\t\tclearTimeout(this.fwdClickTimeout);\r\n\t\t\tthis.fwdClickTimeout = setTimeout(() => this.seekAfterTimeout('fwd'), 500);\r\n\t\t} else if (e.type === 'click' && this.fwdClickCount > 0) {\r\n\t\t\tthis.fwdClickCount++;\r\n\t\t\tclearTimeout(this.fwdClickTimeout);\r\n\t\t\tthis.fwdClickTimeout = setTimeout(() => this.seekAfterTimeout('fwd'), 500);\r\n\t\t}\r\n\t}\r\n\r\n\tupdateCurrentTime() {\r\n\t\tthis.currentTime = this.formatDuration(this.video.nativeElement.currentTime);\r\n\t\tthis.progressPercent =\r\n\t\t\tNumber((this.video.nativeElement.currentTime / this.video.nativeElement.duration).toPrecision(3)) * 100;\r\n\t\tthis.showBuffers();\r\n\t}\r\n\r\n\t// Play previous media from Q\r\n\tplayPrevMedia() {\r\n\t\tif (this.isLoopingEnabled) return this.onprev.emit(this.media);\r\n\r\n\t\tlet mediaToPlay: Media | undefined;\r\n\t\tif (this.playlist.current?.hasPrev()) {\r\n\t\t\tthis.playlist.current = this.playlist.current.prev;\r\n\t\t\tmediaToPlay = this.playlist.current?.media;\r\n\t\t\t// Update prevMedia\r\n\t\t\tif (this.playlist.current?.hasPrev()) {\r\n\t\t\t\tthis.prevMedia = this.playlist.current.prev!.media;\r\n\t\t\t} else if (this.loopPlaylist) {\r\n\t\t\t\tthis.prevMedia = this.playlist.tail?.media;\r\n\t\t\t}\r\n\t\t} else if (this.loopPlaylist) {\r\n\t\t\tthis.playlist.current = this.playlist.tail;\r\n\t\t\tmediaToPlay = this.playlist.current?.media;\r\n\t\t\tthis.prevMedia = this.playlist.current?.prev?.media;\r\n\t\t} else if (this.prevMedia) {\r\n\t\t\tmediaToPlay = this.prevMedia;\r\n\t\t\tthis.prevMedia = undefined;\r\n\t\t}\r\n\r\n\t\tthis.nextMedia = this.media;\r\n\t\tthis.changeMedia(mediaToPlay);\r\n\t\tthis.onprev.emit(mediaToPlay);\r\n\t}\r\n\t\r\n\t// Play next media from Q\r\n\tplayNextMedia() {\r\n\t\tif (this.isLoopingEnabled) return this.onnext.emit(this.media);\r\n\r\n\t\tlet mediaToPlay: Media | undefined;\r\n\t\tif (this.playlist.current?.hasNext()) {\r\n\t\t\tthis.playlist.current = this.playlist.current.next;\r\n\t\t\tmediaToPlay = this.playlist.current?.media;\r\n\t\t\t// Updating nextMedia\r\n\t\t\tif (this.playlist.current?.hasNext()) {\r\n\t\t\t\tthis.nextMedia = this.playlist.current.next!.media;\r\n\t\t\t} else if (this.loopPlaylist) {\r\n\t\t\t\tthis.nextMedia = this.playlist.head?.media;\r\n\t\t\t}\r\n\t\t} else if (this.loopPlaylist) {\r\n\t\t\tthis.playlist.current = this.playlist.head;\r\n\t\t\tmediaToPlay = this.playlist.current?.media;\r\n\t\t\tthis.nextMedia = this.playlist.current?.next?.media;\r\n\t\t} else if (this.nextMedia) {\r\n\t\t\tmediaToPlay = this.nextMedia;\r\n\t\t\tthis.nextMedia = undefined;\r\n\t\t}\r\n\t\t\r\n\t\tthis.prevMedia = this.media;\r\n\t\tthis.changeMedia(mediaToPlay);\r\n\t\tthis.onnext.emit(mediaToPlay);\r\n\t}\r\n\r\n\t// End/Stop current video\r\n\tstopVideo() {\r\n\t\tthis.video.nativeElement.pause();\r\n\t\tthis.seekTo(this.video.nativeElement.duration);\r\n\t\tthis._castService.stopCasting();\r\n\t}\r\n\r\n\tsetPlaybackSpeed(rate: number) {\r\n\t\tif (rate < 0.25 || rate > 2) return;\r\n\t\tthis.video.nativeElement.playbackRate = rate;\r\n\t}\r\n\r\n\t// Initialize Cast and requestSession\r\n\tcastToChromecast() {\r\n\t\t// Check if the Cast SDK is available and initialized\r\n\t\tif (this._castService.isSdkAvailable()) {\r\n\t\t\t// Initialize Cast API\r\n\t\t\tthis._castService.initializeCastApi();\r\n\t\r\n\t\t\t// Get the CastContext and show the Cast dialog to the user\r\n\t\t\tlet castContext = this._castService.getCastContext();\r\n\t\t\t// Starts media casting after session starts\r\n\t\t\tcastContext.requestSession().then((session: any)=> {\r\n\t\t\t\t// Add event listeners\r\n\t\t\t\tthis.listenToPlayerEvents();\r\n\t\t\t\tthis.enableCastingMode();\r\n\t\t\t\t// load media in receiver\r\n\t\t\t\tthis._castService.loadMedia(this.media.src, 'video/mp4');\r\n\t\t\t}).catch((err: any)=> {\r\n\t\t\t\tconsole.error(err);\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tconsole.warn('Cast SDK is not available or not initialized.');\r\n\t\t}\r\n\t}\r\n\r\n\t// After successful connection, use this method to change mode to casting\r\n\tenableCastingMode() {\r\n\t\tthis.isCasting = true;\r\n\t\t// Stop playing on local device\r\n\t\tthis.video.nativeElement.pause();\r\n\t\tthis.isMuted = this._castService.player.isMuted;\r\n\t\tthis.isPlaying = !this._castService.player.isPaused;\r\n\t\tthis.playerVolume = this._castService.player.volumeLevel.toPrecision(2);\r\n\t}\r\n\r\n\t// Stop casting or just stop session\r\n\tendCurrentSession(stopCasting: boolean) {\r\n\t\tthis._castService.endCurrentSession(stopCasting);\r\n\t}\r\n\r\n\t// Listening to remote events\r\n\tlistenToPlayerEvents() {\r\n\t\t// Storing local player states in local variables to restore after receiver disconnects\r\n\t\tlet isMutedLocal = this.isMuted;\r\n\t\tlet playerVolumeLocal = this.playerVolume;\r\n\r\n\t\t// Cast Connected/disconnected\r\n\t\tthis._castService.onCastEvent('IS_CONNECTED_CHANGED', () => {\r\n\t\t\tif (this._castService.player.isConnected) {\r\n\t\t\t\tconsole.log('Cast Player connected');\r\n\t\t\t\t// Stop playing on local device\r\n\t\t\t\tthis.enableCastingMode();\r\n\t\t\t} else {\r\n\t\t\t\tconsole.log('Cast Player disconnected');\r\n\t\t\t\tthis.isCasting = false;\r\n\t\t\t\tthis._castService.stopListeningRemotePlayerEvents();\r\n\t\t\t\t// Start playing on local device\r\n\t\t\t\tthis.seekTo(this._castService.player.currentTime);\r\n\t\t\t\tthis.isPlaying ? this.video.nativeElement.play() : this.video.nativeElement.pause();\r\n\t\t\t\t// Setting local UI to original state\r\n\t\t\t\tthis.isMuted = isMutedLocal;\r\n\t\t\t\tthis.playerVolume = playerVolumeLocal;\r\n\t\t\t}\r\n\t\t}).then((res: any) => console.log(res))\r\n\t\t.catch((err: any) => console.error(err));\r\n\r\n\t\t// Pause/Play\r\n\t\tthis._castService.onCastEvent('IS_PAUSED_CHANGED', () => {\r\n\t\t\tif (this._castService.player.isPaused) {\r\n\t\t\t\tconsole.log('Receiver paused');\r\n\t\t\t\tthis.isPlaying = false;\r\n\t\t\t} else {\r\n\t\t\t\tconsole.log('Receiver playing');\r\n\t\t\t\tthis.isPlaying = true;\r\n\t\t\t}\r\n\t\t}).then((res: any) => console.log(res))\r\n\t\t.catch((err: any) => console.error(err));\r\n\r\n\t\t// MediaInfo changes\r\n\t\tthis._castService.onCastEvent('PLAYER_STATE_CHANGED', () => {\r\n\t\t\t// console.log('PlayerState:', this._castService.player.playerState);\r\n\t\t\tif (this._castService.player.playerState === 'IDLE') {\r\n\t\t\t\tthis.onEnd();\r\n\t\t\t\tthis._castService.play();\r\n\t\t\t\tthis.isPlaying = true;\r\n\t\t\t}\r\n\t\t}).then((res: any) => console.log(res))\r\n\t\t.catch((err: any) => console.error(err));\r\n\r\n\t\t// Paying break\r\n\t\tthis._castService.onCastEvent('IS_PLAYING_BREAK_CHANGED', () => {\r\n\t\t\tif (this._castService.player.isPlayingBreak) {\r\n\t\t\t\tconsole.log('Player is playing break');\r\n\t\t\t\t// Change on local device\r\n\t\t\t\tthis.video.nativeElement.pause();\r\n\t\t\t\t// Show Playing break, in UI\r\n\t\t\t} else {\r\n\t\t\t\tconsole.log('Player break ended');\r\n\t\t\t\t// Change on local device\r\n\t\t\t}\r\n\t\t}).then((res: any) => console.log(res))\r\n\t\t.catch((err: any) => console.error(err));\r\n\r\n\t\t// currentTime changed\r\n\t\tthis._castService.onCastEvent('CURRENT_TIME_CHANGED', () => {\r\n\t\t\t// Change current time on local device\r\n\t\t\tlet currentTime = this._castService.player.currentTime;\r\n\t\t\tthis.progressPercent = Number((currentTime / this.video.nativeElement.duration).toPrecision(3)) * 100;\r\n\t\t\tthis.currentTime = this.formatDuration(currentTime);\r\n\t\t\t// Update in UI on currentTime changes\r\n\t\t\tthis._cd.detectChanges();\r\n\t\t}).then((res: any) => console.log(res))\r\n\t\t.catch((err: any) => console.error(err));\r\n\r\n\t\t// volumeLevel changed\r\n\t\tthis._castService.onCastEvent('VOLUME_LEVEL_CHANGED', () => {\r\n\t\t\t// Change volume level in UI\r\n\t\t\tthis.playerVolume = this._castService.player.volumeLevel.toPrecision(2);\r\n\t\t\t// Update in UI on volume changes\r\n\t\t\tthis._cd.detectChanges();\r\n\t\t}).then((res: any) => console.log(res))\r\n\t\t.catch((err: any) => console.error(err));\r\n\r\n\t\t// Muted/unmuted\r\n\t\tthis._castService.onCastEvent('IS_MUTED_CHANGED', () => {\r\n\t\t\t// Change mute icon in UI\r\n\t\t\tthis.isMuted = this._castService.player.isMuted;\r\n\t\t}).then((res: any) => console.log(res))\r\n\t\t.catch((err: any) => console.error(err));\r\n\t}\r\n\r\n\t// Utility functions\r\n\tformatDuration(time: any): string {\r\n\t\tconst sec = Math.floor(time % 60);\r\n\t\tconst min = Math.floor(time / 60) % 60;\r\n\t\tconst hr = Math.floor(time / 3600);\r\n\r\n\t\tif (hr > 0) {\r\n\t\t\treturn `${hr}:${min < 10 ? '0' + min : min}:${sec < 10 ? '0' + sec : sec}`;\r\n\t\t} else {\r\n\t\t\treturn `${min}:${sec < 10 ? '0' + sec : sec}`;\r\n\t\t}\r\n\t}\r\n\r\n\t// Toggles\r\n\ttoggleLoop() {\r\n\t\tthis.isLoopingEnabled = !this.isLoopingEnabled;\r\n\t}\r\n\r\n\ttogglePlay() {\r\n\t\tif (this.enableControls === false) return;\r\n\t\tif (!this.isCasting) {\r\n\t\t\tif (this.video.nativeElement.currentTime === this.video.nativeElement.duration) {\r\n\t\t\t\tthis.video.nativeElement.currentTime = 0;\r\n\t\t\t}\r\n\t\t\tthis.video.nativeElement.paused ? this.video.nativeElement.play() : this.video.nativeElement.pause();\r\n\t\t} else {\r\n\t\t\t// Play/pause receiver\r\n\t\t\tthis.isPlaying  ? this._castService.pause() : this._castService.play();\r\n\t\t}\r\n\t}\r\n\r\n\ttoggleMute() {\r\n\t\tif (!this.isCasting) {\r\n\t\t\tthis.video.nativeElement.muted = !this.video.nativeElement.muted;\r\n\t\t\tthis.isMuted = this.video.nativeElement.muted;\r\n\t\t} else {\r\n\t\t\t// mute/unmute receiver\r\n\t\t\tthis.isMuted ? this._castService.unmute() : this._castService.mute();\r\n\t\t}\r\n\t}\r\n\r\n\ttogglePIP() {\r\n\t\tif (this.isPIP) {\r\n\t\t\tthis.document.exitPictureInPicture();\r\n\t\t\tthis.isPIP = false;\r\n\t\t} else {\r\n\t\t\tthis.video.nativeElement.requestPictureInPicture();\r\n\t\t\tthis.isPIP = true;\r\n\t\t}\r\n\t}\r\n\r\n\ttoggleFullscreen() {\r\n\t\tif (this.document.fullscreenElement) {\r\n\t\t\tthis.document.exitFullscreen();\r\n\t\t\tthis.isFullscreen = false;\r\n\t\t\tthis.fullscreen.emit(false);\r\n\t\t} else {\r\n\t\t\tthis.videoContainer.nativeElement.requestFullscreen();\r\n\t\t\tthis.isFullscreen = true;\r\n\t\t\tthis.fullscreen.emit(true);\r\n\t\t}\r\n\t}\r\n}\r\n","<div #videoContainer class=\"video-container\" [ngClass]=\"isPlaying ? '' : 'paused'\">\r\n    <div class=\"video-header-container\" *ngIf=\"enableControls\">\r\n        <button class=\"menu-icon-btn\" title=\"Menu\" (click)=\"isMenuSettingsOpen = !isMenuSettingsOpen\">\r\n            <svg class=\"menu-icon\" viewBox=\"0 -960 960 960\" *ngIf=\"!isPlaying\">\r\n                <path fill=\"currentColor\" d=\"M120-240v-80h720v80H120Zm0-200v-80h720v80H120Zm0-200v-80h720v80H120Z\"/>\r\n            </svg>\r\n        </button>\r\n        <span class=\"title\">\r\n            {{media.title}}\r\n        </span>\r\n        <div class=\"menu-box\" [ngClass]=\"isMenuSettingsOpen ? '': 'hidden'\">\r\n            <!-- <input type=\"file\" name=\"Select file to play\" (change)=\"onLocalFileSelected($event)\"> -->\r\n            <button (click)=\"stopVideo()\">Stop Playing</button>\r\n        </div>\r\n    </div>\r\n    <div class=\"video-overlay\" (click)=\"togglePlay()\" *ngIf=\"enableControls\">\r\n        <div stopClickPropagation class=\"loading\"\r\n            [ngStyle]=\"{'background-image': loadingImgSrc ? 'url(' + loadingImgSrc + ')':'../assets/images/Spinner-multicolor.svg'}\"\r\n            *ngIf=\"isMediaLoading\">\r\n            <!-- <img [src]=\"loadingImgSrc\"> -->\r\n        </div>\r\n        <div class=\"video-actions\" *ngIf=\"!isMediaLoading && media.paused\">\r\n            <button stopClickPropagation class=\"play-prev-btn\" title=\"Previous\" (click)=\"playPrevMedia()\" [disabled]=\"!prevMedia\">\r\n                <svg class=\"play-prev-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n                    <path d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n                    <path d=\"M6 6h2v12H6zm3.5 6l8.5 6V6z\" />\r\n                </svg>\r\n            </button>\r\n            <button stopClickPropagation class=\"play-btn\" (click)=\"togglePlay()\">\r\n                <svg class=\"play-icon\" viewBox=\"0 0 24 24\" *ngIf=\"!isCasting\">\r\n                    <path fill=\"currentColor\" d=\"M8,5.14V19.14L19,12.14L8,5.14Z\" />\r\n                </svg>\r\n                <span *ngIf=\"isCasting\">\r\n                    <svg viewBox=\"0 -960 960 960\" title=\"Playing on TV\" *ngIf=\"isPlaying\">\r\n                        <path fill=\"currentColor\" d=\"M200-320h80q0-33-23.5-56.5T200-400v80Zm142 0h58q0-83-58.5-141.5T200-520v58q59 0 100.5 41.5T342-320Zm120 0h58q0-66-25-124.5t-68.5-102Q383-590 324.5-615T200-640v58q109 0 185.5 76.5T462-320ZM320-120v-80H160q-33 0-56.5-23.5T80-280v-480q0-33 23.5-56.5T160-840h640q33 0 56.5 23.5T880-760v480q0 33-23.5 56.5T800-200H640v80H320ZM160-280h640v-480H160v480Zm0 0v-480 480Z\"/>\r\n                    </svg>\r\n                    <svg class=\"cast-pause-icon\" viewBox=\"0 -960 960 960\" title=\"Casting paused\" *ngIf=\"!isPlaying\">\r\n                        <path fill=\"currentColor\" d=\"M750-640h40v-160h-40v160Zm-100 0h40v-160h-40v160ZM480-480ZM80-280q50 0 85 35t35 85H80v-120Zm0-160q117 0 198.5 81.5T360-160h-80q0-83-58.5-141.5T80-360v-80Zm0-160q91 0 171 34.5T391-471q60 60 94.5 140T520-160h-80q0-75-28.5-140.5t-77-114q-48.5-48.5-114-77T80-520v-80Zm720 440H600q0-20-1.5-40t-4.5-40h206v-212q22-7 42-16.5t38-22.5v251q0 33-23.5 56.5T800-160ZM80-680v-40q0-33 23.5-56.5T160-800h292q-6 19-9 39t-3 41H160v46q-20-3-40-4.5T80-680Zm640 160q-83 0-141.5-58.5T520-720q0-83 58.5-141.5T720-920q83 0 141.5 58.5T920-720q0 83-58.5 141.5T720-520Z\"/>\r\n                    </svg>\r\n                </span>\r\n            </button>\r\n            <button stopClickPropagation class=\"play-next-btn\" title=\"Next\" (click)=\"playNextMedia()\" [disabled]=\"!nextMedia\">\r\n                <svg class=\"play-next-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n                    <path d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n                    <path d=\"M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z\" />\r\n                </svg>\r\n            </button>\r\n        </div>\r\n        <div class=\"seek\" *ngIf=\"!isMediaLoading && !media.paused\">\r\n          <button stopClickPropagation class=\"seek-back-btn\" (click)=\"seekBwd($event)\" (dblclick)=\"seekBwd($event)\">\r\n            <div [ngStyle]=\"{'display': bwdClickCount>0 ? 'block' : 'none'}\">\r\n              <div>{{bwdClickCount * seekStepInSec}} seconds</div>\r\n              <svg class=\"seek-back-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n                <path d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n                <path d=\"M11 18V6l-8.5 6 8.5 6zm.5-6l8.5 6V6l-8.5 6z\" />\r\n              </svg>\r\n            </div>\r\n          </button>\r\n          <button stopClickPropagation class=\"seek-ahead-btn\" (click)=\"seekFwd($event)\" (dblclick)=\"seekFwd($event)\">\r\n            <div [ngStyle]=\"{'display': fwdClickCount>0 ? 'block' : 'none'}\">\r\n              <div>{{fwdClickCount * seekStepInSec}} seconds</div>\r\n              <svg class=\"seek-ahead-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n                  <path d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n                  <path d=\"M4 18l8.5-6L4 6v12zm9-12v12l8.5-6L13 6z\" />\r\n              </svg>\r\n            </div>  \r\n          </button>\r\n        </div>\r\n    </div>\r\n    <div class=\"video-controls-container\" *ngIf=\"enableControls\">\r\n        <div class=\"timeline-container\">\r\n            <img src=\"\" class=\"preview-img\">\r\n            <input #progressBar type=\"range\" class=\"timeline-progress\" (input)=\"seekTo(progressBar.value)\"\r\n                [value]=\"media.playFrom\" [max]=\"media.duration\">\r\n            <div class=\"track\">\r\n                <div class=\"track-progress\" [ngStyle]=\"{'width':progressPercent + '%'}\"></div>\r\n                <div class=\"track-buffers\">\r\n                    <span class=\"buffer\" *ngFor=\"let buffer of mediaBuffers\"\r\n                        [ngStyle]=\"{'left':buffer.start + '%', 'width':buffer.end - buffer.start + '%'}\"></span>\r\n                </div>\r\n                <div class=\"track-markers\">\r\n                    <span class=\"marker\" *ngFor=\"let marker of mediaMarkers\" [ngStyle]=\"{'left':marker + '%'}\"></span>\r\n                </div>\r\n            </div>\r\n            <div class=\"thumb\" [ngStyle]=\"{'left':progressPercent + '%', 'transform': 'translate(-'+ progressPercent + '%,-50%)'}\"></div>\r\n        </div>\r\n        <div class=\"controls\">\r\n            <button class=\"play-pause-btn\" [title]=\"isPlaying ? 'Pause (k)' : 'Play (k)'\" (click)=\"togglePlay()\">\r\n                <svg class=\"play-icon\" viewBox=\"0 0 24 24\" *ngIf=\"!isPlaying\">\r\n                    <path fill=\"currentColor\" d=\"M8,5.14V19.14L19,12.14L8,5.14Z\" />\r\n                </svg>\r\n                <svg class=\"pause-icon\" viewBox=\"0 0 24 24\" *ngIf=\"isPlaying\">\r\n                    <path fill=\"currentColor\" d=\"M14,19H18V5H14M6,19H10V5H6V19Z\" />\r\n                </svg>\r\n            </button>\r\n            <button class=\"play-next-btn\" title=\"Next\" (click)=\"playNextMedia()\" [disabled]=\"!nextMedia\">\r\n                <svg class=\"play-next-icon\" fill=\"currentColor\" viewBox=\"0 0 24 24\">\r\n                    <path d=\"M0 0h24v24H0z\" fill=\"none\" />\r\n                    <path d=\"M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z\" />\r\n                </svg>\r\n            </button>\r\n            <div class=\"volume-container\">\r\n                <button class=\"volume-btn\" [title]=\"isMuted ? 'Unmute (m)' : 'Mute (m)'\" (click)=\"toggleMute()\">\r\n                    <svg class=\"volume-high-icon\" viewBox=\"0 0 24 24\"\r\n                        *ngIf=\"!isMuted && playerVolume>.5 && playerVolume<=1\">\r\n                        <path fill=\"currentColor\"\r\n                            d=\"M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z\" />\r\n                    </svg>\r\n                    <svg class=\"volume-low-icon\" viewBox=\"0 0 24 24\"\r\n                        *ngIf=\"!isMuted && playerVolume>0 && playerVolume<=.5\">\r\n                        <path fill=\"currentColor\"\r\n                            d=\"M5,9V15H9L14,20V4L9,9M18.5,12C18.5,10.23 17.5,8.71 16,7.97V16C17.5,15.29 18.5,13.76 18.5,12Z\" />\r\n                    </svg>\r\n                    <svg class=\"volume-muted-icon\" viewBox=\"0 0 24 24\" *ngIf=\"isMuted || playerVolume==0\">\r\n                        <path fill=\"currentColor\"\r\n                            d=\"M12,4L9.91,6.09L12,8.18M4.27,3L3,4.27L7.73,9H3V15H7L12,20V13.27L16.25,17.53C15.58,18.04 14.83,18.46 14,18.7V20.77C15.38,20.45 16.63,19.82 17.68,18.96L19.73,21L21,19.73L12,10.73M19,12C19,12.94 18.8,13.82 18.46,14.64L19.97,16.15C20.62,14.91 21,13.5 21,12C21,7.72 18,4.14 14,3.23V5.29C16.89,6.15 19,8.83 19,12M16.5,12C16.5,10.23 15.5,8.71 14,7.97V10.18L16.45,12.63C16.5,12.43 16.5,12.21 16.5,12Z\" />\r\n                    </svg>\r\n                </button>\r\n                <input #volumeInput class=\"volume-slider\" type=\"range\" (input)=\"changeVolume(volumeInput.value)\"\r\n                    [value]=\"playerVolume\" min=\"0\" max=\"1\" step=\"any\">\r\n            </div>\r\n            <div class=\"duration-container\">\r\n                <span class=\"current-time\">{{currentTime}}</span>\r\n                /\r\n                <span class=\"total-time\">{{totalTime}}</span>\r\n            </div>\r\n            <span class=\"right-side-btns\">\r\n                <button class=\"loop-btn\" (click)=\"toggleLoop()\"\r\n                    [title]=\"isLoopingEnabled ? 'Looping one': loopPlaylist ? 'Looping all' : 'Looping off'\">\r\n                    <svg title=\"Loop off\" viewBox=\"0 0 24 24\" *ngIf=\"!loopPlaylist && !isLoopingEnabled\">\r\n                        <path fill=\"currentColor\" d=\"M2,5.27L3.28,4L20,20.72L18.73,22L15.73,19H7V22L3,18L7,14V17H13.73L7,10.27V11H5V8.27L2,5.27M17,13H19V17.18L17,15.18V13M17,5V2L21,6L17,10V7H8.82L6.82,5H17Z\" />\r\n                    </svg>\r\n                    <svg title=\"Loop one\" viewBox=\"0 0 48 48\" *ngIf=\"loopPlaylist && !isLoopingEnabled\">\r\n                        <path fill=\"currentColor\" d=\"m14 44-8-8 8-8 2.1 2.2-4.3 4.3H35v-8h3v11H11.8l4.3 4.3Zm-4-22.5v-11h26.2l-4.3-4.3L34 4l8 8-8 8-2.1-2.2 4.3-4.3H13v8Z\"/>\r\n                    </svg>\r\n                    <svg title=\"Loop all\" viewBox=\"0 0 48 48\" *ngIf=\"isLoopingEnabled\">\r\n                        <path fill=\"currentColor\" d=\"m14 44-8-8 8-8 2.1 2.2-4.3 4.3H35v-8h3v11H11.8l4.3 4.3Zm9.3-14.1v-9.45h-2.8V18h5.25v11.9ZM10 21.5v-11h26.2l-4.3-4.3L34 4l8 8-8 8-2.1-2.2 4.3-4.3H13v8Z\"/>\r\n                    </svg>\r\n                </button>\r\n                <button class=\"settings-btn\" title=\"Settings\" (click)=\"isControlSettingsOpen = !isControlSettingsOpen\">\r\n                    <svg class=\"settings-icon\" viewBox=\"0 -960 960 960\">\r\n                        <path fill=\"currentColor\" d=\"m370-80-16-128q-13-5-24.5-12T307-235l-119 50L78-375l103-78q-1-7-1-13.5v-27q0-6.5 1-13.5L78-585l110-190 119 50q11-8 23-15t24-12l16-128h220l16 128q13 5 24.5 12t22.5 15l119-50 110 190-103 78q1 7 1 13.5v27q0 6.5-2 13.5l103 78-110 190-118-50q-11 8-23 15t-24 12L590-80H370Zm112-260q58 0 99-41t41-99q0-58-41-99t-99-41q-59 0-99.5 41T342-480q0 58 40.5 99t99.5 41Z\"/>\r\n                    </svg>\r\n                    <div class=\"menu-box\" [ngClass]=\"isControlSettingsOpen ? '': 'hidden'\">\r\n                        <button stopClickPropagation class=\"loop-btn\" (click)=\"toggleLoop()\"\r\n                            [title]=\"isLoopingEnabled ? 'Looping one': loopPlaylist ? 'Looping all' : 'Looping off'\">\r\n                            <svg title=\"Loop off\" viewBox=\"0 0 24 24\" *ngIf=\"!loopPlaylist && !isLoopingEnabled\">\r\n                                <path fill=\"currentColor\" d=\"M2,5.27L3.28,4L20,20.72L18.73,22L15.73,19H7V22L3,18L7,14V17H13.73L7,10.27V11H5V8.27L2,5.27M17,13H19V17.18L17,15.18V13M17,5V2L21,6L17,10V7H8.82L6.82,5H17Z\" />\r\n                            </svg>\r\n                            <svg title=\"Loop one\" viewBox=\"0 0 48 48\" *ngIf=\"loopPlaylist && !isLoopingEnabled\">\r\n                                <path fill=\"currentColor\" d=\"m14 44-8-8 8-8 2.1 2.2-4.3 4.3H35v-8h3v11H11.8l4.3 4.3Zm-4-22.5v-11h26.2l-4.3-4.3L34 4l8 8-8 8-2.1-2.2 4.3-4.3H13v8Z\"/>\r\n                            </svg>\r\n                            <svg title=\"Loop all\" viewBox=\"0 0 48 48\" *ngIf=\"isLoopingEnabled\">\r\n                                <path fill=\"currentColor\" d=\"m14 44-8-8 8-8 2.1 2.2-4.3 4.3H35v-8h3v11H11.8l4.3 4.3Zm9.3-14.1v-9.45h-2.8V18h5.25v11.9ZM10 21.5v-11h26.2l-4.3-4.3L34 4l8 8-8 8-2.1-2.2 4.3-4.3H13v8Z\"/>\r\n                            </svg>\r\n                            <span>Loop {{isLoopingEnabled ? 'all': loopPlaylist ? 'one' : 'off'}}</span>\r\n                        </button>\r\n                        <button stopClickPropagation title=\"Change playback speed\" (click)=\"setPlaybackSpeed(video.playbackRate % 2 + .25)\"\r\n                            [disabled]=\"isCasting\">\r\n                            <span class=\"icon\">{{video.playbackRate}}x </span>\r\n                            <span>Speed</span>\r\n                        </button>\r\n                    </div>\r\n                </button>\r\n                <button class=\"mini-player-btn\" title=\"Miniplayer (i)\" (click)=\"togglePIP()\"\r\n                    [disabled]=\"media.duration === undefined || isCasting\">\r\n                    <svg viewBox=\"0 0 24 24\">\r\n                        <path fill=\"currentColor\" d=\"M21 3H3c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H3V5h18v14zm-10-7h9v6h-9z\" />\r\n                    </svg>\r\n                </button>\r\n                <button class=\"cast-screen-btn\" [title]=\"isCasting ? 'Stop casting' : 'Cast to screen'\"\r\n                    (click)=\"isCasting ? endCurrentSession(true) : castToChromecast()\">\r\n                    <svg class=\"\" viewBox=\"0 -960 960 960\" *ngIf=\"!isCasting\">\r\n                        <path fill=\"currentColor\" d=\"M480-480Zm320 320H600q0-20-1.5-40t-4.5-40h206v-480H160v46q-20-3-40-4.5T80-680v-40q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160Zm-720 0v-120q50 0 85 35t35 85H80Zm200 0q0-83-58.5-141.5T80-360v-80q117 0 198.5 81.5T360-160h-80Zm160 0q0-75-28.5-140.5t-77-114q-48.5-48.5-114-77T80-520v-80q91 0 171 34.5T391-471q60 60 94.5 140T520-160h-80Z\"/>\r\n                    </svg>\r\n                    <svg class=\"\" viewBox=\"0 -960 960 960\" *ngIf=\"isCasting\">\r\n                        <path fill=\"currentColor\" d=\"M720-320H575q-35-109-111.5-192T281-640h439v320ZM80-160v-120q50 0 85 35t35 85H80Zm200 0q0-83-58.5-141.5T80-360v-80q117 0 198.5 81.5T360-160h-80Zm160 0q0-75-28.5-140.5t-77-114q-48.5-48.5-114-77T80-520v-80q91 0 171 34.5T391-471q60 60 94.5 140T520-160h-80Zm360 0H600q0-20-1.5-40t-4.5-40h206v-480H160v46q-20-3-40-4.5T80-680v-40q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160Z\"/>\r\n                    </svg>\r\n                </button>\r\n                <button class=\"full-screen-btn\" [title]=\"isFullscreen ? 'Exit full screen (f)' : 'Full screen (f)'\"\r\n                    (click)=\"toggleFullscreen()\">\r\n                    <svg class=\"open\" viewBox=\"0 0 24 24\" *ngIf=\"!isFullscreen\">\r\n                        <path fill=\"currentColor\" d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\" />\r\n                    </svg>\r\n                    <svg class=\"close\" viewBox=\"0 0 24 24\" *ngIf=\"isFullscreen\">\r\n                        <path fill=\"currentColor\" d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\" />\r\n                    </svg>\r\n                </button>\r\n            </span>\r\n        </div>\r\n    </div>\r\n    <video #video [src]=\"media.src\" [loop]=\"isLoopingEnabled\" [poster]=\"media.poster\" [preload]=\"preload\" (onprogress)=\"isMediaLoading=true\"\r\n        (canplay)=\"isMediaLoading=false\" (loadeddata)=\"updateAfterVideoInfoLoaded()\" (timeupdate)=\"updateCurrentTime()\"\r\n        (click)=\"togglePlay()\" (playing)=\"onPlay($event)\" (pause)=\"onPause($event)\" (ended)=\"onEnd($event)\" (volumechange)=\"onVolumeChange($event)\"\r\n        (error)=\"onError($event)\">\r\n        <track kind=\"captions\" [srclang]=\"cc.lang\" [src]=\"cc.path\" *ngFor=\"let cc of captions\">\r\n    </video>\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { BrowserModule } from '@angular/platform-browser';\r\nimport { NgPlyrComponent } from './ng-plyr.component';\r\nimport { StopClickPropagationDirective } from './directive/stop-click-propagation.directive';\r\n\r\n@NgModule({\r\n  declarations: [\r\n    NgPlyrComponent,\r\n    StopClickPropagationDirective\r\n  ],\r\n  imports: [\r\n    BrowserModule\r\n  ],\r\n  exports: [\r\n    NgPlyrComponent\r\n  ]\r\n})\r\nexport class NgPlyrModule { }\r\n","/*\r\n * Public API Surface of ng-plyr\r\n */\r\n\r\nexport * from './lib/services/ng-plyr.service';\r\nexport * from './lib/services/cast.service';\r\nexport * from './lib/ng-plyr.module';\r\nexport * from './lib/ng-plyr.component';\r\nexport * from './lib/models/media.model';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Error","i1.PlayerService","i2.CastService","i4.StopClickPropagationDirective"],"mappings":"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"}