ion-video-player
Version:
HTML video player for Ionic 6 applications using angular
1 lines • 17.7 kB
Source Map (JSON)
{"version":3,"file":"ion-video-player.mjs","sources":["../../../projects/ion-video-player/src/lib/pipes/seconds-to-hours.pipe.ts","../../../projects/ion-video-player/src/lib/ion-video-player.component.ts","../../../projects/ion-video-player/src/lib/ion-video-player.html","../../../projects/ion-video-player/src/lib/ion-video-player.module.ts","../../../projects/ion-video-player/src/public-api.ts","../../../projects/ion-video-player/src/ion-video-player.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'secondsToHours'\n})\nexport class SecondsToHoursPipe implements PipeTransform {\n\n transform(value: number): string {\n return new Date(value * 1000).toISOString().substring(11, 19);\n }\n\n}","import { Component, OnChanges, ViewChild, ElementRef, Input, Output, EventEmitter } from '@angular/core';\n\n@Component({\n selector: 'ion-video-player',\n templateUrl: 'ion-video-player.html',\n styleUrls: ['ion-video-player.scss']\n})\nexport class IonVideoPlayerComponent implements OnChanges {\n // Get a handle to the player\n @ViewChild('playerContainer') playerContainer!: ElementRef;\n @ViewChild('player') videoPlayer!: ElementRef;\n @ViewChild('progressBar') progressBar!: ElementRef;\n @ViewChild('volumeBar') volumeBar!: ElementRef;\n\n isPlaying: boolean = false;\n volume: number = 100;\n\n //Input options\n @Input() options!: {\n src: string;\n type: string;\n poster: string;\n autoplay: boolean;\n muted: boolean;\n controls: boolean\n };\n\n //Output Events\n @Output() play = new EventEmitter<any>();\n @Output() pause = new EventEmitter<any>();\n @Output() ended = new EventEmitter<any>();\n @Output() volumechange = new EventEmitter<any>();\n @Output() playing = new EventEmitter<any>();\n @Output() error = new EventEmitter<any>();\n\n ngOnChanges() {\n }\n\n setVolume() {\n if (this.volumeBar.nativeElement.value == '100') {\n this.volume = 1;\n } else {\n this.volume = parseFloat('0.' + (this.volumeBar.nativeElement.value));\n }\n this.videoPlayer.nativeElement.volume = this.volume;\n }\n\n playPauseVideo() {\n if (this.videoPlayer.nativeElement.paused || this.videoPlayer.nativeElement.ended) {\n // Change the button to a pause button\n this.videoPlayer.nativeElement.play();\n this.isPlaying = true;\n }\n else {\n // Change the button to a play button\n this.videoPlayer.nativeElement.pause();\n this.isPlaying = false;\n }\n }\n\n // Stop the current media from playing, and return it to the start position\n stopVideo() {\n this.videoPlayer.nativeElement.pause();\n this.isPlaying = false;\n if (this.videoPlayer.nativeElement.currentTime) this.videoPlayer.nativeElement.currentTime = 0;\n }\n\n // Toggles the media player's mute and unmute status\n muteVolume() {\n if (this.videoPlayer.nativeElement.muted) {\n this.videoPlayer.nativeElement.muted = false;\n this.volume = this.videoPlayer.nativeElement.volume;\n }\n else {\n this.videoPlayer.nativeElement.muted = true;\n this.volume = 0;\n }\n }\n\n // Replays the media currently loaded in the player\n replayVideo() {\n this.resetPlayer();\n this.videoPlayer.nativeElement.play();\n }\n\n // Update the progress bar\n updateProgressBar() {\n // Work out how much of the media has played via the duration and currentTime parameters\n var percentage = Math.floor((100 / this.videoPlayer.nativeElement.duration) * this.videoPlayer.nativeElement.currentTime);\n // Update the progress bar's value\n if (this.options.controls) {\n this.progressBar.nativeElement.value = percentage;\n }\n }\n\n seek(e: any) {\n var percent = e.offsetX / this.progressBar.nativeElement.offsetWidth;\n this.videoPlayer.nativeElement.currentTime = percent * this.videoPlayer.nativeElement.duration;\n e.target.value = Math.floor(percent / 100);\n e.target.innerHTML = this.progressBar.nativeElement.value + '% played';\n }\n\n //replay Video from start\n resetPlayer() {\n this.progressBar.nativeElement.value = 0;\n // Move the media back to the start\n this.videoPlayer.nativeElement.currentTime = 0;\n }\n\n //Open Player in Full screen mode\n toggleFullScreen() {\n if (document.fullscreenElement) {\n document.exitFullscreen();\n } else {\n if (this.playerContainer.nativeElement.requestFullscreen) {\n this.playerContainer.nativeElement.requestFullscreen();\n } else if (this.playerContainer.nativeElement.webkitRequestFullscreen) { /* Safari */\n this.playerContainer.nativeElement.webkitRequestFullscreen();\n } else if (this.playerContainer.nativeElement.msRequestFullscreen) { /* IE11 */\n this.playerContainer.nativeElement.msRequestFullscreen();\n }\n }\n }\n\n async openPip() {\n try {\n if (!document.pictureInPictureElement) {\n this.videoPlayer.nativeElement.requestPictureInPicture()\n } else {\n document.exitPictureInPicture();\n }\n } catch (reason) {\n console.error(reason);\n }\n }\n\n // Fires when the audio/video has been started or is no longer paused\n onPlay() {\n console.log('onPlay')\n this.play.emit();\n }\n\n // Fires when the audio/video has been paused\n onPause() {\n console.log('onPause')\n this.pause.emit();\n }\n\n // Fires when the current playlist is ended\n onEnded() {\n console.log('onEnded')\n this.ended.emit();\n }\n\n // Fires when the volume has been changed\n onVolumechange() {\n console.log('onVolumechange')\n this.volumechange.emit();\n }\n\n onPlaying() {\n console.log('onPlaying')\n this.playing.emit();\n }\n\n onError() {\n console.log('onError')\n this.error.emit();\n }\n\n onProgress() {\n // this.videoPlayer.nativeElement.addEventListener('progress', () => {\n // const duration = this.videoPlayer.nativeElement.duration;\n // console.log(duration)\n // if (duration > 0) {\n // for (let i = 0; i < this.videoPlayer.nativeElement.buffered.length; i++) {\n // if (\n // this.videoPlayer.nativeElement.buffered.start(this.videoPlayer.nativeElement.buffered.length - 1 - i) <\n // this.videoPlayer.nativeElement.currentTime\n // ) {\n // console.log(\n // (this.videoPlayer.nativeElement.buffered.end(this.videoPlayer.nativeElement.buffered.length - 1 - i) * 100) / duration\n // );\n // break;\n // }\n // }\n // }\n // });\n }\n\n}\n","<div id=\"player\" #playerContainer class=\"ion-video-player\">\n <video id=\"video-element\" #player\n (timeupdate)=\"updateProgressBar()\"\n [poster]=\"options.poster\"\n [autoplay]=\"options.autoplay\"\n [muted]=\"options.muted\"\n (play)=\"onPlay()\"\n (pause)=\"onPause()\"\n (ended)=\"onEnded()\"\n (volumechange)=\"onVolumechange()\"\n (playing)=\"onPlaying()\"\n (error)=\"onError()\"\n (progress)=\"onProgress()\">\n <source [src]=\"options.src\" [type]=\"options.type\">\n </video>\n\n <div id=\"controls\" *ngIf=\"options.controls\">\n\n <progress id=\"progress-bar\" (click)=\"seek($event)\" min=\"0\" max=\"100\" value='1' #progressBar></progress>\n\n <div class=\"controls-btns\">\n <div class=\"start-stop\">\n <ion-button fill=\"clear\" size=\"small\" slot=\"icon-only\" class='play' (click)=\"playPauseVideo()\">\n <ion-icon [name]=\"isPlaying ? 'pause' : 'play'\"></ion-icon>\n </ion-button>\n <span *ngIf=\"player.duration\">\n {{player.currentTime | secondsToHours}} / {{player.duration | secondsToHours }}\n </span>\n </div>\n\n <div class=\"volume-box\">\n <input type=\"range\" class=\"volumeRange\"\n (change)=\"setVolume()\" \n min=\"0\"\n max=\"100\"\n step=\"1\"\n [value]=\"volumeBar.value\"\n #volumeBar\n [ngStyle]=\"{\n 'background-size': volumeBar.value + '% 100%'\n }\"\n />\n\n <ion-button fill=\"clear\" size=\"small\" slot=\"icon-only\" class=\"mute\" title=\"mute\" (click)=\"muteVolume()\">\n <ion-icon [name]=\"\n volume == 0 ? 'volume-mute'\n :\n (volume > 0 && volume < 0.50) ? 'volume-low'\n :\n (volume > 0.50 && volume < 0.80) ? 'volume-medium'\n : 'volume-high'\">\n </ion-icon>\n </ion-button>\n\n <ion-button fill=\"clear\" size=\"small\" slot=\"icon-only\" (click)=\"toggleFullScreen()\">\n <ion-icon name=\"expand\"></ion-icon>\n </ion-button>\n\n <ion-button fill=\"clear\" size=\"small\" slot=\"icon-only\" (click)=\"openPip()\">\n <ion-icon name=\"open\"></ion-icon>\n </ion-button>\n <!-- <ion-button size=\"small\" slot=\"icon-only\" id=\"btnStop\" class=\"\" title=\"stop\" accesskey=\"X\" (click)=\"stopVideo()\">\n <ion-icon name=\"stop\"></ion-icon>\n </ion-button>\n <ion-button size=\"small\" slot=\"icon-only\" id=\"btnReplay\" class=\"replay\" title=\"replay\" accesskey=\"R\" (click)=\"replayVideo()\">\n <ion-icon name=\"reload\"></ion-icon>\n </ion-button> -->\n </div>\n </div>\n </div>\n</div>","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { IonicModule } from '@ionic/angular';\n\nimport { IonVideoPlayerComponent } from './ion-video-player.component';\nimport { SecondsToHoursPipe } from './pipes/seconds-to-hours.pipe';\n\n@NgModule({\n declarations: [\n IonVideoPlayerComponent,\n SecondsToHoursPipe\n ],\n imports: [\n CommonModule,\n IonicModule\n ],\n exports: [\n IonVideoPlayerComponent,\n SecondsToHoursPipe\n ]\n})\nexport class IonVideoPlayerModule { }\n","/*\n * Public API Surface of ion-video-player\n */\n\nexport * from './lib/ion-video-player.component';\nexport * from './lib/ion-video-player.module';\nexport * from './lib/pipes/seconds-to-hours.pipe';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3.SecondsToHoursPipe"],"mappings":"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"}