diff --git a/patches/futon-niadd-range-download.patch b/patches/futon-niadd-range-download.patch index b8ab87b..05c0fd5 100644 --- a/patches/futon-niadd-range-download.patch +++ b/patches/futon-niadd-range-download.patch @@ -1,5 +1,5 @@ diff --git a/app/src/main/kotlin/io/github/landwarderer/futon/details/ui/pager/pages/MangaPageFetcher.kt b/app/src/main/kotlin/io/github/landwarderer/futon/details/ui/pager/pages/MangaPageFetcher.kt -index ae55a0f..9f4338b 100644 +index ae55a0f..58e1ee7 100644 --- a/app/src/main/kotlin/io/github/landwarderer/futon/details/ui/pager/pages/MangaPageFetcher.kt +++ b/app/src/main/kotlin/io/github/landwarderer/futon/details/ui/pager/pages/MangaPageFetcher.kt @@ -15,21 +15,26 @@ import coil3.request.Options @@ -168,7 +168,7 @@ index ae55a0f..9f4338b 100644 @MangaHttpClient private val okHttpClient: OkHttpClient, @PageCache private val pagesCache: LocalStorageCache, diff --git a/app/src/main/kotlin/io/github/landwarderer/futon/download/ui/worker/DownloadWorker.kt b/app/src/main/kotlin/io/github/landwarderer/futon/download/ui/worker/DownloadWorker.kt -index 8227b2a..742341e 100644 +index 8227b2a..a6b3bb5 100644 --- a/app/src/main/kotlin/io/github/landwarderer/futon/download/ui/worker/DownloadWorker.kt +++ b/app/src/main/kotlin/io/github/landwarderer/futon/download/ui/worker/DownloadWorker.kt @@ -91,6 +91,7 @@ import okio.use @@ -179,18 +179,20 @@ index 8227b2a..742341e 100644 import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.util.ifNullOrEmpty import org.koitharu.kotatsu.parsers.util.mapToSet -@@ -125,6 +126,10 @@ class DownloadWorker @AssistedInject constructor( +@@ -125,6 +126,12 @@ class DownloadWorker @AssistedInject constructor( private val notificationFactory = notificationFactoryFactory.create(uuid = params.id, isSilent = task.isSilent) private val notificationManager = appContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager private val bandwidthLimiter = BandwidthLimiter { settings.downloadBandwidthLimit * 1024 } + private val niaddOkHttp = okHttp.newBuilder() + .followRedirects(false) + .followSslRedirects(false) ++ .readTimeout(NIADD_RANGE_READ_TIMEOUT_SECONDS, TimeUnit.SECONDS) ++ .callTimeout(NIADD_RANGE_CALL_TIMEOUT_SECONDS, TimeUnit.SECONDS) + .build() @Volatile private var lastPublishedState: DownloadState? = null -@@ -427,6 +432,13 @@ class DownloadWorker @AssistedInject constructor( +@@ -427,6 +434,13 @@ class DownloadWorker @AssistedInject constructor( } return file } @@ -204,7 +206,7 @@ index 8227b2a..742341e 100644 val request = PageLoader.createPageRequest(url, source) slowdownDispatcher.delay(source) return imageProxyInterceptor.interceptPageRequest(request, okHttp) -@@ -450,6 +462,117 @@ class DownloadWorker @AssistedInject constructor( +@@ -450,6 +464,117 @@ class DownloadWorker @AssistedInject constructor( } } @@ -322,18 +324,36 @@ index 8227b2a..742341e 100644 private fun File.createTempFile(ext: String?) = File( this, buildString { -@@ -633,6 +756,9 @@ class DownloadWorker @AssistedInject constructor( +@@ -633,6 +758,11 @@ class DownloadWorker @AssistedInject constructor( const val MAX_FAILSAFE_ATTEMPTS = 2 const val MAX_PAGES_PARALLELISM = 4 + private const val NIADD_RANGE_CHUNK_SIZE = 16L * 1024L ++ private const val NIADD_RANGE_READ_TIMEOUT_SECONDS = 6L ++ private const val NIADD_RANGE_CALL_TIMEOUT_SECONDS = 8L + private val NIADD_CONTENT_RANGE_REGEX = Regex("""bytes (\d+)-(\d+)/(\d+)""") + private val NIADD_DOWNLOAD_SEMAPHORE = Semaphore(2) const val DOWNLOAD_ERROR_DELAY = 2_000L const val MAX_RETRY_DELAY = 7_200_000L // 2 hours const val TAG = "download" +diff --git a/app/src/main/kotlin/io/github/landwarderer/futon/reader/domain/DetectReaderModeUseCase.kt b/app/src/main/kotlin/io/github/landwarderer/futon/reader/domain/DetectReaderModeUseCase.kt +index b6184a5..8be5f76 100644 +--- a/app/src/main/kotlin/io/github/landwarderer/futon/reader/domain/DetectReaderModeUseCase.kt ++++ b/app/src/main/kotlin/io/github/landwarderer/futon/reader/domain/DetectReaderModeUseCase.kt +@@ -33,7 +33,10 @@ class DetectReaderModeUseCase @Inject constructor( + suspend operator fun invoke(manga: Manga, state: ReaderState?): ReaderMode { + dataRepository.getReaderMode(manga.id)?.let { return it } + val defaultMode = settings.defaultReaderMode +- if (!settings.isReaderModeDetectionEnabled || defaultMode == ReaderMode.WEBTOON) { ++ if ( ++ manga.source == org.koitharu.kotatsu.parsers.model.MangaParserSource.NINEMANGA_RU || ++ !settings.isReaderModeDetectionEnabled || defaultMode == ReaderMode.WEBTOON ++ ) { + return defaultMode + } + val chapter = state?.let { manga.findChapterById(it.chapterId) } diff --git a/app/src/main/kotlin/io/github/landwarderer/futon/reader/domain/PageLoader.kt b/app/src/main/kotlin/io/github/landwarderer/futon/reader/domain/PageLoader.kt -index 18d203d..02b1653 100644 +index 18d203d..63b59e5 100644 --- a/app/src/main/kotlin/io/github/landwarderer/futon/reader/domain/PageLoader.kt +++ b/app/src/main/kotlin/io/github/landwarderer/futon/reader/domain/PageLoader.kt @@ -30,6 +30,7 @@ import io.github.landwarderer.futon.core.prefs.AppSettings @@ -515,18 +535,3 @@ index 18d203d..02b1653 100644 private const val PREFETCH_LIMIT_DEFAULT = 6 private const val PREFETCH_MIN_RAM_MB = 80L -diff --git a/app/src/main/kotlin/io/github/landwarderer/futon/reader/domain/DetectReaderModeUseCase.kt b/app/src/main/kotlin/io/github/landwarderer/futon/reader/domain/DetectReaderModeUseCase.kt ---- a/app/src/main/kotlin/io/github/landwarderer/futon/reader/domain/DetectReaderModeUseCase.kt -+++ b/app/src/main/kotlin/io/github/landwarderer/futon/reader/domain/DetectReaderModeUseCase.kt -@@ -32,7 +32,10 @@ class DetectReaderModeUseCase @Inject constructor( - suspend operator fun invoke(manga: Manga, state: ReaderState?): ReaderMode { - dataRepository.getReaderMode(manga.id)?.let { return it } - val defaultMode = settings.defaultReaderMode -- if (!settings.isReaderModeDetectionEnabled || defaultMode == ReaderMode.WEBTOON) { -+ if ( -+ manga.source == org.koitharu.kotatsu.parsers.model.MangaParserSource.NINEMANGA_RU || -+ !settings.isReaderModeDetectionEnabled || defaultMode == ReaderMode.WEBTOON -+ ) { - return defaultMode - } - val chapter = state?.let { manga.findChapterById(it.chapterId) }