simplify search a bit

AwkwardPeak7 2 years ago
parent 3f3ab5a7be
commit a40a8d329a
No known key found for this signature in database

@ -197,16 +197,11 @@ class HitomiLaParser(context: MangaLoaderContext) : MangaParser(context, MangaSo
} }
val key = hashTerm(it) val key = hashTerm(it)
val field = "galleries" val node = getGalleryNodeAtAddress(0)
val data = bSearch(key, node)
?: return emptySet()
val node = getNodeAtAddress(field, 0) return getGalleryIDsFromData(data)
val data = bSearch(field, key, node)
if (data != null)
return getGalleryIDsFromData(data)
return emptySet()
} }
} }
@ -216,7 +211,7 @@ class HitomiLaParser(context: MangaLoaderContext) : MangaParser(context, MangaSo
if (length > 100000000 || length <= 0) if (length > 100000000 || length <= 0)
throw Exception("length $length is too long") throw Exception("length $length is too long")
val inbuf = getURLAtRange(url, offset.until(offset+length)) val inbuf = getRangedResponse(url, offset.until(offset+length))
val galleryIDs = mutableSetOf<Int>() val galleryIDs = mutableSetOf<Int>()
@ -239,7 +234,7 @@ class HitomiLaParser(context: MangaLoaderContext) : MangaParser(context, MangaSo
return galleryIDs return galleryIDs
} }
private suspend fun bSearch(field: String, key: UByteArray, node: Node) : Pair<Long, Int>? { private suspend fun bSearch(key: UByteArray, node: Node) : Pair<Long, Int>? {
fun compareArrayBuffers(dv1: UByteArray, dv2: UByteArray) : Int { fun compareArrayBuffers(dv1: UByteArray, dv2: UByteArray) : Int {
val top = min(dv1.size, dv2.size) val top = min(dv1.size, dv2.size)
@ -281,9 +276,8 @@ class HitomiLaParser(context: MangaLoaderContext) : MangaParser(context, MangaSo
else if (isLeaf(node)) else if (isLeaf(node))
return null return null
val nextNode = getNodeAtAddress(field, node.subNodeAddresses[where]) val nextNode = getGalleryNodeAtAddress(node.subNodeAddresses[where])
return bSearch(key, nextNode)
return bSearch(field, key, nextNode)
} }
private suspend fun getGalleryIDsFromNozomi(area: String?, tag: String, language: String, range: LongRange? = null) : Set<Int> { private suspend fun getGalleryIDsFromNozomi(area: String?, tag: String, language: String, range: LongRange? = null) : Set<Int> {
@ -292,7 +286,7 @@ class HitomiLaParser(context: MangaLoaderContext) : MangaParser(context, MangaSo
else -> "$ltnBaseUrl/$area/$tag-$language.nozomi" else -> "$ltnBaseUrl/$area/$tag-$language.nozomi"
} }
val bytes = getURLAtRange(nozomiAddress, range) val bytes = getRangedResponse(nozomiAddress, range)
val nozomi = mutableSetOf<Int>() val nozomi = mutableSetOf<Int>()
val arrayBuffer = ByteBuffer val arrayBuffer = ByteBuffer
@ -305,11 +299,9 @@ class HitomiLaParser(context: MangaLoaderContext) : MangaParser(context, MangaSo
return nozomi return nozomi
} }
private val tagIndexVersion = SuspendLazy { getIndexVersion("tagindex") } private val galleriesIndexVersion = SuspendLazy {
private val galleriesIndexVersion = SuspendLazy { getIndexVersion("galleriesindex") } webClient.httpGet("$ltnBaseUrl/galleriesindex/version?_=${System.currentTimeMillis()}").parseRaw()
}
private suspend fun getIndexVersion(name: String) =
webClient.httpGet("$ltnBaseUrl/$name/version?_=${System.currentTimeMillis()}").parseRaw()
private data class Node( private data class Node(
val keys: List<UByteArray>, val keys: List<UByteArray>,
@ -358,21 +350,15 @@ class HitomiLaParser(context: MangaLoaderContext) : MangaParser(context, MangaSo
return Node(keys, datas, subNodeAddresses) return Node(keys, datas, subNodeAddresses)
} }
private suspend fun getNodeAtAddress(field: String, address: Long) : Node { private suspend fun getGalleryNodeAtAddress(address: Long) : Node {
val url = val url = "$ltnBaseUrl/galleriesindex/galleries.${galleriesIndexVersion.get()}.index"
when(field) {
"galleries" -> "$ltnBaseUrl/galleriesindex/galleries.${galleriesIndexVersion.get()}.index"
"languages" -> "$ltnBaseUrl/galleriesindex/languages.${galleriesIndexVersion.get()}.index"
"nozomiurl" -> "$ltnBaseUrl/galleriesindex/nozomiurl.${galleriesIndexVersion.get()}.index"
else -> "$ltnBaseUrl/tagindex/$field.${tagIndexVersion.get()}.index"
}
val nodedata = getURLAtRange(url, address.until(address + 464)) val nodedata = getRangedResponse(url, address.until(address + 464))
return decodeNode(nodedata) return decodeNode(nodedata)
} }
private suspend fun getURLAtRange(url: String, range: LongRange? = null) : ByteArray { private suspend fun getRangedResponse(url: String, range: LongRange? = null) : ByteArray {
val rangeHeaders = when (range) { val rangeHeaders = when (range) {
null -> Headers.headersOf() null -> Headers.headersOf()
else -> Headers.headersOf("Range", "bytes=${range.first}-${range.last}") else -> Headers.headersOf("Range", "bytes=${range.first}-${range.last}")

Loading…
Cancel
Save