diff --git a/app/src/main/kotlin/com/subtracks/SubtracksApp.kt b/app/src/main/kotlin/com/subtracks/SubtracksApp.kt index 1841b0a1..a0876b57 100644 --- a/app/src/main/kotlin/com/subtracks/SubtracksApp.kt +++ b/app/src/main/kotlin/com/subtracks/SubtracksApp.kt @@ -14,7 +14,7 @@ import org.koin.core.context.startKoin import org.koin.core.context.stopKoin class SubtracksApp : Application() { - private val http = OkHttpClient() + private val http = OkHttpClient.Builder().addInterceptor(UserAgent.interceptor()).build() @OptIn(DelicateCoilApi::class) override fun onCreate() { diff --git a/app/src/main/kotlin/com/subtracks/UserAgent.kt b/app/src/main/kotlin/com/subtracks/UserAgent.kt new file mode 100644 index 00000000..ef957547 --- /dev/null +++ b/app/src/main/kotlin/com/subtracks/UserAgent.kt @@ -0,0 +1,18 @@ +package com.subtracks + +import okhttp3.Interceptor + +object UserAgent { + val value: String = "subtracks/android (${BuildConfig.VERSION_NAME})" + + fun interceptor(): Interceptor = + Interceptor { chain -> + chain.proceed( + chain + .request() + .newBuilder() + .header("User-Agent", value) + .build(), + ) + } +} diff --git a/app/src/main/kotlin/com/subtracks/data/download/SystemDownloadEngine.kt b/app/src/main/kotlin/com/subtracks/data/download/SystemDownloadEngine.kt index 77a6df14..268aac0d 100644 --- a/app/src/main/kotlin/com/subtracks/data/download/SystemDownloadEngine.kt +++ b/app/src/main/kotlin/com/subtracks/data/download/SystemDownloadEngine.kt @@ -4,6 +4,7 @@ import android.app.DownloadManager import android.content.Context import android.os.Environment import androidx.core.net.toUri +import com.subtracks.UserAgent import com.subtracks.data.model.DownloadError class SystemDownloadEngine( @@ -16,6 +17,7 @@ class SystemDownloadEngine( .setTitle(request.title) .setDestinationInExternalFilesDir(context, Environment.DIRECTORY_MUSIC, request.path) .setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN) + .addRequestHeader("User-Agent", UserAgent.value) // Wi-Fi only unless the preference allows a metered network, and roaming counts as // one of those; the platform otherwise permits it by default. .setAllowedOverMetered(request.allowMetered) diff --git a/app/src/main/kotlin/com/subtracks/data/source/subsonic/SubsonicClient.kt b/app/src/main/kotlin/com/subtracks/data/source/subsonic/SubsonicClient.kt index 22551a4e..dc7bf2ce 100644 --- a/app/src/main/kotlin/com/subtracks/data/source/subsonic/SubsonicClient.kt +++ b/app/src/main/kotlin/com/subtracks/data/source/subsonic/SubsonicClient.kt @@ -20,7 +20,6 @@ class SubsonicClient( private val password: String, useTokenAuth: Boolean, private val http: OkHttpClient, - private val userAgent: String = "subtracks/android", private val onTokenAuthUnsupported: () -> Unit = {}, ) { @Volatile @@ -76,7 +75,6 @@ class SubsonicClient( Request .Builder() .url(uri(method, params)) - .header("User-Agent", userAgent) .build() http.newCall(request).execute().use { response -> if (!response.isSuccessful) { diff --git a/app/src/main/kotlin/com/subtracks/playback/PlaybackService.kt b/app/src/main/kotlin/com/subtracks/playback/PlaybackService.kt index 542027f9..d5bafb6f 100644 --- a/app/src/main/kotlin/com/subtracks/playback/PlaybackService.kt +++ b/app/src/main/kotlin/com/subtracks/playback/PlaybackService.kt @@ -29,6 +29,7 @@ import com.google.common.util.concurrent.Futures import com.google.common.util.concurrent.ListenableFuture import com.subtracks.MainActivity import com.subtracks.R +import com.subtracks.UserAgent import com.subtracks.data.repo.LibraryRepository import com.subtracks.data.repo.SourceRepository import com.subtracks.data.source.StarType @@ -104,7 +105,9 @@ class PlaybackService : MediaSessionService() { .setMediaSourceFactory( DefaultMediaSourceFactory(this) .setEnableClippingInMediaPeriod(true) - .setDataSourceFactory(mediaDataSourceFactory(this, OkHttpDataSource.Factory(streamingClient()))), + .setDataSourceFactory( + mediaDataSourceFactory(this, OkHttpDataSource.Factory(streamingClient()).setUserAgent(UserAgent.value)), + ), ).build() exoPlayer.addListener( object : Player.Listener { diff --git a/app/src/test/kotlin/com/subtracks/UserAgentTest.kt b/app/src/test/kotlin/com/subtracks/UserAgentTest.kt new file mode 100644 index 00000000..0ef76a95 --- /dev/null +++ b/app/src/test/kotlin/com/subtracks/UserAgentTest.kt @@ -0,0 +1,24 @@ +package com.subtracks + +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.mockwebserver.MockResponse +import okhttp3.mockwebserver.MockWebServer +import org.junit.Assert.assertEquals +import org.junit.Test + +class UserAgentTest { + @Test + fun addsTheSubtracksUserAgent() { + val server = MockWebServer() + server.enqueue(MockResponse()) + server.start() + val client = OkHttpClient.Builder().addInterceptor(UserAgent.interceptor()).build() + + client.newCall(Request.Builder().url(server.url("/")).build()).execute().close() + val header = server.takeRequest().getHeader("User-Agent") + server.shutdown() + + assertEquals(UserAgent.value, header) + } +}