diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/favicon/FaviconFetcher.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/favicon/FaviconFetcher.kt index 6af4218ae..911c2703f 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/favicon/FaviconFetcher.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/parser/favicon/FaviconFetcher.kt @@ -20,7 +20,9 @@ import okhttp3.Response import okhttp3.ResponseBody import okhttp3.internal.closeQuietly import okio.Closeable +import okio.IOException import okio.buffer +import org.koitharu.kotatsu.core.exceptions.CloudFlareProtectedException import org.koitharu.kotatsu.core.model.MangaSource import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.parser.RemoteMangaRepository @@ -49,22 +51,32 @@ class FaviconFetcher( override suspend fun fetch(): FetchResult { getCached(options)?.let { return it } val repo = mangaRepositoryFactory.create(mangaSource) as RemoteMangaRepository - val favicons = repo.getFavicons() val sizePx = maxOf( options.size.width.pxOrElse { FALLBACK_SIZE }, options.size.height.pxOrElse { FALLBACK_SIZE }, ) - val icon = checkNotNull(favicons.find(sizePx)) { "No favicons found" } - val response = loadIcon(icon.url, mangaSource) - val responseBody = response.requireBody() - val source = writeToDiskCache(responseBody)?.toImageSource()?.also { - response.closeQuietly() - } ?: responseBody.toImageSource(response) - return SourceResult( - source = source, - mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(icon.type), - dataSource = response.toDataSource(), - ) + var favicons = repo.getFavicons() + while (favicons.isNotEmpty()) { + val icon = favicons.find(sizePx) ?: throwNSEE() + val response = try { + loadIcon(icon.url, mangaSource) + } catch (e: CloudFlareProtectedException) { + throw e + } catch (e: IOException) { + favicons -= icon + continue + } + val responseBody = response.requireBody() + val source = writeToDiskCache(responseBody)?.toImageSource()?.also { + response.closeQuietly() + } ?: responseBody.toImageSource(response) + return SourceResult( + source = source, + mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(icon.type), + dataSource = response.toDataSource(), + ) + } + throwNSEE() } private suspend fun loadIcon(url: String, source: MangaSource): Response { @@ -143,6 +155,8 @@ class FaviconFetcher( append(height.toString()) } + private fun throwNSEE(): Nothing = throw NoSuchElementException("No favicons found") + class Factory( context: Context, private val okHttpClient: OkHttpClient,