|
@@ -14,11 +14,11 @@ class FetchInterval(
|
|
|
private val getChaptersByMangaId: GetChaptersByMangaId,
|
|
|
) {
|
|
|
|
|
|
- suspend fun toMangaUpdateOrNull(
|
|
|
+ suspend fun toMangaUpdate(
|
|
|
manga: Manga,
|
|
|
dateTime: ZonedDateTime,
|
|
|
window: Pair<Long, Long>,
|
|
|
- ): MangaUpdate? {
|
|
|
+ ): MangaUpdate {
|
|
|
val interval = manga.fetchInterval.takeIf { it < 0 } ?: calculateInterval(
|
|
|
chapters = getChaptersByMangaId.await(manga.id, applyScanlatorFilter = true),
|
|
|
zone = dateTime.zone,
|
|
@@ -30,11 +30,7 @@ class FetchInterval(
|
|
|
}
|
|
|
val nextUpdate = calculateNextUpdate(manga, interval, dateTime, currentWindow)
|
|
|
|
|
|
- return if (manga.nextUpdate == nextUpdate && manga.fetchInterval == interval) {
|
|
|
- null
|
|
|
- } else {
|
|
|
- MangaUpdate(id = manga.id, nextUpdate = nextUpdate, fetchInterval = interval)
|
|
|
- }
|
|
|
+ return MangaUpdate(id = manga.id, nextUpdate = nextUpdate, fetchInterval = interval)
|
|
|
}
|
|
|
|
|
|
fun getWindow(dateTime: ZonedDateTime): Pair<Long, Long> {
|
|
@@ -96,34 +92,31 @@ class FetchInterval(
|
|
|
dateTime: ZonedDateTime,
|
|
|
window: Pair<Long, Long>,
|
|
|
): Long {
|
|
|
- return if (
|
|
|
- manga.nextUpdate !in window.first.rangeTo(window.second + 1) ||
|
|
|
- manga.fetchInterval == 0
|
|
|
- ) {
|
|
|
- val latestDate = ZonedDateTime.ofInstant(
|
|
|
- if (manga.lastUpdate > 0) Instant.ofEpochMilli(manga.lastUpdate) else Instant.now(),
|
|
|
- dateTime.zone,
|
|
|
- )
|
|
|
- .toLocalDate()
|
|
|
- .atStartOfDay()
|
|
|
- val timeSinceLatest = ChronoUnit.DAYS.between(latestDate, dateTime).toInt()
|
|
|
- val cycle = timeSinceLatest.floorDiv(
|
|
|
- interval.absoluteValue.takeIf { interval < 0 }
|
|
|
- ?: doubleInterval(interval, timeSinceLatest, doubleWhenOver = 10),
|
|
|
- )
|
|
|
- latestDate.plusDays((cycle + 1) * interval.toLong()).toEpochSecond(dateTime.offset) * 1000
|
|
|
- } else {
|
|
|
- manga.nextUpdate
|
|
|
+ if (manga.nextUpdate in window.first.rangeTo(window.second + 1)) {
|
|
|
+ return manga.nextUpdate
|
|
|
}
|
|
|
+
|
|
|
+ val latestDate = ZonedDateTime.ofInstant(
|
|
|
+ if (manga.lastUpdate > 0) Instant.ofEpochMilli(manga.lastUpdate) else Instant.now(),
|
|
|
+ dateTime.zone,
|
|
|
+ )
|
|
|
+ .toLocalDate()
|
|
|
+ .atStartOfDay()
|
|
|
+ val timeSinceLatest = ChronoUnit.DAYS.between(latestDate, dateTime).toInt()
|
|
|
+ val cycle = timeSinceLatest.floorDiv(
|
|
|
+ interval.absoluteValue.takeIf { interval < 0 }
|
|
|
+ ?: increaseInterval(interval, timeSinceLatest, increaseWhenOver = 10),
|
|
|
+ )
|
|
|
+ return latestDate.plusDays((cycle + 1) * interval.toLong()).toEpochSecond(dateTime.offset) * 1000
|
|
|
}
|
|
|
|
|
|
- private fun doubleInterval(delta: Int, timeSinceLatest: Int, doubleWhenOver: Int): Int {
|
|
|
+ private fun increaseInterval(delta: Int, timeSinceLatest: Int, increaseWhenOver: Int): Int {
|
|
|
if (delta >= MAX_INTERVAL) return MAX_INTERVAL
|
|
|
|
|
|
// double delta again if missed more than 9 check in new delta
|
|
|
val cycle = timeSinceLatest.floorDiv(delta) + 1
|
|
|
- return if (cycle > doubleWhenOver) {
|
|
|
- doubleInterval(delta * 2, timeSinceLatest, doubleWhenOver)
|
|
|
+ return if (cycle > increaseWhenOver) {
|
|
|
+ increaseInterval(delta * 2, timeSinceLatest, increaseWhenOver)
|
|
|
} else {
|
|
|
delta
|
|
|
}
|