Merge branch 'issue-65' into dev
This commit is contained in:
@@ -20,7 +20,7 @@ android {
|
|||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 29
|
targetSdkVersion 29
|
||||||
versionCode 42
|
versionCode 42
|
||||||
versionName "4.6-alpha6"
|
versionName "4.6-alpha7"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
vectorDrawables.useSupportLibrary = true
|
vectorDrawables.useSupportLibrary = true
|
||||||
|
|||||||
@@ -31,7 +31,9 @@ import com.google.android.gms.common.GooglePlayServicesNotAvailableException
|
|||||||
import com.google.android.gms.common.GooglePlayServicesRepairableException
|
import com.google.android.gms.common.GooglePlayServicesRepairableException
|
||||||
import com.google.android.gms.security.ProviderInstaller
|
import com.google.android.gms.security.ProviderInstaller
|
||||||
import com.google.firebase.analytics.FirebaseAnalytics
|
import com.google.firebase.analytics.FirebaseAnalytics
|
||||||
|
import xyz.quaver.proxy
|
||||||
import xyz.quaver.pupil.util.Histories
|
import xyz.quaver.pupil.util.Histories
|
||||||
|
import xyz.quaver.pupil.util.getProxy
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class Pupil : MultiDexApplication() {
|
class Pupil : MultiDexApplication() {
|
||||||
@@ -46,6 +48,8 @@ class Pupil : MultiDexApplication() {
|
|||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
val preference = PreferenceManager.getDefaultSharedPreferences(this)
|
val preference = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
|
|
||||||
|
proxy = getProxy(this)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
preference.getString("dl_location", null)
|
preference.getString("dl_location", null)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
|||||||
@@ -46,16 +46,12 @@ class DefaultQueryDialog(context : Context) : AlertDialog(context) {
|
|||||||
private val excludeBL = "-male:yaoi"
|
private val excludeBL = "-male:yaoi"
|
||||||
private val excludeGuro = listOf("-female:guro", "-male:guro")
|
private val excludeGuro = listOf("-female:guro", "-male:guro")
|
||||||
|
|
||||||
private lateinit var dialogView : View
|
|
||||||
|
|
||||||
var onPositiveButtonClickListener : ((Tags) -> (Unit))? = null
|
var onPositiveButtonClickListener : ((Tags) -> (Unit))? = null
|
||||||
|
|
||||||
@SuppressLint("InflateParams")
|
@SuppressLint("InflateParams")
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
initDialog()
|
|
||||||
|
|
||||||
setTitle(R.string.default_query_dialog_title)
|
setTitle(R.string.default_query_dialog_title)
|
||||||
setView(dialogView)
|
setView(build())
|
||||||
setButton(Dialog.BUTTON_POSITIVE, context.getString(android.R.string.ok)) { _, _ ->
|
setButton(Dialog.BUTTON_POSITIVE, context.getString(android.R.string.ok)) { _, _ ->
|
||||||
val newTags = Tags.parse(default_query_dialog_edittext.text.toString())
|
val newTags = Tags.parse(default_query_dialog_edittext.text.toString())
|
||||||
|
|
||||||
@@ -79,15 +75,15 @@ class DefaultQueryDialog(context : Context) : AlertDialog(context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("InflateParams")
|
@SuppressLint("InflateParams")
|
||||||
private fun initDialog() {
|
private fun build() : View {
|
||||||
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
|
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
|
||||||
val tags = Tags.parse(
|
val tags = Tags.parse(
|
||||||
preferences.getString("default_query", "") ?: ""
|
preferences.getString("default_query", "") ?: ""
|
||||||
)
|
)
|
||||||
|
|
||||||
dialogView = LayoutInflater.from(context).inflate(R.layout.dialog_default_query, null)
|
val view = LayoutInflater.from(context).inflate(R.layout.dialog_default_query, null)
|
||||||
|
|
||||||
with(dialogView.default_query_dialog_language_selector) {
|
with(view.default_query_dialog_language_selector) {
|
||||||
adapter =
|
adapter =
|
||||||
ArrayAdapter(
|
ArrayAdapter(
|
||||||
context,
|
context,
|
||||||
@@ -110,13 +106,13 @@ class DefaultQueryDialog(context : Context) : AlertDialog(context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
with(dialogView.default_query_dialog_BL_checkbox) {
|
with(view.default_query_dialog_BL_checkbox) {
|
||||||
isChecked = tags.contains(excludeBL)
|
isChecked = tags.contains(excludeBL)
|
||||||
if (tags.contains(excludeBL))
|
if (tags.contains(excludeBL))
|
||||||
tags.remove(excludeBL)
|
tags.remove(excludeBL)
|
||||||
}
|
}
|
||||||
|
|
||||||
with(dialogView.default_query_dialog_guro_checkbox) {
|
with(view.default_query_dialog_guro_checkbox) {
|
||||||
isChecked = excludeGuro.all { tags.contains(it) }
|
isChecked = excludeGuro.all { tags.contains(it) }
|
||||||
if (excludeGuro.all { tags.contains(it) })
|
if (excludeGuro.all { tags.contains(it) })
|
||||||
excludeGuro.forEach {
|
excludeGuro.forEach {
|
||||||
@@ -124,7 +120,7 @@ class DefaultQueryDialog(context : Context) : AlertDialog(context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
with(dialogView.default_query_dialog_edittext) {
|
with(view.default_query_dialog_edittext) {
|
||||||
setText(tags.toString(), android.widget.TextView.BufferType.EDITABLE)
|
setText(tags.toString(), android.widget.TextView.BufferType.EDITABLE)
|
||||||
addTextChangedListener(object : TextWatcher {
|
addTextChangedListener(object : TextWatcher {
|
||||||
override fun beforeTextChanged(
|
override fun beforeTextChanged(
|
||||||
@@ -149,6 +145,8 @@ class DefaultQueryDialog(context : Context) : AlertDialog(context) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return view
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -26,6 +26,7 @@ import android.content.Intent
|
|||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.view.View
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
import android.widget.RadioButton
|
import android.widget.RadioButton
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
@@ -46,6 +47,16 @@ class DownloadLocationDialog(val activity: Activity) : AlertDialog(activity) {
|
|||||||
private val buttons = mutableListOf<Pair<RadioButton, File?>>()
|
private val buttons = mutableListOf<Pair<RadioButton, File?>>()
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
setTitle(R.string.settings_dl_location)
|
||||||
|
|
||||||
|
setView(build())
|
||||||
|
|
||||||
|
setButton(Dialog.BUTTON_POSITIVE, context.getText(android.R.string.ok)) { _, _ -> }
|
||||||
|
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun build() : View {
|
||||||
val view = layoutInflater.inflate(R.layout.dialog_dl_location, null) as LinearLayout
|
val view = layoutInflater.inflate(R.layout.dialog_dl_location, null) as LinearLayout
|
||||||
|
|
||||||
val externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null)
|
val externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null)
|
||||||
@@ -121,15 +132,7 @@ class DownloadLocationDialog(val activity: Activity) : AlertDialog(activity) {
|
|||||||
buttons[index].first.isChecked = true
|
buttons[index].first.isChecked = true
|
||||||
}
|
}
|
||||||
|
|
||||||
setTitle(R.string.settings_dl_location)
|
return view
|
||||||
|
|
||||||
setView(view)
|
|
||||||
|
|
||||||
setButton(Dialog.BUTTON_POSITIVE, context.getText(android.R.string.ok)) { _, _ ->
|
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -22,6 +22,7 @@ import android.annotation.SuppressLint
|
|||||||
import android.app.Dialog
|
import android.app.Dialog
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.view.View
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import androidx.recyclerview.widget.DividerItemDecoration
|
import androidx.recyclerview.widget.DividerItemDecoration
|
||||||
@@ -56,21 +57,17 @@ class MirrorDialog(context: Context) : AlertDialog(context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private lateinit var recyclerView: RecyclerView
|
|
||||||
|
|
||||||
@SuppressLint("InflateParams")
|
@SuppressLint("InflateParams")
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
initDialog()
|
|
||||||
|
|
||||||
setTitle(R.string.settings_mirror_title)
|
setTitle(R.string.settings_mirror_title)
|
||||||
setView(recyclerView)
|
setView(build())
|
||||||
setButton(Dialog.BUTTON_POSITIVE, context.getString(android.R.string.ok)) { _, _ -> }
|
setButton(Dialog.BUTTON_POSITIVE, context.getString(android.R.string.ok)) { _, _ -> }
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initDialog() {
|
private fun build() : View {
|
||||||
recyclerView = RecyclerView(context).apply recyclerview@{
|
return RecyclerView(context).apply recyclerview@{
|
||||||
addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL))
|
addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL))
|
||||||
layoutManager = LinearLayoutManager(context)
|
layoutManager = LinearLayoutManager(context)
|
||||||
adapter = MirrorAdapter(context).apply adapter@{
|
adapter = MirrorAdapter(context).apply adapter@{
|
||||||
|
|||||||
133
app/src/main/java/xyz/quaver/pupil/ui/dialog/ProxyDialog.kt
Normal file
133
app/src/main/java/xyz/quaver/pupil/ui/dialog/ProxyDialog.kt
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
* Pupil, Hitomi.la viewer for Android
|
||||||
|
* Copyright (C) 2020 tom5079
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package xyz.quaver.pupil.ui.dialog
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.app.Dialog
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.AdapterView
|
||||||
|
import android.widget.ArrayAdapter
|
||||||
|
import androidx.preference.PreferenceManager
|
||||||
|
import kotlinx.android.synthetic.main.dialog_proxy.view.*
|
||||||
|
import xyz.quaver.proxy
|
||||||
|
import xyz.quaver.pupil.R
|
||||||
|
import xyz.quaver.pupil.util.ProxyInfo
|
||||||
|
import xyz.quaver.pupil.util.getProxyInfo
|
||||||
|
import xyz.quaver.pupil.util.json
|
||||||
|
import java.net.Proxy
|
||||||
|
|
||||||
|
class ProxyDialog(context: Context) : Dialog(context) {
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
val view = build()
|
||||||
|
|
||||||
|
setTitle(R.string.settings_proxy_title)
|
||||||
|
setContentView(view)
|
||||||
|
|
||||||
|
window?.attributes?.width = ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
|
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("InflateParams")
|
||||||
|
private fun build() : View {
|
||||||
|
val proxyInfo = getProxyInfo(context)
|
||||||
|
|
||||||
|
val view = LayoutInflater.from(context).inflate(R.layout.dialog_proxy, null)
|
||||||
|
|
||||||
|
val enabler = { enable: Boolean ->
|
||||||
|
view?.proxy_addr?.isEnabled = enable
|
||||||
|
view?.proxy_port?.isEnabled = enable
|
||||||
|
view?.proxy_username?.isEnabled = enable
|
||||||
|
view?.proxy_password?.isEnabled = enable
|
||||||
|
|
||||||
|
if (!enable) {
|
||||||
|
view?.proxy_addr?.text = null
|
||||||
|
view?.proxy_port?.text = null
|
||||||
|
view?.proxy_username?.text = null
|
||||||
|
view?.proxy_password?.text = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
with(view.proxy_type_selector) {
|
||||||
|
adapter = ArrayAdapter(
|
||||||
|
context,
|
||||||
|
android.R.layout.simple_spinner_dropdown_item,
|
||||||
|
context.resources.getStringArray(R.array.proxy_type)
|
||||||
|
)
|
||||||
|
|
||||||
|
setSelection(proxyInfo.type.ordinal)
|
||||||
|
|
||||||
|
onItemSelectedListener = object: AdapterView.OnItemSelectedListener {
|
||||||
|
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
|
||||||
|
enabler.invoke(position != 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onNothingSelected(parent: AdapterView<*>?) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
view.proxy_addr.setText(proxyInfo.host)
|
||||||
|
view.proxy_port.setText(proxyInfo.port?.toString())
|
||||||
|
view.proxy_username.setText(proxyInfo.username)
|
||||||
|
view.proxy_password.setText(proxyInfo.password)
|
||||||
|
|
||||||
|
enabler.invoke(proxyInfo.type != Proxy.Type.DIRECT)
|
||||||
|
|
||||||
|
view.proxy_cancel.setOnClickListener {
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
|
||||||
|
view.proxy_ok.setOnClickListener {
|
||||||
|
val type = Proxy.Type.values()[view.proxy_type_selector.selectedItemPosition]
|
||||||
|
val addr = view.proxy_addr.text?.toString()
|
||||||
|
val port = view.proxy_port.text?.toString()?.toIntOrNull()
|
||||||
|
val username = view.proxy_username.text?.toString()
|
||||||
|
val password = view.proxy_password.text?.toString()
|
||||||
|
|
||||||
|
if (type != Proxy.Type.DIRECT) {
|
||||||
|
if (addr == null || addr.isEmpty())
|
||||||
|
view.proxy_addr.error = context.getText(R.string.proxy_dialog_error)
|
||||||
|
if (port == null)
|
||||||
|
view.proxy_port.error = context.getText(R.string.proxy_dialog_error)
|
||||||
|
|
||||||
|
if (addr == null || addr.isEmpty() || port == null)
|
||||||
|
return@setOnClickListener
|
||||||
|
}
|
||||||
|
|
||||||
|
ProxyInfo(type, addr, port, username, password).let {
|
||||||
|
|
||||||
|
PreferenceManager.getDefaultSharedPreferences(context).edit().putString("proxy",
|
||||||
|
json.stringify(ProxyInfo.serializer(), it)
|
||||||
|
).apply()
|
||||||
|
|
||||||
|
proxy = it.proxy()
|
||||||
|
}
|
||||||
|
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
|
||||||
|
return view
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -36,6 +36,7 @@ import xyz.quaver.pupil.ui.SettingsActivity
|
|||||||
import xyz.quaver.pupil.ui.dialog.DefaultQueryDialog
|
import xyz.quaver.pupil.ui.dialog.DefaultQueryDialog
|
||||||
import xyz.quaver.pupil.ui.dialog.DownloadLocationDialog
|
import xyz.quaver.pupil.ui.dialog.DownloadLocationDialog
|
||||||
import xyz.quaver.pupil.ui.dialog.MirrorDialog
|
import xyz.quaver.pupil.ui.dialog.MirrorDialog
|
||||||
|
import xyz.quaver.pupil.ui.dialog.ProxyDialog
|
||||||
import xyz.quaver.pupil.util.*
|
import xyz.quaver.pupil.util.*
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@@ -146,6 +147,10 @@ class SettingsFragment :
|
|||||||
MirrorDialog(context)
|
MirrorDialog(context)
|
||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
|
"proxy" -> {
|
||||||
|
ProxyDialog(context)
|
||||||
|
.show()
|
||||||
|
}
|
||||||
"backup" -> {
|
"backup" -> {
|
||||||
File(ContextCompat.getDataDir(context), "favorites.json").copyTo(
|
File(ContextCompat.getDataDir(context), "favorites.json").copyTo(
|
||||||
File(getDownloadDirectory(context), "favorites.json"),
|
File(getDownloadDirectory(context), "favorites.json"),
|
||||||
@@ -189,9 +194,18 @@ class SettingsFragment :
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
|
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
|
||||||
when (key) {
|
key ?: return
|
||||||
"dl_location" -> {
|
|
||||||
findPreference<Preference>(key)?.summary = getDownloadDirectory(context!!).canonicalPath
|
with(findPreference<Preference>(key)) {
|
||||||
|
this ?: return
|
||||||
|
|
||||||
|
when (key) {
|
||||||
|
"proxy" -> {
|
||||||
|
summary = getProxyInfo(context).type.name
|
||||||
|
}
|
||||||
|
"dl_location" -> {
|
||||||
|
summary = getDownloadDirectory(context!!).canonicalPath
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -245,8 +259,7 @@ class SettingsFragment :
|
|||||||
onPreferenceClickListener = this@SettingsFragment
|
onPreferenceClickListener = this@SettingsFragment
|
||||||
}
|
}
|
||||||
"default_query" -> {
|
"default_query" -> {
|
||||||
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
|
summary = PreferenceManager.getDefaultSharedPreferences(context).getString("default_query", "") ?: ""
|
||||||
summary = preferences.getString("default_query", "") ?: ""
|
|
||||||
|
|
||||||
onPreferenceClickListener = this@SettingsFragment
|
onPreferenceClickListener = this@SettingsFragment
|
||||||
}
|
}
|
||||||
@@ -270,6 +283,11 @@ class SettingsFragment :
|
|||||||
"mirrors" -> {
|
"mirrors" -> {
|
||||||
onPreferenceClickListener = this@SettingsFragment
|
onPreferenceClickListener = this@SettingsFragment
|
||||||
}
|
}
|
||||||
|
"proxy" -> {
|
||||||
|
summary = getProxyInfo(context).type.name
|
||||||
|
|
||||||
|
onPreferenceClickListener = this@SettingsFragment
|
||||||
|
}
|
||||||
"dark_mode" -> {
|
"dark_mode" -> {
|
||||||
onPreferenceChangeListener = this@SettingsFragment
|
onPreferenceChangeListener = this@SettingsFragment
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import android.content.Context
|
|||||||
import android.content.ContextWrapper
|
import android.content.ContextWrapper
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
|
import android.util.Log
|
||||||
import android.util.SparseArray
|
import android.util.SparseArray
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import androidx.core.app.NotificationManagerCompat
|
import androidx.core.app.NotificationManagerCompat
|
||||||
@@ -40,6 +41,7 @@ import xyz.quaver.hitomi.urlFromUrlFromHash
|
|||||||
import xyz.quaver.hiyobi.cookie
|
import xyz.quaver.hiyobi.cookie
|
||||||
import xyz.quaver.hiyobi.createImgList
|
import xyz.quaver.hiyobi.createImgList
|
||||||
import xyz.quaver.hiyobi.user_agent
|
import xyz.quaver.hiyobi.user_agent
|
||||||
|
import xyz.quaver.proxy
|
||||||
import xyz.quaver.pupil.R
|
import xyz.quaver.pupil.R
|
||||||
import xyz.quaver.pupil.ui.ReaderActivity
|
import xyz.quaver.pupil.ui.ReaderActivity
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
@@ -159,6 +161,7 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont
|
|||||||
OkHttpClient.Builder()
|
OkHttpClient.Builder()
|
||||||
.addInterceptor(interceptor)
|
.addInterceptor(interceptor)
|
||||||
.dispatcher(Dispatcher(Executors.newFixedThreadPool(4)))
|
.dispatcher(Dispatcher(Executors.newFixedThreadPool(4)))
|
||||||
|
.proxy(proxy)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
fun stop() {
|
fun stop() {
|
||||||
@@ -229,7 +232,10 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont
|
|||||||
tag(galleryID to index)
|
tag(galleryID to index)
|
||||||
}.build()
|
}.build()
|
||||||
|
|
||||||
clients[galleryID].newCall(request).enqueue(callback)
|
if (clients.get(galleryID) == null)
|
||||||
|
clients.put(galleryID, buildClient())
|
||||||
|
|
||||||
|
clients[galleryID]?.newCall(request)?.enqueue(callback)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun download(galleryID: Int) = CoroutineScope(Dispatchers.IO).launch {
|
private fun download(galleryID: Int) = CoroutineScope(Dispatchers.IO).launch {
|
||||||
@@ -254,6 +260,8 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont
|
|||||||
}.toMutableList())
|
}.toMutableList())
|
||||||
exception.put(galleryID, reader.galleryInfo.map { null }.toMutableList())
|
exception.put(galleryID, reader.galleryInfo.map { null }.toMutableList())
|
||||||
|
|
||||||
|
Log.i("PUPILD", "READER HERE!")
|
||||||
|
|
||||||
if (notification[galleryID] == null)
|
if (notification[galleryID] == null)
|
||||||
initNotification(galleryID)
|
initNotification(galleryID)
|
||||||
|
|
||||||
@@ -271,8 +279,6 @@ class DownloadWorker private constructor(context: Context) : ContextWrapper(cont
|
|||||||
return@launch
|
return@launch
|
||||||
}
|
}
|
||||||
|
|
||||||
clients.put(galleryID, buildClient())
|
|
||||||
|
|
||||||
for (i in reader.galleryInfo.indices) {
|
for (i in reader.galleryInfo.indices) {
|
||||||
val callback = object : Callback {
|
val callback = object : Callback {
|
||||||
override fun onFailure(call: Call, e: IOException) {
|
override fun onFailure(call: Call, e: IOException) {
|
||||||
|
|||||||
63
app/src/main/java/xyz/quaver/pupil/util/proxy.kt
Normal file
63
app/src/main/java/xyz/quaver/pupil/util/proxy.kt
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* Pupil, Hitomi.la viewer for Android
|
||||||
|
* Copyright (C) 2020 tom5079
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package xyz.quaver.pupil.util
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import androidx.preference.PreferenceManager
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
import okhttp3.Authenticator
|
||||||
|
import okhttp3.Credentials
|
||||||
|
import java.net.InetSocketAddress
|
||||||
|
import java.net.Proxy
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class ProxyInfo(
|
||||||
|
val type: Proxy.Type,
|
||||||
|
val host: String? = null,
|
||||||
|
val port: Int? = null,
|
||||||
|
val username: String? = null,
|
||||||
|
val password: String? = null
|
||||||
|
) {
|
||||||
|
fun proxy() : Proxy {
|
||||||
|
return if (host == null || port == null)
|
||||||
|
return Proxy.NO_PROXY
|
||||||
|
else
|
||||||
|
Proxy(type, InetSocketAddress.createUnresolved(host, port))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun authenticator() = Authenticator { _, response ->
|
||||||
|
val credential = Credentials.basic(username, password)
|
||||||
|
|
||||||
|
response.request().newBuilder()
|
||||||
|
.header("Proxy-Authorization", credential)
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getProxy(context: Context) =
|
||||||
|
getProxyInfo(context).proxy()
|
||||||
|
|
||||||
|
fun getProxyInfo(context: Context) =
|
||||||
|
PreferenceManager.getDefaultSharedPreferences(context).getString("proxy", null).let {
|
||||||
|
if (it == null)
|
||||||
|
ProxyInfo(Proxy.Type.DIRECT)
|
||||||
|
else
|
||||||
|
json.parse(ProxyInfo.serializer(), it)
|
||||||
|
}
|
||||||
123
app/src/main/res/layout/dialog_proxy.xml
Normal file
123
app/src/main/res/layout/dialog_proxy.xml
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ Pupil, Hitomi.la viewer for Android
|
||||||
|
~ Copyright (C) 2020 tom5079
|
||||||
|
~
|
||||||
|
~ This program is free software: you can redistribute it and/or modify
|
||||||
|
~ it under the terms of the GNU General Public License as published by
|
||||||
|
~ the Free Software Foundation, either version 3 of the License, or
|
||||||
|
~ (at your option) any later version.
|
||||||
|
~
|
||||||
|
~ This program is distributed in the hope that it will be useful,
|
||||||
|
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
~ GNU General Public License for more details.
|
||||||
|
~
|
||||||
|
~ You should have received a copy of the GNU General Public License
|
||||||
|
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:padding="16dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/proxy_title"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingBottom="16dp"
|
||||||
|
style="@style/TextAppearance.AppCompat.Large"
|
||||||
|
android:text="@string/settings_proxy_title"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/proxy_type_text"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/proxy_title"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
android:text="@string/proxy_dialog_type"
|
||||||
|
android:textAppearance="?android:attr/listSeparatorTextViewStyle"/>
|
||||||
|
|
||||||
|
<Spinner
|
||||||
|
android:id="@+id/proxy_type_selector"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/proxy_type_text"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/proxy_server_text"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/proxy_type_selector"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
android:text="@string/proxy_dialog_server"
|
||||||
|
android:textAppearance="?android:attr/listSeparatorTextViewStyle"/>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/proxy_address_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/proxy_server_text">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatEditText
|
||||||
|
android:id="@+id/proxy_addr"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_weight="2"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="@string/proxy_dialog_addr_hint"/>
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatEditText
|
||||||
|
android:id="@+id/proxy_port"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="@string/proxy_dialog_port_hint"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatEditText
|
||||||
|
android:id="@+id/proxy_username"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/proxy_address_layout"
|
||||||
|
android:hint="@string/proxy_dialog_username_hint"
|
||||||
|
android:enabled="false"/>
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.AppCompatEditText
|
||||||
|
android:id="@+id/proxy_password"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/proxy_username"
|
||||||
|
android:hint="@string/proxy_dialog_password_hint"
|
||||||
|
android:enabled="false"/>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/proxy_cancel"
|
||||||
|
style="?borderlessButtonStyle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@android:string/cancel"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/proxy_password"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/proxy_ok"
|
||||||
|
app:layout_constraintRight_toLeftOf="@id/proxy_ok"/>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/proxy_ok"
|
||||||
|
style="?borderlessButtonStyle"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@android:string/ok"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/proxy_password"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"/>
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
26
app/src/main/res/values-ja/arrays.xml
Normal file
26
app/src/main/res/values-ja/arrays.xml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ Pupil, Hitomi.la viewer for Android
|
||||||
|
~ Copyright (C) 2020 tom5079
|
||||||
|
~
|
||||||
|
~ This program is free software: you can redistribute it and/or modify
|
||||||
|
~ it under the terms of the GNU General Public License as published by
|
||||||
|
~ the Free Software Foundation, either version 3 of the License, or
|
||||||
|
~ (at your option) any later version.
|
||||||
|
~
|
||||||
|
~ This program is distributed in the hope that it will be useful,
|
||||||
|
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
~ GNU General Public License for more details.
|
||||||
|
~
|
||||||
|
~ You should have received a copy of the GNU General Public License
|
||||||
|
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<resources>
|
||||||
|
<string-array name="proxy_type">
|
||||||
|
<item>ダイレクト</item>
|
||||||
|
<item>HTTP</item>
|
||||||
|
<item>SOCKS</item>
|
||||||
|
</string-array>
|
||||||
|
</resources>
|
||||||
@@ -122,4 +122,12 @@
|
|||||||
<string name="settings_low_quality_summary">ロード速度とデータ使用料を改善するため低解像度イメージをロード</string>
|
<string name="settings_low_quality_summary">ロード速度とデータ使用料を改善するため低解像度イメージをロード</string>
|
||||||
<string name="settings_dl_location_custom">手動で設定</string>
|
<string name="settings_dl_location_custom">手動で設定</string>
|
||||||
<string name="settings_dl_location_not_writable">このフォルダにアクセスできません。他のフォルダを選択してください。</string>
|
<string name="settings_dl_location_not_writable">このフォルダにアクセスできません。他のフォルダを選択してください。</string>
|
||||||
|
<string name="settings_proxy_title">プロクシ</string>
|
||||||
|
<string name="proxy_dialog_username_hint">ID</string>
|
||||||
|
<string name="proxy_dialog_type">プロクシタイプ</string>
|
||||||
|
<string name="proxy_dialog_port_hint">ポート</string>
|
||||||
|
<string name="proxy_dialog_password_hint">パスワード</string>
|
||||||
|
<string name="proxy_dialog_error">エラー</string>
|
||||||
|
<string name="proxy_dialog_addr_hint">サーバーアドレス</string>
|
||||||
|
<string name="proxy_dialog_server">サーバー</string>
|
||||||
</resources>
|
</resources>
|
||||||
26
app/src/main/res/values-ko/arrays.xml
Normal file
26
app/src/main/res/values-ko/arrays.xml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ Pupil, Hitomi.la viewer for Android
|
||||||
|
~ Copyright (C) 2020 tom5079
|
||||||
|
~
|
||||||
|
~ This program is free software: you can redistribute it and/or modify
|
||||||
|
~ it under the terms of the GNU General Public License as published by
|
||||||
|
~ the Free Software Foundation, either version 3 of the License, or
|
||||||
|
~ (at your option) any later version.
|
||||||
|
~
|
||||||
|
~ This program is distributed in the hope that it will be useful,
|
||||||
|
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
~ GNU General Public License for more details.
|
||||||
|
~
|
||||||
|
~ You should have received a copy of the GNU General Public License
|
||||||
|
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<resources>
|
||||||
|
<string-array name="proxy_type">
|
||||||
|
<item>다이렉트</item>
|
||||||
|
<item>HTTP</item>
|
||||||
|
<item>SOCKS</item>
|
||||||
|
</string-array>
|
||||||
|
</resources>
|
||||||
@@ -122,4 +122,12 @@
|
|||||||
<string name="settings_mirror_title">미러 설정</string>
|
<string name="settings_mirror_title">미러 설정</string>
|
||||||
<string name="settings_dl_location_custom">직접 설정</string>
|
<string name="settings_dl_location_custom">직접 설정</string>
|
||||||
<string name="settings_dl_location_not_writable">이 폴더에 접근할 수 없습니다. 다른 폴더를 선택해주세요.</string>
|
<string name="settings_dl_location_not_writable">이 폴더에 접근할 수 없습니다. 다른 폴더를 선택해주세요.</string>
|
||||||
|
<string name="settings_proxy_title">프록시</string>
|
||||||
|
<string name="proxy_dialog_username_hint">ID</string>
|
||||||
|
<string name="proxy_dialog_type">프록시 타입</string>
|
||||||
|
<string name="proxy_dialog_port_hint">포트</string>
|
||||||
|
<string name="proxy_dialog_password_hint">비밀번호</string>
|
||||||
|
<string name="proxy_dialog_error">잘못된 값</string>
|
||||||
|
<string name="proxy_dialog_addr_hint">서버 주소</string>
|
||||||
|
<string name="proxy_dialog_server">서버</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -62,4 +62,10 @@
|
|||||||
<item>HIYOBI|hiyobi.me</item>
|
<item>HIYOBI|hiyobi.me</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="proxy_type">
|
||||||
|
<item>Direct</item>
|
||||||
|
<item>HTTP</item>
|
||||||
|
<item>SOCKS</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
@@ -154,6 +154,7 @@
|
|||||||
|
|
||||||
<string name="settings_miscellaneous_title">Miscellaneous</string>
|
<string name="settings_miscellaneous_title">Miscellaneous</string>
|
||||||
<string name="settings_mirror_summary">Load images from mirrors</string>
|
<string name="settings_mirror_summary">Load images from mirrors</string>
|
||||||
|
<string name="settings_proxy_title">Proxy</string>
|
||||||
<string name="settings_security_mode_title">Enable security mode</string>
|
<string name="settings_security_mode_title">Enable security mode</string>
|
||||||
<string name="settings_security_mode_summary">Enable security mode to make the screen invisible on recent app window</string>
|
<string name="settings_security_mode_summary">Enable security mode to make the screen invisible on recent app window</string>
|
||||||
<string name="settings_dark_mode_title">Dark mode</string>
|
<string name="settings_dark_mode_title">Dark mode</string>
|
||||||
@@ -189,4 +190,13 @@
|
|||||||
<string name="default_query_dialog_language_selector_none">Any</string>
|
<string name="default_query_dialog_language_selector_none">Any</string>
|
||||||
<string name="settings_mirror_title">Mirrors</string>
|
<string name="settings_mirror_title">Mirrors</string>
|
||||||
|
|
||||||
|
<!-- PROXY DIALOG -->
|
||||||
|
<string name="proxy_dialog_type">type</string>
|
||||||
|
<string name="proxy_dialog_addr_hint">address</string>
|
||||||
|
<string name="proxy_dialog_port_hint">port</string>
|
||||||
|
<string name="proxy_dialog_username_hint">username</string>
|
||||||
|
<string name="proxy_dialog_password_hint">password</string>
|
||||||
|
<string name="proxy_dialog_error">Wrong value</string>
|
||||||
|
<string name="proxy_dialog_server">server</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -71,6 +71,10 @@
|
|||||||
app:title="@string/settings_mirror_title"
|
app:title="@string/settings_mirror_title"
|
||||||
app:summary="@string/settings_mirror_summary"/>
|
app:summary="@string/settings_mirror_summary"/>
|
||||||
|
|
||||||
|
<Preference
|
||||||
|
app:key="proxy"
|
||||||
|
app:title="@string/settings_proxy_title"/>
|
||||||
|
|
||||||
<SwitchPreferenceCompat
|
<SwitchPreferenceCompat
|
||||||
app:key="security_mode"
|
app:key="security_mode"
|
||||||
app:title="@string/settings_security_mode_title"
|
app:title="@string/settings_security_mode_title"
|
||||||
|
|||||||
@@ -16,6 +16,10 @@
|
|||||||
|
|
||||||
package xyz.quaver
|
package xyz.quaver
|
||||||
|
|
||||||
|
import java.net.Proxy
|
||||||
|
|
||||||
|
var proxy = Proxy.NO_PROXY
|
||||||
|
|
||||||
fun availableInHiyobi(galleryID: Int) : Boolean {
|
fun availableInHiyobi(galleryID: Int) : Boolean {
|
||||||
return try {
|
return try {
|
||||||
xyz.quaver.hiyobi.getReader(galleryID)
|
xyz.quaver.hiyobi.getReader(galleryID)
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package xyz.quaver.hitomi
|
|||||||
|
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
import kotlinx.serialization.list
|
import kotlinx.serialization.list
|
||||||
|
import xyz.quaver.proxy
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
|
|
||||||
const val protocol = "https:"
|
const val protocol = "https:"
|
||||||
@@ -27,7 +28,9 @@ fun getGalleryInfo(galleryID: Int) =
|
|||||||
Json.nonstrict.parse(
|
Json.nonstrict.parse(
|
||||||
GalleryInfo.serializer().list,
|
GalleryInfo.serializer().list,
|
||||||
Regex("""\[.+]""").find(
|
Regex("""\[.+]""").find(
|
||||||
URL("$protocol//$domain/galleries/$galleryID.js").readText()
|
URL("$protocol//$domain/galleries/$galleryID.js").openConnection(proxy).getInputStream().use {
|
||||||
|
it.reader().readText()
|
||||||
|
}
|
||||||
)?.value ?: "[]"
|
)?.value ?: "[]"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package xyz.quaver.hitomi
|
|||||||
|
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
import org.jsoup.Jsoup
|
import org.jsoup.Jsoup
|
||||||
|
import xyz.quaver.proxy
|
||||||
import java.net.URLDecoder
|
import java.net.URLDecoder
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@@ -36,7 +37,7 @@ data class Gallery(
|
|||||||
val thumbnails: List<String>
|
val thumbnails: List<String>
|
||||||
)
|
)
|
||||||
fun getGallery(galleryID: Int) : Gallery {
|
fun getGallery(galleryID: Int) : Gallery {
|
||||||
val url = Jsoup.connect("https://hitomi.la/galleries/$galleryID.html").get()
|
val url = Jsoup.connect("https://hitomi.la/galleries/$galleryID.html").proxy(proxy).get()
|
||||||
.select("a").attr("href")
|
.select("a").attr("href")
|
||||||
|
|
||||||
val doc = Jsoup.connect(url).get()
|
val doc = Jsoup.connect(url).get()
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package xyz.quaver.hitomi
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
import org.jsoup.Jsoup
|
import org.jsoup.Jsoup
|
||||||
import xyz.quaver.Code
|
import xyz.quaver.Code
|
||||||
|
import xyz.quaver.proxy
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
import java.net.URLDecoder
|
import java.net.URLDecoder
|
||||||
import java.nio.ByteBuffer
|
import java.nio.ByteBuffer
|
||||||
@@ -78,7 +79,7 @@ data class GalleryBlock(
|
|||||||
fun getGalleryBlock(galleryID: Int) : GalleryBlock? {
|
fun getGalleryBlock(galleryID: Int) : GalleryBlock? {
|
||||||
val url = "$protocol//$domain/$galleryblockdir/$galleryID$extension"
|
val url = "$protocol//$domain/$galleryblockdir/$galleryID$extension"
|
||||||
|
|
||||||
val doc = Jsoup.connect(url).get()
|
val doc = Jsoup.connect(url).proxy(proxy).get()
|
||||||
|
|
||||||
val galleryUrl = doc.selectFirst(".lillie").attr("href")
|
val galleryUrl = doc.selectFirst(".lillie").attr("href")
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package xyz.quaver.hitomi
|
|||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
import org.jsoup.Jsoup
|
import org.jsoup.Jsoup
|
||||||
import xyz.quaver.Code
|
import xyz.quaver.Code
|
||||||
|
import xyz.quaver.proxy
|
||||||
|
|
||||||
fun getReferer(galleryID: Int) = "https://hitomi.la/reader/$galleryID.html"
|
fun getReferer(galleryID: Int) = "https://hitomi.la/reader/$galleryID.html"
|
||||||
|
|
||||||
@@ -38,7 +39,7 @@ data class Reader(val code: Code, val title: String, val galleryInfo: List<Galle
|
|||||||
fun getReader(galleryID: Int) : Reader {
|
fun getReader(galleryID: Int) : Reader {
|
||||||
val readerUrl = "https://hitomi.la/reader/$galleryID.html"
|
val readerUrl = "https://hitomi.la/reader/$galleryID.html"
|
||||||
|
|
||||||
val doc = Jsoup.connect(readerUrl).get()
|
val doc = Jsoup.connect(readerUrl).proxy(proxy).get()
|
||||||
|
|
||||||
return Reader(Code.HITOMI, doc.title(), getGalleryInfo(galleryID))
|
return Reader(Code.HITOMI, doc.title(), getGalleryInfo(galleryID))
|
||||||
}
|
}
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package xyz.quaver.hitomi
|
package xyz.quaver.hitomi
|
||||||
|
|
||||||
|
import xyz.quaver.proxy
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
import java.nio.ByteBuffer
|
import java.nio.ByteBuffer
|
||||||
import java.nio.ByteOrder
|
import java.nio.ByteOrder
|
||||||
@@ -49,8 +50,9 @@ fun sanitize(input: String) : String {
|
|||||||
|
|
||||||
fun getIndexVersion(name: String) : String {
|
fun getIndexVersion(name: String) : String {
|
||||||
return try {
|
return try {
|
||||||
URL("$protocol//$domain/$name/version?_=${System.currentTimeMillis()}")
|
URL("$protocol//$domain/$name/version?_=${System.currentTimeMillis()}").openConnection(proxy).getInputStream().use {
|
||||||
.readText()
|
it.reader().readText()
|
||||||
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
""
|
""
|
||||||
}
|
}
|
||||||
@@ -167,13 +169,16 @@ fun getSuggestionsFromData(field: String, data: Pair<Long, Int>) : List<Suggesti
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun getGalleryIDsFromNozomi(area: String?, tag: String, language: String) : List<Int> {
|
fun getGalleryIDsFromNozomi(area: String?, tag: String, language: String) : List<Int> {
|
||||||
|
print("PUPILD: NOZOMI REQUEST: $area:$tag ($language)")
|
||||||
val nozomiAddress =
|
val nozomiAddress =
|
||||||
when(area) {
|
when(area) {
|
||||||
null -> "$protocol//$domain/$compressed_nozomi_prefix/$tag-$language$nozomiextension"
|
null -> "$protocol//$domain/$compressed_nozomi_prefix/$tag-$language$nozomiextension"
|
||||||
else -> "$protocol//$domain/$compressed_nozomi_prefix/$area/$tag-$language$nozomiextension"
|
else -> "$protocol//$domain/$compressed_nozomi_prefix/$area/$tag-$language$nozomiextension"
|
||||||
}
|
}
|
||||||
|
|
||||||
val bytes = URL(nozomiAddress).readBytes()
|
val bytes = URL(nozomiAddress).openConnection(proxy).getInputStream().use {
|
||||||
|
it.readBytes()
|
||||||
|
}
|
||||||
|
|
||||||
val nozomi = ArrayList<Int>()
|
val nozomi = ArrayList<Int>()
|
||||||
|
|
||||||
@@ -184,6 +189,7 @@ fun getGalleryIDsFromNozomi(area: String?, tag: String, language: String) : List
|
|||||||
while (arrayBuffer.hasRemaining())
|
while (arrayBuffer.hasRemaining())
|
||||||
nozomi.add(arrayBuffer.int)
|
nozomi.add(arrayBuffer.int)
|
||||||
|
|
||||||
|
print("PUPILD: NOZOMI REQUEST END: $area:$tag ($language)")
|
||||||
return nozomi
|
return nozomi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,7 +244,7 @@ fun getNodeAtAddress(field: String, address: Long) : Node? {
|
|||||||
|
|
||||||
fun getURLAtRange(url: String, range: LongRange) : ByteArray? {
|
fun getURLAtRange(url: String, range: LongRange) : ByteArray? {
|
||||||
try {
|
try {
|
||||||
with (URL(url).openConnection() as HttpsURLConnection) {
|
with (URL(url).openConnection(proxy) as HttpsURLConnection) {
|
||||||
requestMethod = "GET"
|
requestMethod = "GET"
|
||||||
|
|
||||||
setRequestProperty("Range", "bytes=${range.first}-${range.last}")
|
setRequestProperty("Range", "bytes=${range.first}-${range.last}")
|
||||||
|
|||||||
@@ -20,11 +20,12 @@ import org.jsoup.Jsoup
|
|||||||
import xyz.quaver.Code
|
import xyz.quaver.Code
|
||||||
import xyz.quaver.hitomi.GalleryBlock
|
import xyz.quaver.hitomi.GalleryBlock
|
||||||
import xyz.quaver.hitomi.protocol
|
import xyz.quaver.hitomi.protocol
|
||||||
|
import xyz.quaver.proxy
|
||||||
|
|
||||||
fun getGalleryBlock(galleryID: Int) : GalleryBlock? {
|
fun getGalleryBlock(galleryID: Int) : GalleryBlock? {
|
||||||
val url = "$protocol//$hiyobi/info/$galleryID"
|
val url = "$protocol//$hiyobi/info/$galleryID"
|
||||||
|
|
||||||
val doc = Jsoup.connect(url).get()
|
val doc = Jsoup.connect(url).proxy(proxy).get()
|
||||||
|
|
||||||
val galleryBlock = doc.selectFirst(".gallery-content")
|
val galleryBlock = doc.selectFirst(".gallery-content")
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import xyz.quaver.Code
|
|||||||
import xyz.quaver.hitomi.GalleryInfo
|
import xyz.quaver.hitomi.GalleryInfo
|
||||||
import xyz.quaver.hitomi.Reader
|
import xyz.quaver.hitomi.Reader
|
||||||
import xyz.quaver.hitomi.protocol
|
import xyz.quaver.hitomi.protocol
|
||||||
|
import xyz.quaver.proxy
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
import javax.net.ssl.HttpsURLConnection
|
import javax.net.ssl.HttpsURLConnection
|
||||||
|
|
||||||
@@ -48,7 +49,7 @@ fun renewCookie() : String {
|
|||||||
val url = "https://$hiyobi/"
|
val url = "https://$hiyobi/"
|
||||||
|
|
||||||
try {
|
try {
|
||||||
with(URL(url).openConnection() as HttpsURLConnection) {
|
with(URL(url).openConnection(proxy) as HttpsURLConnection) {
|
||||||
setRequestProperty("User-Agent", user_agent)
|
setRequestProperty("User-Agent", user_agent)
|
||||||
connectTimeout = 2000
|
connectTimeout = 2000
|
||||||
connect()
|
connect()
|
||||||
@@ -64,11 +65,11 @@ fun getReader(galleryID: Int) : Reader {
|
|||||||
val reader = "https://$hiyobi/reader/$galleryID"
|
val reader = "https://$hiyobi/reader/$galleryID"
|
||||||
val url = "https://$hiyobi/data/json/${galleryID}_list.json"
|
val url = "https://$hiyobi/data/json/${galleryID}_list.json"
|
||||||
|
|
||||||
val title = Jsoup.connect(reader).get().title()
|
val title = Jsoup.connect(reader).proxy(proxy).get().title()
|
||||||
|
|
||||||
val galleryInfo = Json.nonstrict.parse(
|
val galleryInfo = Json.nonstrict.parse(
|
||||||
GalleryInfo.serializer().list,
|
GalleryInfo.serializer().list,
|
||||||
with(URL(url).openConnection() as HttpsURLConnection) {
|
with(URL(url).openConnection(proxy) as HttpsURLConnection) {
|
||||||
setRequestProperty("User-Agent", user_agent)
|
setRequestProperty("User-Agent", user_agent)
|
||||||
setRequestProperty("Cookie", cookie)
|
setRequestProperty("Cookie", cookie)
|
||||||
connectTimeout = 2000
|
connectTimeout = 2000
|
||||||
|
|||||||
Reference in New Issue
Block a user