diff --git a/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt b/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt index 73714252..16060355 100644 --- a/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/xyz/quaver/pupil/ExampleInstrumentedTest.kt @@ -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) } } diff --git a/app/src/main/java/xyz/quaver/pupil/GalleryActivity.kt b/app/src/main/java/xyz/quaver/pupil/GalleryActivity.kt index 3a87a040..92dfe9c5 100644 --- a/app/src/main/java/xyz/quaver/pupil/GalleryActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/GalleryActivity.kt @@ -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 diff --git a/app/src/main/java/xyz/quaver/pupil/MainActivity.kt b/app/src/main/java/xyz/quaver/pupil/MainActivity.kt index 64284234..d24131e3 100644 --- a/app/src/main/java/xyz/quaver/pupil/MainActivity.kt +++ b/app/src/main/java/xyz/quaver/pupil/MainActivity.kt @@ -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) diff --git a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt index b94db781..71851505 100644 --- a/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt +++ b/app/src/main/java/xyz/quaver/pupil/adapters/GalleryBlockAdapter.kt @@ -33,8 +33,8 @@ class GalleryBlockAdapter(private val galleries: List 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 + + + + + + diff --git a/libpupil/src/main/java/xyz/quaver/hitomi/readers.kt b/libpupil/src/main/java/xyz/quaver/hitomi/readers.kt index 8ceb06f9..5fee483d 100644 --- a/libpupil/src/main/java/xyz/quaver/hitomi/readers.kt +++ b/libpupil/src/main/java/xyz/quaver/hitomi/readers.kt @@ -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> -) +typealias Reader = List> //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 } \ No newline at end of file diff --git a/libpupil/src/main/java/xyz/quaver/hiyobi/reader.kt b/libpupil/src/main/java/xyz/quaver/hiyobi/reader.kt new file mode 100644 index 00000000..dfd289bb --- /dev/null +++ b/libpupil/src/main/java/xyz/quaver/hiyobi/reader.kt @@ -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) + } +} \ No newline at end of file diff --git a/libpupil/src/test/java/xyz/quaver/hitomi/UnitTest.kt b/libpupil/src/test/java/xyz/quaver/hitomi/UnitTest.kt index 17ac0e39..7f13d067 100644 --- a/libpupil/src/test/java/xyz/quaver/hitomi/UnitTest.kt +++ b/libpupil/src/test/java/xyz/quaver/hitomi/UnitTest.kt @@ -61,4 +61,9 @@ class UnitTest { print(reader) } + + @Test + fun test_hiyobi() { + xyz.quaver.hiyobi.getReader(1414061) + } } \ No newline at end of file