From 058d5905f06421c17202e0926447c6eb2a39d835 Mon Sep 17 00:00:00 2001 From: ObserverOfTime Date: Mon, 26 Nov 2018 16:15:14 +0200 Subject: [PATCH] Add Arc-Relight source (#636) [DNM] Add Arc-Relight source --- src/en/arcrelight/build.gradle | 15 ++ .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2198 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3033 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 4759 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 6737 bytes src/en/arcrelight/res/web_hi_res_512.png | Bin 0 -> 27391 bytes .../extension/en/arcrelight/ARFilters.kt | 64 ++++++++ .../extension/en/arcrelight/ARUtils.kt | 89 +++++++++++ .../extension/en/arcrelight/ArcRelight.kt | 149 ++++++++++++++++++ 10 files changed, 317 insertions(+) create mode 100644 src/en/arcrelight/build.gradle create mode 100644 src/en/arcrelight/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/arcrelight/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/arcrelight/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/arcrelight/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/arcrelight/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/arcrelight/res/web_hi_res_512.png create mode 100644 src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ARFilters.kt create mode 100644 src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ARUtils.kt create mode 100644 src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ArcRelight.kt diff --git a/src/en/arcrelight/build.gradle b/src/en/arcrelight/build.gradle new file mode 100644 index 000000000..8f14bbad3 --- /dev/null +++ b/src/en/arcrelight/build.gradle @@ -0,0 +1,15 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + appName = 'Tachiyomi: Arc-Relight' + pkgNameSuffix = 'en.arcrelight' + extClass = '.ArcRelight' + extVersionCode = 1 + extVersionSuffix = 1 + libVersion = '1.2' +} + +apply from: "$rootDir/common.gradle" + + diff --git a/src/en/arcrelight/res/mipmap-hdpi/ic_launcher.png b/src/en/arcrelight/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c754bc9ecd8848ac87a28ef0587ed79902e2f337 GIT binary patch literal 2198 zcmV;H2x<3;P){1QH^rf6*s^#?6DMvs=1s*-ilv`+q@7!Ys4S+q*Fjr=YQi45b>f+JBZ)1W)NE=0kl?hxcfsoX5$f1rt6wm zY6sDqRv8^;5dcaQ9c(`uw}6NT5kPO0XA@f^1C-HzEbalNmFGkb=s=q!?g6EicTSB2oN&>93OX<7Ak`{|ujZXy*?=C<7sJSK4+MijzI@g5zS_IZ>gn5< zL;cR<@VKdH3W&~1Kz}JyVCMo%M@RkD%>PFMHu#0n6cM1ujGAeW z{Yp+R9IcaJ+b-t#)?O8SA=|!k0M(yojT#;9gtscwu;U(Pzv8qqs(^@ySL#}1>^b>u)2;OlwqQ3XVFm#P*$wvjpKMEeQ>bflge zoQL7hr6Et*cT&Nr3&7tkil_r3YU$N8=lBOroM9FNKsV*~z@WQ`>6mxW47cWX)A}vy zY8V}AX6jpd)k^}%+`$4G9cqO;(X(O-=#M0+3l1?IlQyz(#?q-`gY|GPq~xE7I-tfL zJ?DEaz)!R#u?1x9n%ns2iiyE~=D4gzWmExuN6`c$z8c;{akttUJ3#kntmwvPIKzi; zNODdexLwDY<4Dd#a;Inkk~YYA=ZtvG_}#s+1GK+Z!RypZGX&rd>iB`20vQyIJf@IsM>p8rcliTLIsYw@rKey;=)(`S9aO?lfOOxeW*4b*qli zd#5zefj6r3=9QPZ2d24L%LwS1A`P!&s%9mVyuDhP2Z!*MU{e0UGER)>hRlXsIEZ!O zDs9gU%f8)s$6m{s2m-jTa@N}#hpTXECXET8;&x7O4me;(LBUl0!CDDi@|D76PZo_+ zqr)BWktc_9OW>Q)K$3V~_DJE9*92qs-@%oE_u=ADJ?_iFZ6jRm--hj}=;tx#^UNv& znZ0%u>tc5=_B~}CjQHyrgSz^)utDae^>0^aQDC1qUqHk5BPcUmwLO9c<v z#=3O6kAS!`m_d)dJSd^}Y~!{kP>;cw;}5uf9Jjk*-2N-9&&1Eqz^4dk-2N0j|I-Uw zsi%c5lnV~jNMn09zqg7XoL{$w#`|m59C`)GzE7Ml(rKT3zG~Y6AG`OU0RuQZtO(75 zK;EWaKy=xYO}*oiw}1}aar69 z;U!-Q^|mp`v$Q=rb76ZIJxVy(_cVLfILzUlhga_QuGCk?$K04%xDUB0lh2l@rYsDRC<89Q|1^=OeCv^nS#>BfH+Ln}7+95jB z1!9Q}D6G{iGOP}FL(-n2&cw|rDa6Kv?Wu_g5tVOlUyuK8LTy?9bm}Wff6Y^_`=`#Z z?jKtHx|g*1tTdd@nrZ6hbIek-iCfZV>^rf6*g|Zgw%vAb(qjJh!kUClTSd6N1@&#z zX4IXlT$?9sxjEtH?~AF8i!NKY-hke;5n&}`qc^Q;5gUjt#HJ-EYvM#g5sFZRvMS2| Y0BX5;-KNjL8~^|S07*qoM6N<$f^#HLTL1t6 literal 0 HcmV?d00001 diff --git a/src/en/arcrelight/res/mipmap-mdpi/ic_launcher.png b/src/en/arcrelight/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..356dff73f5dbf5714c7b901ada5d1d5169975189 GIT binary patch literal 1443 zcmV;U1zh@xP)+-p~Lb*m4 zaFV~1DmVC(Qo!+&?Bxka)*1Nx{O**1lz?Os@Z_&b*j*>1v8nRrg0`C~$Kd(;?x@&R z`#Wr`Fs`kDhbkvPZxMsfW2Nz97A0c@?&tc`$Ae(OYo zdl0-d#!OOppu(_-0Pm6*H7VeQhThc|(5@9lA>f7&+5}4q7&j~6Sf?-u5fq4pFlgBXep`>&51e}&J zWTZDm@CFa(f{lFlxJF=Stukf-7)RR$w2ewHUL64sq8J}HOX-2W6a+%1cf32qdx8}S zc&P!0rHk13-5NA2n)nMi(k7sjcgn7W%~d0${~ICWykQ1UnqMnhp!kq0Q%udyy zYbi`S<-sJ>-L+55*~;OT^(Xjy@@+)C8E#vO;g0Dz>HpJs6wQE<*a=5E(1vJ?uYh-3 zgu$&JdsmINd=-2rX#+0`rCZiB#A}$0-=%`NDK6?ehj5mVylpOkY1bc!`zNATKCKKneDkYpSL zpF;{hr-JkcV1!wF6a1xr4}54t#C>ud4?gRR@O-=kY^_m)6L~#A%1LHpKK`SjaflIH zsSMb@)6DeYSvn!)f!j46mbBZ@IIB{P=8Kr*)#5dtYg)8UI()5*)J53dftFUh#6}8u ztV#=qTf4z#*D$Noq!g`mgYg&8H^J<(MH0c1=LB5a>r6fLGkBAGwNVNlw?0e&w%yN@ z!=$yJaS*CT_crv!Pe6E`qa%C4a!ye{NSSpXml?S4Scia!2o(@04*Nl6U<$bjOFz7F zRS_QnWxX9}rLhyVsJoVZ48#?y&pk>uJfBAouk#oYeupGX0LFF{|F|#=gq|B6a0cK2 zzvsUT!1c)9dNDy(wK}G=EIwvFS0^EOym~mSKeASuKX&4RZXVb!b*N7XNC{YpfdBKK zyX#K!o=w^r$h(-cuz=u81J+mNTPTjvn>6GJtU#4$eH%Xdc1J*fIAgI_OdD9IrHv?z zfU2+tegIz+f%&n2(Zl+p>wN6r<-8+HPkZX+Y*u00HR^)OkCe|+C7PMQbuAGb^McyX zI@Qvew&TSd!flyvDp?5IGxof8AU*fUq4eDM8SGnSgpP&A&dAAq3v*f8`;j8DKU{}C xQ3x9o42p1B(TjJSEP2ZN5{d;AHr0}&{R{JO`>~72)lvWe002ovPDHLkV1jhbxPJfu literal 0 HcmV?d00001 diff --git a/src/en/arcrelight/res/mipmap-xhdpi/ic_launcher.png b/src/en/arcrelight/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..1a29ebb8f58b3ed1f812e2859963c5861fdf5951 GIT binary patch literal 3033 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 literal 0 HcmV?d00001 diff --git a/src/en/arcrelight/res/mipmap-xxhdpi/ic_launcher.png b/src/en/arcrelight/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d38ac11d30d2a1d16301da358998d10377bcebc4 GIT binary patch literal 4759 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 Cv<&tD literal 0 HcmV?d00001 diff --git a/src/en/arcrelight/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/arcrelight/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e8ae260540665795c0602d252d4dddb412d4e379 GIT binary patch literal 6737 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 literal 0 HcmV?d00001 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 new file mode 100644 index 000000000..0019a39a8 --- /dev/null +++ b/src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ARFilters.kt @@ -0,0 +1,64 @@ +package eu.kanade.tachiyomi.extension.en.arcrelight + +import eu.kanade.tachiyomi.source.model.Filter + +/** Array containing the possible statuses of a manga */ +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") +) + +/** + * Filter representing the status of a manga. + * + * @constructor Creates a [Filter.Select] object with [STATUSES]. + */ +class Status : Filter.Select("Status", STATUSES) { + /** Returns the [state] as a string. */ + fun string() = values[state].toLowerCase() +} + +/** + * Filter representing a manga category. + * + * @property name The display name of the category. + * @constructor Creates a [Filter.TriState] object using [name]. + */ +class Category(name: String) : Filter.TriState(name) { + /** Returns the [state] as a string, or null if [isIgnored]. */ + fun stringOpt() = when(state) { + STATE_INCLUDE -> name.toLowerCase() + STATE_EXCLUDE -> "-" + name.toLowerCase() + else -> null + } +} + +/** + * Filter representing the [categories][Category] of a manga. + * + * @constructor Creates a [Filter.Group] object with [CATEGORIES]. + */ +class CategoryList : Filter.Group("Categories", CATEGORIES) + +/** + * Filter representing the name of an author or artist. + * + * @constructor Creates a [Filter.Text] object. + */ +class Person : Filter.Text("Author/Artist") + 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 new file mode 100644 index 000000000..5d2fd887a --- /dev/null +++ b/src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ARUtils.kt @@ -0,0 +1,89 @@ +package eu.kanade.tachiyomi.extension.en.arcrelight + +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 + +/** + * The HTTP date format specified in + * [RFC 1123](https://tools.ietf.org/html/rfc1123#page-55). + */ +private const val HTTP_DATE = "EEE, dd MMM yyyy HH:mm:ss zzz" + +/** + * Converts a date in the [HTTP_DATE] format to a Unix timestamp. + * + * @param date The date to convert. + * @return The timestamp of the date. + */ +fun httpDateToTimestamp(date: String) = + SimpleDateFormat(HTTP_DATE, Locale.US).parse(date).time + +/** + * Joins each value of a given [field] of the array using [sep]. + * + * @param field + * When its type is [Int], it is treated as the index of a [JSONArray]. + * When its type is [String], it is treated as the key of a [JSONObject]. + * @param sep The separator used to join the array. + * @return The joined string, or null if the array is empty. + * @throws IllegalArgumentException when [field] is of an invalid type. + */ +fun JSONArray.joinField(field: Any, sep: String = ", "): String? { + if (!(field is Int || field is String)) + throw IllegalArgumentException("field must be a String or Int") + if (this.length() == 0) return null + val list = mutableListOf() + for (i in 0 until this.length()) { + when (field) { + is Int -> list.add(this.getJSONArray(i).getString(field)) + is String -> list.add(this.getJSONObject(i).getString(field)) + } + } + return list.joinToString(sep) +} + +/** + * Creates a [SManga] by parsing a [JSONObject]. + * + * @param obj The object containing the manga info. + */ +fun SManga.fromJSON(obj: JSONObject) { + url = obj.getString("url") + title = obj.getString("title") + description = obj.getString("description") + thumbnail_url = obj.getString("cover") + author = obj.getJSONArray("authors")?.joinField(0) + artist = obj.getJSONArray("artists")?.joinField(0) + genre = obj.getJSONArray("categories")?.joinField("name") + status = when (obj.getBoolean("completed")) { + true -> SManga.COMPLETED + false -> SManga.ONGOING + } +} + +/** + * Creates a [SChapter] by parsing a [JSONObject]. + * + * @param obj The object containing the chapter info. + */ +fun SChapter.fromJSON(obj: JSONObject) { + url = obj.getString("url") + chapter_number = obj.getString("chapter").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 - ") + 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 new file mode 100644 index 000000000..c3a924a0e --- /dev/null +++ b/src/en/arcrelight/src/eu/kanade/tachiyomi/extension/en/arcrelight/ArcRelight.kt @@ -0,0 +1,149 @@ +package eu.kanade.tachiyomi.extension.en.arcrelight + +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.online.HttpSource +import org.json.JSONArray +import org.json.JSONObject +import okhttp3.Headers +import okhttp3.Request +import okhttp3.Response + +/** Arc-Relight source */ +class ArcRelight : HttpSource() { + override val versionId = 1 + + override val name = "Arc-Relight" + + override val baseUrl = "https://arc-relight.site/api/v$versionId" + + override val lang = "en" + + override val supportsLatest = true + + /** + * A user agent representing Tachiyomi. + * Includes the user's Android version + * and the current extension version. + */ + private val userAgent = "Mozilla/5.0 (" + + "Android ${VERSION.RELEASE}; Mobile) " + + "Tachiyomi/${BuildConfig.VERSION_NAME}" + + override fun headersBuilder() = Headers.Builder().apply { + add("User-Agent", userAgent) + add("Referer", baseUrl) + } + + 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 mangaDetailsRequest(manga: SManga) = + GET("$baseUrl/series/${manga.url.split("/") + .last { it != "" }}/", headers) + + override fun chapterListRequest(manga: SManga) = + mangaDetailsRequest(manga) + + override fun searchMangaRequest(page: Int, query: String, + filters: FilterList): Request { + val uri = Uri.parse("$baseUrl/series/").buildUpon() + uri.appendQueryParameter("q", query) + val cat = mutableListOf() + filters.forEach { + 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()) + }) + } + } + return GET("$uri&categories=${cat.joinToString(",")}", headers) + } + + override fun latestUpdatesParse(response: Response): MangasPage { + val arr = JSONArray(response.body()!!.string()) + val ret = ArrayList(arr.length()) + 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") + }) + } + return MangasPage(ret, false) + } + + override fun chapterListParse(response: Response): List { + val res = JSONObject(response.body()!!.string()) + val volumes = res.getJSONObject("volumes") + val ret = mutableListOf() + 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) }) + } + } + return ret.sortedByDescending { it.name } + } + + 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()) + val url = obj.getString("url") + val root = obj.getString("pages_root") + val arr = obj.getJSONArray("pages_list") + val ret = mutableListOf() + for (i in 0 until arr.length()) { + ret.add(Page(i, "$url${i + 1}", root + arr.getString(i))) + } + return ret + } + + override fun searchMangaParse(response: Response): MangasPage { + val arr = JSONArray(response.body()!!.string()) + val ret = mutableListOf() + for (i in 0 until arr.length()) { + ret.add(SManga.create().apply { + fromJSON(arr.getJSONObject(i)) + }) + } + return MangasPage(ret.sortedBy { it.title }, false) + } + + override fun getFilterList() = FilterList( + Person(), Status(), CategoryList() + ) + + override fun fetchPopularManga(page: Int) = + fetchSearchManga(page, "", FilterList()) + + override fun popularMangaRequest(page: Int) = + throw UnsupportedOperationException( + "This method should not be called!") + + override fun popularMangaParse(response: Response) = + throw UnsupportedOperationException( + "This method should not be called!") + + override fun imageUrlParse(response: Response) = + throw UnsupportedOperationException( + "This method should not be called!") +} +