diff --git a/src/pt/unionmangas/build.gradle b/src/pt/unionmangas/build.gradle index bf9cb0692..9299e40ee 100644 --- a/src/pt/unionmangas/build.gradle +++ b/src/pt/unionmangas/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: Union Mangás' pkgNameSuffix = 'pt.unionmangas' extClass = '.UnionMangas' - extVersionCode = 13 + extVersionCode = 14 libVersion = '1.2' } diff --git a/src/pt/unionmangas/src/eu/kanade/tachiyomi/extension/pt/unionmangas/UnionMangas.kt b/src/pt/unionmangas/src/eu/kanade/tachiyomi/extension/pt/unionmangas/UnionMangas.kt index b16662e66..0aa60b608 100644 --- a/src/pt/unionmangas/src/eu/kanade/tachiyomi/extension/pt/unionmangas/UnionMangas.kt +++ b/src/pt/unionmangas/src/eu/kanade/tachiyomi/extension/pt/unionmangas/UnionMangas.kt @@ -7,7 +7,6 @@ import com.google.gson.JsonObject import com.google.gson.JsonParser import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST -import eu.kanade.tachiyomi.network.asObservableSuccess import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.MangasPage import eu.kanade.tachiyomi.source.model.Page @@ -26,7 +25,6 @@ import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element -import rx.Observable class UnionMangas : ParsedHttpSource() { @@ -52,7 +50,7 @@ class UnionMangas : ParsedHttpSource() { override fun headersBuilder(): Headers.Builder = Headers.Builder() .add("User-Agent", USER_AGENT) .add("Origin", baseUrl) - .add("Referer", "$baseUrl/xz") + .add("Referer", "$baseUrl/xw") override fun popularMangaRequest(page: Int): Request { val newHeaders = headersBuilder() @@ -100,6 +98,11 @@ class UnionMangas : ParsedHttpSource() { override fun latestUpdatesNextPageSelector() = "div#linha-botao-mais" override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + if (query.startsWith(PREFIX_ID_SEARCH)) { + val id = query.removePrefix(PREFIX_ID_SEARCH) + return GET("$baseUrl/perfil-manga/$id", headers) + } + val newHeaders = headersBuilder() .add("X-Requested-With", "XMLHttpRequest") .build() @@ -111,6 +114,15 @@ class UnionMangas : ParsedHttpSource() { } override fun searchMangaParse(response: Response): MangasPage { + val requestUrl = response.request().url().toString() + + if (requestUrl.contains("perfil-manga")) { + val id = requestUrl.substringAfter("perfil-manga/") + val manga = mangaDetailsParse(response) + .apply { url = "/perfil-manga/$id" } + return MangasPage(listOf(manga), false) + } + val result = response.asJsonObject() val mangas = result["items"].array @@ -155,13 +167,17 @@ class UnionMangas : ParsedHttpSource() { override fun chapterListSelector() = "div.row.lancamento-linha" override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply { - val firstColumn = element.select("div.col-md-6:eq(0)") - val secondColumn = element.select("div.col-md-6:eq(1)") + val firstColumn = element.select("div.col-md-6:eq(0)").first()!! + val secondColumn = element.select("div.col-md-6:eq(1)").first() name = firstColumn.select("a").first().text() - scanlator = secondColumn?.text() + scanlator = secondColumn?.select("a")?.joinToString { it.text() } date_upload = DATE_FORMATTER.tryParseTime(firstColumn.select("span").last()!!.text()) - setUrlWithoutDomain(firstColumn.select("a").first().attr("href")) + + // For some reason, setUrlWithoutDomain does not work when the url have spaces. + val absoluteUrlFixed = firstColumn.select("a").first().attr("href") + .replace(" ", "%20") + setUrlWithoutDomain(absoluteUrlFixed) } override fun pageListParse(document: Document): List<Page> { @@ -186,25 +202,6 @@ class UnionMangas : ParsedHttpSource() { override fun searchMangaNextPageSelector() = throw Exception("This method should not be called!") - private fun searchMangaByIdRequest(id: String) = GET("$baseUrl/perfil-manga/$id", headers) - - private fun searchMangaByIdParse(response: Response, id: String): MangasPage { - val details = mangaDetailsParse(response) - details.url = "/perfil-manga/$id" - return MangasPage(listOf(details), false) - } - - override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> { - return if (query.startsWith(PREFIX_ID_SEARCH)) { - val id = query.removePrefix(PREFIX_ID_SEARCH) - client.newCall(searchMangaByIdRequest(id)) - .asObservableSuccess() - .map { response -> searchMangaByIdParse(response, id) } - } else { - super.fetchSearchManga(page, query, filters) - } - } - private fun SimpleDateFormat.tryParseTime(date: String): Long { return try { parse(date).time @@ -213,19 +210,21 @@ class UnionMangas : ParsedHttpSource() { } } - private fun String.withoutLanguage(): String = replace("(Pt-Br)", "", true).trim() + private fun String.withoutLanguage(): String = replace(LANGUAGE_REGEX, "").trim() private fun Element.textWithoutLabel(): String = text()!!.substringAfter(":").trim() private fun Response.asJsonObject(): JsonObject = JSON_PARSER.parse(body()!!.string()).obj companion object { - private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36" + private const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" private val JSON_PARSER by lazy { JsonParser() } - const val PREFIX_ID_SEARCH = "id:" - private val DATE_FORMATTER by lazy { SimpleDateFormat("(dd/MM/yyyy)", Locale.ENGLISH) } + + private val LANGUAGE_REGEX = "\\(Pt-Br\\)".toRegex(RegexOption.IGNORE_CASE) + + const val PREFIX_ID_SEARCH = "id:" } } diff --git a/src/pt/unionmangas/src/eu/kanade/tachiyomi/extension/pt/unionmangas/UnionMangasUrlActivity.kt b/src/pt/unionmangas/src/eu/kanade/tachiyomi/extension/pt/unionmangas/UnionMangasUrlActivity.kt index 4c5cd93ca..eaaefb47f 100644 --- a/src/pt/unionmangas/src/eu/kanade/tachiyomi/extension/pt/unionmangas/UnionMangasUrlActivity.kt +++ b/src/pt/unionmangas/src/eu/kanade/tachiyomi/extension/pt/unionmangas/UnionMangasUrlActivity.kt @@ -8,8 +8,8 @@ import android.util.Log import kotlin.system.exitProcess /** - * Springboard that accepts https://unionleitor.top/perfil-manga/xxxxxx intents and redirects them to - * the main Tachiyomi process. + * Springboard that accepts https://unionleitor.top/perfil-manga/xxxxxx intents + * and redirects them to the main Tachiyomi process. */ class UnionMangasUrlActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) {