From 88bd8261687b0906f949cde0b164176e769cc8ca Mon Sep 17 00:00:00 2001 From: Patrick Geneva Date: Fri, 5 Mar 2021 22:02:50 -0500 Subject: [PATCH] Mango: Add first working version (#6034) * Add Mango extension first pass Has browse, chapters, and searching. The api endpoint is just the whole entire library, so searching is done locally. Requires login, so will need to view the webview first to login, then everything works as expected. https://github.com/hkalexling/Mango/ * Added automatic authentication * Sort based on time since there is no chapter number in the api. * Requested changes. --- src/all/mango/AndroidManifest.xml | 2 + src/all/mango/CHANGELOG.md | 7 + src/all/mango/build.gradle | 16 + src/all/mango/res/ic_launcher-web.png | Bin 0 -> 24846 bytes src/all/mango/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3284 bytes src/all/mango/res/mipmap-ldpi/ic_launcher.png | Bin 0 -> 1319 bytes src/all/mango/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1777 bytes .../mango/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3585 bytes .../mango/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7459 bytes .../mango/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9193 bytes .../tachiyomi/extension/all/mango/Mango.kt | 325 ++++++++++++++++++ 11 files changed, 350 insertions(+) create mode 100644 src/all/mango/AndroidManifest.xml create mode 100644 src/all/mango/CHANGELOG.md create mode 100644 src/all/mango/build.gradle create mode 100644 src/all/mango/res/ic_launcher-web.png create mode 100644 src/all/mango/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/all/mango/res/mipmap-ldpi/ic_launcher.png create mode 100644 src/all/mango/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/all/mango/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/all/mango/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/all/mango/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/all/mango/src/eu/kanade/tachiyomi/extension/all/mango/Mango.kt diff --git a/src/all/mango/AndroidManifest.xml b/src/all/mango/AndroidManifest.xml new file mode 100644 index 000000000..30deb7f79 --- /dev/null +++ b/src/all/mango/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/src/all/mango/CHANGELOG.md b/src/all/mango/CHANGELOG.md new file mode 100644 index 000000000..c6987889b --- /dev/null +++ b/src/all/mango/CHANGELOG.md @@ -0,0 +1,7 @@ + + +## 1.0.0 + +### Features + +* First version \ No newline at end of file diff --git a/src/all/mango/build.gradle b/src/all/mango/build.gradle new file mode 100644 index 000000000..4d3346927 --- /dev/null +++ b/src/all/mango/build.gradle @@ -0,0 +1,16 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + extName = 'Mango' + pkgNameSuffix = 'all.mango' + extClass = '.Mango' + extVersionCode = 1 + libVersion = '1.2' +} + +dependencies { + implementation 'info.debatty:java-string-similarity:2.0.0' +} + +apply from: "$rootDir/common.gradle" diff --git a/src/all/mango/res/ic_launcher-web.png b/src/all/mango/res/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..0123a0fbbe9c79cf64f53927563cefed0344518c GIT binary patch literal 24846 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 literal 0 HcmV?d00001 diff --git a/src/all/mango/res/mipmap-hdpi/ic_launcher.png b/src/all/mango/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..553da24a14619769dfe8452265a3928deb26ec72 GIT binary patch literal 3284 zcmV;_3@h`AP)ZoVhm-i@PweGqugg|R8f!MNADwZ)?YXEiU&K+lAVZk|n z{=9nr`RA$CYCUJMU?*d^7QG`dkclaw++KMB7~R{ zLYP`>gb?0Kd&=#R+g5o%TWrg+RxQi=*|B5C{yLFJeDKB_Z#d<0In=2}`zQeIIU3;f z>C^JrXP-T^d-v{tN+c2|fs7EM6FJ_?u)QcBN3U1d#hitil#4S5Z3Wz>eDXI$C;u0iDXx!KOGp*3IFQUHj~ z9fRUt%w%52x9Zq7B6CpKs(aIMRGi;V3_~>^y4HG86!W0MMr{z>?-cW4Ac}Py_3KJ8 zrBx^LhoP8B_*O?3#r(#EA!=l{;?%9cdr!4l<-(ndtToGgW!INT8dj(+5sZjGi+RVm z6!Ri2__>!9t2#Aa`RH|?oBtv2R&L>_W|z*WDAv_+PmY2Y&cV;Uq}b0_F7u=JUf|uz zE!LY=n##FZ*3h1p%gPiZf-)1+My@< zB*GX&Ja8EK@RyOhk0T0mAY>O^%FT6NT|CF)#u6a#Oxcy1#WJj(g<>2=_&3ag&Vj(1 z%%7}1$Hbe2g(+4xJXlb`<^SIlG0)L1?W(HBrlN;{MM+pzd4+yApE> zSBORl_0dIi`8N8or!fwH1CiO;(OIl7v(hNG>;TZPE3=ci+E0u9Omtx(k^^e>)6FI>d@gYQ6Q1`w>& zSE)H0oi=u)3VeP4DYA*|COg6g^qx|z+hGc-OE?$4jlT67y0I2oPj%$6408G)vTzWQ zDj>$vXjCiO)<49(`5(}%q85LFy7~i*-#LRwPctS>jP`7mG1Hvbd7RHpAB`2EaWFE9 zbwx#W3HQ=>QS&c#@=Py7<<6rRpZyzT;Zcy*-8`dRu&dzIao_t-aBbZA7m+hZVb2Nj zR-UwxqC}aeW}f8fhyI9ZYiiI{d?ZFjG5>W{S-}0@f5g4su)!*?Rx%r!i+gjjk-9ZoP_g_4^po{(_N0}_J%pIpgZkhcy7mHMe5U0PyNq_~ASA+UIY_U( z1?e4#{C_P56j@)CZn9!N4S=-Y3OPAimUH=FU|0StEehzi>Wz@BQ!M*%F1+%^({>~zcTf?*29s2@l{T#6|d{lPhCltXo+3=ETXh}`OU z+i^nBY`WN_Nl)$$t>nWh`!Jn2@Ej8Ltwt=0=|&0l;f2<+Ab>%WFk0Uoc`tecI<*Z4 zm6{o+crEJCgW*tW~+T7$#`2gyGA zMZ{QYOJ%|!7@A_*wb7LiBVVwkIwx>l15HO!EZbD;E|W+9oaC+}UC}V890$YCV$B+= zdZ(isHI)wHD1XjzTt&U%vba)*M3%x6e@5Z+e}#~;>wSJFgeByyBQAxvx2b3r+*ZND5Rhk5$Jw&LWae&`oLeUqIK0w(t0 zKKQ#NX2;3R{Rx?UUqB?%krW8Zoi$yLP7hPd41=f$>iY*Mn>u5ru%7%|lF3Po+$`RA z;$cgas8J1D#)RFEQ{w~?M<)uw{U8q=s`aHzzmGL{T;>ulaT2U}O}Fl7rhN zQ6b(hiHFI-&i0!nG;g6tza$=~LtCNF zpt)>YC>9pRVTE6q@%{9JI{xdyYhmsCk3&(c*J7|=0T(v1pSVKN8@;FzkDI82$NQ~N z^iLvTh{`vzQmHtOKdgQKwJ05>lw;d=NvV*pW7-JY zlU9JTZQHKZYQJ<{w;ZfF`qe0L=s8HCIEelrux-0isZ`$ATGyj=B4@E?vuQ6aExlQ* z)oz46_(>=f%jNPrOG``F>h*dptdG$8t7p$S?VYVw8|&-qYIb(ER4f+fCnqNl2_aHK z2ov8=gM*>ps}@p9b?F4@qm=5|ZkRlXE`aO0&c?<@WqEn|`h^P@{(fz3?flCxzr23s z%9T*gN6uoGFJG4P^YazMFfLxZcJ1%-`TVhTI{k=Y7?Yk;MQhm}`Um-*+^c%_<6f+} zwAR?RU8+{A@2#w?{JhagWpoD4}JwxDV%pK SlvZv40000e6bV!$ zA|X`RA+dl}vq$0&U;`^8gu3mP$Ew}H0;vV5RiCh^kXqF8NT8XtNjhnoNr%K9-@{@a zu|2lqNy{gVeCA%?bH4MqFDsxEFl<4G{zt+8P8vBib~0!uWOQ0t5sXkn(T==}L0b+e zz-}~7Pfv5|)T!}&K0l?kE-0m1w2MfXaH1?CHP4koM4Ea$&%0MDm42O>nOQh{_H5Jn zMuY&&+}zwmp-}k9vaGk2Qu#I`(H2Bx)p4BfW@l%=oSK@NYqZ;bk8-)(i>rzks17rXGAtq(V*&=-!J1p<^xxm}bLl!p zwh|IWE^@tT)Jamx{56&&Z+Z^r?_K8G*)yy<4+Dgv9DMwgZLGq^3Md=t9s)ZXc&Avo z%MZn$C|2%Lry6B4nNW*Szb9gl@;p+!f_LL<Nr zo1ksf$Po}j_2xIcKYE0&$#)se?TgSGNS%R{5t8)<%&jxXgFk~E&N}AaFR*ZhTCqy) zX{wMN0Bk09J%?Jlfs_}K+#YoA7-%bY2}wt&cnvdu5sVw`@HT6|s4>h7Z?uCGKygK_vMw_Gl4Px(Sm0 zyk?BBNe@=xg_gcFTSq*kHnVUmsmTCTHmf*&2k4r7HIYojENkxe(OZb|Fl+OvNO(qY zT|;Hl;EWt)_}Ir}3x^WN#LcqUlqsc9+O7|Vs%J1p5EKX)1S1-Qg{!)e-rZRHpJ(Ld z56BEZ(=-})M2SN3EK?fQGmJ4px#CiB6smU=oyno>EGpZF)isFjE6_c1kj$o3EMeg>^dsLE-1l<{%(A7WrR$xYoj+!?**CS;&BY{qFMks7Ja4^RE}t)zO4o@?*~yb9 z=T4kB@kM`s|5dH^UO$=bR@gSugNWd|?wysDm22nDox6=MWr43BfYDl$&*vE&9K^P5 zY}>~3JUTi$&{|WiRw4LR!%#~%Y)uTm-14==7-QDf)>vL%*2b8?!t5uM7VUhj((R6U d976vK{sVRzsW4ZL)QkWC002ovPDHLkV1f&FZ}b2F literal 0 HcmV?d00001 diff --git a/src/all/mango/res/mipmap-mdpi/ic_launcher.png b/src/all/mango/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..fd970f8cf4fce5763b6b761ec0cb8bd0b68f7954 GIT binary patch literal 1777 zcmVM+uOa}vz-LK(rR{Relzp^?RVxkv$Fy)`9DS+@+zWS?gf#ZB8~%3 zlwcJ64k$VaHx-b+=eUrbcEi#g!|#AhCX-A}O>yPQmEpm`!4cCm`-Kpp4QQ=*(|=@r z+qR2qYir9FE?ii-dGjWFhuNO=651nx zqW1{1C-98-ZmFa*5-P6)UW3OP`E`9n_o1bLcMkZ~=-Sy{ zLI^>zQR0tFeIzD`t$c6l!Oj)f zYq;9wZt)(kzxxxaZk?K2L+Qx(*HXaiz~0RP<)8|S2&W9fgw%dS=IKDw4ZFO2gqa33y1tI{)_2hl7f`pRkuQ9Q zY$AgpBg+ekJ@b#X~f7Ra`;n-{sT~YfNGRLNRSES z_(}A~rqJtooOgb~i{mGF?la%!%-D;_t;ri>A?t9U2L&{`x{CYHH=w%GvfZ{(=<*Wo z>O2Us8HJR+)u@5CHxS7za%2+h3Wx6emWe~>b{w~RRzO!)apqn}J-pXhrZqSC8Ct`ENjF8ST^%$qd@Cpob_FEB-g1-8;WQm)>tHkGUOgOB=4lO^^*4FC`Ouj;5=wK+ZxQML) zu7fH)2$VN+%qxxUC@M9Ff}LgHg>RCZdNqFi80$b2p-~8}z-@HM8FjAHuwANkmr~im zktv41_!1EAJ$Sb5k$Neg4(AZ9uTi4@Z8L-b`ZtpWN5#xS#^So@D) zW=2T#k0Q)uB%#(8Jm#5Hm;$Op0bwAklLmmw?}{*Tb~X zF+V})KQYd&u(tedLSM4O%aqA`u!2tfxwkmNcxVQ4<*;M3v;BoNOcU) z82yJKbQ2gA>$}z4O?j{Adj1phkSTQekBZ}aamLiM0^RK6klO2mvEJrD2)xdD7qcMe z{r9^aQXLKi#o?&c)@#!ZyNyCYb{#{gUaxPsu3LF* zi;H)!UAyLVv>)Jv0vZ8Dh*l}ZK6ve0__C^;wq`2Xwn z0;Lp{N`=M6Me6l>piPhifo&1~r~Qc{Q~?j7&YYg86G7yp?}E-hH&5hGP7wYJQe(Je T3T9W&00000NkvXXu0mjfc#Luu literal 0 HcmV?d00001 diff --git a/src/all/mango/res/mipmap-xhdpi/ic_launcher.png b/src/all/mango/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8600237ec3b7624453f6e2cbc288adfe1686584f GIT binary patch literal 3585 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 literal 0 HcmV?d00001 diff --git a/src/all/mango/res/mipmap-xxxhdpi/ic_launcher.png b/src/all/mango/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..307f16eca5e20baf1203d251d2d7507e1e8b1f41 GIT binary patch literal 9193 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 N3nfh$O7V5*{{i!-(response.body()!!.string()) + } catch (e: JsonSyntaxException) { + apiCookies = "" + throw Exception("Login Likely Failed. Try Refreshing.") + } + val mangas = result["titles"].asJsonArray + return MangasPage( + mangas.asJsonArray.map { + SManga.create().apply { + url = "/book/" + it["id"].asString + title = it["display_name"].asString + thumbnail_url = baseUrl + it["cover_url"].asString + } + }, + false + ) + } + + override fun latestUpdatesRequest(page: Int): Request = + throw UnsupportedOperationException("Not used") + + override fun latestUpdatesParse(response: Response): MangasPage = + throw UnsupportedOperationException("Not used") + + // Default is to just return the whole library for searching + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = popularMangaRequest(1) + + // Overridden fetch so that we use our overloaded method instead + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + return client.newCall(searchMangaRequest(page, query, filters)) + .asObservableSuccess() + .map { response -> + searchMangaParse(response, query) + } + } + + // Here the best we can do is just match manga based on their titles + private fun searchMangaParse(response: Response, query: String): MangasPage { + + val queryLower = query.toLowerCase() + val mangas = popularMangaParse(response).mangas + val exactMatch = mangas.firstOrNull { it.title.toLowerCase() == queryLower } + if (exactMatch != null) { + return MangasPage(listOf(exactMatch), false) + } + + // Text distance algorithms + val textDistance = Levenshtein() + val textDistance2 = JaroWinkler() + + // Take results that potentially start the same + val results = mangas.filter { + val title = it.title.toLowerCase() + val query2 = queryLower.take(7) + (title.startsWith(query2, true) || title.contains(query2, true)) + }.sortedBy { textDistance.distance(queryLower, it.title.toLowerCase()) } + + // Take similar results + val results2 = mangas.map { Pair(textDistance2.distance(it.title.toLowerCase(), query), it) } + .filter { it.first < 0.3 }.sortedBy { it.first }.map { it.second } + val combinedResults = results.union(results2) + + // Finally return the list + return MangasPage(combinedResults.toList(), false) + } + + // Stub + override fun searchMangaParse(response: Response): MangasPage = + throw UnsupportedOperationException("Not used") + + override fun mangaDetailsRequest(manga: SManga): Request = + GET(baseUrl + "/api" + manga.url, headers) + + // This will just return the same thing as the main library endpoint + override fun mangaDetailsParse(response: Response): SManga { + val result = try { + gson.fromJson(response.body()!!.string()) + } catch (e: JsonSyntaxException) { + apiCookies = "" + throw Exception("Login Likely Failed. Try Refreshing.") + } + return SManga.create().apply { + url = "/book/" + result["id"].asString + title = result["display_name"].asString + thumbnail_url = baseUrl + result["cover_url"].asString + } + } + + override fun chapterListRequest(manga: SManga): Request = + GET(baseUrl + "/api" + manga.url, headers) + + // The chapter url will contain how many pages the chapter contains for our page list endpoint + override fun chapterListParse(response: Response): List { + val result = try { + gson.fromJson(response.body()!!.string()) + } catch (e: JsonSyntaxException) { + apiCookies = "" + throw Exception("Login Likely Failed. Try Refreshing.") + } + return result["entries"].asJsonArray.map { obj -> + SChapter.create().apply { + name = obj["display_name"].asString + url = "/page/${obj["title_id"].asString}/${obj["id"].asString}/${obj["pages"].asString}/" + date_upload = 1000L * obj["mtime"].asLong + } + }.sortedByDescending { it.date_upload } + } + + // Stub + override fun pageListRequest(chapter: SChapter): Request = + throw UnsupportedOperationException("Not used") + + // Overridden fetch so that we use our overloaded method instead + override fun fetchPageList(chapter: SChapter): Observable> { + val splitUrl = chapter.url.split("/").toMutableList() + val numPages = splitUrl.removeAt(splitUrl.size - 2).toInt() + val baseUrlChapter = splitUrl.joinToString("/") + val pages = mutableListOf() + for (i in 0..numPages) { + pages.add( + Page( + index = i, + imageUrl = "$baseUrl/api$baseUrlChapter$i" + ) + ) + } + return Observable.just(pages) + } + + // Stub + override fun pageListParse(response: Response): List = + throw UnsupportedOperationException("Not used") + + override fun imageUrlParse(response: Response): String = "" + override fun getFilterList(): FilterList = FilterList() + + override val name = "Mango" + override val lang = "en" + override val supportsLatest = false + + override val baseUrl by lazy { getPrefBaseUrl() } + private val username by lazy { getPrefUsername() } + private val password by lazy { getPrefPassword() } + private val gson by lazy { Gson() } + private var apiCookies: String = "" + + override fun headersBuilder(): Headers.Builder = + Headers.Builder() + .add("User-Agent", "Tachiyomi Mango v${BuildConfig.VERSION_NAME}") + + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + override val client: OkHttpClient = + network.client.newBuilder() + .addInterceptor { authIntercept(it) } + .build() + + private fun authIntercept(chain: Interceptor.Chain): Response { + + // Check that we have our username and password to login with + val request = chain.request() + if (username.isEmpty() || password.isEmpty()) { + throw IOException("Missing username or password") + } + + // Do the login if we have not gotten the cookies yet + if (apiCookies.isEmpty() || !apiCookies.contains("mango-sessid-9000", true)) { + doLogin(chain) + } + + // Append the new cookie from the api + val authRequest = request.newBuilder() + .addHeader("Cookie", apiCookies) + .build() + + return chain.proceed(authRequest) + } + + private fun doLogin(chain: Interceptor.Chain) { + // Try to login + val formHeaders: Headers = headersBuilder() + .add("ContentType", "application/x-www-form-urlencoded") + .build() + val formBody: RequestBody = FormBody.Builder() + .addEncoded("username", username) + .addEncoded("password", password) + .build() + val loginRequest = POST("$baseUrl/login", formHeaders, formBody) + val response = chain.proceed(loginRequest) + if (response.code() != 200 || response.header("Set-Cookie") == null) { + throw Exception("Login Failed. Check Address and Credentials") + } + // Save the cookies from the response + apiCookies = response.header("Set-Cookie")!! + response.close() + } + + override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) { + screen.addPreference(screen.editTextPreference(ADDRESS_TITLE, ADDRESS_DEFAULT, baseUrl)) + screen.addPreference(screen.editTextPreference(USERNAME_TITLE, USERNAME_DEFAULT, username)) + screen.addPreference(screen.editTextPreference(PASSWORD_TITLE, PASSWORD_DEFAULT, password, true)) + } + + private fun androidx.preference.PreferenceScreen.editTextPreference(title: String, default: String, value: String, isPassword: Boolean = false): androidx.preference.EditTextPreference { + return androidx.preference.EditTextPreference(context).apply { + key = title + this.title = title + summary = value + this.setDefaultValue(default) + dialogTitle = title + + if (isPassword) { + setOnBindEditTextListener { + it.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD + } + } + setOnPreferenceChangeListener { _, newValue -> + try { + val res = preferences.edit().putString(title, newValue as String).commit() + Toast.makeText(context, "Restart Tachiyomi to apply new setting.", Toast.LENGTH_LONG).show() + apiCookies = "" + res + } catch (e: Exception) { + e.printStackTrace() + false + } + } + } + } + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + screen.addPreference(screen.supportEditTextPreference(ADDRESS_TITLE, ADDRESS_DEFAULT, baseUrl)) + screen.addPreference(screen.supportEditTextPreference(USERNAME_TITLE, USERNAME_DEFAULT, username)) + screen.addPreference(screen.supportEditTextPreference(PASSWORD_TITLE, PASSWORD_DEFAULT, password)) + } + + private fun PreferenceScreen.supportEditTextPreference(title: String, default: String, value: String): EditTextPreference { + return EditTextPreference(context).apply { + key = title + this.title = title + summary = value + this.setDefaultValue(default) + dialogTitle = title + setOnPreferenceChangeListener { _, newValue -> + try { + val res = preferences.edit().putString(title, newValue as String).commit() + Toast.makeText(context, "Restart Tachiyomi to apply new setting.", Toast.LENGTH_LONG).show() + apiCookies = "" + res + } catch (e: Exception) { + e.printStackTrace() + false + } + } + } + } + + // We strip the last slash since we will append it above + private fun getPrefBaseUrl(): String { + var path = preferences.getString(ADDRESS_TITLE, ADDRESS_DEFAULT)!! + if (path.last() == '/') { + path = path.substring(0, path.length - 1) + } + return path + } + private fun getPrefUsername(): String = preferences.getString(USERNAME_TITLE, USERNAME_DEFAULT)!! + private fun getPrefPassword(): String = preferences.getString(PASSWORD_TITLE, PASSWORD_DEFAULT)!! + + companion object { + private const val ADDRESS_TITLE = "Address" + private const val ADDRESS_DEFAULT = "" + private const val USERNAME_TITLE = "Username" + private const val USERNAME_DEFAULT = "" + private const val PASSWORD_TITLE = "Password" + private const val PASSWORD_DEFAULT = "" + } +}