Fix subanimes search and video extractor (#1308)
* Fix anime search without filters * Fix video extractor * Prevent timeouts * Bump version
This commit is contained in:
@ -6,7 +6,7 @@ ext {
|
|||||||
extName = 'SubAnimes'
|
extName = 'SubAnimes'
|
||||||
pkgNameSuffix = 'pt.subanimes'
|
pkgNameSuffix = 'pt.subanimes'
|
||||||
extClass = '.SubAnimes'
|
extClass = '.SubAnimes'
|
||||||
extVersionCode = 1
|
extVersionCode = 2
|
||||||
libVersion = '13'
|
libVersion = '13'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ import org.jsoup.nodes.Document
|
|||||||
import org.jsoup.nodes.Element
|
import org.jsoup.nodes.Element
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
import uy.kohesive.injekt.api.get
|
import uy.kohesive.injekt.api.get
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
import kotlin.Exception
|
import kotlin.Exception
|
||||||
|
|
||||||
class SubAnimes : ParsedAnimeHttpSource() {
|
class SubAnimes : ParsedAnimeHttpSource() {
|
||||||
@ -36,7 +37,12 @@ class SubAnimes : ParsedAnimeHttpSource() {
|
|||||||
|
|
||||||
override val supportsLatest = true
|
override val supportsLatest = true
|
||||||
|
|
||||||
override val client: OkHttpClient = network.client
|
// Sometimes the site is slow.
|
||||||
|
override val client: OkHttpClient = network.client.newBuilder()
|
||||||
|
.connectTimeout(1, TimeUnit.MINUTES)
|
||||||
|
.readTimeout(1, TimeUnit.MINUTES)
|
||||||
|
.writeTimeout(1, TimeUnit.MINUTES)
|
||||||
|
.build()
|
||||||
|
|
||||||
private val json = Json {
|
private val json = Json {
|
||||||
ignoreUnknownKeys = true
|
ignoreUnknownKeys = true
|
||||||
@ -113,12 +119,10 @@ class SubAnimes : ParsedAnimeHttpSource() {
|
|||||||
override fun videoUrlParse(document: Document) = throw Exception("not used")
|
override fun videoUrlParse(document: Document) = throw Exception("not used")
|
||||||
|
|
||||||
// =============================== Search ===============================
|
// =============================== Search ===============================
|
||||||
// We'll be using serialization in the search system,
|
override fun searchAnimeFromElement(element: Element) = latestUpdatesFromElement(element)
|
||||||
// so those functions won't be used.
|
override fun searchAnimeSelector() = "div.aniItem > a"
|
||||||
override fun searchAnimeFromElement(element: Element) = throw Exception("not used")
|
override fun searchAnimeNextPageSelector() = latestUpdatesNextPageSelector()
|
||||||
override fun searchAnimeSelector() = throw Exception("not used")
|
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList) = GET("$baseUrl/page/$page/?s=$query")
|
||||||
override fun searchAnimeNextPageSelector() = throw Exception("not used")
|
|
||||||
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request = throw Exception("not used")
|
|
||||||
|
|
||||||
override fun getFilterList(): AnimeFilterList = SBFilters.filterList
|
override fun getFilterList(): AnimeFilterList = SBFilters.filterList
|
||||||
|
|
||||||
@ -130,6 +134,10 @@ class SubAnimes : ParsedAnimeHttpSource() {
|
|||||||
.map { searchAnimeBySlugParse(it, slug) }
|
.map { searchAnimeBySlugParse(it, slug) }
|
||||||
} else {
|
} else {
|
||||||
val params = SBFilters.getSearchParameters(filters)
|
val params = SBFilters.getSearchParameters(filters)
|
||||||
|
|
||||||
|
if (params == SBFilters.FilterSearchParams()) // no filters
|
||||||
|
return super.fetchSearchAnime(page, query, filters)
|
||||||
|
|
||||||
client.newCall(searchAnimeRequest(page, query, params))
|
client.newCall(searchAnimeRequest(page, query, params))
|
||||||
.asObservableSuccess()
|
.asObservableSuccess()
|
||||||
.map { searchAnimeParse(it, page) }
|
.map { searchAnimeParse(it, page) }
|
||||||
|
@ -9,25 +9,26 @@ import okhttp3.OkHttpClient
|
|||||||
class SubAnimesExtractor(private val client: OkHttpClient) {
|
class SubAnimesExtractor(private val client: OkHttpClient) {
|
||||||
|
|
||||||
fun videoListFromUrl(url: String, player: String, headers: Headers): List<Video> {
|
fun videoListFromUrl(url: String, player: String, headers: Headers): List<Video> {
|
||||||
val iframeBody = client.newCall(GET(url)).execute().asJsoup()
|
val playerUrl = url.replace("&p=true", "")
|
||||||
val newHeaders = headers.newBuilder().set("Referer", url).build()
|
val iframeBody = client.newCall(GET(playerUrl)).execute().asJsoup()
|
||||||
|
val newHeaders = headers.newBuilder().set("Referer", playerUrl).build()
|
||||||
val script = iframeBody.selectFirst("script:containsData(addButton)").data()
|
val script = iframeBody.selectFirst("script:containsData(addButton)").data()
|
||||||
return if (script.contains("vSources")) {
|
return if (script.contains("vSources")) {
|
||||||
val sources = script.substringAfter("vSources").substringBefore(";")
|
val sources = script.substringAfter("vSources").substringBefore(";")
|
||||||
sources.split("src\":").drop(1).map {
|
sources.split("src\":").drop(1).map {
|
||||||
val url = it.substringAfter("\"")
|
val videoUrl = it.substringAfter("\"")
|
||||||
.substringBefore("\"")
|
.substringBefore("\"")
|
||||||
.replace("\\", "")
|
.replace("\\", "")
|
||||||
.trim()
|
.trim()
|
||||||
val quality = it.substringAfter("size\":").substringBefore("}")
|
val quality = it.substringAfter("size\":").substringBefore("}")
|
||||||
Video(url, "$player - ${quality}p", url, headers)
|
Video(videoUrl, "$player - ${quality}p", videoUrl, newHeaders)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
val url = script.substringAfter("file:")
|
val videoUrl = script.substringAfter("file:")
|
||||||
.substringAfter("'")
|
.substringAfter("'")
|
||||||
.substringBefore("'")
|
.substringBefore("'")
|
||||||
.trim()
|
.trim()
|
||||||
listOf(Video(url, player, url, newHeaders))
|
listOf(Video(videoUrl, player, videoUrl, newHeaders))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user