Skip to content

Commit 1b2e22e

Browse files
committed
Improve load image from net
1 parent 13ac684 commit 1b2e22e

File tree

4 files changed

+46
-19
lines changed

4 files changed

+46
-19
lines changed

core/domain/src/main/kotlin/ru/tech/imageresizershrinker/core/domain/Constants.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,7 @@ const val TELEGRAM_CHANNEL_LINK = "https://t.me/t8rin_imagetoolbox_ci"
3030
const val BitcoinWallet = "17Pk1RurnkJxLV9V7mc6Y7dLyHFb9rvQDq"
3131
const val USDTWallet = "TMPAu7a54NvQNEKnNWh3naXu3oYijqP3U7"
3232
const val TONSpaceWallet = "UQDMePBU-FaxwaIME8p7h2spRITeRxvtCPegtKefeV5v-sN1"
33-
const val TONWallet = "UQB44LtN0zArKGcWTbNxU7zAkGYunVs1rkn_VsLq71G4bdmK"
33+
const val TONWallet = "UQB44LtN0zArKGcWTbNxU7zAkGYunVs1rkn_VsLq71G4bdmK"
34+
35+
const val USER_AGENT =
36+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36"

core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/helper/LinkUtils.kt

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package ru.tech.imageresizershrinker.core.ui.utils.helper
2020
import kotlinx.coroutines.Dispatchers
2121
import kotlinx.coroutines.withContext
2222
import org.jsoup.Jsoup
23+
import ru.tech.imageresizershrinker.core.domain.USER_AGENT
2324

2425
object LinkUtils {
2526
fun parseLinks(text: String): Set<String> {
@@ -48,6 +49,7 @@ suspend fun LinkPreview(
4849
runCatching {
4950
Jsoup
5051
.connect(link)
52+
.userAgent(USER_AGENT)
5153
.execute()
5254
.parse()
5355
.getElementsByTag("meta")

feature/load-net-image/src/main/java/ru/tech/imageresizershrinker/feature/load_net_image/data/AndroidHtmlImageParser.kt

+35-14
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import androidx.exifinterface.media.ExifInterface
2323
import dagger.hilt.android.qualifiers.ApplicationContext
2424
import kotlinx.coroutines.withContext
2525
import org.jsoup.Jsoup
26+
import ru.tech.imageresizershrinker.core.domain.USER_AGENT
2627
import ru.tech.imageresizershrinker.core.domain.dispatchers.DispatchersHolder
2728
import ru.tech.imageresizershrinker.core.domain.image.ImageGetter
2829
import ru.tech.imageresizershrinker.core.domain.image.ShareProvider
@@ -44,27 +45,23 @@ internal class AndroidHtmlImageParser @Inject constructor(
4445
url: String,
4546
onFailure: (message: String) -> Unit
4647
): List<String> = withContext(defaultDispatcher) {
47-
val baseImage = imageGetter.getImage(data = url)?.let {
48-
shareProvider.cacheImage(
49-
image = it,
50-
imageInfo = ImageInfo(
51-
width = it.width,
52-
height = it.height,
53-
imageFormat = ImageFormat.Png.Lossless
54-
)
55-
)
56-
}.let(::listOfNotNull)
48+
val realUrl = if (url.isMalformed()) {
49+
"https://$url"
50+
} else url
51+
52+
val baseImage = loadImage(realUrl)
5753

58-
val parsedImages = if (url.isNotEmpty()) {
54+
val parsedImages = if (realUrl.isNotEmpty()) {
5955
runCatching {
6056
val parsed = Jsoup
61-
.connect(url)
57+
.connect(realUrl)
58+
.userAgent(USER_AGENT)
6259
.execute()
6360
.parse()
6461

6562
val list = parsed.getElementsByTag("img")
6663
.mapNotNull { element ->
67-
element.absUrl("src").takeIf { it.isNotEmpty() }
64+
element.absUrl("src").takeIf { it.isNotEmpty() }?.substringBefore("?")
6865
}
6966

7067
val content = parsed.getElementsByTag("meta")
@@ -75,7 +72,16 @@ internal class AndroidHtmlImageParser @Inject constructor(
7572
}
7673
}
7774

78-
content + list
75+
val favIcon = loadImage(
76+
parsed.head()
77+
.select("link[href~=.*\\.ico]")
78+
.firstOrNull()
79+
?.attr("href") ?: ""
80+
).ifEmpty {
81+
loadImage(realUrl.removeSuffix("/") + "/favicon.ico")
82+
}
83+
84+
content + list + favIcon
7985
}.onFailure {
8086
if (it is UnknownHostException) onFailure(context.getString(R.string.unknown_host))
8187
}.getOrNull() ?: emptyList()
@@ -86,4 +92,19 @@ internal class AndroidHtmlImageParser @Inject constructor(
8692
baseImage + parsedImages
8793
}
8894

95+
private suspend fun loadImage(
96+
url: String
97+
): List<String> = imageGetter.getImage(data = url)?.let {
98+
shareProvider.cacheImage(
99+
image = it,
100+
imageInfo = ImageInfo(
101+
width = it.width,
102+
height = it.height,
103+
imageFormat = ImageFormat.Png.Lossless
104+
)
105+
)
106+
}.let(::listOfNotNull)
107+
108+
private fun String.isMalformed(): Boolean = !(startsWith("https://") || startsWith("http://"))
109+
89110
}

feature/load-net-image/src/main/java/ru/tech/imageresizershrinker/feature/load_net_image/presentation/LoadNetImageContent.kt

+5-4
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,9 @@ fun LoadNetImageContent(
211211
allowHardware = false,
212212
model = component.targetUrl,
213213
modifier = Modifier
214+
.container(
215+
resultPadding = 8.dp
216+
)
214217
.then(
215218
if (component.bitmap == null) {
216219
Modifier
@@ -219,9 +222,6 @@ fun LoadNetImageContent(
219222
} else {
220223
Modifier.aspectRatio(component.bitmap?.safeAspectRatio ?: 2f)
221224
}
222-
)
223-
.container(
224-
resultPadding = 8.dp
225225
),
226226
isLoadingFromDifferentPlace = component.isImageLoading,
227227
contentScale = ContentScale.FillBounds,
@@ -324,7 +324,8 @@ fun LoadNetImageContent(
324324
layout(result.measuredWidth, result.measuredHeight) {
325325
result.place(0, 0)
326326
}
327-
}
327+
},
328+
showExtension = false
328329
)
329330
}
330331
}

0 commit comments

Comments
 (0)