androidx / media

Jetpack Media3 support libraries for media use cases, including ExoPlayer, an extensible media player for Android
https://developer.android.com/media/media3
Apache License 2.0
1.57k stars 374 forks source link

Ktor support #1646

Open JJSarrasin opened 3 weeks ago

JJSarrasin commented 3 weeks ago

The standard for HTTP clients is increasingly shifting towards Ktor. It avoids to manage multiple http source in the same project.

My main concern is about DrmSessionManagerProvider.setDrmHttpDataSourceFactory + MediaSourceFactory.setDataSourceFactory, maybe there are other entry points.

Note that Ktor is using OkHttp (or other engines) under the hood, it's more like a convenient way to use Ktor everywhere from a developer perspective. It won't improve any performance or so.

icbaker commented 3 weeks ago

My main concern is about DrmSessionManagerProvider.setDrmHttpDataSourceFactory + MediaSourceFactory.setDataSourceFactory, maybe there are other entry points.

Can you please add a bit more concrete info on how Ktor would resolve this? At the moment these are configured with different DataSource.Factory instances, and each default to DefaultHttpDataSource.Factory for handling HTTP URIs.

What are you suggesting would change here?

Note that we probably wouldn't accept a dependency on Ktor from the main exoplayer module, so any integration would need to be in an extension (similar to the datasource-okhttp extension).

JJSarrasin commented 2 weeks ago

From my understanding, there is a dependency between media3 and okhttp.

Here is the minimal use we do from exo:

val renderersFactory = DefaultRenderersFactory(context)
val dataSourceFactory = OkHttpDataSource.Factory(httpClient)

val drmSessionManagerProvider = DefaultDrmSessionManagerProvider()
drmSessionManagerProvider.setDrmHttpDataSourceFactory(dataSourceFactory)

val mediaSourceFactory = DefaultMediaSourceFactory(context)
    .setLoadErrorHandlingPolicy(DefaultLoadErrorHandlingPolicy(2))
    .setDrmSessionManagerProvider(drmSessionManagerProvider)

mediaSourceFactory.setDataSourceFactory(dataSourceFactory)

val exoPlayer = ExoPlayer.Builder(context, renderersFactory)
    .setMediaSourceFactory(mediaSourceFactory)
    .build()

The passed httpClient is a OkHttpclient variable.

Of course, we won't use media3 on the iOS/web part of our project, so we'll only use the okhttp client implementation of ktor wrapper. We're using Ktor for all the common part of the code and it's kind of the main lib for doing network request in modern KMP projects.

Maybe we should ask Ktor lib to expose a way to get the OkHttpEngine/OkHttpClient instead ?

icbaker commented 2 weeks ago

Maybe we should ask Ktor lib to expose a way to get the OkHttpEngine/OkHttpClient instead ?

This seems like a a reasonable request to me.


Regarding the suggestion for a KtorDataSource, we're unlikely to work on this soon I'm afraid, but we would accept a high quality PR. Any such PR should include a subclass of DataSourceContractTest (see an example in OkHttpDataSourceContractTest).