mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Fix: iOS mobile audio stream support #180
This commit is contained in:
		
							parent
							
								
									72f9732b67
								
							
						
					
					
						commit
						41f05f7a7b
					
				@ -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, () => {
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user