diff --git a/client/components/AudioPlayer.vue b/client/components/AudioPlayer.vue index a7937e2f..cebd15df 100644 --- a/client/components/AudioPlayer.vue +++ b/client/components/AudioPlayer.vue @@ -567,6 +567,17 @@ export default { this.src = url console.log('[AudioPlayer-Set] Set url', url) + var audio = this.$refs.audio + audio.volume = this.volume + audio.defaultPlaybackRate = this.playbackRate + + // iOS does not support Media Elements but allows for HLS in the native audio player + if (!Hls.isSupported()) { + console.warn('HLS is not supported - fallback to using audio element') + audio.src = this.src + '?token=' + this.token + return + } + var hlsOptions = { startPosition: currentTime || -1, xhrSetup: (xhr) => { @@ -576,9 +587,6 @@ export default { console.log('Starting HLS audio stream at time', currentTime) // console.log('[AudioPlayer-Set] HLS Config', hlsOptions) this.hlsInstance = new Hls(hlsOptions) - var audio = this.$refs.audio - audio.volume = this.volume - audio.defaultPlaybackRate = this.playbackRate this.hlsInstance.attachMedia(audio) this.hlsInstance.on(Hls.Events.MEDIA_ATTACHED, () => { diff --git a/server/objects/Stream.js b/server/objects/Stream.js index aca60dcc..2f4fa4d8 100644 --- a/server/objects/Stream.js +++ b/server/objects/Stream.js @@ -95,6 +95,10 @@ class Stream extends EventEmitter { return this.client ? this.client.user || {} : null } + get userToken() { + return this.clientUser ? this.clientUser.token : null + } + get clientUserAudiobooks() { return this.client ? this.clientUser.audiobooks || {} : null } @@ -205,7 +209,7 @@ class Stream extends EventEmitter { async generatePlaylist() { fs.ensureDirSync(this.streamPath) - await hlsPlaylistGenerator(this.playlistPath, 'output', this.totalDuration, this.segmentLength, this.hlsSegmentType) + await hlsPlaylistGenerator(this.playlistPath, 'output', this.totalDuration, this.segmentLength, this.hlsSegmentType, this.userToken) return this.clientPlaylistUri } diff --git a/server/utils/hlsPlaylistGenerator.js b/server/utils/hlsPlaylistGenerator.js index 414e38b7..76f7aa90 100644 --- a/server/utils/hlsPlaylistGenerator.js +++ b/server/utils/hlsPlaylistGenerator.js @@ -1,6 +1,6 @@ const fs = require('fs-extra') -function getPlaylistStr(segmentName, duration, segmentLength, hlsSegmentType) { +function getPlaylistStr(segmentName, duration, segmentLength, hlsSegmentType, token) { var ext = hlsSegmentType === 'fmp4' ? 'm4s' : 'ts' var lines = [ @@ -18,18 +18,18 @@ function getPlaylistStr(segmentName, duration, segmentLength, hlsSegmentType) { var lastSegment = duration - (numSegments * segmentLength) for (let i = 0; i < numSegments; i++) { lines.push(`#EXTINF:6,`) - lines.push(`${segmentName}-${i}.${ext}`) + lines.push(`${segmentName}-${i}.${ext}?token=${token}`) } if (lastSegment > 0) { lines.push(`#EXTINF:${lastSegment},`) - lines.push(`${segmentName}-${numSegments}.${ext}`) + lines.push(`${segmentName}-${numSegments}.${ext}?token=${token}`) } lines.push('#EXT-X-ENDLIST') return lines.join('\n') } -function generatePlaylist(outputPath, segmentName, duration, segmentLength, hlsSegmentType) { - var playlistStr = getPlaylistStr(segmentName, duration, segmentLength, hlsSegmentType) +function generatePlaylist(outputPath, segmentName, duration, segmentLength, hlsSegmentType, token) { + var playlistStr = getPlaylistStr(segmentName, duration, segmentLength, hlsSegmentType, token) return fs.writeFile(outputPath, playlistStr) } module.exports = generatePlaylist \ No newline at end of file