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 {
//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
}!!

View File

@ -7,9 +7,15 @@ import android.widget.FrameLayout
import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.kanade.tachiyomi.R
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.widget.AutofitRecyclerView
import exh.metadata.MetadataHelper
import exh.search.SearchEngine
import kotlinx.android.synthetic.main.item_catalogue_grid.view.*
import uy.kohesive.injekt.injectLazy
import java.util.*
/**
@ -25,6 +31,11 @@ class LibraryCategoryAdapter(val fragment: LibraryCategoryView) :
*/
private var mangas: List<Manga> = emptyList()
private val sourceManager: SourceManager by injectLazy()
private val searchEngine = SearchEngine()
private val metadataHelper = MetadataHelper()
init {
setHasStableIds(true)
}
@ -70,8 +81,28 @@ class LibraryCategoryAdapter(val fragment: LibraryCategoryView) :
* @return true if the manga should be included, false otherwise.
*/
override fun filterObject(manga: Manga, query: String): Boolean = with(manga) {
title.toLowerCase().contains(query) ||
author != null && author!!.toLowerCase().contains(query)
if(manga.source > 100) {
//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)
= 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.exh = exh
return exGalleryBook().read<ExGalleryMetadata>(galleryUniqueIdentifier())

View File

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