{"version":3,"file":"ngx-video-list-player.mjs","sources":["../../../projects/ngx-video-list-player/src/lib/Models/video-event-types.model.ts","../../../projects/ngx-video-list-player/src/lib/Constants/youtube-state.constant.ts","../../../projects/ngx-video-list-player/src/lib/Directives/stop-propagation.directive.ts","../../../projects/ngx-video-list-player/src/lib/Components/ngx-video-list-player.component.ts","../../../projects/ngx-video-list-player/src/lib/Components/ngx-video-list-player.component.html","../../../projects/ngx-video-list-player/src/lib/ngx-video-list-player.module.ts","../../../projects/ngx-video-list-player/src/public-api.ts","../../../projects/ngx-video-list-player/src/ngx-video-list-player.ts"],"sourcesContent":["export class VideoEventTypes {\r\n    public static readonly TimeUpdate = \"timeupdate\" \r\n    public static readonly LoadedMetadata  = \"loadedmetadata\" \r\n    public static readonly FullScreenChange = \"fullscreenchange\"\r\n    public static readonly Ended = \"ended\"\r\n    public static readonly LeavePictureInPicture = \"leavepictureinpicture\"\r\n    public static readonly EnterPictureInPicture = \"enterpictureinpicture\"\r\n    public static readonly Pause = \"pause\"\r\n    public static readonly Play = \"play\"\r\n    public static readonly CanPlay = \"canplay\"\r\n    public static readonly Error = \"error\"\r\n}","export class YoutubeStateConstant {\r\n    static Unstarted: number = -1;\r\n    static Ended: number = 0;\r\n    static Playing: number = 1;\r\n    static Paused: number = 2;\r\n    static Buffering: number = 3;\r\n    static VideoCued: number = 5;\r\n}","import { Directive, HostListener } from '@angular/core';\r\n\r\n@Directive({\r\n  selector: '[stopPropagation]'\r\n})\r\nexport class StopPropagationDirective {\r\n\r\n  @HostListener(\"click\", ['$event']) onClick(event: Event) {\r\n    if (event.stopPropagation) {\r\n      event.stopPropagation();\r\n    }\r\n    else if (window.event) {\r\n      window.event.cancelBubble = true;\r\n    }\r\n  }\r\n}\r\n","import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, HostListener, Input, OnDestroy, OnInit, Output, QueryList, Renderer2, ViewChild, ViewChildren } from '@angular/core';\r\nimport { VideoEventTypes } from '../Models/video-event-types.model';\r\nimport { } from '../Models/global.model';\r\nimport { IVideoConfig, IVideoSource } from '../Models/ngx-video-list-player.config';\r\nimport { YoutubeStateConstant } from '../Constants/youtube-state.constant';\r\nimport { IExtendedVideoSubtitle } from '../Models/custom.config';\r\nimport { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\r\nimport { EventEmitter } from '@angular/core';\r\nimport { YouTubePlayer } from '@angular/youtube-player';\r\n\r\n@Component({\r\n  selector: 'ngx-video-list-player',\r\n  templateUrl: 'ngx-video-list-player.component.html',\r\n  styleUrls: ['ngx-video-list-player.component.scss']\r\n})\r\nexport class NgxVideoListPlayerComponent implements AfterViewInit, OnInit, OnDestroy {\r\n\r\n    videoElement: HTMLVideoElement;\r\n    private mediaControlElement: HTMLElement;\r\n    actualVideo: IVideoSource;\r\n\r\n    @ViewChild('mediaVideo') video: ElementRef;\r\n    @ViewChild('mediaVideoSource') videoSource: ElementRef;\r\n    @ViewChild(\"progressContainer\") progressContainer: ElementRef;\r\n    @ViewChild(\"progressContainerHover\") progressContainerHover: ElementRef;\r\n    @ViewChildren(\"from_pause_to_play\") fromPauseToPlay: QueryList<ElementRef>;\r\n    @ViewChildren(\"from_play_to_pause\") fromPlayToPause: QueryList<ElementRef>;\r\n    @ViewChild(\"mediaPlayer\") mediaPlayer: ElementRef;\r\n    @ViewChild(\"mediaControlContainer\") mediaControlContainer: ElementRef;\r\n    @ViewChild(\"meter\") meterContainer: ElementRef;\r\n    @ViewChild(\"progressSlider\") progressSlider: ElementRef;\r\n    @ViewChild(\"videoTitleContainer\") videoTitleContainer: ElementRef;\r\n    @ViewChild(\"dropUpContent\") dropUpContent: ElementRef;\r\n    @ViewChild(\"videoListContainer\") videoListContainer: ElementRef;\r\n    @ViewChildren(\"videoListElement\") videoListElements: QueryList<ElementRef>;\r\n    @ViewChild(\"mobileDeviceMainPprContainer\") mobileDeviceMainPprContainer: ElementRef;\r\n    @ViewChild(\"subtitleModal\") subtitleModal: ElementRef;\r\n    @ViewChild('youtubePlayer', {static: true}) youtubePlayer: YT.Player;\r\n\r\n    @Input() config: IVideoConfig;\r\n    @Output() onTimeUpdate = new EventEmitter();\r\n    @Output() onCanPlay = new EventEmitter();\r\n    @Output() onLoadedMetadata = new EventEmitter();\r\n    \r\n    private visibleMobileDeviceMainPprContainer: boolean = false;\r\n    private disableControlHide: boolean = false;\r\n    private displayControlsTimeout: NodeJS.Timeout;\r\n    private countDownCircleTimeout: NodeJS.Timeout;\r\n    private youtubeCurrentTimeInterval: NodeJS.Timeout;\r\n    private mediaPlayerIsFocused: boolean = false;\r\n    private actualVideoIndex: number = 0;\r\n    private firstSourceLoad: boolean = false;\r\n    private firstVideoLoad: boolean = true;\r\n    private pauseKeyboardCodes: string[] = [\"Space\"];\r\n\r\n    subtitles: IExtendedVideoSubtitle[];\r\n    videoName: string;\r\n    currentTime: string = \"0:00\";\r\n    duration: string = \"0:00\";\r\n    isFullScreen: boolean = false;\r\n    volumePercent: number = 100;\r\n    muted: boolean = false;\r\n    progressSliderMaxValue: number = 100000;\r\n    progressSliderValue: number = 0;\r\n    pipIsActive: boolean = false;\r\n    supportPictureInPicture = 'pictureInPictureEnabled' in document && document.pictureInPictureEnabled;\r\n    supportFullScreen = 'fullscreenEnabled' in document && document.fullscreenEnabled;\r\n    canPlay?: boolean;\r\n    videoType: string;\r\n    actualSubtitleId: string;\r\n    isMobileDevice = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\r\n    youtubeIsPaused: boolean = false;\r\n    youtubeIsEnded: boolean = false;\r\n\r\n    //Safari does not trigger CanPlay event\r\n    isSafariBrowser: boolean = navigator.userAgent.toLowerCase().indexOf(\"safari\") != -1 && navigator.userAgent.toLowerCase().indexOf(\"chrome\") == -1;\r\n\r\n    constructor(private renderer: Renderer2, \r\n        private breakpointObserver: BreakpointObserver,\r\n        private changeDetectorRef: ChangeDetectorRef) {\r\n              \r\n    }\r\n\r\n    ngOnInit():void {        \r\n        if(!this.config.isAutoPlay)\r\n            this.config.isAutoPlay = false;\r\n\r\n        if(!this.config.isFirstVideoAutoPlay)\r\n            this.config.isFirstVideoAutoPlay = false;\r\n\r\n        if(this.config.volumeCookieName) {\r\n            const volumeCookieValue = document.cookie\r\n                .split('; ')\r\n                .find(row => row.startsWith(`${this.config.volumeCookieName}=`));\r\n\r\n            if(volumeCookieValue) {\r\n                this.volumePercent = parseInt(volumeCookieValue.split('=')[1]);\r\n                if(this.volumePercent < 0)\r\n                    this.volumePercent = 0;\r\n                else if(this.volumePercent > 100)\r\n                    this.volumePercent = 100;\r\n            }\r\n        }\r\n\r\n        if(this.config.videoIndexCookieName) {\r\n            const videoIndexCookieValue = document.cookie\r\n                .split('; ')\r\n                .find(row => row.startsWith(`${this.config.videoIndexCookieName}=`));\r\n                \r\n            if(videoIndexCookieValue)\r\n                this.actualVideoIndex = parseInt(videoIndexCookieValue.split('=')[1]);\r\n        }\r\n    }\r\n\r\n    ngAfterViewInit():void {\r\n        this.videoElement = this.video.nativeElement as HTMLVideoElement;\r\n\r\n        if(isNaN(this.actualVideoIndex) ||  this.actualVideoIndex > this.config.sources.length - 1 || this.actualVideoIndex < 0)\r\n            this.actualVideoIndex = 0;\r\n        \r\n        this.setVideoIndexCookie();\r\n\r\n        this.loadVideo();\r\n        this.changeDetectorRef.detectChanges();\r\n\r\n        this.videoElement.controls = false;\r\n        this.videoElement.ontimeupdate = (this.videoEventHandler.bind(this));\r\n        this.videoElement.onloadedmetadata = (this.videoEventHandler.bind(this));\r\n        this.videoElement.onended = this.videoEventHandler.bind(this);\r\n        this.videoElement.onleavepictureinpicture = this.videoEventHandler.bind(this);\r\n        this.videoElement.onenterpictureinpicture = this.videoEventHandler.bind(this);\r\n        this.videoElement.onpause = this.videoEventHandler.bind(this);\r\n        this.videoElement.onplay = this.videoEventHandler.bind(this);\r\n        this.videoElement.oncanplay = this.videoEventHandler.bind(this);\r\n        this.videoElement.onerror = this.videoEventHandler.bind(this);\r\n        (this.videoSource.nativeElement as HTMLSourceElement).onerror = this.videoEventHandler.bind(this);\r\n        this.mediaControlElement = this.mediaPlayer.nativeElement as HTMLElement;\r\n        this.mediaControlElement.onfullscreenchange = this.videoEventHandler.bind(this);\r\n        this.setVolumeValue(this.volumePercent);\r\n\r\n        this.breakpointObserver.observe([Breakpoints.XSmall, Breakpoints.Small]).subscribe(result => {\r\n            if(this.config.videoListDisplayMode) {\r\n                switch(this.config.videoListDisplayMode) {\r\n                    case \"inline\": \r\n                        this.renderer.addClass(this.mediaPlayer.nativeElement, \"custom-col-8\");\r\n                        this.renderer.addClass(this.videoListContainer.nativeElement, \"custom-col-4\");\r\n                        this.renderer.removeClass(this.mediaPlayer.nativeElement, \"custom-col-12\");\r\n                        this.renderer.removeClass(this.videoListContainer.nativeElement, \"custom-col-12\");\r\n                        break;\r\n                    case \"block\":\r\n                        this.renderer.addClass(this.mediaPlayer.nativeElement, \"custom-col-12\");\r\n                        this.renderer.addClass(this.videoListContainer.nativeElement, \"custom-col-12\");\r\n                        this.renderer.removeClass(this.mediaPlayer.nativeElement, \"custom-col-8\");\r\n                        this.renderer.removeClass(this.videoListContainer.nativeElement, \"custom-col-4\");\r\n                        break;\r\n                    case \"none\": \r\n                        this.renderer.setStyle(this.videoListContainer.nativeElement, \"display\", \"none\");\r\n                        this.renderer.removeClass(this.mediaPlayer.nativeElement, \"custom-col-8\");\r\n                        this.renderer.addClass(this.mediaPlayer.nativeElement, \"custom-col-12\");\r\n                        break;\r\n                }\r\n                return;\r\n            }\r\n            if (result.matches) {\r\n                this.renderer.removeClass(this.mediaPlayer.nativeElement, \"custom-col-8\");\r\n                this.renderer.removeClass(this.videoListContainer.nativeElement, \"custom-col-4\");\r\n                this.renderer.addClass(this.mediaPlayer.nativeElement, \"custom-col-12\");\r\n                this.renderer.addClass(this.videoListContainer.nativeElement, \"custom-col-12\");\r\n            } else {\r\n                this.renderer.addClass(this.mediaPlayer.nativeElement, \"custom-col-8\");\r\n                this.renderer.addClass(this.videoListContainer.nativeElement, \"custom-col-4\");\r\n                this.renderer.removeClass(this.mediaPlayer.nativeElement, \"custom-col-12\");\r\n                this.renderer.removeClass(this.videoListContainer.nativeElement, \"custom-col-12\");\r\n            }\r\n            this.resizeVideoListContainer();\r\n        })\r\n    }\r\n\r\n    videoEventHandler(ev: Event):void {\r\n        if(this.actualVideo.isYoutubeVideo && ev.type != VideoEventTypes.FullScreenChange)\r\n            return;\r\n            \r\n        switch(ev.type){\r\n            case VideoEventTypes.TimeUpdate: \r\n                if(!this.videoElement.duration)\r\n                {\r\n                    this.onTimeUpdate.emit();\r\n                    return;\r\n                }\r\n                \r\n                this.timeUpdateEvent();\r\n                break;\r\n            case VideoEventTypes.LoadedMetadata: \r\n                this.loadMetadataEvent();\r\n                break;\r\n            case VideoEventTypes.FullScreenChange:\r\n                this.isFullScreen = !!document.fullscreenElement;\r\n                break;\r\n            case VideoEventTypes.Ended: \r\n                this.endEvent(true);\r\n                break;\r\n            case VideoEventTypes.LeavePictureInPicture:\r\n                this.pipIsActive = false;\r\n                this.mediaPlayerMouseLeave();\r\n                //Not refresh pip Svg automatic after close in pause state\r\n                this.changeDetectorRef.detectChanges();\r\n                //setTimeout is beacuse of exitPiP pause\r\n                setTimeout(() => {\r\n                    if (this.actualVideo.isYoutubeVideo ? this.youtubePlayer.getPlayerState() == YoutubeStateConstant.Ended : this.videoElement.ended) {\r\n                        this.endEvent(false);\r\n                    }\r\n                }, 1);\r\n                break;\r\n            case VideoEventTypes.EnterPictureInPicture: \r\n                this.pipIsActive = true;\r\n                this.mediaPlayerMouseMove();\r\n                this.clearMobileDeviceMainPprContainerStyles();\r\n                break;\r\n            case VideoEventTypes.Play: \r\n                this.playEvent();\r\n                break;\r\n            case VideoEventTypes.Pause: \r\n                this.pauseEvent();\r\n                break;\r\n            case VideoEventTypes.CanPlay: \r\n                this.canPlayEvent();\r\n                this.onCanPlay.emit();\r\n                break;\r\n            case VideoEventTypes.Error:                 \r\n                this.videoLoadErrorHandling();\r\n                break;\r\n        }\r\n    }    \r\n\r\n    private videoLoadErrorHandling() {\r\n        this.resizeVideoListContainer();\r\n        this.canPlay = false;\r\n        this.firstSourceLoad = false;\r\n        this.firstVideoLoad = false;\r\n        if(this.isNextVideo()) {\r\n            this.clearCountDownCircleTimeout();\r\n            this.countDownCircleTimeout = setTimeout(() => {\r\n                this.next();\r\n            }, 5000);\r\n        }\r\n    }\r\n\r\n    private canPlayEvent() {\r\n        this.resizeVideoListContainer();\r\n        this.canPlay = true;  \r\n        if(this.firstVideoLoad && this.config.isFirstVideoAutoPlay) {\r\n            this.mute();\r\n            this.playPause();\r\n        }  \r\n        else if(!this.firstVideoLoad && this.firstSourceLoad && this.config.isAutoPlay) {\r\n            this.playPause();\r\n        }\r\n        this.firstSourceLoad = false;\r\n        this.firstVideoLoad = false;\r\n    }\r\n\r\n    private endEvent(isNextEvent: boolean): void{\r\n        if(isNextEvent) {\r\n            if(this.isNextVideo() && this.config.isAutoPlay) {\r\n                this.clearCountDownCircleTimeout();\r\n                this.countDownCircleTimeout = setTimeout(() => {\r\n                    this.next();\r\n                }, 5000);\r\n            }\r\n        }\r\n        this.fromPlayToPause.forEach(element => {\r\n            element.nativeElement.beginElement();            \r\n        });\r\n\r\n        if(this.actualVideo != null && this.actualVideo.isYoutubeVideo)\r\n            this.youtubeIsEnded = true;\r\n    }\r\n\r\n    async pipEnter():Promise<void> {\r\n        if(!this.canPlay)\r\n            return;\r\n\r\n        await this.videoElement.requestPictureInPicture();\r\n    }\r\n\r\n    async pipExit():Promise<void> {\r\n        await document.exitPictureInPicture();\r\n    }\r\n\r\n    private playEvent():void {\r\n        this.fromPauseToPlay.forEach(element => {\r\n            element.nativeElement.beginElement();            \r\n        });\r\n        this.mediaPlayerMouseLeave();  \r\n        if(this.actualVideo != null && this.actualVideo.isYoutubeVideo)\r\n            this.youtubeIsPaused = false;\r\n    }\r\n\r\n    private pauseEvent():void {\r\n        this.fromPlayToPause.forEach(element => {\r\n            element.nativeElement.beginElement();            \r\n        });\r\n        this.mediaPlayerMouseMove();\r\n        this.clearMobileDeviceMainPprContainerStyles();\r\n        if(this.actualVideo != null && this.actualVideo.isYoutubeVideo)\r\n            this.youtubeIsPaused = true;\r\n    }\r\n    \r\n    private clearMobileDeviceMainPprContainerStyles() {\r\n        if(this.mobileDeviceMainPprContainer) {\r\n            this.visibleMobileDeviceMainPprContainer = true;\r\n            this.renderer.removeStyle(this.mobileDeviceMainPprContainer.nativeElement, \"visibility\");\r\n            this.renderer.removeStyle(this.mobileDeviceMainPprContainer.nativeElement, \"opacity\");\r\n        }\r\n    }\r\n\r\n    playPause():void {   \r\n        if(!this.canPlay)\r\n            return;\r\n        \r\n        this.clearCountDownCircleTimeout();\r\n\r\n        if(this.actualVideo.isYoutubeVideo) {\r\n            var youtubeState = this.youtubePlayer.getPlayerState();\r\n            this.youtubeIsEnded = false;\r\n            if(youtubeState != YoutubeStateConstant.Playing)\r\n            {\r\n                this.youtubePlayer.playVideo();\r\n                this.youtubeIsPaused = false;\r\n            }\r\n            else\r\n            {\r\n                this.youtubePlayer.pauseVideo();\r\n                this.youtubeIsPaused = true;\r\n            }\r\n        }\r\n        else {\r\n            if(this.videoElement.paused || this.videoElement.ended) {\r\n                this.videoElement.play();\r\n            }\r\n            else{\r\n                this.videoElement.pause();       \r\n            }\r\n        }\r\n        \r\n    }\r\n\r\n    fullScreen():void {\r\n        if (this.mediaControlElement.requestFullscreen) {\r\n            this.mediaControlElement.requestFullscreen();\r\n        } else if (this.mediaControlElement.webkitRequestFullscreen) { /* Safari */\r\n            this.mediaControlElement.webkitRequestFullscreen();\r\n        } else if (this.mediaControlElement.msRequestFullscreen) { /* IE11 */            \r\n            this.mediaControlElement.msRequestFullscreen();\r\n        } else if (this.mediaControlElement.mozRequestFullscreen) {\r\n            this.mediaControlElement.mozRequestFullscreen();\r\n        } else if(this.videoElement.webkitEnterFullscreen)\r\n            this.videoElement.webkitEnterFullscreen();\r\n\r\n        if(this.actualVideo.isYoutubeVideo)\r\n            this.isFullScreen = true;\r\n    }\r\n\r\n    exitFullScreen():void {\r\n        if (document.exitFullscreen) {\r\n            document.exitFullscreen();\r\n        } else if (document.webkitExitFullscreen) { /* Safari */\r\n            document.webkitExitFullscreen();\r\n        } else if (document.msExitFullscreen) { /* IE11 */\r\n            document.msExitFullscreen();\r\n        } else if (document.mozCancelFullScreen) {\r\n            document.mozCancelFullScreen();\r\n        }\r\n\r\n        if(this.actualVideo.isYoutubeVideo)\r\n            this.isFullScreen = false;\r\n    }\r\n\r\n    isNextVideo(): boolean {\r\n        return this.actualVideoIndex < this.config.sources.length - 1;\r\n    }\r\n\r\n    \r\n    next(): void {\r\n        this.actualVideoIndex += 1;\r\n        this.loadVideo();\r\n    }\r\n\r\n    prev(): void {\r\n        if(this.actualVideoIndex == 0) {\r\n            this.clearCountDownCircleTimeout();\r\n\r\n            this.videoElement.currentTime = 0;\r\n            if(!this.videoElement.paused)\r\n                this.playPause();\r\n        }\r\n        else {\r\n            this.actualVideoIndex -= 1;\r\n            this.loadVideo();\r\n        }\r\n    }\r\n\r\n    private loadMetadataEvent() {\r\n        const duration = this.actualVideo.isYoutubeVideo ? this.youtubePlayer.getDuration() :  this.videoElement.duration;\r\n        if(duration == 0)\r\n            this.duration = \"0:00\"\r\n        else\r\n            this.duration = `${Math.floor(duration / 60)}:${Math.floor(duration % 60).toLocaleString(\"en-US\", { minimumIntegerDigits: 2 })}`;\r\n\r\n        this.firstSourceLoad = true;\r\n        this.supportFullScreen ||= this.videoElement.webkitSupportsFullscreen;\r\n        if(this.isSafariBrowser)\r\n        {\r\n            this.canPlayEvent();\r\n            this.onCanPlay.emit();\r\n        }\r\n\r\n        this.onLoadedMetadata.emit();\r\n    }\r\n\r\n    private timeUpdateEvent() {\r\n        try {\r\n            const duration = this.actualVideo.isYoutubeVideo ? this.youtubePlayer.getDuration() :  this.videoElement.duration;\r\n            let currentTime = this.actualVideo.isYoutubeVideo ? this.youtubePlayer.getCurrentTime() :  this.videoElement.currentTime;\r\n            if(!currentTime)\r\n                currentTime = 0;\r\n    \r\n            let percentage = (100 / duration) * currentTime;\r\n            if(isNaN(percentage))\r\n                percentage = 0;\r\n\r\n            this.renderer.setStyle(this.progressContainer.nativeElement, \"width\", `${percentage}%`);\r\n            if(currentTime == 0)\r\n                this.currentTime = `0:00`;\r\n            else\r\n                this.currentTime = `${Math.floor(currentTime / 60)}:${Math.floor(currentTime % 60).toLocaleString(\"en-US\", { minimumIntegerDigits: 2 })}`;\r\n    \r\n            this.progressSliderValue = percentage * (this.progressSliderMaxValue / 100);\r\n            this.onTimeUpdate.emit();\r\n        }\r\n        catch { \r\n            const percentage = 0;\r\n            this.renderer.setStyle(this.progressContainer.nativeElement, \"width\", `${percentage}%`);\r\n            this.currentTime = `0:00`;\r\n            this.progressSliderValue = percentage * (this.progressSliderMaxValue / 100);\r\n            this.onTimeUpdate.emit();\r\n        }\r\n    }\r\n\r\n    private onReadyYoutubeVideo() {\r\n        if(!this.actualVideo.isYoutubeVideo)\r\n            return;\r\n\r\n        this.setVolumeValue(this.volumePercent);\r\n        this.loadMetadataEvent();\r\n        this.canPlayEvent();\r\n        this.onCanPlay.emit();\r\n    }\r\n\r\n    private onStateChangeYoutubeVideo(event) {\r\n        if(!this.actualVideo.isYoutubeVideo)\r\n            return;\r\n\r\n        switch (event.data) {\r\n            case YoutubeStateConstant.Ended: \r\n                this.endEvent(true); \r\n                this.clearYoutubeCurrentTimeInterval();\r\n                break;\r\n            case YoutubeStateConstant.Playing: \r\n                this.playEvent(); \r\n                this.loadMetadataEvent(); \r\n                this.clearYoutubeCurrentTimeInterval();\r\n                this.youtubeCurrentTimeInterval = setInterval(() => {\r\n                    this.timeUpdateEvent();\r\n                }, 100);\r\n                break;\r\n            case YoutubeStateConstant.Paused: \r\n                this.pauseEvent(); \r\n                this.clearYoutubeCurrentTimeInterval();\r\n                break;\r\n            case YoutubeStateConstant.VideoCued: \r\n                this.onReadyYoutubeVideo();\r\n                break;\r\n        }\r\n\r\n    }\r\n\r\n    private async loadVideo(index?: number, tryNumber: number = 1): Promise<void> {\r\n        if(index >= 0)\r\n            this.actualVideoIndex = index;\r\n\r\n        const videoElement = this.videoListElements.find((element, index) => index == this.actualVideoIndex);\r\n        this.videoListContainer.nativeElement.scroll({\r\n            top: videoElement.nativeElement.offsetTop - this.videoListContainer.nativeElement.offsetTop - videoElement.nativeElement.offsetHeight,\r\n            left: 0,\r\n            behavior: 'smooth'\r\n        });\r\n\r\n        this.clearCountDownCircleTimeout();\r\n\r\n        this.setVideoIndexCookie();\r\n\r\n        this.pauseEvent();\r\n        \r\n        this.canPlay = null;\r\n        this.videoElement.currentTime = 0;\r\n        this.progressSliderValue = 0;\r\n        this.renderer.setStyle(this.progressContainerHover.nativeElement, \"width\", `0%`);\r\n        this.renderer.setStyle(this.progressContainer.nativeElement, \"width\", `0%`);\r\n        this.currentTime = \"0:00\"\r\n\r\n        this.actualVideo = this.config.sources[this.actualVideoIndex];\r\n        this.clearYoutubeCurrentTimeInterval();\r\n\r\n        if(this.actualVideo.isYoutubeVideo) {\r\n            if(this.pipIsActive)\r\n                await document.exitPictureInPicture();\r\n\r\n            if(this.youtubePlayer instanceof YouTubePlayer) {\r\n                try {\r\n                    this.youtubePlayer = new YT.Player('youtubePlayer', {\r\n                        videoId: this.actualVideo.src,\r\n                        height: \"100%\",\r\n                        width: \"100%\",\r\n                        playerVars: { 'autoplay': 0, 'controls': 0, 'autohide': 1, 'disablekb': 1, 'showinfo': 0, 'iv_load_policy': 3, 'loop': 1, 'modestbranding': 1, 'playsinline': 0, 'rel': 0 },\r\n                        events: {\r\n                            'onReady': this.onReadyYoutubeVideo.bind(this),\r\n                            'onStateChange': this.onStateChangeYoutubeVideo.bind(this),\r\n                            'onError': (e) => { \r\n                                if(tryNumber >= 4)\r\n                                {\r\n                                    this.videoLoadErrorHandling.bind(this)();\r\n                                }\r\n                                else {\r\n                                    setTimeout(() => {                                    \r\n                                        this.loadVideo(index, ++tryNumber);\r\n                                    }, 1000);\r\n                                }\r\n                            }\r\n                        }\r\n                    });\r\n                }\r\n                catch {\r\n                    if(tryNumber >= 4)\r\n                        this.videoLoadErrorHandling()\r\n                    else {\r\n                        setTimeout(() => {                                    \r\n                            this.loadVideo(index, ++tryNumber);\r\n                        }, 1000);\r\n                        return;\r\n                    }\r\n                }\r\n            }\r\n            else {\r\n                this.youtubePlayer.loadVideoById(this.actualVideo.src, 0);\r\n                this.youtubePlayer.stopVideo();\r\n            }\r\n            this.subtitles = [];\r\n            this.videoElement.pause();\r\n\r\n            setTimeout(() => {                \r\n                this.youtubeIsEnded = false;\r\n                this.youtubeIsPaused = false;\r\n            }, 150);\r\n        }\r\n        else {\r\n            if(!(this.youtubePlayer instanceof YouTubePlayer))\r\n            {\r\n                this.youtubePlayer.stopVideo();\r\n            }\r\n\r\n            this.videoName = this.actualVideo.videoName;\r\n            this.videoElement.src = this.actualVideo.src;\r\n            this.videoType = this.actualVideo.type;\r\n            this.subtitles = [];\r\n    \r\n            if(this.actualVideo.subtitles) {\r\n                this.subtitles = this.actualVideo.subtitles.map(item => ({\r\n                    src: item.src,\r\n                    name: item.name,\r\n                    default: item.default,\r\n                    id: `video_vtt_${this.actualVideo.subtitles.indexOf(item)}`\r\n                }));\r\n            }\r\n    \r\n            var defaultSubtitle = this.subtitles.find(item => item.default);\r\n            if(defaultSubtitle)\r\n                this.actualSubtitleId = defaultSubtitle.id;\r\n            else\r\n                this.actualSubtitleId = null;\r\n        }\r\n    }\r\n\r\n    private clearYoutubeCurrentTimeInterval(): void {\r\n        if(this.youtubeCurrentTimeInterval)\r\n            clearInterval(this.youtubeCurrentTimeInterval);\r\n    }\r\n\r\n    private clearCountDownCircleTimeout():void {        \r\n        if(this.countDownCircleTimeout)\r\n            clearTimeout(this.countDownCircleTimeout);\r\n    }\r\n\r\n    mute():void {\r\n        if(this.actualVideo.isYoutubeVideo) {\r\n            this.youtubePlayer.isMuted() ? this.youtubePlayer.unMute() : this.youtubePlayer.mute();\r\n        }\r\n        else {\r\n            this.videoElement.muted = !this.videoElement.muted;\r\n        }\r\n\r\n        this.muted = !this.muted;\r\n\r\n        if(this.muted){\r\n            this.volumePercent = 0;\r\n        }\r\n        else{\r\n            this.volumePercent = this.actualVideo.isYoutubeVideo ? this.youtubePlayer.getVolume() : this.videoElement.volume * 100;\r\n        }\r\n    }\r\n\r\n    setVolume(event: Event):void {\r\n        if(this.actualVideo.isYoutubeVideo) {\r\n            this.youtubePlayer.unMute();\r\n        }\r\n        else {\r\n            this.videoElement.muted = false;\r\n        }\r\n\r\n        this.muted = false;\r\n        const percentage = parseInt((event.target as HTMLInputElement).value);\r\n\r\n        if(this.config.volumeCookieName)\r\n            document.cookie = `${this.config.volumeCookieName}=${percentage}`;\r\n\r\n        this.setVolumeValue(percentage);\r\n        this.volumePercent = percentage;\r\n    }\r\n\r\n    private setVolumeValue(percentage):void  {\r\n        try {\r\n            if(this.actualVideo.isYoutubeVideo)\r\n                this.youtubePlayer.setVolume(percentage);\r\n            else\r\n                this.videoElement.volume = percentage / 100;\r\n        }\r\n        catch {}\r\n    }\r\n\r\n    private setVideoIndexCookie():void  {\r\n        if(this.config.videoIndexCookieName)\r\n            document.cookie = `${this.config.videoIndexCookieName}=${this.actualVideoIndex}`;\r\n    }\r\n\r\n    progressHelperMouseMove(event):void {\r\n        if(!this.canPlay)\r\n            return;\r\n\r\n        const hoverPercent = event.offsetX / event.srcElement.offsetWidth * 100;\r\n        this.renderer.setStyle(this.progressContainerHover.nativeElement, \"width\", `${hoverPercent}%`);\r\n        this.renderer.setStyle(this.mediaControlContainer.nativeElement, \"height\", \"50px\");\r\n        this.renderer.setStyle(this.meterContainer.nativeElement, \"height\", \"6px\");\r\n        this.renderer.setStyle(this.progressSlider.nativeElement, \"display\", \"inline-block\");\r\n    }\r\n\r\n    mediaPlayerMouseMove():void {\r\n        if(!this.canPlay)\r\n            return;\r\n\r\n        if(this.videoTitleContainer)\r\n            this.renderer.removeStyle(this.videoTitleContainer.nativeElement, \"opacity\")\r\n\r\n        this.renderer.removeStyle(this.mediaControlContainer.nativeElement, \"opacity\")\r\n        this.renderer.removeStyle(this.mediaControlContainer.nativeElement, \"visibility\")\r\n        this.renderer.removeStyle(this.meterContainer.nativeElement, \"opacity\")\r\n        this.renderer.removeStyle(this.mediaPlayer.nativeElement, \"cursor\")        \r\n        if(this.mobileDeviceMainPprContainer) {\r\n            this.visibleMobileDeviceMainPprContainer = true;\r\n            this.renderer.removeStyle(this.mobileDeviceMainPprContainer.nativeElement, \"visibility\");\r\n            this.renderer.removeStyle(this.mobileDeviceMainPprContainer.nativeElement, \"opacity\");\r\n        }\r\n\r\n        if((!this.actualVideo.isYoutubeVideo && !this.videoElement.paused && !this.videoElement.ended || this.actualVideo.isYoutubeVideo && !this.youtubeIsPaused && !this.youtubeIsEnded) \r\n            && !this.disableControlHide && !this.pipIsActive) {\r\n            if(this.displayControlsTimeout) {\r\n                clearTimeout(this.displayControlsTimeout);\r\n            }\r\n            this.displayControlsTimeout = setTimeout(() =>{ this.mediaPlayerMouseLeave() }, 3000);\r\n        }\r\n    }\r\n\r\n    mediaPlayerMouseLeave():void {\r\n        if((!this.actualVideo.isYoutubeVideo && !this.videoElement.paused && !this.videoElement.ended || this.actualVideo.isYoutubeVideo && !this.youtubeIsPaused && !this.youtubeIsEnded)\r\n            && !this.disableControlHide && !this.pipIsActive) {\r\n            if(!this.isMobileDevice)\r\n                this.openSubtitles(true);\r\n\r\n            this.renderer.setStyle(this.mediaPlayer.nativeElement, \"cursor\", `none`)\r\n            this.renderer.setStyle(this.mediaControlContainer.nativeElement, \"opacity\", `0`)\r\n            this.renderer.setStyle(this.mediaControlContainer.nativeElement, \"visibility\", \"hidden\");\r\n            this.renderer.setStyle(this.meterContainer.nativeElement, \"opacity\", `0`)\r\n            \r\n            if(this.videoTitleContainer)\r\n                this.renderer.setStyle(this.videoTitleContainer.nativeElement, \"opacity\", \"0\")\r\n\r\n            if(this.mobileDeviceMainPprContainer) {\r\n                this.visibleMobileDeviceMainPprContainer = false;\r\n                this.renderer.setStyle(this.mobileDeviceMainPprContainer.nativeElement, \"visibility\", \"hidden\");\r\n                this.renderer.setStyle(this.mobileDeviceMainPprContainer.nativeElement, \"opacity\", \"0\");\r\n            }\r\n        }\r\n    }\r\n\r\n    mediaPlayerFocus():void {\r\n        this.mediaPlayerIsFocused = true;\r\n    }\r\n\r\n    mediaPlayerFocusOut():void {\r\n        this.mediaPlayerIsFocused = false;        \r\n    }\r\n\r\n    @HostListener('document:keypress', ['$event'])\r\n    handleDocumentKeyboardEvent(event: KeyboardEvent):void { \r\n        if(this.pauseKeyboardCodes.find(item => item == event.code) && this.mediaPlayerIsFocused)\r\n            this.playPause();\r\n    }\r\n\r\n    @HostListener('document:click', ['$event'])\r\n    handleDocumentClickEvent(event: MouseEvent):void { \r\n        this.openSubtitles(true);\r\n    }\r\n\r\n    @HostListener('window:resize', ['$event'])\r\n    handleDocumentResizeEvent(event: MouseEvent):void { \r\n        this.resizeVideoListContainer();\r\n    }\r\n\r\n    private resizeVideoListContainer() {\r\n        const mediaPlayerHeight = this.mediaPlayer.nativeElement.offsetHeight;\r\n        this.renderer.setStyle(this.videoListContainer.nativeElement, \"height\", `${mediaPlayerHeight}px`)\r\n    }\r\n\r\n    mediaControlContainerMouseEnter():void {\r\n        if(this.isMobileDevice)\r\n            return;\r\n\r\n        this.disableControlHide = true;\r\n    }\r\n\r\n    mediaControlContainerMouseLeave():void {\r\n        if(this.isMobileDevice)\r\n            return;\r\n\r\n        this.disableControlHide = false;\r\n    }\r\n\r\n    //Value range [0..this.progressSliderMaxValue]\r\n    setProgressSlider(value):void {\r\n        const duration = this.actualVideo.isYoutubeVideo ? this.youtubePlayer.getDuration() : this.videoElement.duration;\r\n        const currentTime = duration * value / this.progressSliderMaxValue;;\r\n        if(this.actualVideo.isYoutubeVideo) {\r\n            var playerState = this.youtubePlayer.getPlayerState();\r\n            if(playerState == YoutubeStateConstant.VideoCued) {\r\n                this.youtubePlayer.loadVideoById(this.actualVideo.src, currentTime);\r\n            }\r\n            else\r\n                this.youtubePlayer.seekTo(currentTime, true);\r\n        }\r\n        else {\r\n            this.videoElement.currentTime = currentTime;\r\n        }\r\n\r\n        this.clearCountDownCircleTimeout();\r\n    }\r\n\r\n    progressThumbMouseMove(event: MouseEvent):void {\r\n        if(!this.canPlay)\r\n            return;\r\n\r\n        this.renderer.setStyle(this.mediaControlContainer.nativeElement, \"height\", \"50px\");\r\n        this.renderer.setStyle(this.meterContainer.nativeElement, \"height\", \"6px\");\r\n        const percentage = (event.offsetX / (event.target as HTMLInputElement).clientWidth) * 100;\r\n        if(percentage >= 0 && percentage <= 100)\r\n            this.renderer.setStyle(this.progressContainerHover.nativeElement, \"width\", `${percentage}%`);\r\n    }\r\n\r\n    progressThumbMouseLeave():void {\r\n        this.renderer.removeStyle(this.mediaControlContainer.nativeElement, \"height\");\r\n        this.renderer.removeStyle(this.meterContainer.nativeElement, \"height\");\r\n        this.renderer.removeStyle(this.progressContainerHover.nativeElement, \"width\");\r\n        this.renderer.removeStyle(this.progressSlider.nativeElement, \"display\");\r\n    }\r\n\r\n    openSubtitles(instantHide: boolean = false):void {\r\n        \r\n        if(this.isMobileDevice) \r\n        {\r\n            if(!this.subtitleModal)\r\n                return;\r\n\r\n            if(instantHide || this.subtitleModal.nativeElement.classList.contains('show'))\r\n                this.renderer.removeClass(this.subtitleModal.nativeElement, \"show\");\r\n            else\r\n                this.renderer.addClass(this.subtitleModal.nativeElement, \"show\");\r\n        }\r\n        else \r\n        {\r\n            if(!this.dropUpContent)\r\n                return;\r\n\r\n            if(instantHide || this.dropUpContent.nativeElement.classList.contains('show'))\r\n                this.renderer.removeClass(this.dropUpContent.nativeElement, \"show\");\r\n            else\r\n                this.renderer.addClass(this.dropUpContent.nativeElement, \"show\");        \r\n        }\r\n\r\n    }\r\n\r\n    setSubtitle(id: string):void {\r\n        this.actualSubtitleId = id;\r\n\r\n        for(var i = 0; i < this.videoElement.textTracks.length; i++) {\r\n            this.videoElement.textTracks[i].mode = \"disabled\";\r\n        }\r\n        \r\n        if(id) {\r\n            this.videoElement.textTracks.getTrackById(id).mode = \"showing\";\r\n        }\r\n    }\r\n\r\n    videoClickEvent():void {\r\n        if(this.isMobileDevice)\r\n        {\r\n            if(this.visibleMobileDeviceMainPprContainer){\r\n                this.mediaPlayerMouseLeave();\r\n            }\r\n            else {\r\n                this.renderer.removeStyle(this.mobileDeviceMainPprContainer.nativeElement, \"visibility\");\r\n                this.renderer.removeStyle(this.mobileDeviceMainPprContainer.nativeElement, \"opacity\");\r\n                this.visibleMobileDeviceMainPprContainer = true;\r\n            }\r\n        }\r\n        else{\r\n            this.playPause();\r\n        }\r\n    }\r\n\r\n    emptyVoid(): void {\r\n\r\n    }\r\n\r\n    ngOnDestroy() {\r\n        this.clearYoutubeCurrentTimeInterval();\r\n    }\r\n}\r\n","<div class=\"video-main-container\">\r\n  <div *ngIf=\"isMobileDevice && subtitles && subtitles.length > 0\" class=\"subtitle-modal\" #subtitleModal>\r\n    <div stopPropagation class=\"modal-content\">\r\n      <!-- <span class=\"close\" (click)=\"closeSubtitleModal()\">&times;</span> -->\r\n      <div class=\"modal-title\">\r\n        {{ config.subtitleText || 'Subtitles' }}\r\n      </div>\r\n      <div class=\"modal-container\">\r\n        <div [ngClass]=\"{'active': !actualSubtitleId}\" (click)=\"setSubtitle()\">\r\n            {{ config.subtitleOffText || 'Off' }}\r\n        </div>\r\n        <div *ngFor=\"let subtitle of subtitles\" [ngClass]=\"{ 'active': actualSubtitleId == subtitle.id }\" (click)=\"setSubtitle(subtitle.id)\">\r\n          {{ subtitle.name }}\r\n        </div>\r\n      </div>\r\n      <div class=\"close-button-container\">\r\n          <button class=\"close-button\" (click)=\"openSubtitles(true)\">Ok</button>\r\n      </div>\r\n    </div>  \r\n  </div>\r\n  <div id='media-player' class=\"custom-col-8\" tabindex=\"-1\" (focus)=\"mediaPlayerFocus()\" (focusout)=\"mediaPlayerFocusOut()\" #mediaPlayer (mousemove)=\"mediaPlayerMouseMove()\" (mouseleave)=\"mediaPlayerMouseLeave()\">\r\n    <div class=\"main-ppr-icon-container\" *ngIf=\"canPlay != null && (videoElement.paused || videoElement.ended || !canPlay || (actualVideo != null && actualVideo.isYoutubeVideo && (youtubeIsPaused || youtubeIsEnded)))\">\r\n      <svg height=\"100\" width=\"100\" (click)=\"!isMobileDevice ? playPause() : emptyVoid()\">\r\n        <circle *ngIf=\"!isMobileDevice && actualVideo != null && (!actualVideo.isYoutubeVideo || youtubeIsPaused || youtubeIsEnded)\" cx=\"50\" cy=\"50\" r=\"40\" style=\"cursor: pointer;\" stroke=\"rgb(234 13 191 / 45%)\" stroke-width=\"1\" fill=\"rgb(255 255 255 / 23%)\" />\r\n        <polygon *ngIf=\"!isMobileDevice && canPlay && (actualVideo != null && (!actualVideo.isYoutubeVideo && videoElement.paused && !videoElement.ended || actualVideo.isYoutubeVideo && youtubeIsPaused))\" points=\"40,30 40,70 70,50\" style=\"fill:#ea0dbf;stroke:purple;stroke-width:1;cursor: pointer;\" />\r\n        <use *ngIf=\"!isMobileDevice && (actualVideo != null && (!actualVideo.isYoutubeVideo && videoElement.ended || actualVideo.isYoutubeVideo && youtubeIsEnded))\" xlink:href=\"./assets/media-controls.svg#replay\" href=\"./assets/media-controls.svg#replay\" x=\"1\" y=\"0\" style=\"fill:#ea0dbf;stroke:purple;stroke-width:1\" />\r\n        <use *ngIf=\"!canPlay && !isMobileDevice\" xlink:href=\"./assets/media-controls.svg#can_not_play\" href=\"./assets/media-controls.svg#can_not_play\" x=\"0\" y=\"0\" style=\"fill:#ea0dbf;stroke:purple;stroke-width:1\" />\r\n        <use *ngIf=\"!canPlay && isMobileDevice\" xlink:href=\"./assets/media-controls.svg#can_not_play_mobile\" href=\"./assets/media-controls.svg#can_not_play_mobile\" x=\"11\" y=\"5\" style=\"fill:#ea0dbf;stroke:purple;stroke-width:1\" />\r\n      </svg>\r\n    </div>\r\n    <div *ngIf=\"isMobileDevice && canPlay == true\" class=\"mobile-device-main-ppr-container\" #mobileDeviceMainPprContainer (click)=\"videoClickEvent()\">\r\n      <div class=\"mobile-device-main-ppr-container-helper\">\r\n        <div>\r\n          <svg (click)=\"prev()\" height=\"33\" width=\"33\">\r\n            <use xlink:href=\"./assets/media-controls.svg#prev\" href=\"./assets/media-controls.svg#prev\" x=\"0\" y=\"0\" />\r\n          </svg>\r\n        </div>\r\n        <div style=\"margin-left: 2px;\">\r\n          <svg (click)=\"playPause()\" height=\"33\" width=\"33\">\r\n            <path id='line1' d=\"M 8 7 L 26 17 L 26 17 L 8 26\" style=\"fill:white;\">\r\n              <animate\r\n                  attributeName=\"d\"\r\n                  dur=\"300ms\" \r\n                  from=\"M 8 7 L 26 17 L 26 17 L 8 26\"\r\n                  to=\"M 8 7 L 13 7 L 13 26 L 8 26\"\r\n                  begin=\"indefinite\"\r\n                  fill=\"freeze\"\r\n                  #from_pause_to_play />\r\n              <animate\r\n                  attributeName=\"d\"\r\n                  dur=\"300ms\"\r\n                  from=\"M 8 7 L 13 7 L 13 26 L 8 26\"\r\n                  to=\"M 8 7 L 26 17 L 26 17 L 8 26\"\r\n                  fill=\"freeze\"\r\n                  #from_play_to_pause\r\n                  begin=\"indefinite\" />\r\n            </path>\r\n            <path id='line2' d=\"M 8 7 L 26 17 L 26 17 L 8 26\" style=\"fill:white;\">\r\n                <animate\r\n                    attributeName=\"d\"\r\n                    dur=\"300ms\" \r\n                    from=\"M 8 7 L 26 17 L 26 17 L 8 26\"\r\n                    to=\"M 19 7 L 24 7 L 24 26 L 19 26\"\r\n                    begin=\"indefinite\"\r\n                    fill=\"freeze\"\r\n                    #from_pause_to_play />\r\n                <animate\r\n                    attributeName=\"d\"\r\n                    dur=\"300ms\"\r\n                    from=\"M 19 7 L 24 7 L 24 26 L 19 26\"\r\n                    to=\"M 8 7 L 26 17 L 26 17 L 8 26\"\r\n                    fill=\"freeze\"\r\n                    #from_play_to_pause\r\n                    begin=\"indefinite\" />\r\n            </path>             \r\n          </svg>\r\n        </div>      \r\n        <div>\r\n          <svg *ngIf=\"isNextVideo()\" (click)=\"next()\" height=\"33\" width=\"33\">\r\n              <use xlink:href=\"./assets/media-controls.svg#next\" href=\"./assets/media-controls.svg#next\" x=\"0\" y=\"0\" />\r\n          </svg>\r\n        </div>\r\n      </div>      \r\n    </div>\r\n    <div *ngIf=\"(config.isVideoLoader == null || config.isVideoLoader) && canPlay == null\" class=\"loader-wrapper\" [ngClass]=\"{ 'mobile-device': isMobileDevice }\">\r\n        <div class=\"loader\"></div>\r\n    </div>\r\n    <div *ngIf=\"((canPlay != null && (actualVideo != null && (!actualVideo.isYoutubeVideo && videoElement.ended || actualVideo.isYoutubeVideo && youtubeIsEnded))) || canPlay == false) && isNextVideo()\" class=\"next-loader\" [ngClass]=\"{ 'mobile-device': isMobileDevice }\">\r\n      <ng-container *ngIf=\"isMobileDevice\">\r\n        <svg>\r\n          <circle cx=\"50%\" cy=\"50%\" r=\"11%\"/>\r\n        </svg>\r\n      </ng-container>\r\n      <ng-container *ngIf=\"!isMobileDevice\">\r\n        <svg >\r\n          <circle cx=\"50%\" cy=\"50%\" r=\"42\"/>\r\n        </svg>\r\n      </ng-container>\r\n    </div>\r\n    <div *ngIf=\"videoName && (actualVideo == null || !actualVideo.isYoutubeVideo)\" class=\"video-title\" #videoTitleContainer>\r\n        <div class=\"video-title-text\">\r\n          {{ videoName }}          \r\n        </div>\r\n    </div>\r\n    <div class=\"video-container\">\r\n      <div class=\"youtube-video-container\" (click)=\"playPause()\" [hidden]=\"actualVideo && !actualVideo.isYoutubeVideo\" style=\"text-align: center;\" (mousemove)=\"mediaPlayerMouseMove()\" (mouseleave)=\"mediaPlayerMouseLeave()\">\r\n        <youtube-player id=\"youtubePlayer\" #youtubePlayer style=\"position: absolute; left: 0; pointer-events: none;\"></youtube-player>\r\n      </div>\r\n      <video #mediaVideo [hidden]=\"actualVideo && actualVideo.isYoutubeVideo\" width=\"100%\" (click)=\"videoClickEvent()\">\r\n          <source #mediaVideoSource [type]='videoType'>\r\n          <track *ngFor=\"let subtitle of subtitles; let i = index\" [id]=\"subtitle.id\" [label]=\"subtitle.name\" kind=\"subtitles\" [src]=\"subtitle.src\" [attr.default]=\"subtitle.id == actualSubtitleId ? true : null\">\r\n      </video>\r\n    </div>\r\n    <div id=\"media-control-container\" #mediaControlContainer (mouseenter)=\"mediaControlContainerMouseEnter()\" (mouseleave)=\"mediaControlContainerMouseLeave()\">\r\n      <div id=\"media-controls\">\r\n        <div class=\"progress-thumb\">\r\n          <input [attr.disabled]=\"!canPlay ? true : null\" type=\"range\" min=\"0\" [max]=\"progressSliderMaxValue\" [value]=\"progressSliderValue\" class=\"progress-slider\" [ngClass]=\"{ 'mobile-device': isMobileDevice }\" #progressSlider (input)=\"setProgressSlider(progressSlider.value)\" (mousemove)=\"progressThumbMouseMove($event)\" (mouseleave)=\"progressThumbMouseLeave()\">\r\n        </div>\r\n        <div class=\"meter\" #meter>\r\n          <span #progressContainer class=\"progress-container progress-base\">\r\n            <span class=\"progress\">\r\n            </span>\r\n          </span>\r\n          <span #progressContainerHover class=\"progress-container progress-hover\">\r\n            <span class=\"progress\"></span>\r\n          </span>\r\n          <span class=\"progress-container progress-helper\" (mousemove)=\"progressHelperMouseMove($event)\">\r\n            <span class=\"progress\"></span>\r\n          </span>\r\n        </div>\r\n        <div id=\"control-buttons\" [ngClass]=\"{ 'mobile-device': isMobileDevice }\">\r\n          <div *ngIf=\"!isMobileDevice\">\r\n            <svg (click)=\"prev()\">\r\n                <use xlink:href=\"./assets/media-controls.svg#prev\" href=\"./assets/media-controls.svg#prev\" x=\"0\" y=\"0\" />\r\n            </svg>\r\n          </div>\r\n          <div *ngIf=\"!isMobileDevice\">\r\n            <svg (click)=\"playPause()\">\r\n              <path id='line1' d=\"M 8 7 L 26 17 L 26 17 L 8 26\" style=\"fill:white;\">\r\n                <animate\r\n                  attributeName=\"d\"\r\n                  dur=\"300ms\" \r\n                  from=\"M 8 7 L 26 17 L 26 17 L 8 26\"\r\n                  to=\"M 8 7 L 13 7 L 13 26 L 8 26\"\r\n                  begin=\"indefinite\"\r\n                  fill=\"freeze\"\r\n                  #from_pause_to_play />\r\n                <animate\r\n                  attributeName=\"d\"\r\n                  dur=\"300ms\"\r\n                  from=\"M 8 7 L 13 7 L 13 26 L 8 26\"\r\n                  to=\"M 8 7 L 26 17 L 26 17 L 8 26\"\r\n                  fill=\"freeze\"\r\n                  #from_play_to_pause\r\n                  begin=\"indefinite\" />\r\n              </path>\r\n              <path id='line2' d=\"M 8 7 L 26 17 L 26 17 L 8 26\" style=\"fill:white;\">\r\n                <animate\r\n                    attributeName=\"d\"\r\n                    dur=\"300ms\" \r\n                    from=\"M 8 7 L 26 17 L 26 17 L 8 26\"\r\n                    to=\"M 19 7 L 24 7 L 24 26 L 19 26\"\r\n                    begin=\"indefinite\"\r\n                    fill=\"freeze\"\r\n                    #from_pause_to_play />\r\n                <animate\r\n                    attributeName=\"d\"\r\n                    dur=\"300ms\"\r\n                    from=\"M 19 7 L 24 7 L 24 26 L 19 26\"\r\n                    to=\"M 8 7 L 26 17 L 26 17 L 8 26\"\r\n                    fill=\"freeze\"\r\n                    #from_play_to_pause\r\n                    begin=\"indefinite\" />\r\n              </path>                \r\n            </svg>\r\n          </div>\r\n          <div *ngIf=\"!isMobileDevice && isNextVideo()\">\r\n            <svg (click)=\"next()\">\r\n                <use xlink:href=\"./assets/media-controls.svg#next\" href=\"./assets/media-controls.svg#next\" x=\"0\" y=\"0\" />\r\n            </svg>\r\n          </div>\r\n          <div class=\"duration-time\" [ngClass]=\"{ 'mobile-device': isMobileDevice }\">\r\n              {{ currentTime }} / {{ duration }}\r\n          </div>\r\n          <div class=\"volume-container\" [ngClass]=\"{ 'mobile-device': isMobileDevice }\">\r\n            <svg (click)=mute() style=\"width: 36px;\">\r\n                <use xlink:href=\"./assets/media-controls.svg#volume_base\" href=\"./assets/media-controls.svg#volume_base\" />              \r\n                <ng-container *ngIf=\"!muted; else mutePaths\">\r\n                  <ng-container *ngIf=\"volumePercent > 0\">\r\n                    <use xlink:href=\"./assets/media-controls.svg#volume_up1\" href=\"./assets/media-controls.svg#volume_up1\" />              \r\n                  </ng-container>\r\n                  <ng-container *ngIf=\"volumePercent > 50\">\r\n                    <use xlink:href=\"./assets/media-controls.svg#volume_up2\" href=\"./assets/media-controls.svg#volume_up2\" />                                \r\n                  </ng-container>\r\n                </ng-container>\r\n                <ng-template #mutePaths>\r\n                  <use xlink:href=\"./assets/media-controls.svg#volume_muted1\" href=\"./assets/media-controls.svg#volume_muted1\" />              \r\n                  <use xlink:href=\"./assets/media-controls.svg#volume_muted2\" href=\"./assets/media-controls.svg#volume_muted2\" />              \r\n                </ng-template>              \r\n            </svg>\r\n            <div class=\"volume-setting-container\" *ngIf=\"!isMobileDevice\">\r\n                <input type=\"range\" min=\"0\" max=\"100\" [value]=\"volumePercent\" class=\"custom-slider\" (input)=\"setVolume($event)\">\r\n            </div>\r\n          </div>\r\n          <div class=\"right-section\">\r\n            <div stopPropagation *ngIf=\"subtitles && subtitles.length > 0\" class=\"subtitle-select-container\">\r\n              <svg (click)=\"openSubtitles()\">\r\n                <use xlink:href=\"./assets/media-controls.svg#cc\" href=\"./assets/media-controls.svg#cc\" x=\"0\" y=\"4\" />\r\n              </svg>\r\n              <div class=\"dropup-content\" #dropUpContent>\r\n                <div class=\"dropup-title\">\r\n                    {{ config.subtitleText || 'Subtitles' }}\r\n                </div>\r\n                <div class=\"dropup-container\">\r\n                  <div [ngClass]=\"{'active': !actualSubtitleId}\" (click)=\"setSubtitle()\">\r\n                      {{ config.subtitleOffText || 'Off' }}\r\n                  </div>\r\n                  <div *ngFor=\"let subtitle of subtitles\" [ngClass]=\"{ 'active': actualSubtitleId == subtitle.id }\" (click)=\"setSubtitle(subtitle.id)\">\r\n                    {{ subtitle.name }}\r\n                  </div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n            <div class=\"pip-container\" *ngIf=\"supportPictureInPicture && (actualVideo == null || !actualVideo.isYoutubeVideo)\">\r\n              <svg (click)=\"pipIsActive ? pipExit() : pipEnter()\">\r\n                  <use *ngIf=\"!pipIsActive\" xlink:href=\"./assets/media-controls.svg#pip_enter\" href=\"./assets/media-controls.svg#pip_enter\" x=\"0\" y=\"0\" />\r\n                  <use *ngIf=\"pipIsActive\" xlink:href=\"./assets/media-controls.svg#pip_exit\" href=\"./assets/media-controls.svg#pip_exit\" x=\"0\" y=\"0\" />\r\n              </svg>\r\n            </div>     \r\n            <div *ngIf=\"supportFullScreen && !pipIsActive && !isMobileDevice\">\r\n              <svg (click)=\"!isFullScreen ? fullScreen() : exitFullScreen()\">\r\n                <use xlink:href=\"./assets/media-controls.svg#fullScreen_lt\" href=\"./assets/media-controls.svg#fullScreen_lt\" x=\"0\" y=\"0\" />              \r\n                <use xlink:href=\"./assets/media-controls.svg#fullScreen_lb\" href=\"./assets/media-controls.svg#fullScreen_lb\" x=\"0\" y=\"0\" />\r\n                <use xlink:href=\"./assets/media-controls.svg#fullScreen_rt\" href=\"./assets/media-controls.svg#fullScreen_rt\" x=\"0\" y=\"0\" />\r\n                <use xlink:href=\"./assets/media-controls.svg#fullScreen_rb\" href=\"./assets/media-controls.svg#fullScreen_rb\" x=\"0\" y=\"0\" />\r\n                <ng-container *ngIf=\"isFullScreen\">\r\n                  <use xlink:href=\"./assets/media-controls.svg#fullScreen_exit_lrb\" href=\"./assets/media-controls.svg#fullScreen_exit_lrb\" x=\"0\" y=\"0\" />\r\n                  <use xlink:href=\"./assets/media-controls.svg#fullScreen_exit_rlt\" href=\"./assets/media-controls.svg#fullScreen_exit_rlt\" x=\"0\" y=\"0\" />\r\n                </ng-container>\r\n              </svg>\r\n            </div>     \r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>  \r\n  </div>\r\n  <div class=\"video-list-container custom-col-4\" #videoListContainer>\r\n    <div class=\"video-list-element\" #videoListElement (click)=\"loadVideo(i)\" [ngClass]=\"{ 'active': actualVideoIndex == i }\" *ngFor=\"let video of config.sources; let i = index\">\r\n      <div class=\"video-list-content-container\">\r\n        <div class=\"video-list-content\">\r\n          <div class=\"video-name\">\r\n            {{ video.videoName }}\r\n          </div>\r\n          <div class=\"video-artist\">\r\n            {{ video.artist }}\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { NgxVideoListPlayerComponent } from './Components/ngx-video-list-player.component';\r\nimport { StopPropagationDirective } from './Directives/stop-propagation.directive';\r\nimport { YouTubePlayerModule } from '@angular/youtube-player';\r\n\r\n@NgModule({\r\n  declarations: [\r\n      NgxVideoListPlayerComponent,\r\n      StopPropagationDirective\r\n  ],\r\n  imports: [\r\n      CommonModule,\r\n      YouTubePlayerModule\r\n  ],\r\n  exports: [\r\n      NgxVideoListPlayerComponent\r\n  ]\r\n})\r\nexport class NgxVideoListPlayerModule { }\r\n","/*\r\n * Public API Surface of ngx-video-list-player\r\n */\r\n\r\nexport * from './lib/Components/ngx-video-list-player.component';\r\nexport * from './lib/Models/ngx-video-list-player.config';\r\nexport * from './lib/ngx-video-list-player.module';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}