Initial commit

This commit is contained in:
FourTOne5
2024-01-09 04:12:39 +06:00
commit 600c345dfe
8593 changed files with 150590 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest />

View File

@@ -0,0 +1,12 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlinx-serialization'
ext {
extName = 'MangaDenizi'
pkgNameSuffix = 'tr.mangadenizi'
extClass = '.MangaDenizi'
extVersionCode = 4
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -0,0 +1,137 @@
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 kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import okhttp3.Response
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
import java.util.Locale
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 mangaListJson = Json.decodeFromString<SearchMangaJson>(response.body.string())
val mangaList = mangaListJson.suggestions.map {
SManga.create().apply {
title = it.value
url = "/manga/${it.data}"
}
}
return MangasPage(mangaList, 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 = parseStatus(document.select(".label.label-success").text())
thumbnail_url = document.select("img.img-responsive").attr("abs: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 = try {
dateFormat.parse(element.select("div.date-chapter-title-rtl").text().trim())?.time ?: 0
} catch (_: Exception) {
0
}
}
companion object {
val dateFormat by lazy {
SimpleDateFormat("dd MMM. yyyy", Locale.US)
}
}
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()
@Serializable
data class SearchMangaJson(
val suggestions: List<MangaJson>,
)
@Serializable
data class MangaJson(
val value: String,
val data: String,
)
}

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest />

View File

@@ -0,0 +1,16 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
ext {
extName = 'Manga Ship'
pkgNameSuffix = 'tr.mangaship'
extClass = '.MangaShip'
extVersionCode = 3
}
dependencies {
implementation project(':lib-dataimage')
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

View File

@@ -0,0 +1,107 @@
package eu.kanade.tachiyomi.extension.tr.mangaship
import eu.kanade.tachiyomi.lib.dataimage.DataImageInterceptor
import eu.kanade.tachiyomi.lib.dataimage.dataImageAsUrl
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.FilterList
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 okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
class MangaShip : ParsedHttpSource() {
override val name = "Manga Ship"
override val baseUrl = "https://www.mangaship.net"
override val lang = "tr"
override val supportsLatest = true
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.addInterceptor(DataImageInterceptor())
.build()
// Popular
override fun popularMangaRequest(page: Int): Request {
return GET("$baseUrl/Tr/PopulerMangalar?page=$page", headers)
}
override fun popularMangaSelector() = "div.movie-item-contents"
override fun popularMangaFromElement(element: Element): SManga {
return SManga.create().apply {
element.select("div.movie-item-title a").let {
title = it.text()
setUrlWithoutDomain(it.attr("href"))
}
thumbnail_url = element.select("img").attr("abs:src")
}
}
override fun popularMangaNextPageSelector() = "li.active + li a:not(.lastpage)"
// Latest
override fun latestUpdatesRequest(page: Int): Request {
return GET("$baseUrl/Tr/YeniMangalar?page=$page", headers)
}
override fun latestUpdatesSelector() = popularMangaSelector()
override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element)
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
// Search
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
return GET("$baseUrl/Tr/Search?kelime=$query&tur=Manga&page=$page", headers)
}
override fun searchMangaSelector() = popularMangaSelector()
override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element)
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
// Details
override fun mangaDetailsParse(document: Document): SManga {
return SManga.create().apply {
thumbnail_url = document.select("div.dec-review-img img").attr("abs:src")
genre = document.select("div.col-md-10 li:contains(Kategori) div a").joinToString { it.text() }
author = document.select("div.col-md-10 li:contains(Yazar) div a").text()
description = document.select("div.details-dectiontion p").joinToString("\n") { it.text() }
}
}
// Chapters
override fun chapterListSelector() = "div.item > div"
override fun chapterFromElement(element: Element): SChapter {
return SChapter.create().apply {
element.select("div.plylist-single-content > a[title]").let {
name = it.text()
setUrlWithoutDomain(it.attr("href"))
}
}
}
// Pages
override fun pageListParse(document: Document): List<Page> {
return document.select("div.reading-content-manga img").mapIndexed { i, img ->
Page(i, "", img.dataImageAsUrl("src"))
}
}
override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not used")
}

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest />

View File

@@ -0,0 +1,11 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
ext {
extName = 'SeriManga'
pkgNameSuffix = 'tr.serimanga'
extClass = '.SeriManga'
extVersionCode = 3
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

View File

@@ -0,0 +1,127 @@
package eu.kanade.tachiyomi.extension.tr.serimanga
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.FilterList
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 okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
import java.util.Locale
class SeriManga : ParsedHttpSource() {
override val name = "SeriManga"
override val baseUrl = "https://serimanga.com"
override val lang = "tr"
override val supportsLatest = true
override val client = network.cloudflareClient
override fun popularMangaSelector() = "a.manga-list-bg"
override fun popularMangaRequest(page: Int): Request {
return if (page == 1) {
GET("$baseUrl/mangalar", headers)
} else {
GET("$baseUrl/mangalar?page=$page", headers)
}
}
override fun popularMangaFromElement(element: Element) = SManga.create().apply {
setUrlWithoutDomain(element.attr("href"))
title = element.select("span.mlb-name").text()
thumbnail_url = styleToUrl(element).removeSurrounding("'")
}
private fun styleToUrl(element: Element): String {
return element.attr("style").substringAfter("(").substringBefore(")")
}
override fun popularMangaNextPageSelector() = "[rel=next]"
override fun latestUpdatesSelector() = "a.sli2-img"
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/?a=a&page=$page", headers)
override fun latestUpdatesFromElement(element: Element) = SManga.create().apply {
setUrlWithoutDomain(element.attr("href"))
title = element.attr("title")
thumbnail_url = styleToUrl(element)
}
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
override fun searchMangaSelector() = popularMangaSelector()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = GET("$baseUrl/mangalar?search=$query&page=$page", headers)
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element)
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
override fun mangaDetailsParse(document: Document) = SManga.create().apply {
description = document.select(".demo1").text()
genre = document.select("div.spc2rcrc-links > a").joinToString { it.text() }
status = document.select("div.is-status.is-status--green").text().let {
parseStatus(it)
}
thumbnail_url = document.select("[rel=image_src]").attr("href")
}
private fun parseStatus(status: String) = when {
status.contains("CONTINUES") -> SManga.ONGOING
status.contains("Tamamlanmış") -> SManga.COMPLETED
else -> SManga.UNKNOWN
}
override fun chapterListParse(response: Response): List<SChapter> {
val chapters = mutableListOf<SChapter>()
var document = response.asJsoup()
var continueParsing = true
while (continueParsing) {
document.select(chapterListSelector()).map { chapters.add(chapterFromElement(it)) }
document.select(popularMangaNextPageSelector()).let {
if (it.isNotEmpty()) {
document = client.newCall(GET(it.attr("abs:href"), headers)).execute().asJsoup()
} else {
continueParsing = false
}
}
}
return chapters
}
override fun chapterListSelector() = "ul.spl-list > li"
override fun chapterFromElement(element: Element) = SChapter.create().apply {
setUrlWithoutDomain(element.select("a").attr("href"))
name = "${element.select("span").first()!!.text()}: ${element.select("span")[1].text()}"
date_upload = dateFormat.parse(element.select("span")[2].ownText())?.time ?: 0
}
companion object {
val dateFormat by lazy {
SimpleDateFormat("dd MMMM yyyy", Locale("tr"))
}
}
override fun pageListParse(document: Document): List<Page> {
return document.select("div.reader-manga > img").mapIndexed { i, element ->
val url = if (element.hasAttr("data-src"))element.attr("data-src") else element.attr("src")
Page(i, "", url)
}
}
override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not Used")
override fun getFilterList() = FilterList()
}