Skip to content

Commit 47ca5de

Browse files
committed
Extract embed request to repository
1 parent e9b55c9 commit 47ca5de

File tree

2 files changed

+33
-10
lines changed

2 files changed

+33
-10
lines changed

duckplayer/duckplayer-impl/src/main/java/com/duckduckgo/duckplayer/impl/DuckPlayerFeatureRepository.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,21 @@ import com.duckduckgo.duckplayer.api.PrivatePlayerMode.AlwaysAsk
2424
import com.duckduckgo.duckplayer.api.PrivatePlayerMode.Disabled
2525
import com.duckduckgo.duckplayer.api.PrivatePlayerMode.Enabled
2626
import com.squareup.anvil.annotations.ContributesBinding
27+
import dagger.Lazy
2728
import dagger.SingleInstanceIn
29+
import java.io.IOException
30+
import java.io.InputStream
2831
import javax.inject.Inject
32+
import javax.inject.Named
2933
import kotlinx.coroutines.CoroutineScope
3034
import kotlinx.coroutines.flow.Flow
3135
import kotlinx.coroutines.flow.combine
3236
import kotlinx.coroutines.launch
3337
import kotlinx.coroutines.withContext
38+
import logcat.logcat
39+
import okhttp3.Headers.Companion.toHeaders
40+
import okhttp3.OkHttpClient
41+
import okhttp3.Request
3442

3543
interface DuckPlayerFeatureRepository {
3644
fun getDuckPlayerRemoteConfigJson(): String
@@ -73,6 +81,11 @@ interface DuckPlayerFeatureRepository {
7381

7482
suspend fun wasUsedBefore(): Boolean
7583
suspend fun setUsed()
84+
85+
suspend fun requestEmbed(
86+
url: String,
87+
headers: Map<String, String>,
88+
): InputStream?
7689
}
7790

7891
@SingleInstanceIn(AppScope::class)
@@ -81,6 +94,7 @@ class RealDuckPlayerFeatureRepository @Inject constructor(
8194
private val duckPlayerDataStore: DuckPlayerDataStore,
8295
@AppCoroutineScope private val appCoroutineScope: CoroutineScope,
8396
private val dispatcherProvider: DispatcherProvider,
97+
@Named("api") private val okHttpClient: Lazy<OkHttpClient>,
8498
) : DuckPlayerFeatureRepository {
8599

86100
override fun getDuckPlayerRemoteConfigJson(): String {
@@ -212,4 +226,17 @@ class RealDuckPlayerFeatureRepository @Inject constructor(
212226
override suspend fun setUsed() {
213227
duckPlayerDataStore.setUsed()
214228
}
229+
230+
override suspend fun requestEmbed(
231+
url: String,
232+
headers: Map<String, String>,
233+
): InputStream? {
234+
return try {
235+
val okHttpRequest = Request.Builder().url(url).headers(headers.toHeaders()).build()
236+
withContext(dispatcherProvider.io()) { okHttpClient.get().newCall(okHttpRequest).execute().body?.byteStream() }
237+
} catch (e: IOException) {
238+
logcat { "Request failed: ${e.message}" }
239+
null
240+
}
241+
}
215242
}

duckplayer/duckplayer-impl/src/main/java/com/duckduckgo/duckplayer/impl/RealDuckPlayer.kt

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,22 +69,20 @@ import dagger.SingleInstanceIn
6969
import java.io.IOException
7070
import java.io.InputStream
7171
import javax.inject.Inject
72-
import javax.inject.Named
7372
import kotlinx.coroutines.CoroutineScope
7473
import kotlinx.coroutines.flow.Flow
7574
import kotlinx.coroutines.flow.map
7675
import kotlinx.coroutines.launch
7776
import kotlinx.coroutines.withContext
78-
import okhttp3.Headers.Companion.toHeaders
79-
import okhttp3.OkHttpClient
80-
import okhttp3.Request
8177

8278
private const val DUCK_PLAYER_VIDEO_ID_QUERY_PARAM = "videoID"
8379
const val DUCK_PLAYER_OPEN_IN_YOUTUBE_PATH = "openInYoutube"
8480
private const val DUCK_PLAYER_DOMAIN = "player"
8581
private const val DUCK_PLAYER_URL_BASE = "$duck://$DUCK_PLAYER_DOMAIN/"
8682
private const val DUCK_PLAYER_ASSETS_PATH = "duckplayer/"
8783
private const val DUCK_PLAYER_ASSETS_INDEX_PATH = "${DUCK_PLAYER_ASSETS_PATH}index.html"
84+
private const val REFERER_HEADER = "referer"
85+
private const val EMBED_REFERER_VALUE = "http://android.mobile.duckduckgo.com"
8886

8987
interface DuckPlayerInternal : DuckPlayer {
9088
/**
@@ -114,7 +112,6 @@ class RealDuckPlayer @Inject constructor(
114112
private val dispatchers: DispatcherProvider,
115113
@IsMainProcess private val isMainProcess: Boolean,
116114
@AppCoroutineScope private val appCoroutineScope: CoroutineScope,
117-
@Named("api") private val okHttpClient: OkHttpClient,
118115
) : DuckPlayerInternal, PrivacyConfigCallbackPlugin {
119116

120117
private var shouldForceYTNavigation = false
@@ -341,11 +338,10 @@ class RealDuckPlayer @Inject constructor(
341338

342339
private suspend fun getEmbedWithReferer(request: WebResourceRequest): InputStream? {
343340
val headers = request.requestHeaders
344-
.filterNot { it.key.lowercase() == "referer" }
345-
.plus("referer" to "http://android.mobile.duckduckgo.com")
346-
.toHeaders()
347-
val okHttpRequest = Request.Builder().url(request.url.toString()).headers(headers).build()
348-
return withContext(dispatchers.io()) { okHttpClient.newCall(okHttpRequest).execute().body?.byteStream() }
341+
.filterNot { it.key.lowercase() == REFERER_HEADER }
342+
.plus(REFERER_HEADER to EMBED_REFERER_VALUE)
343+
344+
return duckPlayerFeatureRepository.requestEmbed(request.url.toString(), headers)
349345
}
350346

351347
private fun processSimulatedYouTubeNoCookieUri(

0 commit comments

Comments
 (0)