diff --git a/src/ar/shqqaa/build.gradle b/src/ar/shqqaa/build.gradle new file mode 100644 index 000000000..fec7285cc --- /dev/null +++ b/src/ar/shqqaa/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + appName = 'Tachiyomi: Shqqaa Manga' + pkgNameSuffix = 'ar.shqqaa' + extClass = '.Shqqaa' + extVersionCode = 1 + libVersion = '1.2' +} + +apply from: "$rootDir/common.gradle" diff --git a/src/ar/shqqaa/res/mipmap-hdpi/ic_launcher.png b/src/ar/shqqaa/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..92a98f26b Binary files /dev/null and b/src/ar/shqqaa/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/ar/shqqaa/res/mipmap-mdpi/ic_launcher.png b/src/ar/shqqaa/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..65d7042fc Binary files /dev/null and b/src/ar/shqqaa/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/ar/shqqaa/res/mipmap-xhdpi/ic_launcher.png b/src/ar/shqqaa/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..1beb8ec4b Binary files /dev/null and b/src/ar/shqqaa/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/ar/shqqaa/res/mipmap-xxhdpi/ic_launcher.png b/src/ar/shqqaa/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..b3990c6f1 Binary files /dev/null and b/src/ar/shqqaa/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/ar/shqqaa/res/mipmap-xxxhdpi/ic_launcher.png b/src/ar/shqqaa/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..079f36bec Binary files /dev/null and b/src/ar/shqqaa/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/ar/shqqaa/res/web_hi_res_512.png b/src/ar/shqqaa/res/web_hi_res_512.png new file mode 100644 index 000000000..999e42808 Binary files /dev/null and b/src/ar/shqqaa/res/web_hi_res_512.png differ diff --git a/src/ar/shqqaa/src/eu/kanade/tachiyomi/extension/ar/shqqaa/Shqqaa.kt b/src/ar/shqqaa/src/eu/kanade/tachiyomi/extension/ar/shqqaa/Shqqaa.kt new file mode 100644 index 000000000..3e36af0fb --- /dev/null +++ b/src/ar/shqqaa/src/eu/kanade/tachiyomi/extension/ar/shqqaa/Shqqaa.kt @@ -0,0 +1,120 @@ +package eu.kanade.tachiyomi.extension.ar.shqqaa + +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.source.model.* +import eu.kanade.tachiyomi.source.online.ParsedHttpSource +import okhttp3.OkHttpClient +import okhttp3.Request +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable + +class Shqqaa : ParsedHttpSource() { + + override val name = "مانجا شقاع" + + override val baseUrl = "https://www.shqqaa.com" + + override val lang = "ar" + + override val supportsLatest = true + + override val client: OkHttpClient = network.cloudflareClient + + // Popular + override fun popularMangaRequest(page: Int): Request { + return GET("$baseUrl/manga", headers) + } + + override fun popularMangaSelector() = "div.card" + + override fun popularMangaFromElement(element: Element): SManga { + val manga = SManga.create() + manga.thumbnail_url = element.select("img").first().attr("data-src") + element.select("a").first().let { + manga.setUrlWithoutDomain(it.attr("href")) + manga.title = it.attr("title").split(", ")[0] + } + return manga + } + + override fun popularMangaNextPageSelector(): String? = null + + // Latest + override fun latestUpdatesRequest(page: Int): Request { + return GET("$baseUrl/manga/chapters/", headers) + } + + override fun latestUpdatesSelector(): String = "div.row > div.col-xl-3" + + override fun latestUpdatesFromElement(element: Element): SManga { + val manga = SManga.create() + element.select("a").first().let { + manga.setUrlWithoutDomain("${it.attr("href").substringBeforeLast('/')}/") + manga.title = element.select("small").first().text().split(", ")[0] + } + manga.thumbnail_url = element.select("img").first().attr("data-src") + return manga + } + + override fun latestUpdatesNextPageSelector(): String? = null + + // Search + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable = Observable.empty() + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = throw Exception("Not used") + + override fun searchMangaSelector(): String = throw Exception("Not Used") + + override fun searchMangaFromElement(element: Element): SManga = throw Exception("Not Used") + + override fun searchMangaNextPageSelector() = throw Exception("Not Used") + + // Manga summary page + override fun mangaDetailsParse(document: Document): SManga { + val infoElement = document.select("div.col-sm-12") + val mangaInfo = infoElement[1] + val manga = SManga.create() + manga.title = mangaInfo.select("small.text-muted")[1].ownText().split(", ")[0] + manga.author = null + val status = mangaInfo.select("span.badge").first().ownText() + manga.status = parseStatus(status) + manga.genre = null + manga.description = infoElement.first().select(".text-muted").first().ownText() + manga.thumbnail_url = mangaInfo.select("img").attr("data-src") + return manga + } + + private fun parseStatus(status: String?) = when { + status == null -> SManga.UNKNOWN + status.contains("مستمر") -> SManga.ONGOING + status.contains("منتهي") -> SManga.COMPLETED + else -> SManga.UNKNOWN + } + + // Chapters + override fun chapterListSelector() = "a.m-1" + + override fun chapterFromElement(element: Element): SChapter { + val chapter = SChapter.create() + element.select("a").let { + chapter.setUrlWithoutDomain(it.attr("href")) + chapter.name = it.text() + } + chapter.date_upload = 0 + return chapter + } + + // Pages + override fun pageListParse(document: Document): List { + val pages = mutableListOf() + document.select("div.img-manga img").forEach { + pages.add(Page(pages.size, "", it.attr("src"))) + } + return pages + } + override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not used") + + override fun getFilterList() = FilterList() + +}