Integrate tag searching into library.

This commit is contained in:
NerdNumber9 2017-01-04 11:17:12 -05:00
parent 63d58c7a4f
commit 516a3bd017
4 changed files with 42 additions and 7 deletions

View File

@ -125,7 +125,7 @@ class EHentaiMetadata(override val id: Int,
override fun fetchMangaDetails(manga: Manga) = Observable.fromCallable { override fun fetchMangaDetails(manga: Manga) = Observable.fromCallable {
//Hack to convert the gallery into an online gallery when favoriting it or reading it //Hack to convert the gallery into an online gallery when favoriting it or reading it
metadataHelper.fetchMetadata(manga.url, exh).copyTo(manga) metadataHelper.fetchMetadata(manga.url, exh)?.copyTo(manga)
manga manga
}!! }!!

View File

@ -7,9 +7,15 @@ import android.widget.FrameLayout
import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.source.SourceManager
import eu.kanade.tachiyomi.data.source.online.all.EHentai
import eu.kanade.tachiyomi.data.source.online.all.EHentaiMetadata
import eu.kanade.tachiyomi.util.inflate import eu.kanade.tachiyomi.util.inflate
import eu.kanade.tachiyomi.widget.AutofitRecyclerView import eu.kanade.tachiyomi.widget.AutofitRecyclerView
import exh.metadata.MetadataHelper
import exh.search.SearchEngine
import kotlinx.android.synthetic.main.item_catalogue_grid.view.* import kotlinx.android.synthetic.main.item_catalogue_grid.view.*
import uy.kohesive.injekt.injectLazy
import java.util.* import java.util.*
/** /**
@ -25,6 +31,11 @@ class LibraryCategoryAdapter(val fragment: LibraryCategoryView) :
*/ */
private var mangas: List<Manga> = emptyList() private var mangas: List<Manga> = emptyList()
private val sourceManager: SourceManager by injectLazy()
private val searchEngine = SearchEngine()
private val metadataHelper = MetadataHelper()
init { init {
setHasStableIds(true) setHasStableIds(true)
} }
@ -70,8 +81,28 @@ class LibraryCategoryAdapter(val fragment: LibraryCategoryView) :
* @return true if the manga should be included, false otherwise. * @return true if the manga should be included, false otherwise.
*/ */
override fun filterObject(manga: Manga, query: String): Boolean = with(manga) { override fun filterObject(manga: Manga, query: String): Boolean = with(manga) {
title.toLowerCase().contains(query) || if(manga.source > 100) {
author != null && author!!.toLowerCase().contains(query) //Regular searching for normal manga
title.toLowerCase().contains(query) ||
author != null && author!!.toLowerCase().contains(query)
} else {
//Use gallery search engine for EH manga
val source = sourceManager.get(manga.source)
source?.let {
val exh: Boolean
if(source is EHentai)
exh = source.exh
else if(source is EHentaiMetadata)
exh = source.exh
else
return@with false
val metadata = metadataHelper.fetchMetadata(manga.url, exh)
metadata?.let {
searchEngine.matches(metadata, searchEngine.parseQuery(query))
} ?: title.toLowerCase().contains(query) //Use regular searching when the metadata is not set up for this gallery
} ?: false
}
} }
/** /**

View File

@ -8,7 +8,8 @@ class MetadataHelper {
fun writeGallery(galleryMetadata: ExGalleryMetadata) fun writeGallery(galleryMetadata: ExGalleryMetadata)
= exGalleryBook().write(galleryMetadata.galleryUniqueIdentifier(), galleryMetadata) = exGalleryBook().write(galleryMetadata.galleryUniqueIdentifier(), galleryMetadata)
fun fetchMetadata(url: String, exh: Boolean) = ExGalleryMetadata().apply { fun fetchMetadata(url: String, exh: Boolean): ExGalleryMetadata?
= ExGalleryMetadata().apply {
this.url = url this.url = url
this.exh = exh this.exh = exh
return exGalleryBook().read<ExGalleryMetadata>(galleryUniqueIdentifier()) return exGalleryBook().read<ExGalleryMetadata>(galleryUniqueIdentifier())

View File

@ -4,6 +4,9 @@ import exh.metadata.models.ExGalleryMetadata
import exh.metadata.models.Tag import exh.metadata.models.Tag
class SearchEngine { class SearchEngine {
private val queryCache = mutableMapOf<String, List<QueryComponent>>()
fun matches(metadata: ExGalleryMetadata, query: List<QueryComponent>): Boolean { fun matches(metadata: ExGalleryMetadata, query: List<QueryComponent>): Boolean {
fun matchTagList(tags: List<Tag>, fun matchTagList(tags: List<Tag>,
@ -56,7 +59,7 @@ class SearchEngine {
return true return true
} }
fun parseQuery(query: String): List<QueryComponent> { fun parseQuery(query: String) = queryCache.getOrPut(query, {
val res = mutableListOf<QueryComponent>() val res = mutableListOf<QueryComponent>()
var inQuotes = false var inQuotes = false
@ -128,6 +131,6 @@ class SearchEngine {
} }
flushAll() flushAll()
return res res
} })
} }