mirror of
https://github.com/libre-tube/LibreTube.git
synced 2025-04-28 16:00:31 +05:30
commit
93275b9d00
@ -131,8 +131,6 @@ dependencies {
|
|||||||
|
|
||||||
/* Cronet and Coil */
|
/* Cronet and Coil */
|
||||||
coreLibraryDesugaring(libs.desugaring)
|
coreLibraryDesugaring(libs.desugaring)
|
||||||
implementation(libs.cronet.embedded)
|
|
||||||
implementation(libs.cronet.okhttp)
|
|
||||||
implementation(libs.coil)
|
implementation(libs.coil)
|
||||||
|
|
||||||
/* Room */
|
/* Room */
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
package com.github.libretube.api
|
|
||||||
|
|
||||||
import com.github.libretube.LibreTubeApp
|
|
||||||
import com.google.net.cronet.okhttptransport.CronetCallFactory
|
|
||||||
import org.chromium.net.CronetEngine
|
|
||||||
|
|
||||||
object CronetHelper {
|
|
||||||
val cronetEngine: CronetEngine = CronetEngine.Builder(LibreTubeApp.instance)
|
|
||||||
.enableHttp2(true)
|
|
||||||
.enableQuic(true)
|
|
||||||
.enableBrotli(true)
|
|
||||||
.enableHttpCache(CronetEngine.Builder.HTTP_CACHE_IN_MEMORY, 1024L * 1024L) // 1MiB
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val callFactory: CronetCallFactory = CronetCallFactory.newBuilder(cronetEngine).build()
|
|
||||||
}
|
|
@ -3,7 +3,6 @@ package com.github.libretube.api
|
|||||||
import com.github.libretube.BuildConfig
|
import com.github.libretube.BuildConfig
|
||||||
import com.github.libretube.constants.PreferenceKeys
|
import com.github.libretube.constants.PreferenceKeys
|
||||||
import com.github.libretube.helpers.PreferenceHelper
|
import com.github.libretube.helpers.PreferenceHelper
|
||||||
import com.google.net.cronet.okhttptransport.CronetInterceptor
|
|
||||||
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
|
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
|
||||||
import okhttp3.MediaType.Companion.toMediaType
|
import okhttp3.MediaType.Companion.toMediaType
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
@ -38,7 +37,6 @@ object RetrofitInstance {
|
|||||||
val api by resettableLazy(lazyMgr) {
|
val api by resettableLazy(lazyMgr) {
|
||||||
Retrofit.Builder()
|
Retrofit.Builder()
|
||||||
.baseUrl(apiUrl)
|
.baseUrl(apiUrl)
|
||||||
.callFactory(CronetHelper.callFactory)
|
|
||||||
.client(httpClient)
|
.client(httpClient)
|
||||||
.addConverterFactory(kotlinxConverterFactory)
|
.addConverterFactory(kotlinxConverterFactory)
|
||||||
.build()
|
.build()
|
||||||
@ -48,7 +46,6 @@ object RetrofitInstance {
|
|||||||
val authApi by resettableLazy(lazyMgr) {
|
val authApi by resettableLazy(lazyMgr) {
|
||||||
Retrofit.Builder()
|
Retrofit.Builder()
|
||||||
.baseUrl(authUrl)
|
.baseUrl(authUrl)
|
||||||
.callFactory(CronetHelper.callFactory)
|
|
||||||
.client(httpClient)
|
.client(httpClient)
|
||||||
.addConverterFactory(kotlinxConverterFactory)
|
.addConverterFactory(kotlinxConverterFactory)
|
||||||
.build()
|
.build()
|
||||||
@ -58,7 +55,6 @@ object RetrofitInstance {
|
|||||||
val externalApi by resettableLazy(lazyMgr) {
|
val externalApi by resettableLazy(lazyMgr) {
|
||||||
Retrofit.Builder()
|
Retrofit.Builder()
|
||||||
.baseUrl(apiUrl)
|
.baseUrl(apiUrl)
|
||||||
.callFactory(CronetHelper.callFactory)
|
|
||||||
.client(httpClient)
|
.client(httpClient)
|
||||||
.addConverterFactory(kotlinxConverterFactory)
|
.addConverterFactory(kotlinxConverterFactory)
|
||||||
.build()
|
.build()
|
||||||
@ -76,8 +72,6 @@ object RetrofitInstance {
|
|||||||
httpClient.addInterceptor(loggingInterceptor)
|
httpClient.addInterceptor(loggingInterceptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
httpClient.addInterceptor(CronetInterceptor.newBuilder(CronetHelper.cronetEngine).build())
|
|
||||||
|
|
||||||
return httpClient.build()
|
return httpClient.build()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,11 +13,9 @@ import coil.disk.DiskCache
|
|||||||
import coil.request.CachePolicy
|
import coil.request.CachePolicy
|
||||||
import coil.request.ImageRequest
|
import coil.request.ImageRequest
|
||||||
import com.github.libretube.BuildConfig
|
import com.github.libretube.BuildConfig
|
||||||
import com.github.libretube.api.CronetHelper
|
|
||||||
import com.github.libretube.constants.PreferenceKeys
|
import com.github.libretube.constants.PreferenceKeys
|
||||||
import com.github.libretube.extensions.toAndroidUri
|
import com.github.libretube.extensions.toAndroidUri
|
||||||
import com.github.libretube.util.DataSaverMode
|
import com.github.libretube.util.DataSaverMode
|
||||||
import com.google.net.cronet.okhttptransport.CronetInterceptor
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
@ -46,10 +44,7 @@ object ImageHelper {
|
|||||||
httpClient.addInterceptor(loggingInterceptor)
|
httpClient.addInterceptor(loggingInterceptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
httpClient.addInterceptor(CronetInterceptor.newBuilder(CronetHelper.cronetEngine).build())
|
|
||||||
|
|
||||||
imageLoader = ImageLoader.Builder(context)
|
imageLoader = ImageLoader.Builder(context)
|
||||||
.callFactory(CronetHelper.callFactory)
|
|
||||||
.crossfade(true)
|
.crossfade(true)
|
||||||
.okHttpClient {
|
.okHttpClient {
|
||||||
httpClient.build()
|
httpClient.build()
|
||||||
|
@ -22,7 +22,6 @@ import androidx.media3.common.TrackSelectionOverride
|
|||||||
import androidx.media3.common.Tracks
|
import androidx.media3.common.Tracks
|
||||||
import androidx.media3.common.util.UnstableApi
|
import androidx.media3.common.util.UnstableApi
|
||||||
import androidx.media3.datasource.DefaultDataSource
|
import androidx.media3.datasource.DefaultDataSource
|
||||||
import androidx.media3.datasource.cronet.CronetDataSource
|
|
||||||
import androidx.media3.exoplayer.DefaultLoadControl
|
import androidx.media3.exoplayer.DefaultLoadControl
|
||||||
import androidx.media3.exoplayer.ExoPlayer
|
import androidx.media3.exoplayer.ExoPlayer
|
||||||
import androidx.media3.exoplayer.LoadControl
|
import androidx.media3.exoplayer.LoadControl
|
||||||
@ -31,7 +30,6 @@ import androidx.media3.exoplayer.trackselection.DefaultTrackSelector
|
|||||||
import androidx.media3.ui.CaptionStyleCompat
|
import androidx.media3.ui.CaptionStyleCompat
|
||||||
import com.github.libretube.LibreTubeApp
|
import com.github.libretube.LibreTubeApp
|
||||||
import com.github.libretube.R
|
import com.github.libretube.R
|
||||||
import com.github.libretube.api.CronetHelper
|
|
||||||
import com.github.libretube.api.obj.ChapterSegment
|
import com.github.libretube.api.obj.ChapterSegment
|
||||||
import com.github.libretube.api.obj.Segment
|
import com.github.libretube.api.obj.Segment
|
||||||
import com.github.libretube.api.obj.Streams
|
import com.github.libretube.api.obj.Streams
|
||||||
@ -50,7 +48,6 @@ import kotlinx.coroutines.CoroutineScope
|
|||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
import java.util.concurrent.Executors
|
|
||||||
import kotlin.math.absoluteValue
|
import kotlin.math.absoluteValue
|
||||||
import kotlin.math.max
|
import kotlin.math.max
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
@ -520,11 +517,7 @@ object PlayerHelper {
|
|||||||
trackSelector: DefaultTrackSelector,
|
trackSelector: DefaultTrackSelector,
|
||||||
isBackgroundMode: Boolean
|
isBackgroundMode: Boolean
|
||||||
): ExoPlayer {
|
): ExoPlayer {
|
||||||
val cronetDataSourceFactory = CronetDataSource.Factory(
|
val dataSourceFactory = DefaultDataSource.Factory(context)
|
||||||
CronetHelper.cronetEngine,
|
|
||||||
Executors.newCachedThreadPool()
|
|
||||||
)
|
|
||||||
val dataSourceFactory = DefaultDataSource.Factory(context, cronetDataSourceFactory)
|
|
||||||
val audioAttributes = AudioAttributes.Builder()
|
val audioAttributes = AudioAttributes.Builder()
|
||||||
.setUsage(C.USAGE_MEDIA)
|
.setUsage(C.USAGE_MEDIA)
|
||||||
.setContentType(C.AUDIO_CONTENT_TYPE_MOVIE)
|
.setContentType(C.AUDIO_CONTENT_TYPE_MOVIE)
|
||||||
|
@ -20,7 +20,6 @@ import androidx.lifecycle.LifecycleService
|
|||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import com.github.libretube.LibreTubeApp.Companion.DOWNLOAD_CHANNEL_NAME
|
import com.github.libretube.LibreTubeApp.Companion.DOWNLOAD_CHANNEL_NAME
|
||||||
import com.github.libretube.R
|
import com.github.libretube.R
|
||||||
import com.github.libretube.api.CronetHelper
|
|
||||||
import com.github.libretube.api.StreamsExtractor
|
import com.github.libretube.api.StreamsExtractor
|
||||||
import com.github.libretube.api.obj.Streams
|
import com.github.libretube.api.obj.Streams
|
||||||
import com.github.libretube.constants.IntentData
|
import com.github.libretube.constants.IntentData
|
||||||
@ -47,7 +46,6 @@ import com.github.libretube.receivers.NotificationReceiver.Companion.ACTION_DOWN
|
|||||||
import com.github.libretube.receivers.NotificationReceiver.Companion.ACTION_DOWNLOAD_RESUME
|
import com.github.libretube.receivers.NotificationReceiver.Companion.ACTION_DOWNLOAD_RESUME
|
||||||
import com.github.libretube.receivers.NotificationReceiver.Companion.ACTION_DOWNLOAD_STOP
|
import com.github.libretube.receivers.NotificationReceiver.Companion.ACTION_DOWNLOAD_STOP
|
||||||
import com.github.libretube.ui.activities.MainActivity
|
import com.github.libretube.ui.activities.MainActivity
|
||||||
import com.google.net.cronet.okhttptransport.CronetInterceptor
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.SupervisorJob
|
import kotlinx.coroutines.SupervisorJob
|
||||||
@ -95,12 +93,9 @@ class DownloadService : LifecycleService() {
|
|||||||
val downloadFlow: SharedFlow<Pair<Int, DownloadStatus>> = _downloadFlow
|
val downloadFlow: SharedFlow<Pair<Int, DownloadStatus>> = _downloadFlow
|
||||||
|
|
||||||
private val httpClient: OkHttpClient by lazy {
|
private val httpClient: OkHttpClient by lazy {
|
||||||
val cronetInterceptor = CronetInterceptor.newBuilder(CronetHelper.cronetEngine).build()
|
|
||||||
|
|
||||||
OkHttpClient.Builder()
|
OkHttpClient.Builder()
|
||||||
.connectTimeout(Duration.ofMillis(DownloadHelper.DEFAULT_TIMEOUT.toLong()))
|
.connectTimeout(Duration.ofMillis(DownloadHelper.DEFAULT_TIMEOUT.toLong()))
|
||||||
.readTimeout(Duration.ofMillis(DownloadHelper.DEFAULT_TIMEOUT.toLong()))
|
.readTimeout(Duration.ofMillis(DownloadHelper.DEFAULT_TIMEOUT.toLong()))
|
||||||
.addInterceptor(cronetInterceptor)
|
|
||||||
.retryOnConnectionFailure(true)
|
.retryOnConnectionFailure(true)
|
||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
|
@ -8,10 +8,9 @@ import androidx.media3.common.MediaItem
|
|||||||
import androidx.media3.common.MediaItem.SubtitleConfiguration
|
import androidx.media3.common.MediaItem.SubtitleConfiguration
|
||||||
import androidx.media3.common.MimeTypes
|
import androidx.media3.common.MimeTypes
|
||||||
import androidx.media3.common.Player
|
import androidx.media3.common.Player
|
||||||
import androidx.media3.datasource.cronet.CronetDataSource
|
import androidx.media3.datasource.DefaultDataSource
|
||||||
import androidx.media3.exoplayer.hls.HlsMediaSource
|
import androidx.media3.exoplayer.hls.HlsMediaSource
|
||||||
import com.github.libretube.R
|
import com.github.libretube.R
|
||||||
import com.github.libretube.api.CronetHelper
|
|
||||||
import com.github.libretube.api.JsonHelper
|
import com.github.libretube.api.JsonHelper
|
||||||
import com.github.libretube.api.RetrofitInstance
|
import com.github.libretube.api.RetrofitInstance
|
||||||
import com.github.libretube.api.StreamsExtractor
|
import com.github.libretube.api.StreamsExtractor
|
||||||
@ -37,7 +36,6 @@ import kotlinx.coroutines.Dispatchers
|
|||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import kotlinx.serialization.encodeToString
|
import kotlinx.serialization.encodeToString
|
||||||
import java.util.concurrent.Executors
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads the selected videos audio in background mode with a notification area.
|
* Loads the selected videos audio in background mode with a notification area.
|
||||||
@ -52,11 +50,6 @@ open class OnlinePlayerService : AbstractPlayerService() {
|
|||||||
private var channelId: String? = null
|
private var channelId: String? = null
|
||||||
private var startTimestamp: Long? = null
|
private var startTimestamp: Long? = null
|
||||||
|
|
||||||
private val cronetDataSourceFactory = CronetDataSource.Factory(
|
|
||||||
CronetHelper.cronetEngine,
|
|
||||||
Executors.newCachedThreadPool()
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The response that gets when called the Api.
|
* The response that gets when called the Api.
|
||||||
*/
|
*/
|
||||||
@ -290,7 +283,7 @@ open class OnlinePlayerService : AbstractPlayerService() {
|
|||||||
}
|
}
|
||||||
// HLS
|
// HLS
|
||||||
streams.hls != null -> {
|
streams.hls != null -> {
|
||||||
val hlsMediaSourceFactory = HlsMediaSource.Factory(cronetDataSourceFactory)
|
val hlsMediaSourceFactory = HlsMediaSource.Factory(DefaultDataSource.Factory(this))
|
||||||
.setPlaylistParserFactory(YoutubeHlsPlaylistParser.Factory())
|
.setPlaylistParserFactory(YoutubeHlsPlaylistParser.Factory())
|
||||||
|
|
||||||
val mediaItem = createMediaItem(
|
val mediaItem = createMediaItem(
|
||||||
|
@ -17,8 +17,6 @@ espresso = "3.6.1"
|
|||||||
workRuntime = "2.9.1"
|
workRuntime = "2.9.1"
|
||||||
retrofit = "2.11.0"
|
retrofit = "2.11.0"
|
||||||
desugaring = "2.1.4"
|
desugaring = "2.1.4"
|
||||||
cronetEmbedded = "119.6045.31"
|
|
||||||
cronetOkHttp = "0.1.0"
|
|
||||||
coil = "2.7.0"
|
coil = "2.7.0"
|
||||||
room = "2.6.1"
|
room = "2.6.1"
|
||||||
kotlinxSerialization = "1.6.3"
|
kotlinxSerialization = "1.6.3"
|
||||||
@ -65,8 +63,6 @@ androidx-media3-ui = { group="androidx.media3", name="media3-ui", version.ref="m
|
|||||||
newpipeextractor = { module = "com.github.teamnewpipe:NewPipeExtractor", version.ref = "newpipeextractor" }
|
newpipeextractor = { module = "com.github.teamnewpipe:NewPipeExtractor", version.ref = "newpipeextractor" }
|
||||||
square-retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" }
|
square-retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" }
|
||||||
desugaring = { group = "com.android.tools", name = "desugar_jdk_libs_nio", version.ref = "desugaring" }
|
desugaring = { group = "com.android.tools", name = "desugar_jdk_libs_nio", version.ref = "desugaring" }
|
||||||
cronet-embedded = { group = "org.chromium.net", name = "cronet-embedded", version.ref = "cronetEmbedded" }
|
|
||||||
cronet-okhttp = { group = "com.google.net.cronet", name = "cronet-okhttp", version.ref = "cronetOkHttp" }
|
|
||||||
coil = { group = "io.coil-kt", name = "coil", version.ref="coil" }
|
coil = { group = "io.coil-kt", name = "coil", version.ref="coil" }
|
||||||
lifecycle-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "lifecycle" }
|
lifecycle-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "lifecycle" }
|
||||||
lifecycle-runtime = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycle" }
|
lifecycle-runtime = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycle" }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user