refactor: Simplify code and move stuff around

This commit is contained in:
Ahmad Ansori Palembani 2024-12-14 18:46:49 +07:00
parent ee2acf8b98
commit 62e26d1f38
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6

View file

@ -65,48 +65,6 @@ suspend fun syncChaptersWithSource(
// Chapters whose metadata have changed. // Chapters whose metadata have changed.
val toChange = mutableListOf<ChapterUpdate>() val toChange = mutableListOf<ChapterUpdate>()
for (sourceChapter in sourceChapters) {
val dbChapter = dbChapters.find { it.url == sourceChapter.url }
// Add the chapter if not in db already, or update if the metadata changed.
if (dbChapter == null) {
toAdd.add(sourceChapter)
} else {
// this forces metadata update for the main viewable things in the chapter list
if (source is HttpSource) {
source.prepareNewChapter(sourceChapter, manga)
}
sourceChapter.chapter_number =
ChapterRecognition.parseChapterNumber(sourceChapter.name, manga.title, sourceChapter.chapter_number)
if (shouldUpdateDbChapter(dbChapter, sourceChapter)) {
if ((dbChapter.name != sourceChapter.name || dbChapter.scanlator != sourceChapter.scanlator) &&
downloadManager.isChapterDownloaded(dbChapter, manga)
) {
downloadManager.renameChapter(source, manga, dbChapter, sourceChapter)
}
val update = ChapterUpdate(
dbChapter.id!!,
scanlator = sourceChapter.scanlator,
name = sourceChapter.name,
dateUpload = sourceChapter.date_upload,
chapterNumber = sourceChapter.chapter_number.toDouble(),
sourceOrder = sourceChapter.source_order.toLong(),
)
toChange.add(update)
}
}
}
// Recognize number for new chapters.
toAdd.forEach {
if (source is HttpSource) {
source.prepareNewChapter(it, manga)
}
it.chapter_number = ChapterRecognition.parseChapterNumber(it.name, manga.title, it.chapter_number)
}
val duplicates = dbChapters.groupBy { it.url } val duplicates = dbChapters.groupBy { it.url }
.filter { it.value.size > 1 } .filter { it.value.size > 1 }
.flatMap { (_, chapters) -> .flatMap { (_, chapters) ->
@ -119,6 +77,39 @@ suspend fun syncChaptersWithSource(
} }
val toDelete = duplicates + notInSource val toDelete = duplicates + notInSource
for (sourceChapter in sourceChapters) {
val chapter = sourceChapter
if (source is HttpSource) {
source.prepareNewChapter(chapter, manga)
}
chapter.chapter_number = ChapterRecognition.parseChapterNumber(chapter.name, manga.title, chapter.chapter_number)
val dbChapter = dbChapters.find { it.url == chapter.url }
// Add the chapter if not in db already, or update if the metadata changed.
if (dbChapter == null) {
toAdd.add(chapter)
} else {
if (shouldUpdateDbChapter(dbChapter, chapter)) {
if ((dbChapter.name != chapter.name || dbChapter.scanlator != chapter.scanlator) &&
downloadManager.isChapterDownloaded(dbChapter, manga)
) {
downloadManager.renameChapter(source, manga, dbChapter, chapter)
}
val update = ChapterUpdate(
dbChapter.id!!,
scanlator = chapter.scanlator,
name = chapter.name,
dateUpload = chapter.date_upload,
chapterNumber = chapter.chapter_number.toDouble(),
sourceOrder = chapter.source_order.toLong(),
)
toChange.add(update)
}
}
}
// Return if there's nothing to add, delete or change, avoid unnecessary db transactions. // Return if there's nothing to add, delete or change, avoid unnecessary db transactions.
if (toAdd.isEmpty() && toDelete.isEmpty() && toChange.isEmpty()) { if (toAdd.isEmpty() && toDelete.isEmpty() && toChange.isEmpty()) {
val newestDate = dbChapters.maxOfOrNull { it.date_upload } ?: 0L val newestDate = dbChapters.maxOfOrNull { it.date_upload } ?: 0L
@ -198,21 +189,17 @@ suspend fun syncChaptersWithSource(
manga.last_update = Date().time manga.last_update = Date().time
updateManga.await(MangaUpdate(manga.id!!, lastUpdate = manga.last_update)) updateManga.await(MangaUpdate(manga.id!!, lastUpdate = manga.last_update))
val reAddedSet = reAdded.toSet() val reAddedUrls = reAdded.map { it.url }.toHashSet()
val filteredScanlators = ChapterUtil.getScanlators(manga.filtered_scanlators).toHashSet()
return Pair( return Pair(
updatedToAdd.subtract(reAddedSet).toList().filterChaptersByScanlators(manga), updatedToAdd.filterNot {
toDelete - reAddedSet, it.url in reAddedUrls || it.scanlator in filteredScanlators
},
toDelete.filterNot { it.url in reAddedUrls },
) )
} }
private fun List<Chapter>.filterChaptersByScanlators(manga: Manga): List<Chapter> {
if (manga.filtered_scanlators.isNullOrBlank()) return this
return this.filter { chapter ->
!ChapterUtil.getScanlators(manga.filtered_scanlators).contains(chapter.scanlator)
}
}
// checks if the chapter in db needs updated // checks if the chapter in db needs updated
private fun shouldUpdateDbChapter(dbChapter: Chapter, sourceChapter: Chapter): Boolean { private fun shouldUpdateDbChapter(dbChapter: Chapter, sourceChapter: Chapter): Boolean {
return dbChapter.scanlator != sourceChapter.scanlator || return dbChapter.scanlator != sourceChapter.scanlator ||