mirror of
https://github.com/tachiyomiorg/tachiyomi.git
synced 2024-11-20 00:39:14 +01:00
download new chapters changes (#3193)
* download new chapters changes * move initialFetchChapters logic into onNextChapters * refractor download new chapter logic to be more explicit
This commit is contained in:
parent
102a372df9
commit
ed029c52ae
@ -23,6 +23,7 @@ import eu.kanade.tachiyomi.source.SourceManager
|
|||||||
import eu.kanade.tachiyomi.source.model.SManga
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
|
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
|
||||||
import eu.kanade.tachiyomi.util.prepUpdateCover
|
import eu.kanade.tachiyomi.util.prepUpdateCover
|
||||||
|
import eu.kanade.tachiyomi.util.shouldDownloadNewChapters
|
||||||
import eu.kanade.tachiyomi.util.storage.getUriCompat
|
import eu.kanade.tachiyomi.util.storage.getUriCompat
|
||||||
import eu.kanade.tachiyomi.util.system.acquireWakeLock
|
import eu.kanade.tachiyomi.util.system.acquireWakeLock
|
||||||
import eu.kanade.tachiyomi.util.system.isServiceRunning
|
import eu.kanade.tachiyomi.util.system.isServiceRunning
|
||||||
@ -256,10 +257,6 @@ class LibraryUpdateService(
|
|||||||
val newUpdates = ArrayList<Pair<LibraryManga, Array<Chapter>>>()
|
val newUpdates = ArrayList<Pair<LibraryManga, Array<Chapter>>>()
|
||||||
// List containing failed updates
|
// List containing failed updates
|
||||||
val failedUpdates = ArrayList<Pair<Manga, String?>>()
|
val failedUpdates = ArrayList<Pair<Manga, String?>>()
|
||||||
// List containing categories that get included in downloads.
|
|
||||||
val categoriesToDownload = preferences.downloadNewCategories().get().map(String::toInt)
|
|
||||||
// Boolean to determine if user wants to automatically download new chapters.
|
|
||||||
val downloadNew = preferences.downloadNew().get()
|
|
||||||
// Boolean to determine if DownloadManager has downloads
|
// Boolean to determine if DownloadManager has downloads
|
||||||
var hasDownloads = false
|
var hasDownloads = false
|
||||||
|
|
||||||
@ -278,11 +275,7 @@ class LibraryUpdateService(
|
|||||||
// Filter out mangas without new chapters (or failed).
|
// Filter out mangas without new chapters (or failed).
|
||||||
.filter { pair -> pair.first.isNotEmpty() }
|
.filter { pair -> pair.first.isNotEmpty() }
|
||||||
.doOnNext {
|
.doOnNext {
|
||||||
if (downloadNew && (
|
if (manga.shouldDownloadNewChapters(db, preferences)) {
|
||||||
categoriesToDownload.isEmpty() ||
|
|
||||||
manga.category in categoriesToDownload
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
downloadChapters(manga, it.first)
|
downloadChapters(manga, it.first)
|
||||||
hasDownloads = true
|
hasDownloads = true
|
||||||
}
|
}
|
||||||
@ -309,7 +302,7 @@ class LibraryUpdateService(
|
|||||||
|
|
||||||
if (newUpdates.isNotEmpty()) {
|
if (newUpdates.isNotEmpty()) {
|
||||||
notifier.showUpdateNotifications(newUpdates)
|
notifier.showUpdateNotifications(newUpdates)
|
||||||
if (downloadNew && hasDownloads) {
|
if (hasDownloads) {
|
||||||
DownloadService.start(this)
|
DownloadService.start(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -326,14 +319,9 @@ class LibraryUpdateService(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun downloadChapters(manga: Manga, chapters: List<Chapter>) {
|
private fun downloadChapters(manga: Manga, chapters: List<Chapter>) {
|
||||||
// we need to get the chapters from the db so we have chapter ids
|
|
||||||
val mangaChapters = db.getChapters(manga).executeAsBlocking()
|
|
||||||
val dbChapters = chapters.map {
|
|
||||||
mangaChapters.find { mangaChapter -> mangaChapter.url == it.url }!!
|
|
||||||
}
|
|
||||||
// We don't want to start downloading while the library is updating, because websites
|
// We don't want to start downloading while the library is updating, because websites
|
||||||
// may don't like it and they could ban the user.
|
// may don't like it and they could ban the user.
|
||||||
downloadManager.downloadChapters(manga, dbChapters, false)
|
downloadManager.downloadChapters(manga, chapters, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -99,7 +99,7 @@ class ChaptersController :
|
|||||||
adapter?.fastScroller = binding.fastScroller
|
adapter?.fastScroller = binding.fastScroller
|
||||||
|
|
||||||
binding.swipeRefresh.refreshes()
|
binding.swipeRefresh.refreshes()
|
||||||
.onEach { fetchChaptersFromSource() }
|
.onEach { fetchChaptersFromSource(manualFetch = true) }
|
||||||
.launchIn(scope)
|
.launchIn(scope)
|
||||||
|
|
||||||
binding.fab.clicks()
|
binding.fab.clicks()
|
||||||
@ -263,10 +263,10 @@ class ChaptersController :
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun onNextChapters(chapters: List<ChapterItem>) {
|
fun onNextChapters(chapters: List<ChapterItem>) {
|
||||||
// If the list is empty, fetch chapters from source if the conditions are met
|
// If the list is empty and it hasn't requested previously, fetch chapters from source
|
||||||
// We use presenter chapters instead because they are always unfiltered
|
// We use presenter chapters instead because they are always unfiltered
|
||||||
if (presenter.chapters.isEmpty()) {
|
if (!presenter.hasRequested && presenter.chapters.isEmpty()) {
|
||||||
initialFetchChapters()
|
fetchChaptersFromSource()
|
||||||
}
|
}
|
||||||
|
|
||||||
val adapter = adapter ?: return
|
val adapter = adapter ?: return
|
||||||
@ -285,16 +285,9 @@ class ChaptersController :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initialFetchChapters() {
|
private fun fetchChaptersFromSource(manualFetch: Boolean = false) {
|
||||||
// Only fetch if this view is from the catalog and it hasn't requested previously
|
|
||||||
if ((parentController as MangaController).fromSource && !presenter.hasRequested) {
|
|
||||||
fetchChaptersFromSource()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun fetchChaptersFromSource() {
|
|
||||||
binding.swipeRefresh.isRefreshing = true
|
binding.swipeRefresh.isRefreshing = true
|
||||||
presenter.fetchChaptersFromSource()
|
presenter.fetchChaptersFromSource(manualFetch)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onFetchChaptersDone() {
|
fun onFetchChaptersDone() {
|
||||||
|
@ -14,6 +14,7 @@ import eu.kanade.tachiyomi.ui.base.presenter.BasePresenter
|
|||||||
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
|
import eu.kanade.tachiyomi.util.chapter.syncChaptersWithSource
|
||||||
import eu.kanade.tachiyomi.util.isLocal
|
import eu.kanade.tachiyomi.util.isLocal
|
||||||
import eu.kanade.tachiyomi.util.lang.isNullOrUnsubscribed
|
import eu.kanade.tachiyomi.util.lang.isNullOrUnsubscribed
|
||||||
|
import eu.kanade.tachiyomi.util.shouldDownloadNewChapters
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
import rx.Subscription
|
import rx.Subscription
|
||||||
@ -153,13 +154,18 @@ class ChaptersPresenter(
|
|||||||
/**
|
/**
|
||||||
* Requests an updated list of chapters from the source.
|
* Requests an updated list of chapters from the source.
|
||||||
*/
|
*/
|
||||||
fun fetchChaptersFromSource() {
|
fun fetchChaptersFromSource(manualFetch: Boolean = false) {
|
||||||
hasRequested = true
|
hasRequested = true
|
||||||
|
|
||||||
if (!fetchChaptersSubscription.isNullOrUnsubscribed()) return
|
if (!fetchChaptersSubscription.isNullOrUnsubscribed()) return
|
||||||
fetchChaptersSubscription = Observable.defer { source.fetchChapterList(manga) }
|
fetchChaptersSubscription = Observable.defer { source.fetchChapterList(manga) }
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
.map { syncChaptersWithSource(db, it, manga, source) }
|
.map { syncChaptersWithSource(db, it, manga, source) }
|
||||||
|
.doOnNext {
|
||||||
|
if (manualFetch) {
|
||||||
|
downloadNewChapters(it.first)
|
||||||
|
}
|
||||||
|
}
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.subscribeFirst(
|
.subscribeFirst(
|
||||||
{ view, _ ->
|
{ view, _ ->
|
||||||
@ -262,7 +268,7 @@ class ChaptersPresenter(
|
|||||||
* Downloads the given list of chapters with the manager.
|
* Downloads the given list of chapters with the manager.
|
||||||
* @param chapters the list of chapters to download.
|
* @param chapters the list of chapters to download.
|
||||||
*/
|
*/
|
||||||
fun downloadChapters(chapters: List<ChapterItem>) {
|
fun downloadChapters(chapters: List<Chapter>) {
|
||||||
downloadManager.downloadChapters(manga, chapters)
|
downloadManager.downloadChapters(manga, chapters)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -299,6 +305,12 @@ class ChaptersPresenter(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun downloadNewChapters(chapters: List<Chapter>) {
|
||||||
|
if (chapters.isEmpty() || !manga.shouldDownloadNewChapters(db, preferences)) return
|
||||||
|
|
||||||
|
downloadChapters(chapters)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deletes a list of chapters from disk. This method is called in a background thread.
|
* Deletes a list of chapters from disk. This method is called in a background thread.
|
||||||
* @param chapters the chapters to delete.
|
* @param chapters the chapters to delete.
|
||||||
|
@ -3,6 +3,7 @@ package eu.kanade.tachiyomi.util
|
|||||||
import eu.kanade.tachiyomi.data.cache.CoverCache
|
import eu.kanade.tachiyomi.data.cache.CoverCache
|
||||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
||||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||||
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.source.LocalSource
|
import eu.kanade.tachiyomi.source.LocalSource
|
||||||
import eu.kanade.tachiyomi.source.model.SManga
|
import eu.kanade.tachiyomi.source.model.SManga
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
@ -47,3 +48,16 @@ fun Manga.updateCoverLastModified(db: DatabaseHelper) {
|
|||||||
cover_last_modified = Date().time
|
cover_last_modified = Date().time
|
||||||
db.updateMangaCoverLastModified(this).executeAsBlocking()
|
db.updateMangaCoverLastModified(this).executeAsBlocking()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Manga.shouldDownloadNewChapters(db: DatabaseHelper, prefs: PreferencesHelper): Boolean {
|
||||||
|
// Boolean to determine if user wants to automatically download new chapters.
|
||||||
|
val downloadNew = prefs.downloadNew().get()
|
||||||
|
if (!downloadNew) return false
|
||||||
|
|
||||||
|
val categoriesToDownload = prefs.downloadNewCategories().get().map(String::toInt)
|
||||||
|
if (categoriesToDownload.isEmpty()) return true
|
||||||
|
|
||||||
|
val categoriesForManga = db.getCategoriesForManga(this).executeAsBlocking().mapNotNull { it.id }
|
||||||
|
|
||||||
|
return categoriesForManga.intersect(categoriesToDownload).isNotEmpty()
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user