Skip to content

Commit a0a6694

Browse files
authored
Merge pull request libre-tube#7262 from Bnyro/master
refactor: merge OfflinePlayerService with VideoOfflinePlayerService
2 parents 50bd0f6 + 09660cd commit a0a6694

7 files changed

Lines changed: 84 additions & 116 deletions

File tree

app/src/main/java/com/github/libretube/helpers/BackgroundHelper.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import com.github.libretube.parcelable.PlayerData
1717
import com.github.libretube.services.AbstractPlayerService
1818
import com.github.libretube.services.OfflinePlayerService
1919
import com.github.libretube.services.OnlinePlayerService
20-
import com.github.libretube.services.VideoOfflinePlayerService
2120
import com.github.libretube.ui.activities.MainActivity
2221
import com.github.libretube.ui.activities.NoInternetActivity
2322
import com.github.libretube.ui.fragments.DownloadTab
@@ -65,8 +64,7 @@ object BackgroundHelper {
6564
fun stopBackgroundPlay(context: Context) {
6665
arrayOf(
6766
OnlinePlayerService::class.java,
68-
OfflinePlayerService::class.java,
69-
VideoOfflinePlayerService::class.java
67+
OfflinePlayerService::class.java
7068
).forEach {
7169
val intent = Intent(context, it)
7270
context.stopService(intent)
@@ -104,7 +102,8 @@ object BackgroundHelper {
104102
IntentData.videoId to videoId,
105103
IntentData.shuffle to shuffle,
106104
IntentData.downloadTab to downloadTab,
107-
IntentData.noInternet to noInternet
105+
IntentData.noInternet to noInternet,
106+
IntentData.audioOnly to true
108107
)
109108

110109
startMediaService(context, OfflinePlayerService::class.java, arguments)

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

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import androidx.media3.common.ForwardingPlayer
1515
import androidx.media3.common.MediaMetadata
1616
import androidx.media3.common.PlaybackException
1717
import androidx.media3.common.Player
18-
import androidx.media3.common.util.Log
1918
import androidx.media3.common.util.UnstableApi
2019
import androidx.media3.exoplayer.ExoPlayer
2120
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector
@@ -119,13 +118,6 @@ abstract class AbstractPlayerService : MediaLibraryService(), MediaLibrarySessio
119118
onServiceCreated(args)
120119
notificationProvider?.intentActivity = getIntentActivity()
121120

122-
if (isAudioOnlyPlayer) {
123-
trackSelector?.updateParameters {
124-
setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, true)
125-
}
126-
}
127-
128-
Log.e("custom start", "custom start")
129121
if (::videoId.isInitialized) startPlayback()
130122
}
131123
}

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

Lines changed: 72 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,16 @@ package com.github.libretube.services
33
import android.content.Intent
44
import android.os.Bundle
55
import androidx.annotation.OptIn
6+
import androidx.media3.common.C
67
import androidx.media3.common.MediaItem
8+
import androidx.media3.common.MediaItem.SubtitleConfiguration
9+
import androidx.media3.common.MimeTypes
710
import androidx.media3.common.Player
811
import androidx.media3.common.util.UnstableApi
12+
import androidx.media3.datasource.FileDataSource
13+
import androidx.media3.exoplayer.source.MergingMediaSource
14+
import androidx.media3.exoplayer.source.ProgressiveMediaSource
15+
import androidx.media3.exoplayer.source.SingleSampleMediaSource
916
import com.github.libretube.constants.IntentData
1017
import com.github.libretube.db.DatabaseHelper
1118
import com.github.libretube.db.DatabaseHolder.Database
@@ -15,6 +22,7 @@ import com.github.libretube.enums.FileType
1522
import com.github.libretube.extensions.serializable
1623
import com.github.libretube.extensions.setMetadata
1724
import com.github.libretube.extensions.toAndroidUri
25+
import com.github.libretube.extensions.updateParameters
1826
import com.github.libretube.helpers.PlayerHelper
1927
import com.github.libretube.ui.activities.MainActivity
2028
import com.github.libretube.ui.activities.NoInternetActivity
@@ -65,6 +73,7 @@ open class OfflinePlayerService : AbstractPlayerService() {
6573
downloadTab = args.serializable(IntentData.downloadTab)!!
6674
shuffle = args.getBoolean(IntentData.shuffle, false)
6775
noInternetService = args.getBoolean(IntentData.noInternet, false)
76+
isAudioOnlyPlayer = args.getBoolean(IntentData.audioOnly, false)
6877

6978
val videoId = if (shuffle) {
7079
runBlocking(Dispatchers.IO) {
@@ -75,10 +84,12 @@ open class OfflinePlayerService : AbstractPlayerService() {
7584
} ?: return
7685
setVideoId(videoId)
7786

78-
PlayingQueue.clear()
79-
8087
exoPlayer?.addListener(playerListener)
88+
trackSelector?.updateParameters {
89+
setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, isAudioOnlyPlayer)
90+
}
8191

92+
PlayingQueue.clear()
8293
fillQueue()
8394
}
8495

@@ -116,23 +127,71 @@ open class OfflinePlayerService : AbstractPlayerService() {
116127
}
117128
}
118129

119-
open fun setMediaItem(downloadWithItems: DownloadWithItems) {
120-
val audioItem = downloadWithItems.downloadItems.filter { it.path.exists() }
121-
.firstOrNull { it.type == FileType.AUDIO }
122-
?: // in some rare cases, video files can contain audio
123-
downloadWithItems.downloadItems.firstOrNull { it.type == FileType.VIDEO }
130+
private fun setMediaItem(downloadWithItems: DownloadWithItems) {
131+
val downloadFiles = downloadWithItems.downloadItems.filter { it.path.exists() }
124132

125-
if (audioItem == null) {
133+
val videoUri = downloadFiles.firstOrNull { it.type == FileType.VIDEO }?.path?.toAndroidUri()
134+
val audioUri = downloadFiles.firstOrNull { it.type == FileType.AUDIO }?.path?.toAndroidUri()
135+
if (isAudioOnlyPlayer && audioUri == null) {
126136
stopSelf()
127137
return
128138
}
129139

130-
val mediaItem = MediaItem.Builder()
131-
.setUri(audioItem.path.toAndroidUri())
132-
.setMetadata(downloadWithItems)
133-
.build()
140+
val subtitleInfo = downloadFiles.firstOrNull { it.type == FileType.SUBTITLE }
141+
142+
val subtitle = subtitleInfo?.let {
143+
SubtitleConfiguration.Builder(it.path.toAndroidUri())
144+
.setMimeType(MimeTypes.APPLICATION_TTML)
145+
.setLanguage(it.language ?: "en")
146+
.build()
147+
}
148+
149+
when {
150+
videoUri != null && audioUri != null -> {
151+
val videoItem = MediaItem.Builder()
152+
.setUri(videoUri)
153+
.setMetadata(downloadWithItems)
154+
.setSubtitleConfigurations(listOfNotNull(subtitle))
155+
.build()
156+
157+
val videoSource = ProgressiveMediaSource.Factory(FileDataSource.Factory())
158+
.createMediaSource(videoItem)
159+
160+
val audioSource = ProgressiveMediaSource.Factory(FileDataSource.Factory())
161+
.createMediaSource(MediaItem.fromUri(audioUri))
134162

135-
exoPlayer?.setMediaItem(mediaItem)
163+
var mediaSource = MergingMediaSource(audioSource, videoSource)
164+
if (subtitle != null) {
165+
val subtitleSource = SingleSampleMediaSource.Factory(FileDataSource.Factory())
166+
.createMediaSource(subtitle, C.TIME_UNSET)
167+
168+
mediaSource = MergingMediaSource(mediaSource, subtitleSource)
169+
}
170+
171+
exoPlayer?.setMediaSource(mediaSource)
172+
}
173+
174+
videoUri != null -> exoPlayer?.setMediaItem(
175+
MediaItem.Builder()
176+
.setUri(videoUri)
177+
.setMetadata(downloadWithItems)
178+
.setSubtitleConfigurations(listOfNotNull(subtitle))
179+
.build()
180+
)
181+
182+
audioUri != null -> exoPlayer?.setMediaItem(
183+
MediaItem.Builder()
184+
.setUri(audioUri)
185+
.setMetadata(downloadWithItems)
186+
.setSubtitleConfigurations(listOfNotNull(subtitle))
187+
.build()
188+
)
189+
}
190+
191+
trackSelector?.updateParameters {
192+
setPreferredTextRoleFlags(C.ROLE_FLAG_CAPTION)
193+
setPreferredTextLanguage(subtitle?.language)
194+
}
136195
}
137196

138197
private suspend fun fillQueue() {

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.net.Uri
44
import android.os.Bundle
55
import androidx.core.net.toUri
66
import androidx.core.os.bundleOf
7+
import androidx.media3.common.C
78
import androidx.media3.common.MediaItem
89
import androidx.media3.common.MediaItem.SubtitleConfiguration
910
import androidx.media3.common.MimeTypes
@@ -25,6 +26,7 @@ import com.github.libretube.extensions.parcelable
2526
import com.github.libretube.extensions.setMetadata
2627
import com.github.libretube.extensions.toastFromMainDispatcher
2728
import com.github.libretube.extensions.toastFromMainThread
29+
import com.github.libretube.extensions.updateParameters
2830
import com.github.libretube.helpers.PlayerHelper
2931
import com.github.libretube.helpers.PlayerHelper.checkForSegments
3032
import com.github.libretube.helpers.PlayerHelper.getSubtitleRoleFlags
@@ -112,13 +114,14 @@ open class OnlinePlayerService : AbstractPlayerService() {
112114
if (!playerData.keepQueue) PlayingQueue.clear()
113115

114116
exoPlayer?.addListener(playerListener)
117+
trackSelector?.updateParameters {
118+
setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, isAudioOnlyPlayer)
119+
}
115120
}
116121

117122
override suspend fun startPlayback() {
118123
super.startPlayback()
119124

120-
Log.e("start", "playback")
121-
122125
val timestampMs = startTimestampSeconds?.times(1000) ?: 0L
123126
startTimestampSeconds = null
124127

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

Lines changed: 0 additions & 85 deletions
This file was deleted.

app/src/main/java/com/github/libretube/ui/activities/OfflinePlayerActivity.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import com.github.libretube.helpers.BackgroundHelper
3232
import com.github.libretube.helpers.PlayerHelper
3333
import com.github.libretube.helpers.WindowHelper
3434
import com.github.libretube.services.AbstractPlayerService
35-
import com.github.libretube.services.VideoOfflinePlayerService
35+
import com.github.libretube.services.OfflinePlayerService
3636
import com.github.libretube.ui.base.BaseActivity
3737
import com.github.libretube.ui.fragments.DownloadTab
3838
import com.github.libretube.ui.interfaces.TimeFrameReceiver
@@ -139,9 +139,10 @@ class OfflinePlayerActivity : BaseActivity() {
139139

140140
val arguments = bundleOf(
141141
IntentData.downloadTab to DownloadTab.VIDEO,
142-
IntentData.videoId to videoId
142+
IntentData.videoId to videoId,
143+
IntentData.audioOnly to false
143144
)
144-
BackgroundHelper.startMediaService(this, VideoOfflinePlayerService::class.java, arguments) {
145+
BackgroundHelper.startMediaService(this, OfflinePlayerService::class.java, arguments) {
145146
playerController = it
146147
playerController.addListener(playerListener)
147148
initializePlayerView()

app/src/main/java/com/github/libretube/ui/fragments/AudioPlayerFragment.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ class AudioPlayerFragment : Fragment(R.layout.fragment_audio_player), AudioPlaye
9595
BackgroundHelper.startMediaService(
9696
requireContext(),
9797
if (isOffline) OfflinePlayerService::class.java else OnlinePlayerService::class.java,
98-
bundleOf()
9998
) {
10099
if (_binding == null) {
101100
it.sendCustomCommand(AbstractPlayerService.stopServiceCommand, Bundle.EMPTY)

0 commit comments

Comments
 (0)