From 3968208d9cec956ed301e6a1606f68a60893bbb8 Mon Sep 17 00:00:00 2001 From: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com> Date: Wed, 22 Oct 2025 10:28:49 +0500 Subject: [PATCH] add Mangataro (#11177) * Mangataro * Refactor: Simplify search payload creation - Use a custom serializer for search filter parameters. - Remove redundant `.toJsonString()` calls for each filter. - Update filter classes to use appropriate data types (Int, Int?, String?) instead of just Strings, improving type safety. - Change `firstInstanceOrNull` to `firstInstance` for non-nullable filters. * Refactor: Move deeplink handler Move the deeplink handler function to a more logical position after the search parsing logic. * MangaTaro: Implement new search method - Add a new text search method that uses a different API endpoint. This provides more relevant results but ignores filters. - Add a filter option to toggle between the new search and the old filter-based search. - Exclude novels from appearing in search results and manga details. --- src/en/mangataro/AndroidManifest.xml | 21 ++ src/en/mangataro/build.gradle | 8 + .../mangataro/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 5314 bytes .../mangataro/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2850 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 7630 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 14944 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 23918 bytes .../tachiyomi/extension/en/mangataro/Dto.kt | 106 ++++++ .../extension/en/mangataro/Filters.kt | 320 ++++++++++++++++++ .../extension/en/mangataro/MangaTaro.kt | 318 +++++++++++++++++ .../extension/en/mangataro/UrlActivity.kt | 29 ++ 11 files changed, 802 insertions(+) create mode 100644 src/en/mangataro/AndroidManifest.xml create mode 100644 src/en/mangataro/build.gradle create mode 100644 src/en/mangataro/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/mangataro/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/mangataro/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/mangataro/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/mangataro/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/mangataro/src/eu/kanade/tachiyomi/extension/en/mangataro/Dto.kt create mode 100644 src/en/mangataro/src/eu/kanade/tachiyomi/extension/en/mangataro/Filters.kt create mode 100644 src/en/mangataro/src/eu/kanade/tachiyomi/extension/en/mangataro/MangaTaro.kt create mode 100644 src/en/mangataro/src/eu/kanade/tachiyomi/extension/en/mangataro/UrlActivity.kt diff --git a/src/en/mangataro/AndroidManifest.xml b/src/en/mangataro/AndroidManifest.xml new file mode 100644 index 000000000..0f848b795 --- /dev/null +++ b/src/en/mangataro/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + diff --git a/src/en/mangataro/build.gradle b/src/en/mangataro/build.gradle new file mode 100644 index 000000000..ac31aebf3 --- /dev/null +++ b/src/en/mangataro/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'MangaTaro' + extClass = '.MangaTaro' + extVersionCode = 1 + isNsfw = false +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/mangataro/res/mipmap-hdpi/ic_launcher.png b/src/en/mangataro/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..fadc812171c49fdcb40c52600567f7d77b50e5c0 GIT binary patch literal 5314 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 literal 0 HcmV?d00001 diff --git a/src/en/mangataro/res/mipmap-xxhdpi/ic_launcher.png b/src/en/mangataro/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..e661ca391c5343d0a54a845995e98bebea111a04 GIT binary patch literal 14944 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 literal 0 HcmV?d00001 diff --git a/src/en/mangataro/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/mangataro/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..439ac0b7500bcd6565007289f72aff0ce7686b80 GIT binary patch literal 23918 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, + @Serializable(with = StringifiedListSerializer::class) + private val genres: List, + @Serializable(with = StringifiedListSerializer::class) + private val types: List, + @Serializable(with = StringifiedListSerializer::class) + private val statuses: List, + private val sort: String, + private val genreMatchMode: String, +) + +class StringifiedListSerializer(elementSerializer: KSerializer) : + JsonTransformingSerializer>(ListSerializer(elementSerializer)) { + + override fun transformSerialize(element: JsonElement) = + JsonPrimitive(element.toJsonString()) +} + +@Serializable +@Suppress("unused") +class SearchQueryPayload( + val limit: Int, + val query: String, +) + +@Serializable +class SearchQueryResponse( + val results: List, +) { + @Serializable + class Manga( + val id: Int, + val slug: String, + val title: String, + val thumbnail: String, + val type: String, + val description: String, + val status: String, + ) +} + +@Serializable +class BrowseManga( + val id: String, + val url: String, + val title: String, + val cover: String, + val type: String, + val description: String, + val status: String, +) + +@Serializable +class MangaUrl( + val id: String, + val slug: String, +) + +@Serializable +class MangaDetails( + val id: Int, + val slug: String, + val title: Rendered, + val content: Rendered, + @SerialName("featured_media") + val featuredMedia: Int, + @SerialName("class_list") + private val classList: List, +) { + fun getFromClassList(type: String): List { + return classList.filter { it.startsWith("$type-") } + .map { + it.substringAfter("$type-") + .split("-") + .joinToString(" ") { word -> word.replaceFirstChar { it.titlecase() } } + } + } +} + +@Serializable +class Thumbnail( + @SerialName("source_url") + val url: String, +) + +@Serializable +class Rendered( + val rendered: String, +) diff --git a/src/en/mangataro/src/eu/kanade/tachiyomi/extension/en/mangataro/Filters.kt b/src/en/mangataro/src/eu/kanade/tachiyomi/extension/en/mangataro/Filters.kt new file mode 100644 index 000000000..79779e408 --- /dev/null +++ b/src/en/mangataro/src/eu/kanade/tachiyomi/extension/en/mangataro/Filters.kt @@ -0,0 +1,320 @@ +package eu.kanade.tachiyomi.extension.en.mangataro + +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList +import java.util.Calendar + +abstract class SelectFilter( + name: String, + private val options: List>, +) : Filter.Select( + name, + options.map { it.first }.toTypedArray(), +) { + val selected get() = options[state].second +} + +class CheckBoxFilter(name: String, val value: T) : Filter.CheckBox(name) + +abstract class CheckBoxGroup( + name: String, + options: List>, +) : Filter.Group>( + name, + options.map { CheckBoxFilter(it.first, it.second) }, +) { + val checked get() = state.filter { it.state }.map { it.value } +} + +class SearchWithFilters : Filter.CheckBox("Apply filters to Text Search", false) + +class TypeFilter : SelectFilter( + name = "Type", + options = listOf( + "All" to null, + "Manga" to "Manga", + "Manhwa" to "Manhwa", + "Manhua" to "Manhua", + ), +) + +class StatusFilter : SelectFilter( + name = "Status", + options = listOf( + "All" to null, + "Completed" to "Completed", + "Ongoing" to "Ongoing", + ), +) + +class YearFilter : SelectFilter( + name = "Year", + options = buildList { + add("All" to null) + val current = Calendar.getInstance().get(Calendar.YEAR) + (current downTo 1949).mapTo(this) { it.toString() to it } + }, +) + +class TagFilter : CheckBoxGroup( + name = "Tags", + options = tags, +) + +class TagFilterMatch : SelectFilter( + name = "Tag Match", + options = listOf( + "Any" to "any", + "All" to "all", + ), +) + +class SortFilter( + state: Selection = Selection(0, false), +) : Filter.Sort( + name = "Sort", + values = sort.map { it.first }.toTypedArray(), + state = state, +) { + private val sortDirection get() = if (state?.ascending == true) { + "asc" + } else { + "desc" + } + val selected get() = "${sort[state?.index ?: 0].second}_$sortDirection" + + companion object { + val popular = FilterList( + SortFilter(Selection(3, false)), + TagFilterMatch(), + ) + val latest = FilterList( + SortFilter(Selection(0, false)), + TagFilterMatch(), + ) + } +} + +private val tags = listOf( + "4-Koma" to 2094, + "Abandoned Children" to 1050, + "Ability Steal" to 2386, + "Absent Parents" to 2397, + "Academy" to 4012, + "Accelerated Growth" to 999, + "Action" to 7, + "Adaptation" to 1351, + "Adapted to Anime" to 1000, + "Adapted to Drama CD" to 5072, + "Adapted to Game" to 1001, + "Adapted to Manga" to 5069, + "Adapted to Manhua" to 963, + "Adapted to Manhwa" to 1002, + "Adapted to Visual Novel" to 5070, + "Adopted Children" to 1058, + "Adult" to 88, + "Adult Cast" to 16, + "Adventure" to 12, + "Age Regression" to 2861, + "Alchemy" to 964, + "Aliens" to 965, + "Alternate World" to 966, + "Ancient Times" to 2862, + "Animals" to 1135, + "Anthology" to 2096, + "Anthropomorphic" to 93, + "Appearance Different from Actual Age" to 5071, + "Aristocracy" to 1037, + "Army" to 2387, + "Army Building" to 1005, + "Arranged Marriage" to 1047, + "Arrogant Characters" to 2401, + "Artbook" to 4551, + "Artifacts" to 4004, + "Assassins" to 2863, + "Avant Garde" to 98, + "Award Winning" to 17, + "Battle Academy" to 5279, + "Battle Competition" to 2388, + "BD" to 1137, + "Beast Companions" to 968, + "Beautiful Female Lead" to 969, + "Betrayal" to 2864, + "Blacksmith" to 971, + "Boys Love" to 80, + "Boys' Love" to 4237, + "Brotherhood" to 1038, + "Business Management" to 2398, + "Calm Protagonist" to 1006, + "Cautious Protagonist" to 2392, + "CGDCT" to 94, + "Character growth" to 4929, + "Childcare" to 51, + "Children's" to 4818, + "Cold Love Interests" to 2393, + "Cold Protagonist" to 2394, + "Combat Sports" to 92, + "Comedy" to 20, + "Cooking" to 2118, + "Crime" to 1753, + "Crossdressing" to 81, + "Cruel Characters" to 2395, + "Cunning Protagonist" to 1039, + "Cute Stuffs" to 4817, + "Dark" to 4930, + "Death of Loved Ones" to 1044, + "Delinquents" to 52, + "Demons" to 1376, + "Dense Protagonist" to 975, + "Detective" to 58, + "Devoted love interests" to 4008, + "Doujinshi" to 79, + "Dragons" to 1040, + "Drama" to 8, + "Drugs" to 1048, + "Dungeon" to 4795, + "Dungeons" to 1011, + "Ecchi" to 40, + "Educational" to 66, + "Elemental Magic" to 976, + "Elves" to 4010, + "Erotica" to 71, + "Evolution" to 4931, + "Family" to 4005, + "Fantasy" to 2, + "French" to 108, + "Full Color" to 34, + "Gag Humor" to 59, + "Game" to 36, + "Game Elements" to 979, + "Gender Bender" to 106, + "Genderswap" to 2093, + "Ghosts" to 1134, + "Girls Love" to 49, + "Gore" to 23, + "Gourmet" to 46, + "Gyaru" to 4739, + "Harem" to 64, + "Hentai" to 82, + "High Stakes Game" to 76, + "Historical" to 18, + "Horror" to 44, + "Human nonhuman relationship" to 4932, + "Idols (Female)" to 95, + "Idols (Male)" to 101, + "Indonesian" to 109, + "Isekai" to 3, + "Iyashikei" to 91, + "Josei" to 43, + "Kids" to 107, + "Kingdoms" to 4006, + "Level System" to 1020, + "Light Novel" to 55, + "Loli" to 4207, + "Lolicon" to 89, + "Long Strip" to 1172, + "Love interest falls in love first" to 4007, + "Love Polygon" to 41, + "Love Status Quo" to 100, + "Mafia" to 2061, + "Magic" to 35, + "Magical Girls" to 2095, + "Magical Sex Shift" to 68, + "Mahou Shoujo" to 97, + "Male" to 4933, + "Manga" to 14, + "Mangataro Exclusive" to 4792, + "Manhua" to 33, + "Manhwa" to 6, + "Martial Arts" to 4, + "Master-disciple relationship" to 4013, + "Mature" to 87, + "Mecha" to 74, + "Medical" to 67, + "Memoir" to 96, + "Military" to 30, + "Misunderstandings" to 1023, + "Monster Girls" to 1414, + "Monsters" to 37, + "Multiple POV" to 1024, + "Murim" to 38, + "Music" to 83, + "Mystery" to 24, + "Mythology" to 53, + "Ninja" to 4601, + "OEL" to 103, + "Office Workers" to 2062, + "Official Colored" to 4834, + "One-shot" to 48, + "Oneshot" to 4210, + "Organized Crime" to 50, + "Otaku Culture" to 70, + "Parody" to 21, + "Performing Arts" to 72, + "Pets" to 105, + "Philosophical" to 63, + "Police" to 1136, + "Post-Apocalyptic" to 1557, + "Psychological" to 26, + "Racing" to 102, + "Reincarnated in another world" to 4014, + "Reincarnation" to 5, + "Reverse Harem" to 61, + "Romance" to 29, + "Romantic Subtext" to 28, + "Samurai" to 60, + "School" to 10, + "School Life" to 73, + "Sci-Fi" to 15, + "Seinen" to 19, + "Self-Published" to 1413, + "Sexual Violence" to 4116, + "Shoujo" to 42, + "Shoujo Ai" to 90, + "Shounen" to 13, + "Shounen Ai" to 104, + "Showbiz" to 54, + "Skill books" to 4009, + "Slice of Life" to 47, + "Smut" to 85, + "Space" to 84, + "Sports" to 25, + "Strategy Game" to 77, + "Super Power" to 22, + "Superhero" to 4098, + "Supernatural" to 9, + "Survival" to 56, + "Suspense" to 75, + "Sword And Magic" to 995, + "Team Sports" to 27, + "Thai" to 591, + "Thriller" to 1341, + "Time Travel" to 32, + "Traditional Games" to 4742, + "Tragedy" to 65, + "Transported to another world" to 4011, + "Urban Fantasy" to 110, + "Vampire" to 45, + "Vampires" to 2102, + "Video Game" to 31, + "Video Games" to 1366, + "Villainess" to 62, + "Virtual Reality" to 4485, + "Visual Arts" to 57, + "Web Comic" to 1173, + "Webtoon" to 39, + "Workplace" to 69, + "Wuxia" to 1350, + "Xianxia" to 2391, + "Xuanhuan" to 962, + "Yaoi" to 86, + "Yuri" to 99, + "Zombies" to 1342, +) + +private val sort = listOf( + "Latest Updates" to "post", + "Release Date" to "release", + "Title A-Z" to "title", + "Popular" to "popular", +) diff --git a/src/en/mangataro/src/eu/kanade/tachiyomi/extension/en/mangataro/MangaTaro.kt b/src/en/mangataro/src/eu/kanade/tachiyomi/extension/en/mangataro/MangaTaro.kt new file mode 100644 index 000000000..f0862a8ef --- /dev/null +++ b/src/en/mangataro/src/eu/kanade/tachiyomi/extension/en/mangataro/MangaTaro.kt @@ -0,0 +1,318 @@ +package eu.kanade.tachiyomi.extension.en.mangataro + +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.network.asObservableSuccess +import eu.kanade.tachiyomi.source.model.Filter +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 eu.kanade.tachiyomi.util.asJsoup +import keiyoushi.utils.firstInstance +import keiyoushi.utils.firstInstanceOrNull +import keiyoushi.utils.parseAs +import keiyoushi.utils.toJsonString +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.Response +import org.jsoup.Jsoup +import rx.Observable +import java.lang.UnsupportedOperationException +import java.util.Calendar + +class MangaTaro : HttpSource() { + + override val name = "MangaTaro" + + override val baseUrl = "https://mangataro.org" + + override val lang = "en" + + override val supportsLatest = true + + override val client = network.cloudflareClient + + override fun headersBuilder() = super.headersBuilder() + .set("Referer", "$baseUrl/") + + override fun popularMangaRequest(page: Int) = + searchMangaRequest(page, "", SortFilter.popular) + + override fun popularMangaParse(response: Response) = + searchMangaParse(response) + + override fun latestUpdatesRequest(page: Int) = + searchMangaRequest(page, "", SortFilter.latest) + + override fun latestUpdatesParse(response: Response) = + searchMangaParse(response) + + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + return if (query.startsWith("https://")) { + deeplinkHandler(query) + } else if ( + query.isNotBlank() && + filters.firstInstanceOrNull()?.state == false + ) { + querySearch(query) + } else { + super.fetchSearchManga(page, query, filters) + } + } + + private fun querySearch(query: String): Observable { + val body = SearchQueryPayload( + query = query.trim(), + limit = 25, + ).toJsonString().toRequestBody("application/json".toMediaType()) + + return client.newCall(POST("$baseUrl/auth/search", headers, body)) + .asObservableSuccess() + .map { response -> + val data = response.parseAs().results + + val mangas = data.filter { it.type != "Novel" } + .map { + SManga.create().apply { + url = MangaUrl(it.id.toString(), it.slug).toJsonString() + title = it.title + thumbnail_url = it.thumbnail + description = it.description + status = when (it.status) { + "Ongoing" -> SManga.ONGOING + "Completed" -> SManga.COMPLETED + else -> SManga.UNKNOWN + } + } + } + + MangasPage( + mangas = mangas, + hasNextPage = false, + ) + } + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val body = SearchPayload( + page = page, + search = query.trim(), + years = filters.firstInstanceOrNull() + ?.selected.let(::listOfNotNull), + genres = filters.firstInstanceOrNull() + ?.checked.orEmpty(), + types = filters.firstInstanceOrNull() + ?.selected.let(::listOfNotNull), + statuses = filters.firstInstanceOrNull() + ?.selected.let(::listOfNotNull), + sort = filters.firstInstance().selected, + genreMatchMode = filters.firstInstance().selected, + ).toJsonString().toRequestBody("application/json".toMediaType()) + + return POST("$baseUrl/wp-json/manga/v1/load", headers, body) + } + + override fun getFilterList() = FilterList( + SearchWithFilters(), + Filter.Header("If unchecked, all filters will be ignored with search query"), + Filter.Header("But will give more relevant results"), + Filter.Separator(), + SortFilter(), + TypeFilter(), + StatusFilter(), + YearFilter(), + TagFilter(), + TagFilterMatch(), + ) + + override fun searchMangaParse(response: Response): MangasPage { + val data = response.parseAs>() + + val mangas = data.filter { it.type != "Novel" } + .map { + SManga.create().apply { + url = MangaUrl(id = it.id, slug = it.url.toSlug()).toJsonString() + title = it.title + thumbnail_url = it.cover + description = it.description + status = when (it.status) { + "Ongoing" -> SManga.ONGOING + "Completed" -> SManga.COMPLETED + else -> SManga.UNKNOWN + } + } + } + + return MangasPage( + mangas = mangas, + hasNextPage = data.size == 24, + ) + } + + private fun deeplinkHandler(url: String): Observable { + val slug = url.toSlug() + + return client.newCall(GET("$baseUrl/manga/$slug", headers)) + .asObservableSuccess() + .map { + val document = it.asJsoup() + + val id = document.body().dataset()["manga-id"]!! + val status = when (document.selectFirst(".manga-page-wrapper span.capitalize")?.text()?.lowercase()) { + "ongoing" -> SManga.ONGOING + "completed" -> SManga.COMPLETED + else -> SManga.UNKNOWN + } + + if (document.selectFirst(".manga-page-wrapper span:contains(Novel)") != null) { + throw Exception("Novels are not supported") + } + + id to status + } + .switchMap { + client.newCall(mangaDetailsRequest(it.first, it.second)) + .asObservableSuccess() + .map(::mangaDetailsParse) + } + .map { MangasPage(listOf(it), false) } + } + + override fun mangaDetailsRequest(manga: SManga): Request { + val id = manga.url.parseAs().id + + return mangaDetailsRequest(id, manga.status) + } + + private fun mangaDetailsRequest(id: String, status: Int): Request { + val url = baseUrl.toHttpUrl().newBuilder().apply { + addPathSegments("wp-json/wp/v2/manga") + addPathSegment(id) + fragment(status.toString()) + }.build() + + return GET(url, headers) + } + + override fun mangaDetailsParse(response: Response): SManga { + val data = response.parseAs() + val thumbnail = getThumbnail(data.featuredMedia) + + return SManga.create().apply { + url = MangaUrl(data.id.toString(), data.slug).toJsonString() + title = data.title.rendered + description = Jsoup.parseBodyFragment(data.content.rendered).wholeText() + genre = buildSet { + addAll(data.getFromClassList("tag")) + addAll(data.getFromClassList("type")) + }.joinToString() + author = data.getFromClassList("manga_author").joinToString() + status = response.request.url.fragment!!.toInt() + thumbnail_url = thumbnail + initialized = true + } + } + + private fun getThumbnail(mediaId: Int): String { + val url = baseUrl.toHttpUrl().newBuilder().apply { + addPathSegments("wp-json/wp/v2/media") + addPathSegment(mediaId.toString()) + }.build() + + return client.newCall(GET(url, headers)).execute() + .parseAs() + .url + } + + override fun getMangaUrl(manga: SManga): String { + val slug = manga.url.parseAs().slug + + return "$baseUrl/manga/$slug" + } + + override fun chapterListRequest(manga: SManga): Request { + return GET(getMangaUrl(manga), headers) + } + + override fun chapterListParse(response: Response): List { + val document = response.asJsoup() + val placeholders = listOf("", "N/A", "—") + var hasScanlator = false + + val chapters = document.select(".chapter-list a").map { + SChapter.create().apply { + setUrlWithoutDomain(it.absUrl("href")) + val details = it.select("> div + div > div") + name = buildString { + append(details[0].selectFirst("span")!!.ownText()) + details[1].text().also { title -> + if (title !in placeholders) { + append(": ", title) + } + } + } + details[2].text().let { group -> + if (group !in placeholders) { + scanlator = group + hasScanlator = true + } + } + date_upload = details[3].text().parseRelativeDate() + } + } + + if (hasScanlator) { + chapters.onEach { it.scanlator = it.scanlator ?: "\u200B" } // Insert zero-width space + } + + return chapters + } + + override fun pageListParse(response: Response): List { + val document = response.asJsoup() + + return document.select("img.comic-image").mapIndexed { idx, img -> + val imageUrl = when { + img.hasAttr("data-src") -> img.absUrl("data-src") + else -> img.absUrl("src") + } + Page(idx, imageUrl = imageUrl) + } + } + + private fun String.toSlug() = toHttpUrl().let { url -> + val path = url.pathSegments.filter(String::isNotBlank) + + if ((path.size == 2 && path[0] == "manga") || (path.size == 3 && path[0] == "read")) { + path[1] + } else { + throw Exception("Expected manga or read path, got $this") + } + } + + private fun String.parseRelativeDate(): Long { + val calendar = Calendar.getInstance() + val (amount, unit) = relativeDateRegex.matchEntire(this)?.destructured + ?: return 0L + + when (unit) { + "h" -> calendar.add(Calendar.HOUR, -amount.toInt()) + "w" -> calendar.add(Calendar.WEEK_OF_YEAR, -amount.toInt()) + "mo" -> calendar.add(Calendar.MONTH, -amount.toInt()) + "y" -> calendar.add(Calendar.YEAR, -amount.toInt()) + } + + return calendar.timeInMillis + } + + private val relativeDateRegex = Regex("""(\d+)(h|w|mo|y) ago""") + + override fun imageUrlParse(response: Response): String { + throw UnsupportedOperationException() + } +} diff --git a/src/en/mangataro/src/eu/kanade/tachiyomi/extension/en/mangataro/UrlActivity.kt b/src/en/mangataro/src/eu/kanade/tachiyomi/extension/en/mangataro/UrlActivity.kt new file mode 100644 index 000000000..fb3c9f9ee --- /dev/null +++ b/src/en/mangataro/src/eu/kanade/tachiyomi/extension/en/mangataro/UrlActivity.kt @@ -0,0 +1,29 @@ +package eu.kanade.tachiyomi.extension.en.mangataro + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.util.Log +import kotlin.system.exitProcess + +class UrlActivity : Activity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val mainIntent = Intent().apply { + action = "eu.kanade.tachiyomi.SEARCH" + putExtra("query", intent.data.toString()) + putExtra("filter", packageName) + } + + try { + startActivity(mainIntent) + } catch (e: ActivityNotFoundException) { + Log.e("MangaTaro", "Unable to launch activity", e) + } + + finish() + exitProcess(0) + } +}