diff --git a/src/all/unionmangas/AndroidManifest.xml b/src/all/unionmangas/AndroidManifest.xml deleted file mode 100644 index 80cb91e25..000000000 --- a/src/all/unionmangas/AndroidManifest.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/all/unionmangas/build.gradle b/src/all/unionmangas/build.gradle deleted file mode 100644 index 1667159e7..000000000 --- a/src/all/unionmangas/build.gradle +++ /dev/null @@ -1,12 +0,0 @@ -ext { - extName = 'Union Mangas' - extClass = '.UnionMangasFactory' - extVersionCode = 6 - isNsfw = true -} - -apply from: "$rootDir/common.gradle" - -dependencies { - implementation(project(':lib:cryptoaes')) -} diff --git a/src/all/unionmangas/res/mipmap-hdpi/ic_launcher.png b/src/all/unionmangas/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 192b1691f..000000000 Binary files a/src/all/unionmangas/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/all/unionmangas/res/mipmap-mdpi/ic_launcher.png b/src/all/unionmangas/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 7a1314df7..000000000 Binary files a/src/all/unionmangas/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/all/unionmangas/res/mipmap-xhdpi/ic_launcher.png b/src/all/unionmangas/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 37a770ead..000000000 Binary files a/src/all/unionmangas/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/all/unionmangas/res/mipmap-xxhdpi/ic_launcher.png b/src/all/unionmangas/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 3422a06e2..000000000 Binary files a/src/all/unionmangas/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/all/unionmangas/res/mipmap-xxxhdpi/ic_launcher.png b/src/all/unionmangas/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 8929bdad1..000000000 Binary files a/src/all/unionmangas/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangas.kt b/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangas.kt deleted file mode 100644 index 4f54cc0a4..000000000 --- a/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangas.kt +++ /dev/null @@ -1,210 +0,0 @@ -package eu.kanade.tachiyomi.extension.all.unionmangas - -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.network.asObservableSuccess -import eu.kanade.tachiyomi.network.interceptor.rateLimit -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 kotlinx.serialization.decodeFromString -import kotlinx.serialization.json.Json -import okhttp3.Headers -import okhttp3.HttpUrl.Companion.toHttpUrl -import okhttp3.Request -import okhttp3.Response -import rx.Observable -import uy.kohesive.injekt.injectLazy -import java.text.SimpleDateFormat -import java.util.Locale - -class UnionMangas(private val langOption: LanguageOption) : HttpSource() { - override val lang = langOption.lang - - override val name: String = "Union Mangas" - - override val baseUrl: String = "https://unionmangasbr.org" - - override val supportsLatest = true - - private val json: Json by injectLazy() - - override val client = network.client.newBuilder() - .rateLimit(2) - .build() - - override fun headersBuilder(): Headers.Builder = super.headersBuilder() - .set("Referer", "$baseUrl/") - - override fun chapterListParse(response: Response) = throw UnsupportedOperationException() - - override fun fetchChapterList(manga: SManga): Observable> { - val chapters = mutableListOf() - var currentPage = 0 - do { - val chaptersDto = fetchChapterListPageable(manga, currentPage) - chapters += chaptersDto.data.map { chapter -> - SChapter.create().apply { - name = chapter.name - date_upload = chapter.date.toDate() - url = chapter.toChapterUrl(langOption.infix) - } - } - currentPage++ - } while (chaptersDto.hasNextPage()) - return Observable.just(chapters) - } - - private fun fetchChapterListPageable(manga: SManga, page: Int): Pageable { - manga.apply { - url = getURLCompatibility(url) - } - - val maxResult = 16 - val url = "$apiUrl/${langOption.infix}/GetChapterListFilter/${manga.slug()}/$maxResult/$page/all/ASC" - return client.newCall(GET(url, headers)).execute() - .parseAs>() - } - - override fun latestUpdatesParse(response: Response) = popularMangaParse(response) - - override fun latestUpdatesRequest(page: Int): Request { - val maxResult = 24 - val url = "$apiUrl/${langOption.infix}/HomeLastUpdate".toHttpUrl().newBuilder() - .addPathSegment("$maxResult") - .addPathSegment("${page - 1}") - .build() - return GET(url, headers) - } - - override fun getMangaUrl(manga: SManga): String { - manga.apply { - url = getURLCompatibility(url) - } - - return baseUrl + manga.url.replace(langOption.infix, langOption.mangaSubstring) - } - - override fun mangaDetailsRequest(manga: SManga): Request { - manga.apply { - url = getURLCompatibility(url) - } - - val url = "$apiUrl/${langOption.infix}/getInfoManga".toHttpUrl().newBuilder() - .addPathSegment(manga.slug()) - .build() - return GET(url, headers) - } - - override fun mangaDetailsParse(response: Response): SManga { - val dto = response.parseAs() - return mangaParse(dto.details) - } - - override fun pageListRequest(chapter: SChapter): Request { - val chapterSlug = getURLCompatibility(chapter.url) - .substringAfter(langOption.infix) - - val url = "$apiUrl/${langOption.infix}/GetImageChapter$chapterSlug" - return GET(url, headers) - } - - override fun pageListParse(response: Response): List { - val location = response.request.url.toString() - val dto = response.parseAs() - return dto.pages.mapIndexed { index, url -> - Page(index, location, imageUrl = url) - } - } - - override fun popularMangaParse(response: Response): MangasPage { - val dto = response.parseAs>() - val mangas = dto.data.map(::mangaParse) - return MangasPage( - mangas = mangas, - hasNextPage = dto.hasNextPage(), - ) - } - - override fun popularMangaRequest(page: Int): Request { - val maxResult = 24 - return GET("$apiUrl/${langOption.infix}/HomeTopFllow/$maxResult/${page - 1}") - } - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val maxResult = 20 - val url = "$apiUrl/${langOption.infix}/QuickSearch/".toHttpUrl().newBuilder() - .addPathSegment(query) - .addPathSegment("$maxResult") - .build() - return GET(url, headers) - } - - override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { - if (query.startsWith(SEARCH_PREFIX)) { - val url = "$baseUrl/${langOption.infix}/${query.substringAfter(SEARCH_PREFIX)}" - return client.newCall(GET(url, headers)) - .asObservableSuccess().map { response -> - val mangas = try { listOf(mangaDetailsParse(response)) } catch (_: Exception) { emptyList() } - MangasPage(mangas, false) - } - } - return super.fetchSearchManga(page, query, filters) - } - - override fun imageUrlParse(response: Response): String = "" - - override fun searchMangaParse(response: Response): MangasPage { - val dto = response.parseAs() - return MangasPage( - dto.mangas.map(::mangaParse), - false, - ) - } - - /* - * Keeps compatibility with pt-BR previous version - * */ - private fun getURLCompatibility(url: String): String { - val slugSuffix = "-br" - val mangaSubString = "manga-br" - - val oldSlug = url.substringAfter(mangaSubString) - .substring(1) - .split("/") - .first() - - val newSlug = oldSlug.substringBeforeLast(slugSuffix) - - return url.replace(oldSlug, newSlug) - } - - private inline fun Response.parseAs(): T { - return json.decodeFromString(body.string()) - } - - private fun SManga.slug() = this.url.split("/").last() - - private fun mangaParse(dto: MangaDto): SManga { - return SManga.create().apply { - title = dto.title - thumbnail_url = dto.thumbnailUrl - status = dto.status - url = "/${langOption.infix}/${dto.slug}" - genre = dto.genres - initialized = true - } - } - - private fun String.toDate(): Long = - try { dateFormat.parse(trim())!!.time } catch (_: Exception) { 0L } - - companion object { - const val SEARCH_PREFIX = "slug:" - val apiUrl = "https://api.novelfull.us/api" - val oldApiUrl = "https://api.unionmanga.xyz" - val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS", Locale.ENGLISH) - } -} diff --git a/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasDto.kt b/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasDto.kt deleted file mode 100644 index 55a77cc7a..000000000 --- a/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasDto.kt +++ /dev/null @@ -1,68 +0,0 @@ -package eu.kanade.tachiyomi.extension.all.unionmangas - -import eu.kanade.tachiyomi.source.model.SManga -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -class MangaDetailsDto(private val data: Props) { - val details: MangaDto get() = data.details - - @Serializable - class Props( - @SerialName("infoDoc") val details: MangaDto, - ) -} - -@Serializable -open class Pageable( - var currentPage: Int, - var totalPage: Int, - val data: List, -) { - fun hasNextPage() = (currentPage + 1) <= totalPage -} - -@Serializable -class ChapterDto( - val date: String, - @SerialName("idDoc") val slugManga: String, - @SerialName("idDetail") val id: String, - @SerialName("nameChapter") val name: String, -) { - fun toChapterUrl(lang: String) = "/$lang/${this.slugManga}/$id" -} - -@Serializable -class MangaDto( - @SerialName("name") val title: String, - @SerialName("image") private val _thumbnailUrl: String, - @SerialName("idDoc") val slug: String, - @SerialName("genresName") val genres: String, - @SerialName("status") val _status: String, -) { - val thumbnailUrl get() = "${UnionMangas.oldApiUrl}$_thumbnailUrl" - - val status get() = when (_status) { - "ongoing" -> SManga.ONGOING - "completed" -> SManga.COMPLETED - else -> SManga.UNKNOWN - } -} - -@Serializable -class SearchDto( - @SerialName("data") - val mangas: List, -) - -@Serializable -class PageDto(val `data`: Data) { - val pages: List get() = `data`.detailDocuments.source.split("#") - - @Serializable - class Data(@SerialName("detail_documents") val detailDocuments: DetailDocuments) - - @Serializable - class DetailDocuments(val source: String) -} diff --git a/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasFactory.kt b/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasFactory.kt deleted file mode 100644 index cd2e01ba4..000000000 --- a/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasFactory.kt +++ /dev/null @@ -1,15 +0,0 @@ -package eu.kanade.tachiyomi.extension.all.unionmangas - -import eu.kanade.tachiyomi.source.Source -import eu.kanade.tachiyomi.source.SourceFactory - -class UnionMangasFactory : SourceFactory { - override fun createSources(): List = languages.map { UnionMangas(it) } -} - -class LanguageOption(val lang: String, val infix: String = lang, val mangaSubstring: String = infix) - -val languages = listOf( - LanguageOption("pt-BR", "manga-br"), - LanguageOption("ru", "manga-ru", "mangas"), -) diff --git a/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasUrlActivity.kt b/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasUrlActivity.kt deleted file mode 100644 index 29db77a01..000000000 --- a/src/all/unionmangas/src/eu/kanade/tachiyomi/extension/all/unionmangas/UnionMangasUrlActivity.kt +++ /dev/null @@ -1,36 +0,0 @@ -package eu.kanade.tachiyomi.extension.all.unionmangas - -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 UnionMangasUrlActivity : Activity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val pathSegments = intent?.data?.pathSegments - - if (pathSegments != null && pathSegments.size > 1) { - val intent = Intent().apply { - action = "eu.kanade.tachiyomi.SEARCH" - putExtra("query", slug(pathSegments)) - putExtra("filter", packageName) - } - - try { - startActivity(intent) - } catch (e: ActivityNotFoundException) { - Log.e("UnionMangasUrlActivity", e.toString()) - } - } - - finish() - exitProcess(0) - } - - private fun slug(pathSegments: List) = - "${UnionMangas.SEARCH_PREFIX}${pathSegments[1]}" -}