|
|
|
@ -294,48 +294,46 @@ class LibraryUpdateService(
|
|
|
|
|
return@async
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
currentlyUpdatingManga.add(manga)
|
|
|
|
|
notifier.showProgressNotification(
|
|
|
|
|
withUpdateNotification(
|
|
|
|
|
currentlyUpdatingManga,
|
|
|
|
|
progressCount.get(),
|
|
|
|
|
mangaToUpdate.size
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
val (newChapters, _) = updateManga(manga)
|
|
|
|
|
|
|
|
|
|
if (newChapters.isNotEmpty()) {
|
|
|
|
|
if (manga.shouldDownloadNewChapters(db, preferences)) {
|
|
|
|
|
downloadChapters(manga, newChapters)
|
|
|
|
|
hasDownloads.set(true)
|
|
|
|
|
progressCount,
|
|
|
|
|
manga,
|
|
|
|
|
) { manga ->
|
|
|
|
|
try {
|
|
|
|
|
val (newChapters, _) = updateManga(manga)
|
|
|
|
|
|
|
|
|
|
if (newChapters.isNotEmpty()) {
|
|
|
|
|
if (manga.shouldDownloadNewChapters(db, preferences)) {
|
|
|
|
|
downloadChapters(manga, newChapters)
|
|
|
|
|
hasDownloads.set(true)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Convert to the manga that contains new chapters
|
|
|
|
|
newUpdates.add(
|
|
|
|
|
manga to newChapters.sortedByDescending { ch -> ch.source_order }
|
|
|
|
|
.toTypedArray()
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Convert to the manga that contains new chapters
|
|
|
|
|
newUpdates.add(manga to newChapters.sortedByDescending { ch -> ch.source_order }.toTypedArray())
|
|
|
|
|
}
|
|
|
|
|
} catch (e: Throwable) {
|
|
|
|
|
val errorMessage = if (e is NoChaptersException) {
|
|
|
|
|
getString(R.string.no_chapters_error)
|
|
|
|
|
} else if (e is SourceManager.SourceNotInstalledException) {
|
|
|
|
|
// failedUpdates will already have the source, don't need to copy it into the message
|
|
|
|
|
getString(R.string.loader_not_implemented_error)
|
|
|
|
|
} else {
|
|
|
|
|
e.message
|
|
|
|
|
} catch (e: Throwable) {
|
|
|
|
|
val errorMessage = when (e) {
|
|
|
|
|
is NoChaptersException -> {
|
|
|
|
|
getString(R.string.no_chapters_error)
|
|
|
|
|
}
|
|
|
|
|
is SourceManager.SourceNotInstalledException -> {
|
|
|
|
|
// failedUpdates will already have the source, don't need to copy it into the message
|
|
|
|
|
getString(R.string.loader_not_implemented_error)
|
|
|
|
|
}
|
|
|
|
|
else -> {
|
|
|
|
|
e.message
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
failedUpdates.add(manga to errorMessage)
|
|
|
|
|
}
|
|
|
|
|
failedUpdates.add(manga to errorMessage)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (preferences.autoUpdateTrackers()) {
|
|
|
|
|
updateTrackings(manga, loggedServices)
|
|
|
|
|
if (preferences.autoUpdateTrackers()) {
|
|
|
|
|
updateTrackings(manga, loggedServices)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
currentlyUpdatingManga.remove(manga)
|
|
|
|
|
progressCount.andIncrement
|
|
|
|
|
notifier.showProgressNotification(
|
|
|
|
|
currentlyUpdatingManga,
|
|
|
|
|
progressCount.get(),
|
|
|
|
|
mangaToUpdate.size
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -418,36 +416,35 @@ class LibraryUpdateService(
|
|
|
|
|
return@async
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
currentlyUpdatingManga.add(manga)
|
|
|
|
|
notifier.showProgressNotification(
|
|
|
|
|
withUpdateNotification(
|
|
|
|
|
currentlyUpdatingManga,
|
|
|
|
|
progressCount.get(),
|
|
|
|
|
mangaToUpdate.size
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
sourceManager.get(manga.source)?.let { source ->
|
|
|
|
|
try {
|
|
|
|
|
val networkManga =
|
|
|
|
|
source.getMangaDetails(manga.toMangaInfo())
|
|
|
|
|
val sManga = networkManga.toSManga()
|
|
|
|
|
manga.prepUpdateCover(coverCache, sManga, true)
|
|
|
|
|
sManga.thumbnail_url?.let {
|
|
|
|
|
manga.thumbnail_url = it
|
|
|
|
|
db.insertManga(manga).executeAsBlocking()
|
|
|
|
|
progressCount,
|
|
|
|
|
manga,
|
|
|
|
|
) { manga ->
|
|
|
|
|
sourceManager.get(manga.source)?.let { source ->
|
|
|
|
|
try {
|
|
|
|
|
val networkManga =
|
|
|
|
|
source.getMangaDetails(manga.toMangaInfo())
|
|
|
|
|
val sManga = networkManga.toSManga()
|
|
|
|
|
manga.prepUpdateCover(coverCache, sManga, true)
|
|
|
|
|
sManga.thumbnail_url?.let {
|
|
|
|
|
manga.thumbnail_url = it
|
|
|
|
|
db.insertManga(manga).executeAsBlocking()
|
|
|
|
|
}
|
|
|
|
|
} catch (e: Throwable) {
|
|
|
|
|
// Ignore errors and continue
|
|
|
|
|
Timber.e(e)
|
|
|
|
|
}
|
|
|
|
|
} catch (e: Throwable) {
|
|
|
|
|
// Ignore errors and continue
|
|
|
|
|
Timber.e(e)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
currentlyUpdatingManga.remove(manga)
|
|
|
|
|
progressCount.andIncrement
|
|
|
|
|
notifier.showProgressNotification(
|
|
|
|
|
currentlyUpdatingManga,
|
|
|
|
|
progressCount.get(),
|
|
|
|
|
mangaToUpdate.size
|
|
|
|
|
)
|
|
|
|
|
currentlyUpdatingManga.remove(manga)
|
|
|
|
|
progressCount.andIncrement
|
|
|
|
|
notifier.showProgressNotification(
|
|
|
|
|
currentlyUpdatingManga,
|
|
|
|
|
progressCount.get(),
|
|
|
|
|
mangaToUpdate.size
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -506,6 +503,38 @@ class LibraryUpdateService(
|
|
|
|
|
.awaitAll()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private suspend fun withUpdateNotification(
|
|
|
|
|
updatingManga: CopyOnWriteArrayList<LibraryManga>,
|
|
|
|
|
completed: AtomicInteger,
|
|
|
|
|
manga: LibraryManga,
|
|
|
|
|
block: suspend (LibraryManga) -> Unit,
|
|
|
|
|
) {
|
|
|
|
|
if (updateJob?.isActive != true) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
updatingManga.add(manga)
|
|
|
|
|
notifier.showProgressNotification(
|
|
|
|
|
updatingManga,
|
|
|
|
|
completed.get(),
|
|
|
|
|
mangaToUpdate.size
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
block(manga)
|
|
|
|
|
|
|
|
|
|
if (updateJob?.isActive != true) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
updatingManga.remove(manga)
|
|
|
|
|
completed.andIncrement
|
|
|
|
|
notifier.showProgressNotification(
|
|
|
|
|
updatingManga,
|
|
|
|
|
completed.get(),
|
|
|
|
|
mangaToUpdate.size
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Writes basic file of update errors to cache dir.
|
|
|
|
|
*/
|
|
|
|
|