/* * Pupil, Hitomi.la viewer for Android * Copyright (C) 2019 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 . */ package xyz.quaver.pupil.util import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.os.Build import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.runBlocking import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import okhttp3.OkHttpClient import okhttp3.Request import xyz.quaver.Code import xyz.quaver.hitomi.GalleryBlock import xyz.quaver.hitomi.Reader import xyz.quaver.hitomi.getReferer import xyz.quaver.hitomi.imageUrlFromImage import xyz.quaver.hiyobi.cookie import xyz.quaver.hiyobi.createImgList import xyz.quaver.hiyobi.user_agent import xyz.quaver.pupil.util.downloader.Cache import xyz.quaver.pupil.util.downloader.Metadata import java.util.* import kotlin.collections.ArrayList @OptIn(ExperimentalStdlibApi::class) fun String.wordCapitalize() : String { val result = ArrayList() @SuppressLint("DefaultLocale") for (word in this.split(" ")) result.add(word.capitalize(Locale.US)) return result.joinToString(" ") } fun byteToString(byte: Long, precision : Int = 1) : String { val suffix = listOf( "B", "kB", "MB", "GB", "TB" //really? ) var size = byte.toDouble(); var suffixIndex = 0 while (size >= 1024) { size /= 1024 suffixIndex++ } return "%.${precision}f ${suffix[suffixIndex]}".format(size) } /** * Convert android generated ID to requestCode * to prevent java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCode * * https://stackoverflow.com/questions/38072322/generate-16-bit-unique-ids-in-android-for-startactivityforresult */ fun Int.normalizeID() = this.and(0xFFFF) fun OkHttpClient.Builder.proxyInfo(proxyInfo: ProxyInfo) = this.apply { proxy(proxyInfo.proxy()) proxyInfo.authenticator()?.let { proxyAuthenticator(it) } } val formatMap = mapOf (String)>( "-id-" to { id.toString() }, "-title-" to { title }, // TODO ) /** * Formats download folder name with given Metadata */ fun GalleryBlock.formatDownloadFolder(): String = Preferences["download_folder_format", "-id-"].let { formatMap.entries.fold(it) { str, (k, v) -> str.replace(k, v.invoke(this), true) } } fun Context.startForegroundServiceCompat(service: Intent) { if (Build.VERSION.SDK_INT >= 26) startForegroundService(service) else startService(service) } val Reader.requestBuilders: List get() { val galleryID = this.galleryInfo.id ?: 0 val lowQuality = Preferences["low_quality", true] return when(code) { Code.HITOMI -> { this.galleryInfo.files.map { Request.Builder() .url(imageUrlFromImage(galleryID, it, !lowQuality)) .header("Referer", getReferer(galleryID)) } } Code.HIYOBI -> { createImgList(galleryID, this, lowQuality).map { Request.Builder() .url(it.path) .header("User-Agent", user_agent) .header("Cookie", cookie) } } } } fun String.ellipsize(n: Int): String = if (this.length > n) this.slice(0 until n) + "…" else this