UNPKG

ngx-audio-player

Version:

A library for loading and playing audio using HTML 5 for Angular 7/8/9/10/11/12. (https://mudigal-technologies.github.io/ngx-audio-player/)

1 lines 54.1 kB
{"version":3,"file":"ngx-audio-player.mjs","sources":["../../../projects/ngx-audio-player/src/lib/service/audio-player-service/audio-player.service.ts","../../../projects/ngx-audio-player/src/lib/pipe/seconds-to-minutes.ts","../../../projects/ngx-audio-player/src/lib/component/ngx-audio-player/ngx-audio-player.component.ts","../../../projects/ngx-audio-player/src/lib/component/ngx-audio-player/ngx-audio-player.component.html","../../../projects/ngx-audio-player/src/lib/ngx-audio-player.module.ts","../../../projects/ngx-audio-player/src/lib/model/track.model.ts","../../../projects/ngx-audio-player/src/public_api.ts","../../../projects/ngx-audio-player/src/ngx-audio-player.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { Track } from '../../model/track.model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AudioPlayerService {\n\n // Dynamic update of playlist\n tracks: Track[] = [];\n playlistSubject$: BehaviorSubject<Track[]> =\n new BehaviorSubject<Track[]>(this.tracks);\n\n // Get the current track\n currentTrack: Track = null;\n currentTrackSubject$: BehaviorSubject<Track> =\n new BehaviorSubject<Track>(this.currentTrack);\n\n // Get the current time\n currentTime: any = null;\n currentTimeSubject$: BehaviorSubject<any> =\n new BehaviorSubject<any>(this.currentTime);\n\n setPlaylist(tracks: Track[]) {\n this.tracks = tracks;\n this.playlistSubject$.next(this.tracks);\n }\n\n getPlaylist(): Observable<Track[]> {\n return this.playlistSubject$.asObservable();\n }\n\n setCurrentTrack(currentTrack: Track) {\n this.currentTrack = currentTrack;\n this.currentTrackSubject$.next(this.currentTrack);\n }\n\n getCurrentTrack(): Observable<Track> {\n return this.currentTrackSubject$.asObservable();\n }\n\n setCurrentTime(currentTime: any) {\n this.currentTime = currentTime;\n this.currentTimeSubject$.next(this.currentTime);\n }\n\n getCurrentTime(): Observable<any> {\n return this.currentTimeSubject$.asObservable();\n }\n\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n/*\n * Transform seconds to minutes:seconds\n * Example : 270 -> 02:30\n*/\n@Pipe({ name: 'secondsToMinutes' })\nexport class SecondsToMinutesPipe implements PipeTransform {\n transform(time: number): string {\n const hours = ('0' + Math.floor(time / 3600)).slice(-2);\n const minutes = ('0' + Math.floor((time % 3600) / 60)).slice(-2);\n const seconds = ('0' + time % 60).slice(-2);\n if (hours !== '00') { return `${hours}:${minutes}:${seconds}`; }\n return `${minutes}:${seconds}`;\n }\n}\n","\nimport { Component, OnInit, Input, ViewChild, Output, ElementRef, OnChanges, SimpleChanges, EventEmitter } from '@angular/core';\nimport { Track } from '../../model/track.model';\nimport { MatSlider } from '@angular/material/slider';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { MatPaginator } from '@angular/material/paginator';\nimport { AudioPlayerService } from '../../service/audio-player-service/audio-player.service';\n\nclass EventResponse {\n event: string;\n track: Track;\n}\n\n@Component({\n selector: 'mat-advanced-audio-player,ngx-audio-player',\n templateUrl: './ngx-audio-player.component.html',\n styleUrls: ['./ngx-audio-player.component.css']\n})\nexport class AudioPlayerComponent implements OnInit, OnChanges {\n\n audioPlayerService: AudioPlayerService;\n constructor(elem: ElementRef) {\n if (elem.nativeElement.tagName.toLowerCase() === 'mat-advanced-audio-player') {\n console.warn(`'mat-advanced-audio-player' selector is deprecated; use 'ngx-audio-player' instead.`);\n }\n this.audioPlayerService = new AudioPlayerService();\n }\n\n @Input()\n set playlist(playlist: Track[]) {\n this.audioPlayerService.setPlaylist(playlist);\n }\n\n @ViewChild(MatPaginator, { static: false }) set matPaginator(mp: MatPaginator) {\n this.paginator = mp;\n this.setDataSourceAttributes();\n }\n\n\n displayedColumns: string[];\n dataSource = new MatTableDataSource<Track>();\n paginator: MatPaginator;\n\n timeLineDuration: MatSlider;\n mediaType: string = null;\n\n tracks: Track[] = [];\n\n // all || one || none\n @Input() repeat: \"all\" | \"one\" | \"none\" = 'all';\n @Input() displayTitle = true;\n @Input() displayPlaylist = true;\n @Input() displayVolumeControls = true;\n @Input() displayVolumeSlider = false;\n @Input() displayRepeatControls = true;\n @Input() pageSizeOptions = [10, 20, 30];\n @Input() expanded = true;\n @Input() autoPlay = false;\n @Input() disablePositionSlider = false;\n @Input() displayArtist = false;\n @Input() displayDuration = false;\n\n // Support for internationalization\n @Input() tableHeader = 'Playlist';\n @Input() titleHeader = 'Title';\n @Input() artistHeader = 'Artist';\n @Input() durationHeader = 'Duration';\n\n currentIndex = 0;\n\n @Output()\n trackPlaying: EventEmitter<EventResponse> = new EventEmitter<EventResponse>();\n @Output()\n trackPaused: EventEmitter<EventResponse> = new EventEmitter<EventResponse>();\n @Output()\n trackEnded: EventEmitter<EventResponse> = new EventEmitter<EventResponse>();\n @Output()\n nextTrackRequested: EventEmitter<EventResponse> = new EventEmitter<EventResponse>();\n @Output()\n previousTrackRequested: EventEmitter<EventResponse> = new EventEmitter<EventResponse>();\n @Output()\n trackSelected: EventEmitter<EventResponse> = new EventEmitter<EventResponse>();\n\n @ViewChild('audioPlayer', { static: true }) player: ElementRef;\n\n iOS = (/iPad|iPhone|iPod/.test(navigator.platform)\n || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1));\n\n loaderDisplay = false;\n isPlaying = false;\n currentTime = 0;\n volume = 0.1;\n toggledVolume = 1.0;\n duration = 0.01;\n\n private startOffsetValue = 0;\n @Input()\n set startOffset(seconds: number) {\n this.startOffsetValue = seconds;\n this.player.nativeElement.currentTime = seconds;\n }\n get startOffset(): number {\n return this.startOffsetValue;\n }\n\n @Input()\n public endOffset = 0;\n\n /**\n * Allow to start the current track\n */\n @Input()\n public play() {\n if (!this.isPlaying) {\n setTimeout(() => {\n this.isPlaying = true;\n this.player.nativeElement.play();\n }, 50);\n }\n }\n\n /**\n * Allow to pause the current track\n */\n @Input()\n public pause() {\n if (this.isPlaying) {\n setTimeout(() => {\n this.isPlaying = false;\n this.player.nativeElement.pause();\n }, 50);\n }\n }\n\n /**\n * Allow to stop the current track\n */\n @Input()\n public stop() {\n setTimeout(() => {\n this.isPlaying = false;\n this.player.nativeElement.pause();\n this.player.nativeElement.currentTime = 0;\n }, 50);\n }\n\n currTimePosChanged(event) {\n this.player.nativeElement.currentTime = event.value;\n }\n\n currVolumeChanged(event) {\n this.volume = event.value;\n this.toggledVolume = event.value;\n this.player.nativeElement.volume = event.value;\n }\n\n bindPlayerEvent(): void {\n\n this.player.nativeElement.addEventListener('playing', () => {\n this.isPlaying = true;\n this.emitEventResponse(\"TrackPlaying\", this.trackPlaying);\n this.mediaType = '';\n if (this.tracks[this.currentIndex].mediaType !== 'stream') {\n this.duration = Math.floor(this.player.nativeElement.duration);\n } else {\n this.mediaType = 'stream';\n }\n });\n this.player.nativeElement.addEventListener('pause', () => {\n this.isPlaying = false;\n this.emitEventResponse(\"TrackPaused\", this.trackPaused);\n });\n this.player.nativeElement.addEventListener('timeupdate', () => {\n this.currentTime = Math.floor(this.player.nativeElement.currentTime);\n // BUG: Commenting for `ended` event not firing #66\n // if (this.currentTime >= this.duration - this.endOffset) {\n // this.player.nativeElement.pause();\n // }\n });\n this.player.nativeElement.addEventListener('volume', () => {\n this.volume = Math.floor(this.player.nativeElement.volume);\n });\n if (!this.iOS) {\n this.player.nativeElement.addEventListener('loadstart', () => {\n this.loaderDisplay = true;\n });\n }\n this.player.nativeElement.addEventListener('loadedmetadata', () => {\n this.loaderDisplay = false;\n if (this.tracks[this.currentIndex].mediaType !== 'stream') {\n this.duration = Math.floor(this.player.nativeElement.duration);\n } else {\n this.duration = 0;\n }\n });\n this.player.nativeElement.addEventListener('ended', () => {\n this.emitEventResponse(\"TrackEnded\", this.trackEnded);\n });\n\n }\n emitEventResponse(event: string, emitter: EventEmitter<EventResponse>) {\n let eventResponse: EventResponse = new EventResponse();\n eventResponse.event = event;\n eventResponse.track = this.audioPlayerService.currentTrack;\n emitter.emit(eventResponse);\n }\n\n playBtnHandler(): void {\n if (this.loaderDisplay) {\n return;\n }\n if (this.player.nativeElement.paused) {\n if (this.currentTime >= this.duration - this.endOffset) {\n this.player.nativeElement.currentTime = this.startOffset;\n } else {\n this.player.nativeElement.currentTime = this.currentTime;\n }\n\n this.player.nativeElement.play();\n } else {\n this.currentTime = this.player.nativeElement.currentTime;\n this.player.nativeElement.pause();\n }\n }\n\n triggerPlay(track?: Track): void {\n\n if (track) {\n this.startOffset = track.startOffset || 0;\n this.endOffset = track.endOffset || 0;\n }\n\n setTimeout(() => {\n this.player.nativeElement.play();\n }, 50);\n\n }\n\n toggleVolume() {\n if (this.volume === 0) {\n this.setVolume(this.toggledVolume);\n } else {\n this.toggledVolume = this.volume;\n this.setVolume(0);\n }\n }\n\n toggleRepeat() {\n if (this.repeat === 'none') {\n this.repeat = 'all';\n } else if (this.repeat === 'all') {\n if (this.tracks.length > 1) {\n this.repeat = 'one';\n } else {\n this.repeat = 'none';\n }\n } else if (this.repeat === 'one' && this.tracks.length > 1) {\n this.repeat = 'none';\n }\n }\n\n private setVolume(vol) {\n this.volume = vol;\n this.player.nativeElement.volume = this.volume;\n }\n\n ngOnInit() {\n\n this.bindPlayerEvent();\n\n // auto play next track\n this.player.nativeElement.addEventListener('ended', () => {\n if (this.mediaType !== 'stream' && this.checkIfSongHasStartedSinceAtleastTwoSeconds()) {\n if (this.repeat === 'all') {\n this.nextSong();\n } else if (this.repeat === 'one') {\n this.triggerPlay();\n } else if (this.repeat === 'none') {\n // Do nothing\n }\n } else {\n this.triggerPlay();\n }\n });\n\n this.player.nativeElement.addEventListener('timeupdate', () => {\n this.audioPlayerService.setCurrentTime(this.player.nativeElement.currentTime);\n });\n\n // Subscribe to playlist observer from AudioPlayerService and\n // update the playlist within MatAdvancedAudioPlayerComponent\n this.audioPlayerService.getPlaylist().subscribe(tracks => {\n if (tracks !== null && tracks.length > 0) {\n this.tracks = tracks;\n this.initialize();\n }\n });\n\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.hasOwnProperty('displayArtist') || changes.hasOwnProperty('displayDuration')) {\n this.buildDisplayedColumns();\n }\n }\n\n private buildDisplayedColumns() {\n this.displayedColumns = ['title'];\n if (this.displayArtist) {\n this.displayedColumns.push('artist');\n }\n if (this.displayDuration) {\n this.displayedColumns.push('duration');\n }\n this.displayedColumns.push('status');\n }\n\n initialize() {\n this.buildDisplayedColumns();\n\n // populate indexs for the track and configure\n // material table data source and paginator\n this.setDataSourceAttributes();\n\n\n this.player.nativeElement.currentTime = this.startOffset;\n this.updateCurrentTrack();\n\n if (this.autoPlay) {\n this.triggerPlay();\n }\n }\n\n setDataSourceAttributes() {\n let index = 1;\n if (this.tracks) {\n this.tracks.forEach((track: Track) => {\n track.index = index++;\n });\n this.dataSource = new MatTableDataSource<Track>(this.tracks);\n this.dataSource.paginator = this.paginator;\n }\n }\n\n nextSong(): void {\n if (this.displayPlaylist === true\n && (((this.currentIndex + 1) % this.paginator.pageSize) === 0\n || (this.currentIndex + 1) === this.paginator.length)) {\n if (this.paginator.hasNextPage()) {\n this.paginator.nextPage();\n } else if (!this.paginator.hasNextPage()) {\n this.paginator.firstPage();\n }\n }\n this.currentTime = 0;\n this.duration = 0.01;\n if ((this.currentIndex + 1) >= this.tracks.length) {\n this.currentIndex = 0;\n } else {\n this.currentIndex++;\n }\n this.updateCurrentTrack();\n this.emitEventResponse(\"NextTrackRequested\", this.nextTrackRequested);\n this.triggerPlay();\n }\n\n previousSong(): void {\n this.currentTime = 0;\n this.duration = 0.01;\n if (!this.checkIfSongHasStartedSinceAtleastTwoSeconds()) {\n if (this.displayPlaylist === true\n && (((this.currentIndex) % this.paginator.pageSize) === 0\n || (this.currentIndex === 0))) {\n if (this.paginator.hasPreviousPage()) {\n this.paginator.previousPage();\n } else if (!this.paginator.hasPreviousPage()) {\n this.paginator.lastPage();\n }\n }\n if ((this.currentIndex - 1) < 0) {\n this.currentIndex = (this.tracks.length - 1);\n } else {\n this.currentIndex--;\n }\n } else {\n this.resetSong();\n }\n this.updateCurrentTrack();\n this.emitEventResponse(\"PreviousTrackRequested\", this.previousTrackRequested);\n this.triggerPlay();\n }\n\n resetSong(): void {\n this.player.nativeElement.src = this.tracks[this.currentIndex].link;\n }\n\n selectTrack(index: number): void {\n this.currentIndex = index - 1;\n this.updateCurrentTrack();\n this.emitEventResponse(\"TrackSelected\", this.trackSelected);\n this.triggerPlay();\n }\n\n checkIfSongHasStartedSinceAtleastTwoSeconds(): boolean {\n return this.player.nativeElement.currentTime > 2;\n }\n\n updateCurrentTrack() {\n this.audioPlayerService.setCurrentTrack(this.tracks[this.currentIndex]);\n }\n\n}\n","<mat-card class=\"ngx-d-flex ngx-content-center ngx-audio-player z-depth-1 mat-elevation-z2\" style=\"margin: 0px;\">\n\n <audio #audioPlayer [src]=\"tracks[currentIndex]?.link\"></audio>\n\n <button type=\"button\" *ngIf=\"tracks.length > 1\" (click)='previousSong();' [disabled]=\"loaderDisplay\" class=\"ngx-p-1\"\n mat-button>\n <mat-icon aria-hidden=\"true\">\n <!-- Skip previous icon (skip_previous) -->\n <svg height=\"32\" viewBox=\"0 0 24 24\" width=\"32\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 6h2v12H6zm3.5 6l8.5 6V6z\" />\n <path d=\"M0 0h32v32H0z\" fill=\"none\" />\n </svg>\n </mat-icon>\n </button>\n <button type=\"button\" (click)='playBtnHandler();' [disabled]=\"loaderDisplay\" class=\"ngx-p-1 play-pause\" mat-button>\n\n <svg *ngIf=\"loaderDisplay\" height=\"34px\" preserveAspectRatio=\"xMidYMid\"\n style=\"margin: auto; display: block; shape-rendering: auto;\" viewBox=\"0 0 100 100\" width=\"34px\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <g transform=\"rotate(0 50 50)\">\n <rect fill=\"#7a7a7a\" height=\"12\" rx=\"3\" ry=\"6\" width=\"6\" x=\"47\" y=\"20\">\n <animate attributeName=\"opacity\" begin=\"-0.9166666666666666s\" dur=\"1s\" keyTimes=\"0;1\"\n repeatCount=\"indefinite\" values=\"1;0\" />\n </rect>\n </g>\n <g transform=\"rotate(30 50 50)\">\n <rect fill=\"#7a7a7a\" height=\"12\" rx=\"3\" ry=\"6\" width=\"6\" x=\"47\" y=\"20\">\n <animate attributeName=\"opacity\" begin=\"-0.8333333333333334s\" dur=\"1s\" keyTimes=\"0;1\"\n repeatCount=\"indefinite\" values=\"1;0\" />\n </rect>\n </g>\n <g transform=\"rotate(60 50 50)\">\n <rect fill=\"#7a7a7a\" height=\"12\" rx=\"3\" ry=\"6\" width=\"6\" x=\"47\" y=\"20\">\n <animate attributeName=\"opacity\" begin=\"-0.75s\" dur=\"1s\" keyTimes=\"0;1\" repeatCount=\"indefinite\"\n values=\"1;0\" />\n </rect>\n </g>\n <g transform=\"rotate(90 50 50)\">\n <rect fill=\"#7a7a7a\" height=\"12\" rx=\"3\" ry=\"6\" width=\"6\" x=\"47\" y=\"20\">\n <animate attributeName=\"opacity\" begin=\"-0.6666666666666666s\" dur=\"1s\" keyTimes=\"0;1\"\n repeatCount=\"indefinite\" values=\"1;0\" />\n </rect>\n </g>\n <g transform=\"rotate(120 50 50)\">\n <rect fill=\"#7a7a7a\" height=\"12\" rx=\"3\" ry=\"6\" width=\"6\" x=\"47\" y=\"20\">\n <animate attributeName=\"opacity\" begin=\"-0.5833333333333334s\" dur=\"1s\" keyTimes=\"0;1\"\n repeatCount=\"indefinite\" values=\"1;0\" />\n </rect>\n </g>\n <g transform=\"rotate(150 50 50)\">\n <rect fill=\"#7a7a7a\" height=\"12\" rx=\"3\" ry=\"6\" width=\"6\" x=\"47\" y=\"20\">\n <animate attributeName=\"opacity\" begin=\"-0.5s\" dur=\"1s\" keyTimes=\"0;1\" repeatCount=\"indefinite\"\n values=\"1;0\" />\n </rect>\n </g>\n <g transform=\"rotate(180 50 50)\">\n <rect fill=\"#7a7a7a\" height=\"12\" rx=\"3\" ry=\"6\" width=\"6\" x=\"47\" y=\"20\">\n <animate attributeName=\"opacity\" begin=\"-0.4166666666666667s\" dur=\"1s\" keyTimes=\"0;1\"\n repeatCount=\"indefinite\" values=\"1;0\" />\n </rect>\n </g>\n <g transform=\"rotate(210 50 50)\">\n <rect fill=\"#7a7a7a\" height=\"12\" rx=\"3\" ry=\"6\" width=\"6\" x=\"47\" y=\"20\">\n <animate attributeName=\"opacity\" begin=\"-0.3333333333333333s\" dur=\"1s\" keyTimes=\"0;1\"\n repeatCount=\"indefinite\" values=\"1;0\" />\n </rect>\n </g>\n <g transform=\"rotate(240 50 50)\">\n <rect fill=\"#7a7a7a\" height=\"12\" rx=\"3\" ry=\"6\" width=\"6\" x=\"47\" y=\"20\">\n <animate attributeName=\"opacity\" begin=\"-0.25s\" dur=\"1s\" keyTimes=\"0;1\" repeatCount=\"indefinite\"\n values=\"1;0\" />\n </rect>\n </g>\n <g transform=\"rotate(270 50 50)\">\n <rect fill=\"#7a7a7a\" height=\"12\" rx=\"3\" ry=\"6\" width=\"6\" x=\"47\" y=\"20\">\n <animate attributeName=\"opacity\" begin=\"-0.16666666666666666s\" dur=\"1s\" keyTimes=\"0;1\"\n repeatCount=\"indefinite\" values=\"1;0\" />\n </rect>\n </g>\n <g transform=\"rotate(300 50 50)\">\n <rect fill=\"#7a7a7a\" height=\"12\" rx=\"3\" ry=\"6\" width=\"6\" x=\"47\" y=\"20\">\n <animate attributeName=\"opacity\" begin=\"-0.08333333333333333s\" dur=\"1s\" keyTimes=\"0;1\"\n repeatCount=\"indefinite\" values=\"1;0\" />\n </rect>\n </g>\n <g transform=\"rotate(330 50 50)\">\n <rect fill=\"#7a7a7a\" height=\"12\" rx=\"3\" ry=\"6\" width=\"6\" x=\"47\" y=\"20\">\n <animate attributeName=\"opacity\" begin=\"0s\" dur=\"1s\" keyTimes=\"0;1\" repeatCount=\"indefinite\"\n values=\"1;0\" />\n </rect>\n </g>\n </svg>\n\n <mat-icon *ngIf=\"!loaderDisplay && !isPlaying\" aria-hidden=\"true\" class=\"play-track\">\n <!-- Play icon (play_arrow) -->\n <svg height=\"32\" viewBox=\"0 0 24 24\" width=\"32\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 5v14l11-7z\" />\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"!loaderDisplay && isPlaying\" aria-hidden=\"true\" class=\"pause-track\">\n <!-- Pause icon (pause) -->\n <svg height=\"32\" viewBox=\"0 0 24 24\" width=\"32\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\" />\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n </svg>\n </mat-icon>\n </button>\n <button type=\"button\" *ngIf=\"tracks.length > 1\" (click)='nextSong();' [disabled]=\"loaderDisplay\"\n class=\"ngx-p-1 skip-next\" mat-button>\n <mat-icon aria-hidden=\"true\" class=\"next-track\">\n <!-- Skip next icon (skip_next) -->\n <svg height=\"32\" viewBox=\"0 0 24 24\" width=\"32\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z\" />\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n </svg>\n </mat-icon>\n </button>\n\n <div class=\"ngx-col\">\n <div class=\"ngx-d-flex ngx-flex-fill ngx-content-center\">\n <div class=\"ngx-d-none ngx-d-sm-block ngx-py-3 ngx-px-1\" style=\"font-size: 12px\">\n <span *ngIf=\"duration !== 0.01\">\n {{currentTime | secondsToMinutes}}\n </span>\n </div>\n\n <mat-slider *ngIf=\"mediaType !== 'stream'\" [disabled]=\"disablePositionSlider\"\n (change)=\"currTimePosChanged($event)\" [min]=\"startOffset\"\n class=\"ngx-d-none ngx-d-sm-block ngx-flex-fill ngx-p-1 ngx-slider\" max=\"{{duration-endOffset}}\"\n style=\"width: 100%\" value=\"{{currentTime}}\"></mat-slider>\n <mat-slider *ngIf=\"mediaType === 'stream'\" [disabled]=\"true\" [min]=\"startOffset\"\n class=\"ngx-d-none ngx-d-sm-block ngx-flex-fill ngx-p-1\" max=\"{{currentTime}}\" style=\"width: 100%\"\n value=\"{{currentTime}}\"></mat-slider>\n\n <div class=\"ngx-py-3 ngx-px-1\" style=\"font-size: 12px; text-align: right\">\n <span *ngIf=\"mediaType !== null && mediaType !== 'stream' && duration !== 0.01\">\n -{{duration-currentTime | secondsToMinutes }}\n </span>\n <span *ngIf=\"mediaType === 'stream'\">\n STREAM\n </span>\n </div>\n </div>\n </div>\n <button type=\"button\" (click)='toggleRepeat();' *ngIf=\"displayRepeatControls\"\n class=\"ngx-p-1 volume justify-content-center\" mat-button>\n <mat-icon *ngIf=\"repeat === 'none'\" aria-hidden=\"true\" class=\"volume-mute justify-content-center\">\n <!-- Repeat None -->\n <svg height=\"24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 22 22\">\n <g>\n <g>\n <path d=\"m0,0l24,0l0,24l-24,0l0,-24z\" fill=\"none\" />\n <path\n d=\"m8,20l0,1.932a0.5,0.5 0 0 1 -0.82,0.385l-4.12,-3.433a0.5,0.5 0 0 1 0.322,-0.884l14.618,0a2,2 0 0 0 2,-2l0,-8l2,0l0,8a4,4 0 0 1 -4,4l-10,0zm8,-16l0,-1.932a0.5,0.5 0 0 1 0.82,-0.385l4.12,3.433a0.5,0.5 0 0 1 -0.321,0.884l-14.619,0a2,2 0 0 0 -2,2l0,8l-2,0l0,-8a4,4 0 0 1 4,-4l10,0z\" />\n <path d=\"M 3 0 L 22.4164 22.2706 L 21 24 L 1.5836 1.8128 L 3 0\"></path>\n </g>\n <!-- <line xmlns=\"http://www.w3.org/2000/svg\" id=\"svg_4\" y2=\"22.27056\" x2=\"22.41638\" y1=\"1.81276\" x1=\"1.58362\" stroke-width=\"2\" fill=\"none\"/> -->\n </g>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"repeat === 'all'\" aria-hidden=\"true\" class=\"volume-mute\">\n <!-- Repeat All -->\n <svg height=\"24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 22 22\">\n <g>\n <path fill=\"none\" d=\"M0 0h24v24H0z\" />\n <path\n d=\"M8 20v1.932a.5.5 0 0 1-.82.385l-4.12-3.433A.5.5 0 0 1 3.382 18H18a2 2 0 0 0 2-2V8h2v8a4 4 0 0 1-4 4H8zm8-16V2.068a.5.5 0 0 1 .82-.385l4.12 3.433a.5.5 0 0 1-.321.884H6a2 2 0 0 0-2 2v8H2V8a4 4 0 0 1 4-4h10z\" />\n </g>\n </svg>\n </mat-icon>\n <mat-icon *ngIf=\"repeat === 'one'\" aria-hidden=\"true\" class=\"volume-up\">\n <!-- Repeat ONE -->\n <svg height=\"24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 22 22\">\n <g>\n <path fill=\"none\" d=\"M0 0h24v24H0z\" />\n <path\n d=\"M8 20v1.932a.5.5 0 0 1-.82.385l-4.12-3.433A.5.5 0 0 1 3.382 18H18a2 2 0 0 0 2-2V8h2v8a4 4 0 0 1-4 4H8zm8-16V2.068a.5.5 0 0 1 .82-.385l4.12 3.433a.5.5 0 0 1-.321.884H6a2 2 0 0 0-2 2v8H2V8a4 4 0 0 1 4-4h10zm-5 4h2v8h-2v-6H9V9l2-1z\" />\n </g>\n </svg>\n </mat-icon>\n </button>\n <button type=\"button\" *ngIf=\"displayVolumeControls\" class=\"ngx-p-1 volume\" mat-button>\n <mat-icon (click)='toggleVolume();' *ngIf=\"volume === 0\" aria-hidden=\"true\" class=\"volume-mute\">\n <!-- Volume mute icon (volume_off) -->\n <svg height=\"28\" viewBox=\"0 0 24 24\" width=\"28\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z\" />\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n </svg>\n </mat-icon>\n <mat-icon (click)='toggleVolume();' *ngIf=\"volume > 0\" aria-hidden=\"true\" class=\"volume-up\">\n <!-- Volume up icon (volume_up) -->\n <svg height=\"28\" viewBox=\"0 0 24 24\" width=\"28\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z\" />\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n </svg>\n </mat-icon>\n <mat-slider *ngIf=\"displayVolumeSlider\" (change)=\"currVolumeChanged($event)\" [min]=\"0\"\n class=\"ngx-d-none ngx-d-sm-block ngx-p-1 ngx-volume ngx-slider\" max=\"1\" step=\"0.01\"\n value=\"{{volume}}\"></mat-slider>\n </button>\n</mat-card>\n\n<mat-card *ngIf=\"displayTitle\" class=\"mat-elevation-z1 ngx-audio-player\">\n <div style=\"text-align: center;\">\n <div style=\"margin: 1px 2px; padding: 0.5em; font-weight: 400; font-size: 16px;\">\n <div style=\"padding: 0.3em;\" *ngIf=\"!isPlaying\">{{\n tracks[currentIndex]?.title }}{{\n displayArtist && tracks[currentIndex]?.artist ?\n ' | ' + tracks[currentIndex]?.artist : ''}}</div>\n\n <marquee *ngIf=\"isPlaying\" behavior=\"scroll\" direction=\"left\">{{\n tracks[currentIndex]?.title\n }}{{ displayArtist && tracks[currentIndex]?.artist ? ' | ' + tracks[currentIndex]?.artist : ''}}\n </marquee>\n </div>\n <div class=\"clear\"></div>\n </div>\n</mat-card>\n\n<mat-accordion class=\"ngx-audio-player\" *ngIf=\"displayPlaylist && tracks.length > 1\">\n <mat-expansion-panel [expanded]=\"expanded\">\n <mat-expansion-panel-header>\n {{tableHeader}}\n </mat-expansion-panel-header>\n <table [dataSource]=\"dataSource\" class=\"mat-elevation-z6\" mat-table>\n <ng-container matColumnDef=\"title\">\n <th *matHeaderCellDef mat-header-cell>{{titleHeader}}</th>\n <td (click)=\"selectTrack(element.index)\" *matCellDef=\"let element\" mat-cell>\n {{element.title}}\n </td>\n </ng-container>\n <ng-container matColumnDef=\"artist\">\n <th *matHeaderCellDef mat-header-cell>{{artistHeader}}</th>\n <td (click)=\"selectTrack(element.index)\" *matCellDef=\"let element\" mat-cell>\n {{element?.artist ? element?.artist : ''}}\n </td>\n </ng-container>\n <ng-container matColumnDef=\"duration\">\n <th *matHeaderCellDef mat-header-cell>{{durationHeader}}</th>\n <td (click)=\"selectTrack(element.index)\" *matCellDef=\"let element\" mat-cell>\n {{element?.duration ? (element?.duration | secondsToMinutes) : ''}}\n </td>\n </ng-container>\n <ng-container matColumnDef=\"status\">\n <th *matHeaderCellDef mat-header-cell></th>\n <td *matCellDef=\"let element\" mat-cell>\n <div *ngIf=\"tracks[currentIndex]?.title === element.title\">\n <!-- <mat-icon *ngIf=\"isPlaying\" aria-hidden=\"true\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/><path d=\"M0 0h24v24H0z\" fill=\"none\"/></svg>\n </mat-icon> -->\n <mat-icon *ngIf=\"isPlaying\" aria-hidden=\"true\" class=\"currently-playing\">\n <!-- Play icon (play_arrow) -->\n <svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path\n d=\"M12 3v9.28c-.47-.17-.97-.28-1.5-.28C8.01 12 6 14.01 6 16.5S8.01 21 10.5 21c2.31 0 4.2-1.75 4.45-4H15V6h4V3h-7z\" />\n </svg>\n </mat-icon>\n </div>\n </td>\n </ng-container>\n <tr *matHeaderRowDef=\"displayedColumns\" mat-header-row></tr>\n <tr *matRowDef=\"let row; columns: displayedColumns;\" class=\"mat-select-content\" mat-row></tr>\n </table>\n <mat-paginator [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons></mat-paginator>\n </mat-expansion-panel>\n</mat-accordion>","import { NgModule } from '@angular/core';\n\nimport { MatSliderModule } from '@angular/material/slider';\nimport { MatPaginatorModule } from '@angular/material/paginator';\nimport { MatTableModule } from '@angular/material/table';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatExpansionModule } from '@angular/material/expansion';\nimport { MatCardModule } from '@angular/material/card';\nimport { MatButtonModule } from '@angular/material/button';\n\nimport { CommonModule } from '@angular/common';\nimport { SecondsToMinutesPipe } from './pipe/seconds-to-minutes';\n\nimport { FormsModule } from '@angular/forms';\nimport { MatIconModule } from '@angular/material/icon';\nimport { AudioPlayerComponent } from './component/ngx-audio-player/ngx-audio-player.component';\n\n@NgModule({\n declarations: [SecondsToMinutesPipe, AudioPlayerComponent],\n imports: [CommonModule, FormsModule, MatButtonModule, MatCardModule, MatTableModule, MatFormFieldModule,\n MatSliderModule, MatExpansionModule, MatPaginatorModule, MatIconModule],\n exports: [AudioPlayerComponent]\n})\nexport class NgxAudioPlayerModule {\n}\n","export class Track {\n index?: number;\n link: string;\n title: string;\n mediaType?: string;\n startOffset?: number;\n endOffset?: number;\n duration?: number;\n artist?: string;\n public toString = (): string => {\n return `Track (index: ${this.index}, title: ${this.title})`;\n }\n}\n","/*\n * Public API Surface of ngx-audio-player\n */\n\nexport * from './lib/component/ngx-audio-player/ngx-audio-player.component';\nexport * from './lib/ngx-audio-player.module';\nexport * from './lib/model/track.model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i9.SecondsToMinutesPipe"],"mappings":"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