Add hiyobi image booster

This commit is contained in:
tom5079
2019-05-13 12:56:39 +09:00
parent cbb52f3dc9
commit 2bf0f86510
9 changed files with 89 additions and 28 deletions

View File

@@ -11,6 +11,7 @@ import kotlinx.coroutines.runBlocking
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import xyz.quaver.hiyobi.getReader
import java.io.File
/**
@@ -38,16 +39,7 @@ class ExampleInstrumentedTest {
}
@Test
@ExperimentalUnsignedTypes
fun test_doSearch() {
Log.d("TEST", "Starting...")
runBlocking {
CoroutineScope(Dispatchers.Main).launch {
Log.d("TEST", "This is started! wow")
}.join()
}
Log.d("TEST", "Finished! ...Really?")
getReader(1414061)
}
}

View File

@@ -1,17 +1,21 @@
package xyz.quaver.pupil
import android.os.Bundle
import android.util.Log
import android.view.View
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import androidx.preference.PreferenceManager
import kotlinx.android.synthetic.main.activity_gallery.*
import kotlinx.coroutines.*
import xyz.quaver.hitomi.Reader
import xyz.quaver.hitomi.getReader
import xyz.quaver.hitomi.getReferer
import xyz.quaver.hiyobi.hiyobi
import xyz.quaver.pupil.adapters.GalleryAdapter
import java.io.File
import java.io.FileOutputStream
import java.lang.Exception
import java.net.URL
import javax.net.ssl.HttpsURLConnection
@@ -32,9 +36,20 @@ class GalleryActivity : AppCompatActivity() {
setContentView(R.layout.activity_gallery)
supportActionBar?.title = intent.getStringExtra("GALLERY_TITLE")
galleryID = intent.getIntExtra("GALLERY_ID", 0)
CoroutineScope(Dispatchers.Unconfined).launch {
reader = async(Dispatchers.IO) {
val preference = PreferenceManager.getDefaultSharedPreferences(this@GalleryActivity)
if (preference.getBoolean("use_hiyobi", false)) {
try {
xyz.quaver.hiyobi.getReader(galleryID)
Log.d("Pupil", "Using Hiyobi.me")
} catch (e: Exception) {
getReader(galleryID)
}
}
getReader(galleryID)
}
}
@@ -78,17 +93,15 @@ class GalleryActivity : AppCompatActivity() {
val reader = reader.await()
launch(Dispatchers.Main) {
supportActionBar?.title = reader.title
with(gallery_progressbar) {
max = reader.images.size
max = reader.size
progress = 0
visibility = View.VISIBLE
}
}
reader.images.chunked(8).forEach { chunked ->
reader.chunked(8).forEach { chunked ->
chunked.map {
async(Dispatchers.IO) {
val url = if (it.second?.haswebp == 1) webpUrlFromUrl(it.first) else it.first

View File

@@ -176,9 +176,10 @@ class MainActivity : AppCompatActivity() {
private fun setupRecyclerView() {
with(main_recyclerview) {
adapter = GalleryBlockAdapter(galleries).apply {
setClickListener {
setClickListener { galleryID, title ->
val intent = Intent(this@MainActivity, GalleryActivity::class.java)
intent.putExtra("GALLERY_ID", it)
intent.putExtra("GALLERY_ID", galleryID)
intent.putExtra("GALLERY_TITLE", title)
//TODO: Maybe sprinke some transitions will be nice :D
startActivity(intent)

View File

@@ -33,8 +33,8 @@ class GalleryBlockAdapter(private val galleries: List<Pair<GalleryBlock, Bitmap?
class ViewHolder(val view: CardView) : RecyclerView.ViewHolder(view)
class ProgressViewHolder(view: LinearLayout) : RecyclerView.ViewHolder(view)
private var callback: ((Int) -> Unit)? = null
fun setClickListener(callback: ((Int) -> Unit)?) {
private var callback: ((Int, String) -> Unit)? = null
fun setClickListener(callback: ((Int, String) -> Unit)?) {
this.callback = callback
}
@@ -74,7 +74,7 @@ class GalleryBlockAdapter(private val galleries: List<Pair<GalleryBlock, Bitmap?
val series = gallery.series.ifEmpty { listOf("N/A") }
setOnClickListener {
callback?.invoke(gallery.id)
callback?.invoke(gallery.id, gallery.title)
}
galleryblock_thumbnail.setImageBitmap(thumbnail)

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -30,4 +30,14 @@
</PreferenceCategory>
<PreferenceCategory
app:title="Image loading">
<SwitchPreference
app:key="use_hiyobi"
app:title="Use hiyobi.me"
app:summary="Use hiyobi.me to improve image loading speed if available"/>
</PreferenceCategory>
</androidx.preference.PreferenceScreen>

View File

@@ -1,11 +1,9 @@
package xyz.quaver.hitomi
import kotlinx.serialization.ImplicitReflectionSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonConfiguration
import kotlinx.serialization.list
import kotlinx.serialization.parseList
import org.jsoup.Jsoup
import java.net.URL
@@ -18,10 +16,7 @@ data class GalleryInfo(
val name: String,
val height: Int
)
data class Reader(
val title: String,
val images: List<Pair<URL, GalleryInfo?>>
)
typealias Reader = List<Pair<URL, GalleryInfo?>>
//Set header `Referer` to reader url to avoid 403 error
fun getReader(galleryID: Int) : Reader {
val readerUrl = "https://hitomi.la/reader/$galleryID.html"
@@ -29,8 +24,6 @@ fun getReader(galleryID: Int) : Reader {
val doc = Jsoup.connect(readerUrl).get()
val title = doc.selectFirst("title").text()
val images = doc.select(".img-url").map {
URL(protocol + urlFromURL(it.text()))
}
@@ -49,5 +42,5 @@ fun getReader(galleryID: Int) : Reader {
if (images.size > galleryInfo.size)
galleryInfo.addAll(arrayOfNulls(images.size - galleryInfo.size))
return Reader(title, images zip galleryInfo)
return images zip galleryInfo
}

View File

@@ -0,0 +1,47 @@
package xyz.quaver.hiyobi
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonConfiguration
import kotlinx.serialization.json.content
import xyz.quaver.hitomi.Reader
import java.net.URL
import javax.net.ssl.HttpsURLConnection
const val hiyobi = "xn--9w3b15m8vo.asia"
const val user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36"
var cookie: String = ""
fun renewCookie() : String {
val url = "https://$hiyobi/"
with(URL(url).openConnection() as HttpsURLConnection) {
setRequestProperty("User-Agent", user_agent)
connectTimeout = 2000
connect()
return headerFields["Set-Cookie"]!![0]
}
}
fun getReader(galleryId: Int) : Reader {
val url = "https://$hiyobi/data/json/${galleryId}_list.json"
if (cookie.isEmpty())
cookie = renewCookie()
val json = Json(JsonConfiguration.Stable).parseJson(
with(URL(url).openConnection() as HttpsURLConnection) {
setRequestProperty("User-Agent", user_agent)
setRequestProperty("Cookie", cookie)
connectTimeout = 2000
connect()
inputStream.bufferedReader().use { it.readText() }
}
)
return json.jsonArray.map {
val name = it.jsonObject["name"]!!.content
Pair(URL("https://$hiyobi/data/$galleryId/$name"), null)
}
}

View File

@@ -61,4 +61,9 @@ class UnitTest {
print(reader)
}
@Test
fun test_hiyobi() {
xyz.quaver.hiyobi.getReader(1414061)
}
}