@@ -10,6 +10,7 @@ import androidx.media3.common.MimeTypes
1010import androidx.media3.common.Player
1111import androidx.media3.common.util.UnstableApi
1212import androidx.media3.datasource.FileDataSource
13+ import androidx.media3.exoplayer.source.MediaSource
1314import androidx.media3.exoplayer.source.MergingMediaSource
1415import androidx.media3.exoplayer.source.ProgressiveMediaSource
1516import 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