fix: Scanlator filter not working properly

This commit is contained in:
Ahmad Ansori Palembani 2024-08-10 10:29:52 +07:00
parent 0e2c336a37
commit 7e1b532f83
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6
6 changed files with 70 additions and 22 deletions

View file

@ -186,17 +186,12 @@ class MangaDetailsPresenter(
private suspend fun getChapters() { private suspend fun getChapters() {
val chapters = getChapter.awaitAll(manga.id!!, isScanlatorFiltered()).map { it.toModel() } val chapters = getChapter.awaitAll(manga.id!!, isScanlatorFiltered()).map { it.toModel() }
allChapters = if (!isScanlatorFiltered()) chapters else getChapter.awaitAll(manga.id!!, false).map { it.toModel() }
// Find downloaded chapters // Find downloaded chapters
setDownloadedChapters(chapters) setDownloadedChapters(chapters)
allChapterScanlators = allChapterScanlators = allChapters.mapNotNull { it.chapter.scanlator }.toSet()
if (!isScanlatorFiltered()) {
chapters.flatMap { ChapterUtil.getScanlators(it.chapter.scanlator) }
} else {
getAvailableScanlators.await(manga.id!!)
}.toSet()
// Store the last emission
allChapters = if (!isScanlatorFiltered()) chapters else getChapter.awaitAll(manga.id!!, false).map { it.toModel() }
this.chapters = applyChapterFilters(chapters) this.chapters = applyChapterFilters(chapters)
} }

View file

@ -166,11 +166,9 @@ class ChaptersSortBottomSheet(controller: MangaDetailsController) :
binding.filterGroupsButton.setOnClickListener { binding.filterGroupsButton.setOnClickListener {
val scanlators = presenter.allChapterScanlators.toList() val scanlators = presenter.allChapterScanlators.toList()
val filteredScanlators = val filteredScanlators =
( presenter.manga.filtered_scanlators?.let { ChapterUtil.getScanlators(it) }.orEmpty()
presenter.manga.filtered_scanlators?.let { ChapterUtil.getScanlators(it) } .filter { it in scanlators }
?.toMutableSet() .toMutableSet()
?: mutableSetOf()
)
val preselected = scanlators.map { it in filteredScanlators }.toBooleanArray() val preselected = scanlators.map { it in filteredScanlators }.toBooleanArray()
var alertDialog: AlertDialog? = null var alertDialog: AlertDialog? = null
activity.materialAlertDialog() activity.materialAlertDialog()

View file

@ -206,10 +206,7 @@ private fun List<Chapter>.filterChaptersByScanlators(manga: Manga): List<Chapter
if (manga.filtered_scanlators == null) return this if (manga.filtered_scanlators == null) return this
return this.filter { chapter -> return this.filter { chapter ->
ChapterUtil.getScanlators(chapter.scanlator) !ChapterUtil.getScanlators(manga.filtered_scanlators).contains(chapter.scanlator)
.none { group ->
ChapterUtil.getScanlators(manga.filtered_scanlators).contains(group)
}
} }
} }

View file

@ -156,7 +156,7 @@ class ChapterUtil {
return chapters.size > 20 return chapters.size > 20
} }
const val scanlatorSeparator = " & " const val scanlatorSeparator = " [.] "
fun getScanlators(scanlators: String?): List<String> { fun getScanlators(scanlators: String?): List<String> {
if (scanlators.isNullOrBlank()) return emptyList() if (scanlators.isNullOrBlank()) return emptyList()

View file

@ -0,0 +1,57 @@
DROP VIEW IF EXISTS scanlators_view;
CREATE VIEW scanlators_view AS
SELECT S.* FROM (
WITH RECURSIVE split(seq, _id, name, str) AS (
SELECT 0, mangas._id, NULL, ifnull(mangas.filtered_scanlators, '')||' [.] ' FROM mangas WHERE mangas._id
UNION ALL SELECT
seq+1,
_id,
substr(str, 0, instr(str, ' [.] ')),
substr(str, instr(str, ' [.] ')+5)
FROM split WHERE str != ''
)
SELECT _id AS manga_id, name FROM split WHERE split.seq != 0 ORDER BY split.seq ASC
) AS S;
-- Replace seperator from ' & ' to less common ' [.] '
WITH tmp(_id, filtered_scanlators) AS (SELECT _id, replace(filtered_scanlators, ' & ', ' [.] ') FROM mangas)
UPDATE mangas
SET filtered_scanlators = (SELECT filtered_scanlators FROM tmp)
WHERE _id IN (SELECT _id FROM tmp);
-- To sync the project
DROP VIEW IF EXISTS library_view;
CREATE VIEW library_view AS
SELECT
M.*,
coalesce(C.total, 0) AS total,
coalesce(C.read_count, 0) AS has_read,
coalesce(C.bookmark_count, 0) AS bookmark_count,
coalesce(MC.category_id, 0) AS category,
coalesce(C.latestUpload, 0) AS latestUpload,
coalesce(C.lastRead, 0) AS lastRead,
coalesce(C.lastFetch, 0) AS lastFetch
FROM mangas AS M
LEFT JOIN (
SELECT
chapters.manga_id,
count(*) AS total,
sum(read) AS read_count,
sum(bookmark) AS bookmark_count,
coalesce(max(chapters.date_upload), 0) AS latestUpload,
coalesce(max(history.history_last_read), 0) AS lastRead,
coalesce(max(chapters.date_fetch), 0) AS lastFetch
FROM chapters
LEFT JOIN scanlators_view AS filtered_scanlators
ON chapters.manga_id = filtered_scanlators.manga_id
AND ifnull(chapters.scanlator, 'N/A') = ifnull(filtered_scanlators.name, '/<INVALID>/')
LEFT JOIN history
ON chapters._id = history.history_chapter_id
WHERE filtered_scanlators.name IS NULL
GROUP BY chapters.manga_id
) AS C
ON M._id = C.manga_id
LEFT JOIN (SELECT * FROM mangas_categories) AS MC
ON MC.manga_id = M._id
WHERE M.favorite = 1
ORDER BY M.title;

View file

@ -1,12 +1,13 @@
-- FIXME: Turn this to its own table
CREATE VIEW scanlators_view AS CREATE VIEW scanlators_view AS
SELECT S.* FROM ( SELECT S.* FROM (
WITH RECURSIVE split(seq, _id, name, str) AS ( -- Probably should migrate this to its own table someday WITH RECURSIVE split(seq, _id, name, str) AS (
SELECT 0, mangas._id, NULL, replace(ifnull(mangas.filtered_scanlators, ''), ' & ', '[.]')||'[.]' FROM mangas WHERE mangas._id SELECT 0, mangas._id, NULL, ifnull(mangas.filtered_scanlators, '')||' [.] ' FROM mangas WHERE mangas._id
UNION ALL SELECT UNION ALL SELECT
seq+1, seq+1,
_id, _id,
substr(str, 0, instr(str, '[.]')), substr(str, 0, instr(str, ' [.] ')),
substr(str, instr(str, '[.]')+3) substr(str, instr(str, ' [.] ')+5)
FROM split WHERE str != '' FROM split WHERE str != ''
) )
SELECT _id AS manga_id, name FROM split WHERE split.seq != 0 ORDER BY split.seq ASC SELECT _id AS manga_id, name FROM split WHERE split.seq != 0 ORDER BY split.seq ASC