From 1a0e173779edac5f05b9fdf4e1ac03e06279f7d9 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Mon, 28 Jan 2019 00:23:46 +0000 Subject: [PATCH] Update Arc-Relight extension (#746) Update Arc-Relight extension --- src/en/arcrelight/build.gradle | 3 +- .../extension/en/arcrelight/ARFilters.kt | 31 +++---- .../extension/en/arcrelight/ARUtils.kt | 9 +- .../extension/en/arcrelight/ArcRelight.kt | 82 ++++++++++++------- 4 files changed, 71 insertions(+), 54 deletions(-) diff --git a/src/en/arcrelight/build.gradle b/src/en/arcrelight/build.gradle index 8f14bbad3..53cb67c69 100644 --- a/src/en/arcrelight/build.gradle +++ b/src/en/arcrelight/build.gradle @@ -5,8 +5,7 @@ ext { appName = 'Tachiyomi: Arc-Relight' pkgNameSuffix = 'en.arcrelight' extClass = '.ArcRelight' - extVersionCode = 1 - extVersionSuffix = 1 + extVersionCode = 2 libVersion = '1.2' } diff --git a/src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ARFilters.kt b/src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ARFilters.kt index 0019a39a8..01c8d6df0 100644 --- a/src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ARFilters.kt +++ b/src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ARFilters.kt @@ -7,20 +7,21 @@ private val STATUSES = arrayOf("Any", "Completed", "Ongoing") /** List containing the possible categories of a manga */ private val CATEGORIES = listOf( - Category("4-Koma"), - Category("Chaos;Head"), - Category("Comedy"), - Category("Drama"), - Category("Mystery"), - Category("Psychological"), - Category("Robotics;Notes"), - Category("Romance"), - Category("Sci-Fi"), - Category("Seinen"), - Category("Shounen"), - Category("Steins;Gate"), - Category("Supernatural"), - Category("Tragedy") + Category("4-Koma"), + Category("Chaos;Head"), + Category("Collection"), + Category("Comedy"), + Category("Drama"), + Category("Mystery"), + Category("Psychological"), + Category("Robotics;Notes"), + Category("Romance"), + Category("Sci-Fi"), + Category("Seinen"), + Category("Shounen"), + Category("Steins;Gate"), + Category("Supernatural"), + Category("Tragedy") ) /** @@ -41,7 +42,7 @@ class Status : Filter.Select("Status", STATUSES) { */ class Category(name: String) : Filter.TriState(name) { /** Returns the [state] as a string, or null if [isIgnored]. */ - fun stringOpt() = when(state) { + fun optString() = when (state) { STATE_INCLUDE -> name.toLowerCase() STATE_EXCLUDE -> "-" + name.toLowerCase() else -> null diff --git a/src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ARUtils.kt b/src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ARUtils.kt index 5d2fd887a..a68f2f769 100644 --- a/src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ARUtils.kt +++ b/src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ARUtils.kt @@ -4,7 +4,6 @@ import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import org.json.JSONArray import org.json.JSONObject -import java.lang.IllegalArgumentException import java.text.DecimalFormat import java.text.SimpleDateFormat import java.util.Locale @@ -74,14 +73,12 @@ fun SManga.fromJSON(obj: JSONObject) { */ fun SChapter.fromJSON(obj: JSONObject) { url = obj.getString("url") - chapter_number = obj.getString("chapter").toFloat() + chapter_number = obj.optString("chapter", "0").toFloat() date_upload = httpDateToTimestamp(obj.getString("date")) scanlator = obj.getJSONArray("groups")?.joinField("name", " & ") - val vol = obj.getString("volume") - val ch = DecimalFormat("0.#").format(chapter_number) name = buildString { - if (vol != "0") append("Vol.$vol ") - append("Ch.$ch - ") + obj.optInt("volume").let { if (it != 0) append("Vol.$it ") } + append("Ch.${DecimalFormat("#.#").format(chapter_number)} - ") append(obj.getString("title")) if (obj.getBoolean("final")) append(" [END]") } diff --git a/src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ArcRelight.kt b/src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ArcRelight.kt index c3a924a0e..21d225d1b 100644 --- a/src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ArcRelight.kt +++ b/src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ArcRelight.kt @@ -4,13 +4,17 @@ import android.net.Uri import android.os.Build.VERSION import eu.kanade.tachiyomi.extension.BuildConfig import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.source.model.* +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.MangasPage +import eu.kanade.tachiyomi.source.model.Page +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.HttpSource -import org.json.JSONArray -import org.json.JSONObject import okhttp3.Headers import okhttp3.Request import okhttp3.Response +import org.json.JSONArray +import org.json.JSONObject /** Arc-Relight source */ class ArcRelight : HttpSource() { @@ -29,8 +33,8 @@ class ArcRelight : HttpSource() { * Includes the user's Android version * and the current extension version. */ - private val userAgent = "Mozilla/5.0 (" + - "Android ${VERSION.RELEASE}; Mobile) " + + private val userAgent = "Mozilla/5.0 " + + "(Android ${VERSION.RELEASE}; Mobile) " + "Tachiyomi/${BuildConfig.VERSION_NAME}" override fun headersBuilder() = Headers.Builder().apply { @@ -38,19 +42,28 @@ class ArcRelight : HttpSource() { add("Referer", baseUrl) } - override fun latestUpdatesRequest(page: Int) = - GET("$baseUrl/releases/", headers) + override fun latestUpdatesRequest(page: Int) = GET( + "$baseUrl/releases/", headers + ) - override fun pageListRequest(chapter: SChapter) = - GET(Uri.parse(chapter.url).path.replace( - "/reader/", "$baseUrl/series/"), headers) + override fun pageListRequest(chapter: SChapter) = GET( + "$baseUrl/series/${chapter.url.substringAfter("/reader/")}", headers + ) - override fun mangaDetailsRequest(manga: SManga) = - GET("$baseUrl/series/${manga.url.split("/") - .last { it != "" }}/", headers) + override fun chapterListRequest(manga: SManga) = GET( + "$baseUrl/series/${Uri.parse(manga.url).lastPathSegment}/", headers + ) - override fun chapterListRequest(manga: SManga) = - mangaDetailsRequest(manga) + override fun mangaDetailsRequest(manga: SManga): Request { + // Workaround to get the proper URL in openInBrowser + val method = Thread.currentThread() + .stackTrace.getOrNull(2)?.methodName ?: "" + return if (method == "openInBrowser") { + GET(manga.url, headers) + } else { + chapterListRequest(manga) + } + } override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { @@ -61,8 +74,8 @@ class ArcRelight : HttpSource() { when (it) { is Person -> uri.appendQueryParameter("author", it.state) is Status -> uri.appendQueryParameter("status", it.string()) - is CategoryList -> cat.addAll(it.state.mapNotNull { - c -> Uri.encode(c.stringOpt()) + is CategoryList -> cat.addAll(it.state.mapNotNull { c -> + Uri.encode(c.optString()) }) } } @@ -71,16 +84,20 @@ class ArcRelight : HttpSource() { override fun latestUpdatesParse(response: Response): MangasPage { val arr = JSONArray(response.body()!!.string()) - val ret = ArrayList(arr.length()) + val ret = mutableListOf() for (i in 0 until arr.length()) { val obj = arr.getJSONObject(i) ret.add(SManga.create().apply { url = obj.getString("url") title = obj.getString("title") thumbnail_url = obj.getString("cover") + // A bit of a hack to sort by date + description = httpDateToTimestamp( + obj.getJSONObject("latest_chapter").getString("date") + ).toString() }) } - return MangasPage(ret, false) + return MangasPage(ret.sortedByDescending { it.description }, false) } override fun chapterListParse(response: Response): List { @@ -90,19 +107,19 @@ class ArcRelight : HttpSource() { volumes.keys().forEach { vol -> val chapters = volumes.getJSONObject(vol) chapters.keys().forEach { ch -> - val obj = chapters.getJSONObject(ch) - obj.put("chapter", ch) - obj.put("volume", vol) - ret.add(SChapter.create().apply { fromJSON(obj) }) + ret.add(SChapter.create().apply { + fromJSON(chapters.getJSONObject(ch).also { + it.put("volume", vol) + it.put("chapter", ch) + }) + }) } } return ret.sortedByDescending { it.name } } - override fun mangaDetailsParse(response: Response) = - SManga.create().apply { - fromJSON(JSONObject(response.body()!!.string())) - } + override fun mangaDetailsParse(response: Response) = SManga.create() + .apply { fromJSON(JSONObject(response.body()!!.string())) } override fun pageListParse(response: Response): List { val obj = JSONObject(response.body()!!.string()) @@ -128,7 +145,7 @@ class ArcRelight : HttpSource() { } override fun getFilterList() = FilterList( - Person(), Status(), CategoryList() + Person(), Status(), CategoryList() ) override fun fetchPopularManga(page: Int) = @@ -136,14 +153,17 @@ class ArcRelight : HttpSource() { override fun popularMangaRequest(page: Int) = throw UnsupportedOperationException( - "This method should not be called!") + "This method should not be called!" + ) override fun popularMangaParse(response: Response) = throw UnsupportedOperationException( - "This method should not be called!") + "This method should not be called!" + ) override fun imageUrlParse(response: Response) = throw UnsupportedOperationException( - "This method should not be called!") + "This method should not be called!" + ) }