Fix: iOS mobile audio stream support #180

This commit is contained in:
advplyr 2021-11-16 17:37:49 -06:00
parent 72f9732b67
commit 41f05f7a7b
3 changed files with 21 additions and 9 deletions

View File

@ -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, () => {

View File

@ -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
}

View File

@ -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