New Source [OnePace] (#688)
This commit is contained in:
committed by
GitHub
parent
9092d6f1af
commit
617c5c7ba1
2
src/all/onepace/AndroidManifest.xml
Normal file
2
src/all/onepace/AndroidManifest.xml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest package="eu.kanade.tachiyomi.animeextension" />
|
13
src/all/onepace/build.gradle
Normal file
13
src/all/onepace/build.gradle
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
apply plugin: 'com.android.application'
|
||||||
|
apply plugin: 'kotlin-android'
|
||||||
|
|
||||||
|
ext {
|
||||||
|
extName = 'Onepace'
|
||||||
|
pkgNameSuffix = 'all.onepace'
|
||||||
|
extClass = '.OnepaceFactory'
|
||||||
|
extVersionCode = 1
|
||||||
|
libVersion = '12'
|
||||||
|
containsNsfw = false
|
||||||
|
}
|
||||||
|
|
||||||
|
apply from: "$rootDir/common.gradle"
|
BIN
src/all/onepace/res/mipmap-hdpi/ic_launcher.png
Normal file
BIN
src/all/onepace/res/mipmap-hdpi/ic_launcher.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
BIN
src/all/onepace/res/mipmap-mdpi/ic_launcher.png
Normal file
BIN
src/all/onepace/res/mipmap-mdpi/ic_launcher.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
BIN
src/all/onepace/res/mipmap-xhdpi/ic_launcher.png
Normal file
BIN
src/all/onepace/res/mipmap-xhdpi/ic_launcher.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
BIN
src/all/onepace/res/mipmap-xxhdpi/ic_launcher.png
Normal file
BIN
src/all/onepace/res/mipmap-xxhdpi/ic_launcher.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
BIN
src/all/onepace/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
BIN
src/all/onepace/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
@ -0,0 +1,156 @@
|
|||||||
|
package eu.kanade.tachiyomi.animeextension.all.onepace
|
||||||
|
|
||||||
|
import androidx.preference.PreferenceScreen
|
||||||
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
||||||
|
import eu.kanade.tachiyomi.animesource.model.AnimesPage
|
||||||
|
import eu.kanade.tachiyomi.animesource.model.SAnime
|
||||||
|
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
||||||
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
|
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
import kotlinx.serialization.decodeFromString
|
||||||
|
import kotlinx.serialization.json.Json
|
||||||
|
import kotlinx.serialization.json.JsonObject
|
||||||
|
import kotlinx.serialization.json.jsonArray
|
||||||
|
import kotlinx.serialization.json.jsonObject
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
import okhttp3.Request
|
||||||
|
import okhttp3.Response
|
||||||
|
import org.jsoup.nodes.Document
|
||||||
|
import org.jsoup.nodes.Element
|
||||||
|
import uy.kohesive.injekt.api.get
|
||||||
|
import uy.kohesive.injekt.injectLazy
|
||||||
|
import java.lang.Exception
|
||||||
|
import java.net.URLEncoder
|
||||||
|
|
||||||
|
open class Onepace(override val lang: String, override val name: String) : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
||||||
|
|
||||||
|
override val baseUrl = "https://www.zippyshare.com/rest/public/getTree?user=onepace&ident=kbvatgfc&id=%23"
|
||||||
|
|
||||||
|
override val supportsLatest = false
|
||||||
|
|
||||||
|
override val client: OkHttpClient = network.cloudflareClient
|
||||||
|
|
||||||
|
private val json: Json by injectLazy()
|
||||||
|
|
||||||
|
override fun popularAnimeParse(response: Response): AnimesPage {
|
||||||
|
val animes = mutableListOf<SAnime>()
|
||||||
|
val document = client.newCall(GET(baseUrl)).execute().asJsoup()
|
||||||
|
val responseJson = json.decodeFromString<JsonObject>(document.select("body").text().dropLast(1).drop(1))
|
||||||
|
val childrenJson = responseJson["children"]?.jsonArray
|
||||||
|
// 0 = eng, 1 = sp, 2 = fr
|
||||||
|
val langId = when (lang) {
|
||||||
|
"es" -> 1
|
||||||
|
"en" -> 0
|
||||||
|
"fr" -> 2
|
||||||
|
else -> 0
|
||||||
|
}
|
||||||
|
val langAnJson = childrenJson!![langId].jsonObject["children"]!!.jsonArray
|
||||||
|
langAnJson.forEach {
|
||||||
|
val anName = it.jsonObject["text"].toString().replace("\"", "")
|
||||||
|
val anId = it.jsonObject["li_attr"]!!.jsonObject["ident"].toString().replace("\"", "")
|
||||||
|
val anStatus = if (anName.contains("Completo")) SAnime.COMPLETED else SAnime.ONGOING
|
||||||
|
val thumUrl = thumAnimeParser(anName)
|
||||||
|
animes.add(
|
||||||
|
SAnime.create().apply {
|
||||||
|
title = anName
|
||||||
|
status = anStatus
|
||||||
|
url = "https://www.zippyshare.com/onepace/$anId/dir.html"
|
||||||
|
thumbnail_url = thumUrl
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return AnimesPage(animes, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun thumAnimeParser(animeName: String): String {
|
||||||
|
val document = client.newCall(GET("https://onepace.net/_next/data/BM0nGdjN96o4xOSQR37x8/es/watch.json")).execute().asJsoup()
|
||||||
|
val jsonResponse = json.decodeFromString<JsonObject>(document.body().text())["pageProps"]!!
|
||||||
|
val arcsJson = jsonResponse.jsonObject["arcs"]!!.jsonArray
|
||||||
|
arcsJson.forEach {
|
||||||
|
val thumId = it.jsonObject["images"]!!.jsonArray[0].jsonObject["src"].toString().replace("\"", "")
|
||||||
|
val langTitle = it.jsonObject["translations"]!!.jsonArray
|
||||||
|
langTitle.forEach { j ->
|
||||||
|
val langCode = j.jsonObject["language"]!!.jsonObject["code"]
|
||||||
|
if (langCode.toString().replace("\"", "") == lang) {
|
||||||
|
val title = j.jsonObject["title"].toString().replace("\"", "")
|
||||||
|
if (animeName.lowercase().contains(title.lowercase())) return "https://onepace.net/_next/image?url=%2Fimages%2Farcs%2F$thumId&w=828&q=75"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun popularAnimeRequest(page: Int): Request = GET(baseUrl)
|
||||||
|
|
||||||
|
override fun popularAnimeNextPageSelector() = throw Exception("not used")
|
||||||
|
|
||||||
|
override fun popularAnimeSelector() = throw Exception("not used")
|
||||||
|
|
||||||
|
override fun popularAnimeFromElement(element: Element) = throw Exception("not used")
|
||||||
|
|
||||||
|
override fun episodeListParse(response: Response): List<SEpisode> {
|
||||||
|
val episodes = mutableListOf<SEpisode>()
|
||||||
|
val Realurl = response.request.url.toString().substringAfter("%23")
|
||||||
|
val jsoup = client.newCall(GET(Realurl)).execute().asJsoup()
|
||||||
|
jsoup.select("table.listingplikow tbody tr.filerow.even").forEach {
|
||||||
|
val epName = it.select("td.cien a.name").text().replace(".mp4", "")
|
||||||
|
val epNum = epName.substringAfter("][").substringBefore("]").replace("-", ".").replace(",", ".").toFloat()
|
||||||
|
val epUrl = it.select("td.cien a.name").attr("href")
|
||||||
|
episodes.add(
|
||||||
|
SEpisode.create().apply {
|
||||||
|
name = epName
|
||||||
|
url = epUrl
|
||||||
|
episode_number = epNum
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return episodes
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun episodeListSelector() = throw Exception("not used")
|
||||||
|
|
||||||
|
override fun episodeFromElement(element: Element) = throw Exception("not used")
|
||||||
|
|
||||||
|
override fun videoListParse(response: Response): List<Video> {
|
||||||
|
// This is a shit but work
|
||||||
|
val realUrl = "https:" + response.request.url.toString().substringAfter("%23")
|
||||||
|
val hostUrl = realUrl.substringBefore("/v/")
|
||||||
|
val document = client.newCall(GET(realUrl)).execute().asJsoup()
|
||||||
|
val timeId = document.selectFirst("script:containsData(var a = function())").data().substringAfter("+(").substringBefore("%1000")
|
||||||
|
val videoId = realUrl.substringAfter("/v/").substringBefore("/file")
|
||||||
|
val videoName = document.selectFirst("div.center div font+font").text()
|
||||||
|
val videoUrl = "$hostUrl/d/$videoId/${(timeId.toInt() % 1000) + 11}/${URLEncoder.encode(videoName)}"
|
||||||
|
return listOf(Video(videoUrl, "ZippyShare", videoUrl, null))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun videoListSelector() = throw Exception("not used")
|
||||||
|
|
||||||
|
override fun videoUrlParse(document: Document) = throw Exception("not used")
|
||||||
|
|
||||||
|
override fun videoFromElement(element: Element) = throw Exception("not used")
|
||||||
|
|
||||||
|
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList) = throw Exception("not used")
|
||||||
|
|
||||||
|
override fun searchAnimeFromElement(element: Element) = throw Exception("not used")
|
||||||
|
|
||||||
|
override fun searchAnimeNextPageSelector() = throw Exception("not used")
|
||||||
|
|
||||||
|
override fun searchAnimeSelector() = throw Exception("not used")
|
||||||
|
|
||||||
|
override fun latestUpdatesNextPageSelector() = throw Exception("not used")
|
||||||
|
|
||||||
|
override fun latestUpdatesFromElement(element: Element) = throw Exception("not used")
|
||||||
|
|
||||||
|
override fun latestUpdatesRequest(page: Int) = throw Exception("not used")
|
||||||
|
|
||||||
|
override fun latestUpdatesSelector() = throw Exception("not used")
|
||||||
|
|
||||||
|
override fun animeDetailsParse(document: Document) = throw Exception("ඞ")
|
||||||
|
|
||||||
|
override fun setupPreferenceScreen(screen: PreferenceScreen) = throw Exception("not used")
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package eu.kanade.tachiyomi.animeextension.all.onepace
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.animesource.AnimeSource
|
||||||
|
import eu.kanade.tachiyomi.animesource.AnimeSourceFactory
|
||||||
|
|
||||||
|
class OnepaceFactory : AnimeSourceFactory {
|
||||||
|
override fun createSources(): List<AnimeSource> = listOf(
|
||||||
|
OnepaceEspa(),
|
||||||
|
OnepaceFr(),
|
||||||
|
OnepaceEn()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
class OnepaceEspa : Onepace("es", "OnePaceESP")
|
||||||
|
class OnepaceFr : Onepace("fr", "OnePaceFR")
|
||||||
|
class OnepaceEn : Onepace("en", "OnePaceEN")
|
Reference in New Issue
Block a user