|
@@ -91,7 +91,6 @@ class Downloader(private val context: Context, private val provider: DownloadPro
|
|
|
|
|
|
init {
|
|
|
Observable.fromCallable { store.restore() }
|
|
|
- .map { downloads -> downloads.filter { isDownloadAllowed(it) } }
|
|
|
.subscribeOn(Schedulers.io())
|
|
|
.observeOn(AndroidSchedulers.mainThread())
|
|
|
.subscribe({ downloads -> queue.addAll(downloads)
|
|
@@ -213,8 +212,7 @@ class Downloader(private val context: Context, private val provider: DownloadPro
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * Creates a download object for every chapter and adds them to the downloads queue. This method
|
|
|
- * must be called in the main thread.
|
|
|
+ * Creates a download object for every chapter and adds them to the downloads queue.
|
|
|
*
|
|
|
* @param manga the manga of the chapters to download.
|
|
|
* @param chapters the list of chapters to download.
|
|
@@ -222,52 +220,48 @@ class Downloader(private val context: Context, private val provider: DownloadPro
|
|
|
fun queueChapters(manga: Manga, chapters: List<Chapter>) {
|
|
|
val source = sourceManager.get(manga.source) as? HttpSource ?: return
|
|
|
|
|
|
- val chaptersToQueue = chapters
|
|
|
- // Avoid downloading chapters with the same name.
|
|
|
- .distinctBy { it.name }
|
|
|
- // Add chapters to queue from the start.
|
|
|
- .sortedByDescending { it.source_order }
|
|
|
- // Create a downloader for each one.
|
|
|
- .map { Download(source, manga, it) }
|
|
|
- // Filter out those already queued or downloaded.
|
|
|
- .filter { isDownloadAllowed(it) }
|
|
|
-
|
|
|
- // Return if there's nothing to queue.
|
|
|
- if (chaptersToQueue.isEmpty())
|
|
|
- return
|
|
|
-
|
|
|
- queue.addAll(chaptersToQueue)
|
|
|
-
|
|
|
- // Initialize queue size.
|
|
|
- notifier.initialQueueSize = queue.size
|
|
|
-
|
|
|
- // Initial multi-thread
|
|
|
- notifier.multipleDownloadThreads = preferences.downloadThreads().getOrDefault() > 1
|
|
|
-
|
|
|
- if (isRunning) {
|
|
|
- // Send the list of downloads to the downloader.
|
|
|
- downloadsRelay.call(chaptersToQueue)
|
|
|
- } else {
|
|
|
- // Show initial notification.
|
|
|
- notifier.onProgressChange(queue)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * Returns true if the given download can be queued and downloaded.
|
|
|
- *
|
|
|
- * @param download the download to be checked.
|
|
|
- */
|
|
|
- private fun isDownloadAllowed(download: Download): Boolean {
|
|
|
- // If the chapter is already queued, don't add it again
|
|
|
- if (queue.any { it.chapter.id == download.chapter.id })
|
|
|
- return false
|
|
|
-
|
|
|
- val dir = provider.findChapterDir(download.source, download.manga, download.chapter)
|
|
|
- if (dir != null && dir.exists())
|
|
|
- return false
|
|
|
-
|
|
|
- return true
|
|
|
+ Observable
|
|
|
+ // Background, long running checks
|
|
|
+ .fromCallable {
|
|
|
+ val mangaDir = provider.findMangaDir(source, manga)
|
|
|
+
|
|
|
+ chapters
|
|
|
+ // Avoid downloading chapters with the same name.
|
|
|
+ .distinctBy { it.name }
|
|
|
+ // Filter out those already downloaded.
|
|
|
+ .filter { mangaDir?.findFile(provider.getChapterDirName(it)) == null }
|
|
|
+ // Add chapters to queue from the start.
|
|
|
+ .sortedByDescending { it.source_order }
|
|
|
+ }
|
|
|
+ .subscribeOn(Schedulers.io())
|
|
|
+ .observeOn(AndroidSchedulers.mainThread())
|
|
|
+ // Main thread, quick checks
|
|
|
+ .map { chaptersToQueue ->
|
|
|
+ chaptersToQueue
|
|
|
+ // Filter out those already enqueued.
|
|
|
+ .filter { chapter -> queue.none { it.chapter.id == chapter.id } }
|
|
|
+ // Create a download for each one.
|
|
|
+ .map { Download(source, manga, it) }
|
|
|
+ }
|
|
|
+ .subscribe { chaptersToQueue ->
|
|
|
+ if (chaptersToQueue.isNotEmpty()) {
|
|
|
+ queue.addAll(chaptersToQueue)
|
|
|
+
|
|
|
+ // Initialize queue size.
|
|
|
+ notifier.initialQueueSize = queue.size
|
|
|
+
|
|
|
+ // Initial multi-thread
|
|
|
+ notifier.multipleDownloadThreads = preferences.downloadThreads().getOrDefault() > 1
|
|
|
+
|
|
|
+ if (isRunning) {
|
|
|
+ // Send the list of downloads to the downloader.
|
|
|
+ downloadsRelay.call(chaptersToQueue)
|
|
|
+ } else {
|
|
|
+ // Show initial notification.
|
|
|
+ notifier.onProgressChange(queue)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|