diff --git a/client/players/AudioTrack.js b/client/players/AudioTrack.js index f364dad8..78ddfd76 100644 --- a/client/players/AudioTrack.js +++ b/client/players/AudioTrack.js @@ -29,4 +29,4 @@ export default class AudioTrack { return this.contentUrl + `?token=${this.userToken}` } -} \ No newline at end of file +} diff --git a/client/players/castUtils.js b/client/players/castUtils.js index 666fcb2c..3d8e3ee8 100644 --- a/client/players/castUtils.js +++ b/client/players/castUtils.js @@ -1,13 +1,22 @@ - 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 + let metadata = null + if (libraryItem.mediaType === 'podcast') { + metadata = new chrome.cast.media.MusicTrackMediaMetadata() + metadata.albumArtist = libraryItem.media.metadata.author + metadata.artist = libraryItem.media.metadata.author + metadata.title = track.title + metadata.albumName = libraryItem.media.metadata.title + metadata.images = [castImage] + } else { + // https://developers.google.com/cast/docs/reference/web_sender/chrome.cast.media.AudiobookChapterMediaMetadata + 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 @@ -20,17 +29,25 @@ function getMediaInfoFromTrack(libraryItem, castImage, track) { function buildCastMediaInfo(libraryItem, coverUrl, tracks) { const castImage = new chrome.cast.Image(coverUrl) - return tracks.map(t => getMediaInfoFromTrack(libraryItem, castImage, t)) + 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 + let containerMetadata = null + let queueType = chrome.cast.media.QueueType.AUDIOBOOK + if (libraryItem.mediaType === 'podcast') { + queueType = chrome.cast.media.QueueType.PODCAST_SERIES + containerMetadata = new chrome.cast.media.ContainerMetadata(chrome.cast.media.ContainerType.GENERIC_CONTAINER) + containerMetadata.title = libraryItem.media.metadata.title + } else { + 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) @@ -38,23 +55,25 @@ function buildCastQueueRequest(libraryItem, coverUrl, tracks, startTime) { }) // Find track to start playback and calculate track start offset - var track = tracks.find(at => at.startOffset <= startTime && at.startOffset + at.duration > startTime) + 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 + queueData.queueType = queueType return queueData } function castLoadMedia(castSession, request) { return new Promise((resolve) => { - castSession.loadMedia(request) - .then(() => resolve(true), (reason) => { + castSession.loadMedia(request).then( + () => resolve(true), + (reason) => { console.error('Load media failed', reason) resolve(false) - }) + } + ) }) } @@ -69,7 +88,4 @@ function buildCastLoadRequest(libraryItem, coverUrl, tracks, startTime, autoplay return request } -export { - buildCastLoadRequest, - castLoadMedia -} \ No newline at end of file +export { buildCastLoadRequest, castLoadMedia }