diff --git a/src/tr/MangaDenizi/build.gradle b/src/tr/MangaDenizi/build.gradle new file mode 100644 index 000000000..de26d4573 --- /dev/null +++ b/src/tr/MangaDenizi/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + appName = 'Tachiyomi: MangaDenizi' + pkgNameSuffix = 'tr.mangadenizi' + extClass = '.MangaDenizi' + extVersionCode = 1 + libVersion = '1.2' +} + +apply from: "$rootDir/common.gradle" diff --git a/src/tr/MangaDenizi/res/mipmap-hdpi/ic_launcher.png b/src/tr/MangaDenizi/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..412911dd1 Binary files /dev/null and b/src/tr/MangaDenizi/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/tr/MangaDenizi/res/mipmap-mdpi/ic_launcher.png b/src/tr/MangaDenizi/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..e1223d1be Binary files /dev/null and b/src/tr/MangaDenizi/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/tr/MangaDenizi/res/mipmap-xhdpi/ic_launcher.png b/src/tr/MangaDenizi/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..7cbfcdd5b Binary files /dev/null and b/src/tr/MangaDenizi/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/tr/MangaDenizi/res/mipmap-xxhdpi/ic_launcher.png b/src/tr/MangaDenizi/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..2ae5244d8 Binary files /dev/null and b/src/tr/MangaDenizi/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/tr/MangaDenizi/res/mipmap-xxxhdpi/ic_launcher.png b/src/tr/MangaDenizi/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..0b07b8fef Binary files /dev/null and b/src/tr/MangaDenizi/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/tr/MangaDenizi/res/web_hi_res_512.png b/src/tr/MangaDenizi/res/web_hi_res_512.png new file mode 100644 index 000000000..35a3ebe62 Binary files /dev/null and b/src/tr/MangaDenizi/res/web_hi_res_512.png differ diff --git a/src/tr/MangaDenizi/src/eu/kanade/tachiyomi/extension/tr/mangadenizi/MangaDenizi.kt b/src/tr/MangaDenizi/src/eu/kanade/tachiyomi/extension/tr/mangadenizi/MangaDenizi.kt new file mode 100644 index 000000000..21b4135ae --- /dev/null +++ b/src/tr/MangaDenizi/src/eu/kanade/tachiyomi/extension/tr/mangadenizi/MangaDenizi.kt @@ -0,0 +1,134 @@ +package eu.kanade.tachiyomi.extension.tr.mangadenizi + +import eu.kanade.tachiyomi.network.GET +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.ParsedHttpSource +import eu.kanade.tachiyomi.util.asJsoup +import java.text.SimpleDateFormat +import okhttp3.OkHttpClient +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import org.json.JSONArray +import org.json.JSONObject + +class MangaDenizi : ParsedHttpSource() { + override val name = "MangaDenizi" + + override val baseUrl = "https://mangadenizi.com" + + override val lang = "tr" + + override val supportsLatest = true + + override val client = network.cloudflareClient + + override fun popularMangaSelector() = "div.media-left" + + override fun popularMangaRequest(page: Int) = GET("$baseUrl/manga-list?page=$page", headers) + + override fun popularMangaFromElement(element: Element) = SManga.create().apply { + setUrlWithoutDomain(element.select("a").attr("href")) + title = element.select("img").attr("alt") + thumbnail_url = element.select("img").attr("abs:src") + } + + override fun popularMangaNextPageSelector() = "[rel=next]" + + override fun latestUpdatesSelector() = "h3 > a" + + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/latest-release?page=$page", headers) + + //No thumbnail on latest releases page + override fun latestUpdatesFromElement(element: Element) = SManga.create().apply { + setUrlWithoutDomain(element.attr("href")) + title = element.text() + } + + override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector() + + override fun latestUpdatesParse(response: Response): MangasPage { + val document = response.asJsoup() + val mangas = document.select(latestUpdatesSelector()) + .distinctBy { it.text().trim() } + .map { latestUpdatesFromElement(it) } + val hasNextPage = latestUpdatesNextPageSelector().let { selector -> + document.select(selector).first() + } != null + + return MangasPage(mangas, hasNextPage) + } + + override fun searchMangaSelector() = "Unused" + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET("$baseUrl/search?query=$query", headers) + + override fun searchMangaNextPageSelector() = "Unused" + override fun searchMangaFromElement(element: Element) = throw UnsupportedOperationException("Unused") + + override fun searchMangaParse(response: Response): MangasPage { + val res = response.body()!!.string() + return getMangasPage(res) + } + + private fun getMangasPage(json: String): MangasPage { + val response = JSONObject(json) + val results = response.getJSONArray("suggestions") + val mangas = ArrayList<SManga>() + + //No thumbnail here either + for (i in 0 until results.length()) { + val obj = results.getJSONObject(i) + val manga = SManga.create() + manga.title = obj.getString("value") + manga.url = "/manga/${obj.getString("data")}" + mangas.add(manga) + } + + return MangasPage(mangas, false) + } + + override fun mangaDetailsParse(document: Document) = SManga.create().apply { + description = document.select(".well > p").text() + genre = document.select("dd > a[href*=category]").joinToString { it.text() } + status = document.select(".label.label-success").let { + parseStatus(it.text()) + } + thumbnail_url = document.select("img.img-responsive").attr("src") + } + + private fun parseStatus(status: String) = when { + status.contains("Devam Ediyor") -> SManga.ONGOING + status.contains("Tamamlandı") -> SManga.COMPLETED + else -> SManga.UNKNOWN + } + + override fun chapterListSelector() = "ul.chapters li" + + override fun chapterFromElement(element: Element) = SChapter.create().apply { + setUrlWithoutDomain(element.select("a").attr("href")) + name = "${element.select("a").text()}: ${element.select("em").text()}" + date_upload = dateFormat.parse(element.select("div.date-chapter-title-rtl").text().trim()).time ?: 0 + } + + companion object { + val dateFormat by lazy { + SimpleDateFormat("dd MMM. yyyy") + } + } + + override fun pageListParse(document: Document): List<Page> { + return document.select("img.img-responsive").mapIndexed { i, element -> + val url = if (element.hasAttr("data-src")) element.attr("abs:data-src") else element.attr("abs:src") + Page(i, "", url) + } + } + + override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not Used") + + override fun getFilterList() = FilterList() +}