CineVision: Some improvements (#843)

* CineVision: Reduce requests amount on search

* CineVision: add Streamlare extractor

* CineVision: Remove useless headers

* CineVision: bump version
This commit is contained in:
Claudemirovsky
2022-09-05 16:12:13 -03:00
committed by GitHub
parent 4528aa91dc
commit 4e9a6ae9c9
4 changed files with 34 additions and 13 deletions

View File

@ -5,7 +5,7 @@ ext {
extName = 'CineVision' extName = 'CineVision'
pkgNameSuffix = 'pt.cinevision' pkgNameSuffix = 'pt.cinevision'
extClass = '.CineVision' extClass = '.CineVision'
extVersionCode = 1 extVersionCode = 2
libVersion = '13' libVersion = '13'
containsNsfw = true containsNsfw = true
} }

View File

@ -1,9 +1,6 @@
package eu.kanade.tachiyomi.animeextension.pt.cinevision package eu.kanade.tachiyomi.animeextension.pt.cinevision
object CVConstants { object CVConstants {
const val ACCEPT_LANGUAGE = "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7"
const val USER_AGENT = "Mozilla/5.0 (Linux; Android 10; SM-A307GT Build/QP1A.190711.020;) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/103.0.5060.71 Mobile Safari/537.36"
const val PREFIX_SEARCH = "slug:" const val PREFIX_SEARCH = "slug:"
const val PREFERRED_QUALITY = "preferred_quality" const val PREFERRED_QUALITY = "preferred_quality"

View File

@ -4,6 +4,7 @@ import android.app.Application
import android.content.SharedPreferences import android.content.SharedPreferences
import androidx.preference.ListPreference import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.pt.cinevision.extractors.StreamlareExtractor
import eu.kanade.tachiyomi.animeextension.pt.cinevision.extractors.VidmolyExtractor import eu.kanade.tachiyomi.animeextension.pt.cinevision.extractors.VidmolyExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
@ -19,7 +20,6 @@ import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.jsonPrimitive
import okhttp3.Headers
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
@ -44,11 +44,6 @@ class CineVision : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override val client: OkHttpClient = network.client override val client: OkHttpClient = network.client
override fun headersBuilder(): Headers.Builder = Headers.Builder()
.add("Referer", baseUrl)
.add("Accept-Language", CVConstants.ACCEPT_LANGUAGE)
.add("User-Agent", CVConstants.USER_AGENT)
private val preferences: SharedPreferences by lazy { private val preferences: SharedPreferences by lazy {
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000) Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
} }
@ -129,10 +124,11 @@ class CineVision : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
) )
val url = "https:" + json["embed_url"]!!.jsonPrimitive.content val url = "https:" + json["embed_url"]!!.jsonPrimitive.content
// It may need more extractors, but i only saw it using vidmoly
return when { return when {
"vidmoly.to" in url -> "vidmoly.to" in url ->
VidmolyExtractor(client).getVideoList(url, name) VidmolyExtractor(client).getVideoList(url, name)
"streamlare.com" in url ->
StreamlareExtractor(client).videosFromUrl(url, name)
else -> emptyList<Video>() else -> emptyList<Video>()
} }
} }
@ -206,13 +202,15 @@ class CineVision : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun searchAnimeFromElement(element: Element): SAnime { override fun searchAnimeFromElement(element: Element): SAnime {
val anime = SAnime.create() val anime = SAnime.create()
anime.setUrlWithoutDomain(element.attr("href")) anime.setUrlWithoutDomain(element.attr("href"))
anime.title = element.text() val img = element.selectFirst("img")
anime.title = img.attr("alt")
anime.thumbnail_url = img.attr("data-src").replace("/p/w92", "/p/w185")
return anime return anime
} }
override fun searchAnimeNextPageSelector(): String = latestUpdatesNextPageSelector() override fun searchAnimeNextPageSelector(): String = latestUpdatesNextPageSelector()
override fun searchAnimeSelector(): String = "div.result-item div.details div.title a" override fun searchAnimeSelector(): String = "div.result-item div.image a"
// =========================== Anime Details ============================ // =========================== Anime Details ============================
override fun animeDetailsParse(document: Document): SAnime { override fun animeDetailsParse(document: Document): SAnime {

View File

@ -0,0 +1,26 @@
package eu.kanade.tachiyomi.animeextension.pt.cinevision.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.POST
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.RequestBody.Companion.toRequestBody
class StreamlareExtractor(private val client: OkHttpClient) {
fun videosFromUrl(url: String, name: String): List<Video> {
val id = url.substringAfter("/e/").substringBefore("/")
val body = "{\"id\":\"$id\"}".toRequestBody("application/json".toMediaType())
val playlist = client.newCall(
POST("https://sltube.org/api/video/stream/get", body = body)
).execute().body!!.string()
val separator = "\"label\":\""
return playlist.substringAfter(separator).split(separator).map {
val quality = "$name - " + it.substringAfter(separator).substringBefore("\",")
val videoUrl = it.substringAfter("file\":\"").substringBefore("\",")
.replace("\\", "")
Video(videoUrl, quality, videoUrl)
}
}
}