mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			75 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
 | |
| function getMediaInfoFromTrack(libraryItem, castImage, track) {
 | |
|   // https://developers.google.com/cast/docs/reference/web_sender/chrome.cast.media.AudiobookChapterMediaMetadata
 | |
|   var metadata = new chrome.cast.media.AudiobookChapterMediaMetadata()
 | |
|   metadata.bookTitle = libraryItem.media.metadata.title
 | |
|   metadata.chapterNumber = track.index
 | |
|   metadata.chapterTitle = track.title
 | |
|   metadata.images = [castImage]
 | |
|   metadata.title = track.title
 | |
|   metadata.subtitle = libraryItem.media.metadata.title
 | |
| 
 | |
|   var trackurl = track.fullContentUrl
 | |
|   var mimeType = track.mimeType
 | |
|   var mediainfo = new chrome.cast.media.MediaInfo(trackurl, mimeType)
 | |
|   mediainfo.metadata = metadata
 | |
|   mediainfo.itemId = track.index
 | |
|   mediainfo.duration = track.duration
 | |
|   return mediainfo
 | |
| }
 | |
| 
 | |
| function buildCastMediaInfo(libraryItem, coverUrl, tracks) {
 | |
|   const castImage = new chrome.cast.Image(coverUrl)
 | |
|   return tracks.map(t => getMediaInfoFromTrack(libraryItem, castImage, t))
 | |
| }
 | |
| 
 | |
| function buildCastQueueRequest(libraryItem, coverUrl, tracks, startTime) {
 | |
|   var mediaInfoItems = buildCastMediaInfo(libraryItem, coverUrl, tracks)
 | |
| 
 | |
|   var containerMetadata = new chrome.cast.media.AudiobookContainerMetadata()
 | |
|   containerMetadata.authors = libraryItem.media.metadata.authors.map(a => a.name)
 | |
|   containerMetadata.narrators = libraryItem.media.metadata.narrators || []
 | |
|   containerMetadata.publisher = libraryItem.media.metadata.publisher || undefined
 | |
|   containerMetadata.title = libraryItem.media.metadata.title
 | |
| 
 | |
|   var mediaQueueItems = mediaInfoItems.map((mi) => {
 | |
|     var queueItem = new chrome.cast.media.QueueItem(mi)
 | |
|     return queueItem
 | |
|   })
 | |
| 
 | |
|   // Find track to start playback and calculate track start offset
 | |
|   var track = tracks.find(at => at.startOffset <= startTime && at.startOffset + at.duration > startTime)
 | |
|   var trackStartIndex = track ? track.index - 1 : 0
 | |
|   var trackStartTime = Math.floor(track ? startTime - track.startOffset : 0)
 | |
| 
 | |
|   var queueData = new chrome.cast.media.QueueData(libraryItem.id, libraryItem.media.metadata.title, '', false, mediaQueueItems, trackStartIndex, trackStartTime)
 | |
|   queueData.containerMetadata = containerMetadata
 | |
|   queueData.queueType = chrome.cast.media.QueueType.AUDIOBOOK
 | |
|   return queueData
 | |
| }
 | |
| 
 | |
| function castLoadMedia(castSession, request) {
 | |
|   return new Promise((resolve) => {
 | |
|     castSession.loadMedia(request)
 | |
|       .then(() => resolve(true), (reason) => {
 | |
|         console.error('Load media failed', reason)
 | |
|         resolve(false)
 | |
|       })
 | |
|   })
 | |
| }
 | |
| 
 | |
| function buildCastLoadRequest(libraryItem, coverUrl, tracks, startTime, autoplay, playbackRate) {
 | |
|   var request = new chrome.cast.media.LoadRequest()
 | |
| 
 | |
|   request.queueData = buildCastQueueRequest(libraryItem, coverUrl, tracks, startTime)
 | |
|   request.currentTime = request.queueData.startTime
 | |
| 
 | |
|   request.autoplay = autoplay
 | |
|   request.playbackRate = playbackRate
 | |
|   return request
 | |
| }
 | |
| 
 | |
| export {
 | |
|   buildCastLoadRequest,
 | |
|   castLoadMedia
 | |
| } |