Skip to content

Commit 9a09a38

Browse files
committed
fix: missing item metadata when playing download containing video AND audio
1 parent 50c2e18 commit 9a09a38

1 file changed

Lines changed: 37 additions & 46 deletions

File tree

app/src/main/java/com/github/libretube/services/OfflinePlayerService.kt

Lines changed: 37 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.media3.common.MimeTypes
1010
import androidx.media3.common.Player
1111
import androidx.media3.common.util.UnstableApi
1212
import androidx.media3.datasource.FileDataSource
13+
import androidx.media3.exoplayer.source.MediaSource
1314
import androidx.media3.exoplayer.source.MergingMediaSource
1415
import androidx.media3.exoplayer.source.ProgressiveMediaSource
1516
import androidx.media3.exoplayer.source.SingleSampleMediaSource
@@ -58,7 +59,8 @@ open class OfflinePlayerService : AbstractPlayerService() {
5859

5960
if (playbackState == Player.STATE_READY) {
6061
scope.launch(Dispatchers.IO) {
61-
val watchHistoryItem = downloadWithItems?.download?.toStreamItem()?.toWatchHistoryItem(videoId)
62+
val watchHistoryItem =
63+
downloadWithItems?.download?.toStreamItem()?.toWatchHistoryItem(videoId)
6264
if (watchHistoryItem != null) {
6365
DatabaseHelper.addToWatchHistory(watchHistoryItem)
6466
}
@@ -137,65 +139,54 @@ open class OfflinePlayerService : AbstractPlayerService() {
137139

138140
val videoUri = downloadFiles.firstOrNull { it.type == FileType.VIDEO }?.path?.toAndroidUri()
139141
val audioUri = downloadFiles.firstOrNull { it.type == FileType.AUDIO }?.path?.toAndroidUri()
140-
if (isAudioOnlyPlayer && audioUri == null) {
141-
stopSelf()
142-
return
143-
}
144-
145142
val subtitleInfo = downloadFiles.firstOrNull { it.type == FileType.SUBTITLE }
146143

147-
val subtitle = subtitleInfo?.let {
148-
SubtitleConfiguration.Builder(it.path.toAndroidUri())
149-
.setMimeType(MimeTypes.APPLICATION_TTML)
150-
.setLanguage(it.language ?: "en")
144+
val videoSource = videoUri?.let { videoUri ->
145+
val videoItem = MediaItem.Builder()
146+
.setUri(videoUri)
147+
.setMetadata(downloadWithItems)
151148
.build()
152-
}
153149

154-
when {
155-
videoUri != null && audioUri != null -> {
156-
val videoItem = MediaItem.Builder()
157-
.setUri(videoUri)
158-
.setMetadata(downloadWithItems)
159-
.setSubtitleConfigurations(listOfNotNull(subtitle))
160-
.build()
150+
ProgressiveMediaSource.Factory(FileDataSource.Factory())
151+
.createMediaSource(videoItem)
152+
}
161153

162-
val videoSource = ProgressiveMediaSource.Factory(FileDataSource.Factory())
163-
.createMediaSource(videoItem)
154+
val audioSource = audioUri?.let { audioUri ->
155+
val audioItem = MediaItem.Builder()
156+
.setUri(audioUri)
157+
.setMetadata(downloadWithItems)
158+
.build()
164159

165-
val audioSource = ProgressiveMediaSource.Factory(FileDataSource.Factory())
166-
.createMediaSource(MediaItem.fromUri(audioUri))
160+
ProgressiveMediaSource.Factory(FileDataSource.Factory())
161+
.createMediaSource(audioItem)
162+
}
167163

168-
var mediaSource = MergingMediaSource(audioSource, videoSource)
169-
if (subtitle != null) {
170-
val subtitleSource = SingleSampleMediaSource.Factory(FileDataSource.Factory())
171-
.createMediaSource(subtitle, C.TIME_UNSET)
164+
val subtitleSource = subtitleInfo?.let { subtitleInfo ->
165+
val subtitle = SubtitleConfiguration.Builder(subtitleInfo.path.toAndroidUri())
166+
.setMimeType(MimeTypes.APPLICATION_TTML)
167+
.setLanguage(subtitleInfo.language ?: "en")
168+
.build()
172169

173-
mediaSource = MergingMediaSource(mediaSource, subtitleSource)
174-
}
170+
SingleSampleMediaSource.Factory(FileDataSource.Factory())
171+
.createMediaSource(subtitle, C.TIME_UNSET)
172+
}
175173

176-
exoPlayer?.setMediaSource(mediaSource)
177-
}
174+
var mediaSource: MediaSource? = null
175+
listOfNotNull(videoSource, audioSource, subtitleSource).forEach { source ->
176+
mediaSource =
177+
if (mediaSource == null) source else MergingMediaSource(mediaSource!!, source)
178+
}
178179

179-
videoUri != null -> exoPlayer?.setMediaItem(
180-
MediaItem.Builder()
181-
.setUri(videoUri)
182-
.setMetadata(downloadWithItems)
183-
.setSubtitleConfigurations(listOfNotNull(subtitle))
184-
.build()
185-
)
186-
187-
audioUri != null -> exoPlayer?.setMediaItem(
188-
MediaItem.Builder()
189-
.setUri(audioUri)
190-
.setMetadata(downloadWithItems)
191-
.setSubtitleConfigurations(listOfNotNull(subtitle))
192-
.build()
193-
)
180+
if (mediaSource == null || isAudioOnlyPlayer && audioSource == null) {
181+
stopSelf()
182+
return
194183
}
195184

185+
exoPlayer?.setMediaSource(mediaSource!!)
186+
196187
trackSelector?.updateParameters {
197188
setPreferredTextRoleFlags(C.ROLE_FLAG_CAPTION)
198-
setPreferredTextLanguage(subtitle?.language)
189+
setPreferredTextLanguage(subtitleInfo?.language ?: "en")
199190
}
200191
}
201192

0 commit comments

Comments
 (0)