{"version":3,"file":"ng-ws-video-player.mjs","sources":["../../../projects/ng-ws-video-player/src/lib/ng-ws-video-player.component.ts","../../../projects/ng-ws-video-player/src/lib/ng-ws-video-player.component.html","../../../projects/ng-ws-video-player/src/lib/ng-ws-video-player.service.ts","../../../projects/ng-ws-video-player/src/ng-ws-video-player.ts"],"sourcesContent":["import {\n  AfterViewInit,\n  Component,\n  ElementRef,\n  inject,\n  Input,\n  OnDestroy,\n  OnInit,\n  ViewChild,\n} from '@angular/core';\nimport { NgClass, NgStyle } from \"@angular/common\";\n\nimport { NgWsVideoPlayerService } from \"./ng-ws-video-player.service\";\n\n@Component({\n  selector: 'ng-ws-video-player',\n  standalone: true,\n  imports: [NgClass, NgStyle],\n  providers: [],\n  templateUrl: './ng-ws-video-player.component.html',\n  styleUrl: './ng-ws-video-player.component.scss'\n})\nexport class NgWsVideoPlayerComponent implements OnInit, AfterViewInit, OnDestroy {\n  private _videoPlayerService: NgWsVideoPlayerService = inject(NgWsVideoPlayerService);\n\n  /** @desc Getting Elements */\n  @ViewChild('videoPlayer') videoPlayer!: ElementRef<HTMLVideoElement>;\n  @ViewChild('videoContainer') videoContainer!: ElementRef<HTMLDivElement>;\n  @ViewChild('timelineContainer') timelineContainer!: ElementRef<HTMLDivElement>;\n  @ViewChild('currentTimeEl') currentTimeElem!: ElementRef<HTMLDivElement>;\n  @ViewChild('totalTimeEl') totalTimeElem!: ElementRef<HTMLDivElement>;\n  @ViewChild('speedBtn') speedBtn!: ElementRef<HTMLButtonElement>;\n  @ViewChild('volumeSlider') volumeSlider!: ElementRef<HTMLInputElement>;\n\n  /** @desc Sources */\n  @Input({required: true}) videoSrc: string = '';\n  @Input() captionSrc: string = '';\n  @Input() captionLangLabel: string = 'English';\n  @Input() captionSrcLang: string = 'en';\n\n  /** @desc Classes And Styling */\n  @Input() videoPlayerClassesToAdd: string = '';\n  @Input() videoContainerClassesToAdd: string = '';\n  @Input() videoAccentColor: string = '';\n\n  public static isScrubbing: boolean = false;\n  public static wasPaused: boolean = false;\n\n  ngOnInit(): void {\n    this.addKeyboardEventsListener();\n    this.addOnMouseUpScrubbingHandler();\n    this.addOnMouseMoveScrubbingHandler();\n  }\n\n  ngAfterViewInit(): void {\n    this.addFullScreenChangeListener();\n  }\n\n  ngOnDestroy(): void {\n    this.removeKeyboardEventsListener();\n    this.removeOnMouseUpScrubbingHandler();\n    this.removeOnMouseMoveScrubbingHandler();\n    this.removeFullScreenChangeListener();\n  }\n\n  /** @desc Adding dynamic CSS variable to use in stylesheet\n   * (for styling ::after or ::before elements) */\n  public setAccentColorVariableForCSS(): Record<string, string> {\n    return {'--video-accent-color': this.videoAccentColor};\n  }\n\n  /** @desc Video Duration Handling */\n  public onVideoDataLoaded(): void {\n    this.totalTimeElem.nativeElement.textContent = this._videoPlayerService.formatDuration(this.videoPlayer.nativeElement.duration);\n  }\n\n  public onVideoTimeUpdate(): void {\n    const videoPlayer: HTMLVideoElement = this.videoPlayer.nativeElement;\n    const currentTimeElem: HTMLDivElement = this.currentTimeElem.nativeElement;\n    const timelineContainer: HTMLDivElement = this.timelineContainer.nativeElement;\n\n    currentTimeElem.textContent = this._videoPlayerService.formatDuration(videoPlayer.currentTime);\n    const percent: number = videoPlayer.currentTime / videoPlayer.duration;\n    timelineContainer.style.setProperty(\"--progress-position\", String(percent));\n  }\n\n  /** @desc EventListener adders, removers and handlers */\n  private FullScreenChangeHandler(): void {\n    this.videoContainer.nativeElement.classList.toggle(\"full-screen\", !!document.fullscreenElement);\n  }\n\n  public onPictureInPictureEnter(): void {\n    this.videoContainer.nativeElement.classList.add(\"mini-player\");\n  }\n\n  public onPictureInPictureLeave(): void {\n    this.videoContainer.nativeElement.classList.remove(\"mini-player\");\n  }\n\n  private addFullScreenChangeListener(): void {\n    document.addEventListener(\"fullscreenchange\", this.FullScreenChangeHandler.bind(this));\n  }\n\n  private removeFullScreenChangeListener(): void {\n    document.removeEventListener(\"fullscreenchange\", this.FullScreenChangeHandler.bind(this));\n  }\n\n  private addKeyboardEventsListener(): void {\n    document.addEventListener('keydown', this.KeyboardEventsHandler.bind(this));\n  }\n\n  private removeKeyboardEventsListener(): void {\n    document.removeEventListener('keydown', this.KeyboardEventsHandler.bind(this));\n  }\n\n  private KeyboardEventsHandler(e: KeyboardEvent): void {\n    const tagName = document!.activeElement!.tagName.toLowerCase();\n\n    if (tagName === 'input' || e.ctrlKey || e.metaKey || e.shiftKey) {\n      return;\n    }\n\n    switch (e.key.toLowerCase()) {\n      case \" \":\n        if (tagName === 'button') {\n          return;\n        }\n        this.togglePlay();\n        break;\n      case \"k\":\n        this.togglePlay();\n        break\n      case \"f\":\n        this.toggleFullScreenMode();\n        break\n      case \"t\":\n        this.toggleTheaterMode();\n        break\n      case \"i\":\n        this.toggleMiniPlayerMode();\n        break\n      case \"m\":\n        this.toggleMute();\n        break\n      case \"arrowleft\":\n      case \"j\":\n        this._videoPlayerService.skipTime(this.videoPlayer.nativeElement, -5);\n        break\n      case \"arrowright\":\n      case \"l\":\n        this._videoPlayerService.skipTime(this.videoPlayer.nativeElement, 5);\n        break\n      case \"c\":\n        this.toggleCaptions();\n        break\n    }\n  }\n\n  private addOnMouseUpScrubbingHandler(): void {\n    document.addEventListener('mouseup', this.ScrubbingOnMouseUpHandler.bind(this));\n  }\n\n  private removeOnMouseUpScrubbingHandler(): void {\n    document.removeEventListener('mouseup', this.ScrubbingOnMouseUpHandler.bind(this));\n  }\n\n  private ScrubbingOnMouseUpHandler(e: MouseEvent): void {\n    if (NgWsVideoPlayerComponent.isScrubbing) {\n      this.toggleScrubbing(e);\n    }\n  }\n\n  private addOnMouseMoveScrubbingHandler(): void {\n    document.addEventListener('mousemove', this.ScrubbingOnMouseMoveHandler.bind(this));\n  }\n\n  private removeOnMouseMoveScrubbingHandler(): void {\n    document.removeEventListener('mousemove', this.ScrubbingOnMouseMoveHandler.bind(this));\n  }\n\n  private ScrubbingOnMouseMoveHandler(e: MouseEvent): void {\n    if (NgWsVideoPlayerComponent.isScrubbing) {\n      this.timelineUpdateHandler(e);\n    }\n  }\n\n  public timelineUpdateHandler(e: MouseEvent): void {\n    this._videoPlayerService.timelineUpdateHandler(\n      this.timelineContainer.nativeElement,\n      NgWsVideoPlayerComponent.isScrubbing,\n      e\n    );\n  }\n\n  /** @desc VideoPlayer Controls */\n  public toggleScrubbing(e: MouseEvent): void {\n    this._videoPlayerService.toggleScrubbing(\n      this.timelineContainer.nativeElement,\n      this.videoContainer.nativeElement,\n      this.videoPlayer.nativeElement,\n      e\n    );\n\n    this.timelineUpdateHandler(e);\n  }\n\n  public togglePlay(): void {\n    this._videoPlayerService.togglePlay(this.videoPlayer.nativeElement);\n  }\n\n  public toggleFullScreenMode(): void {\n    this._videoPlayerService.toggleFullScreenMode(this.videoContainer.nativeElement);\n  }\n\n  public toggleTheaterMode(): void {\n    this._videoPlayerService.toggleTheaterMode(this.videoContainer.nativeElement);\n  }\n\n  public toggleMiniPlayerMode(): void {\n    this._videoPlayerService.toggleMiniPlayerMode(\n      this.videoContainer.nativeElement,\n      this.videoPlayer.nativeElement\n    );\n  }\n\n  public toggleCaptions(): void {\n    this._videoPlayerService.toggleCaptions(\n      this.videoContainer.nativeElement,\n      this.videoPlayer.nativeElement\n    );\n  }\n\n  public changePlaybackSpeed(): void {\n    this._videoPlayerService.changePlaybackSpeed(\n      this.videoPlayer.nativeElement,\n      this.speedBtn.nativeElement\n    );\n  }\n\n  public togglePlayPauseIcon(playingStatus: 'play' | 'pause'): void {\n    this._videoPlayerService.togglePlayPauseIcon(this.videoContainer.nativeElement, playingStatus);\n  }\n\n  public onVolumeInput(e: Event): void {\n    this._videoPlayerService.onVolumeInput(this.videoPlayer.nativeElement, e);\n  }\n\n  public onVolumeChange(e: Event): void {\n    this._videoPlayerService.onVolumeChange(\n      this.videoContainer.nativeElement,\n      this.videoPlayer.nativeElement,\n      this.volumeSlider.nativeElement,\n      e\n    );\n  }\n\n  public toggleMute(): void {\n    this._videoPlayerService.toggleMute(\n      this.videoContainer.nativeElement,\n      this.videoPlayer.nativeElement,\n      this.volumeSlider.nativeElement\n    );\n  }\n}\n","<div #videoContainer\n     [class]=\"videoContainerClassesToAdd + 'video-container paused'\"\n     data-volume-level=\"high\">\n  <div class=\"video-controls-container\">\n    <div #timelineContainer\n         class=\"timeline-container\"\n         (mousemove)=\"timelineUpdateHandler($event)\"\n         (mousedown)=\"toggleScrubbing($event)\">\n      <div class=\"timeline\" [ngStyle]=\"setAccentColorVariableForCSS()\">\n        <div class=\"thumb-indicator\" [ngStyle]=\"{'background-color': videoAccentColor}\"></div>\n      </div>\n    </div>\n    <div class=\"controls\">\n      <button class=\"play-pause-btn control-btn\"\n              (click)=\"togglePlay()\">\n        <svg class=\"play-icon\" viewBox=\"0 0 24 24\">\n          <path fill=\"currentColor\" d=\"M8,5.14V19.14L19,12.14L8,5.14Z\"/>\n        </svg>\n        <svg class=\"pause-icon\" viewBox=\"0 0 24 24\">\n          <path fill=\"currentColor\" d=\"M14,19H18V5H14M6,19H10V5H6V19Z\"/>\n        </svg>\n      </button>\n      <div class=\"volume-container\">\n        <button class=\"mute-btn control-btn\"\n                (click)=\"toggleMute()\">\n          <svg class=\"volume-high-icon\" viewBox=\"0 0 24 24\">\n            <path fill=\"currentColor\"\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\"/>\n          </svg>\n          <svg class=\"volume-low-icon\" viewBox=\"0 0 24 24\">\n            <path fill=\"currentColor\"\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\"/>\n          </svg>\n          <svg class=\"volume-muted-icon\" viewBox=\"0 0 24 24\">\n            <path fill=\"currentColor\"\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\"/>\n          </svg>\n        </button>\n        <input #volumeSlider\n               (change)=\"onVolumeChange($event)\"\n               (input)=\"onVolumeInput($event)\"\n               class=\"volume-slider\"\n               [ngStyle]=\"{'accent-color': videoAccentColor}\"\n               type=\"range\"\n               min=\"0\"\n               max=\"1\"\n               step=\"any\"\n               value=\"1\">\n      </div>\n      <div class=\"duration-container\">\n        <div #currentTimeEl class=\"current-time\">0:00</div>\n        /\n        <div #totalTimeEl class=\"total-time\"></div>\n      </div>\n      <button class=\"captions-btn control-btn\"\n              [ngStyle]=\"setAccentColorVariableForCSS()\"\n              (click)=\"toggleCaptions()\">\n        <svg viewBox=\"0 0 24 24\">\n          <path fill=\"currentColor\"\n                d=\"M18,11H16.5V10.5H14.5V13.5H16.5V13H18V14A1,1 0 0,1 17,15H14A1,1 0 0,1 13,14V10A1,1 0 0,1 14,9H17A1,1 0 0,1 18,10M11,11H9.5V10.5H7.5V13.5H9.5V13H11V14A1,1 0 0,1 10,15H7A1,1 0 0,1 6,14V10A1,1 0 0,1 7,9H10A1,1 0 0,1 11,10M19,4H5C3.89,4 3,4.89 3,6V18A2,2 0 0,0 5,20H19A2,2 0 0,0 21,18V6C21,4.89 20.1,4 19,4Z\"/>\n        </svg>\n      </button>\n      <button #speedBtn\n              class=\"speed-btn wide-btn control-btn\"\n              (click)=\"changePlaybackSpeed()\">\n        1x\n      </button>\n      <button class=\"mini-player-btn control-btn\"\n              [ngStyle]=\"setAccentColorVariableForCSS()\"\n              (click)=\"toggleMiniPlayerMode()\">\n        <svg viewBox=\"0 0 24 24\">\n          <path fill=\"currentColor\"\n                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\"/>\n        </svg>\n      </button>\n      <button class=\"theater-btn control-btn\"\n              [ngStyle]=\"setAccentColorVariableForCSS()\"\n              (click)=\"toggleTheaterMode()\">\n        <svg class=\"tall\" viewBox=\"0 0 24 24\">\n          <path fill=\"currentColor\"\n                d=\"M19 6H5c-1.1 0-2 .9-2 2v8c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 10H5V8h14v8z\"/>\n        </svg>\n        <svg class=\"wide\" viewBox=\"0 0 24 24\">\n          <path fill=\"currentColor\"\n                d=\"M19 7H5c-1.1 0-2 .9-2 2v6c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V9c0-1.1-.9-2-2-2zm0 8H5V9h14v6z\"/>\n        </svg>\n      </button>\n      <button class=\"full-screen-btn control-btn\"\n              (click)=\"toggleFullScreenMode()\">\n        <svg class=\"open\" viewBox=\"0 0 24 24\">\n          <path fill=\"currentColor\" d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"/>\n        </svg>\n        <svg class=\"close\" viewBox=\"0 0 24 24\">\n          <path fill=\"currentColor\" d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\"/>\n        </svg>\n      </button>\n    </div>\n  </div>\n  <video #videoPlayer\n         [src]=\"videoSrc\"\n         [class]=\"videoPlayerClassesToAdd\"\n         (click)=\"togglePlay()\"\n         (play)=\"togglePlayPauseIcon('play')\"\n         (pause)=\"togglePlayPauseIcon('pause')\"\n         (loadeddata)=\"onVideoDataLoaded()\"\n         (timeupdate)=\"onVideoTimeUpdate()\"\n         (enterpictureinpicture)=\"onPictureInPictureEnter()\"\n         (leavepictureinpicture)=\"onPictureInPictureLeave()\"\n  >\n    <track kind=\"captions\"\n           [label]=\"captionLangLabel\"\n           [srclang]=\"captionSrcLang\"\n           [src]=\"captionSrc\">\n  </video>\n</div>\n","import { Injectable } from '@angular/core';\n\nimport { NgWsVideoPlayerComponent } from \"./ng-ws-video-player.component\";\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class NgWsVideoPlayerService {\n  /** @desc Video duration formatter */\n  public formatDuration(time: number): string {\n    const seconds: number = Math.floor(time % 60);\n    const minutes: number = Math.floor(time / 60) % 60;\n    const hours: number = Math.floor(time / 3600);\n    const leadingZeroFormatter: Intl.NumberFormat = new Intl.NumberFormat('en-US', {\n      minimumIntegerDigits: 2,\n    });\n\n    if (hours === 0) {\n      return `${ minutes }:${ leadingZeroFormatter.format(seconds) }`;\n    } else {\n      return `${ hours }:${ leadingZeroFormatter.format(\n        minutes\n      ) }:${ leadingZeroFormatter.format(seconds) }`;\n    }\n  }\n\n  /** @desc Updates video progress bar */\n  public timelineUpdateHandler(\n    timelineContainer: HTMLDivElement,\n    isScrubbing: boolean,\n    e: MouseEvent\n  ): void {\n    const rect = timelineContainer.getBoundingClientRect();\n    const percent = Math.min(Math.max(0, e.x - rect.x), rect.width) / rect.width;\n\n    if (isScrubbing) {\n      e.preventDefault()\n      timelineContainer.style.setProperty(\"--progress-position\", String(percent));\n    }\n  }\n\n  /** @desc Video controls functionality */\n  public skipTime(videoPlayer: HTMLVideoElement, duration: number): void {\n    videoPlayer.currentTime += duration;\n  }\n\n  public togglePlay(videoPlayer: HTMLVideoElement): void {\n    videoPlayer.paused ? videoPlayer.play() : videoPlayer.pause();\n  }\n\n  public toggleFullScreenMode(videoContainer: HTMLDivElement): void {\n    if (document.fullscreenElement == null) {\n      videoContainer.requestFullscreen();\n    } else {\n      document.exitFullscreen();\n    }\n  }\n\n  public toggleTheaterMode(videoContainer: HTMLDivElement): void {\n    if (document.fullscreenElement !== null) {\n      return;\n    }\n\n    videoContainer.classList.toggle(\"theater\");\n  }\n\n  public toggleMiniPlayerMode(videoContainer: HTMLDivElement, videoPlayer: HTMLVideoElement): void {\n    if (document.fullscreenElement !== null) {\n      return;\n    }\n\n    if (videoContainer.classList.contains(\"mini-player\")) {\n      document.exitPictureInPicture();\n    } else {\n      videoPlayer.requestPictureInPicture();\n    }\n  }\n\n  public toggleCaptions(videoContainer: HTMLDivElement, videoPlayer: HTMLVideoElement): void {\n    const captions = videoPlayer.textTracks[0];\n\n    if (captions.mode === 'disabled' || captions.mode === 'hidden') {\n      captions.mode = 'showing';\n    } else {\n      captions.mode = 'hidden';\n    }\n\n    const isActive: boolean = captions.mode === \"showing\";\n    videoContainer.classList.toggle(\"captions\", isActive);\n  }\n\n  public changePlaybackSpeed(videoPlayer: HTMLVideoElement, speedBtn: HTMLButtonElement): void {\n    let newPlaybackRate: number = videoPlayer.playbackRate + 0.25;\n\n    if (newPlaybackRate > 2) {\n      newPlaybackRate = 0.25;\n    }\n\n    videoPlayer.playbackRate = newPlaybackRate;\n    speedBtn.textContent = `${ newPlaybackRate }x`;\n  }\n\n  public togglePlayPauseIcon(videoContainer: HTMLDivElement, playingStatus: 'play' | 'pause'): void {\n    playingStatus === 'play' ?\n      videoContainer.classList.remove('paused') :\n      videoContainer.classList.add('paused');\n  }\n\n  public toggleMute(\n    videoContainer: HTMLDivElement,\n    videoPlayer: HTMLVideoElement,\n    volumeSlider: HTMLInputElement\n  ): void {\n    videoPlayer.muted = !videoPlayer.muted;\n\n    const volumeLevel: string = videoPlayer.muted ? 'muted' : 'high';\n    volumeSlider.value = videoPlayer.muted ? '0' : '1';\n    videoContainer.dataset['volumeLevel'] = volumeLevel;\n  }\n\n  public toggleScrubbing(\n    timelineContainer: HTMLDivElement,\n    videoContainer: HTMLDivElement,\n    videoPlayer: HTMLVideoElement,\n    e: MouseEvent\n  ): void {\n    const rect = timelineContainer.getBoundingClientRect();\n    const percent = Math.min(Math.max(0, e.x - rect.x), rect.width) / rect.width;\n\n    NgWsVideoPlayerComponent.isScrubbing = (e.buttons & 1) === 1;\n    videoContainer.classList.toggle(\"scrubbing\", NgWsVideoPlayerComponent.isScrubbing);\n\n    if (NgWsVideoPlayerComponent.isScrubbing) {\n      NgWsVideoPlayerComponent.wasPaused = videoPlayer.paused;\n      videoPlayer.pause();\n    } else {\n      videoPlayer.currentTime = percent * videoPlayer.duration;\n      if (!NgWsVideoPlayerComponent.wasPaused) {\n        videoPlayer.play();\n      }\n    }\n  }\n\n  /** @desc Volume change handlers */\n  public onVolumeInput(videoPlayer: HTMLVideoElement, e: Event): void {\n    videoPlayer.volume = +(e.target as HTMLInputElement).value;\n    videoPlayer.muted = +(e.target as HTMLInputElement).value === 0;\n  }\n\n  public onVolumeChange(\n    videoContainer: HTMLDivElement,\n    videoPlayer: HTMLVideoElement,\n    volumeSlider: HTMLInputElement,\n    e: Event\n  ): void {\n    volumeSlider.value = (e.target as HTMLInputElement).value;\n    videoPlayer.volume = +volumeSlider.value;\n\n    let volumeLevel: string = '';\n\n    if (videoPlayer.muted || videoPlayer.volume === 0) {\n      volumeSlider.value = '0';\n      volumeLevel = \"muted\";\n    } else if (videoPlayer.volume >= 0.5) {\n      volumeLevel = \"high\";\n    } else {\n      volumeLevel = \"low\";\n    }\n\n    videoContainer.dataset['volumeLevel'] = volumeLevel;\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}