feat(hi/yomovies): Add Minoplres extractor (#2256)

This commit is contained in:
Claudemirovsky
2023-09-25 08:32:00 -03:00
committed by GitHub
parent fe94803815
commit 98c2c7c55c
4 changed files with 44 additions and 11 deletions

View File

@ -1,11 +1,13 @@
apply plugin: 'com.android.application' plugins {
apply plugin: 'kotlin-android' alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
}
ext { ext {
extName = 'YoMovies' extName = 'YoMovies'
pkgNameSuffix = 'hi.yomovies' pkgNameSuffix = 'hi.yomovies'
extClass = '.YoMovies' extClass = '.YoMovies'
extVersionCode = 2 extVersionCode = 3
libVersion = '13' libVersion = '13'
containsNsfw = true containsNsfw = true
} }

View File

@ -1,12 +1,12 @@
package eu.kanade.tachiyomi.animeextension.hi.yomovies package eu.kanade.tachiyomi.animeextension.hi.yomovies
import android.app.Application import android.app.Application
import android.content.SharedPreferences
import android.widget.Toast import android.widget.Toast
import androidx.preference.EditTextPreference import androidx.preference.EditTextPreference
import androidx.preference.ListPreference import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.AppInfo import eu.kanade.tachiyomi.AppInfo
import eu.kanade.tachiyomi.animeextension.hi.yomovies.extractors.MinoplresExtractor
import eu.kanade.tachiyomi.animeextension.hi.yomovies.extractors.MovembedExtractor import eu.kanade.tachiyomi.animeextension.hi.yomovies.extractors.MovembedExtractor
import eu.kanade.tachiyomi.animeextension.hi.yomovies.extractors.SpeedostreamExtractor import eu.kanade.tachiyomi.animeextension.hi.yomovies.extractors.SpeedostreamExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
@ -44,7 +44,7 @@ class YoMovies : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override val client: OkHttpClient = network.cloudflareClient override val client: OkHttpClient = network.cloudflareClient
private val preferences: SharedPreferences by lazy { private val preferences by lazy {
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000) Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
} }
@ -108,7 +108,7 @@ class YoMovies : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
// ============================== Episodes ============================== // ============================== Episodes ==============================
override fun episodeListParse(response: Response): List<SEpisode> { override fun episodeListParse(response: Response): List<SEpisode> {
val document = response.asJsoup() val document = response.use { it.asJsoup() }
val episodeList = mutableListOf<SEpisode>() val episodeList = mutableListOf<SEpisode>()
val seasonList = document.select("div#seasons > div.tvseason") val seasonList = document.select("div#seasons > div.tvseason")
@ -149,7 +149,7 @@ class YoMovies : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
// ============================ Video Links ============================= // ============================ Video Links =============================
override fun videoListParse(response: Response): List<Video> { override fun videoListParse(response: Response): List<Video> {
val document = response.asJsoup() val document = response.use { it.asJsoup() }
val videoList = document.select("div[id*=tab]:has(div.movieplay > iframe)").parallelMap { server -> val videoList = document.select("div[id*=tab]:has(div.movieplay > iframe)").parallelMap { server ->
val iframe = server.selectFirst("div.movieplay > iframe")!! val iframe = server.selectFirst("div.movieplay > iframe")!!
@ -176,6 +176,10 @@ class YoMovies : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
iframeUrl.contains("movembed.cc") -> { iframeUrl.contains("movembed.cc") -> {
MovembedExtractor(client, headers).videosFromUrl(iframeUrl) MovembedExtractor(client, headers).videosFromUrl(iframeUrl)
} }
iframeUrl.contains("minoplres") -> {
MinoplresExtractor(client, headers).videosFromUrl(iframeUrl, name)
}
else -> emptyList() else -> emptyList()
} }
} }
@ -202,7 +206,7 @@ class YoMovies : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
override fun List<Video>.sort(): List<Video> { override fun List<Video>.sort(): List<Video> {
val quality = preferences.getString(PREF_QUALITY_KEY, PREF_QUALITY_DEFAULT)!! val quality = preferences.getString(PREF_QUALITY_KEY, PREF_QUALITY_DEFAULT)!!
return this.sortedWith( return sortedWith(
compareBy( compareBy(
{ it.quality.contains(quality) }, { it.quality.contains(quality) },
{ Regex("""(\d+)p""").find(it.quality)?.groupValues?.get(1)?.toIntOrNull() ?: 0 }, { Regex("""(\d+)p""").find(it.quality)?.groupValues?.get(1)?.toIntOrNull() ?: 0 },
@ -211,7 +215,7 @@ class YoMovies : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
} }
// From Dopebox // From Dopebox
private fun <A, B> Iterable<A>.parallelMap(f: suspend (A) -> B): List<B> = private inline fun <A, B> Iterable<A>.parallelMap(crossinline f: suspend (A) -> B): List<B> =
runBlocking { runBlocking {
map { async(Dispatchers.Default) { f(it) } }.awaitAll() map { async(Dispatchers.Default) { f(it) } }.awaitAll()
} }
@ -219,7 +223,7 @@ class YoMovies : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
companion object { companion object {
private val PREF_DOMAIN_KEY = "preferred_domain_name_v${AppInfo.getVersionName()}" private val PREF_DOMAIN_KEY = "preferred_domain_name_v${AppInfo.getVersionName()}"
private const val PREF_DOMAIN_TITLE = "Override BaseUrl" private const val PREF_DOMAIN_TITLE = "Override BaseUrl"
private const val PREF_DOMAIN_DEFAULT = "https://yomovies.baby" private const val PREF_DOMAIN_DEFAULT = "https://yomovies.cheap"
private const val PREF_DOMAIN_SUMMARY = "For temporary uses. Updating the extension will erase this setting." private const val PREF_DOMAIN_SUMMARY = "For temporary uses. Updating the extension will erase this setting."
private const val PREF_QUALITY_KEY = "preferred_quality" private const val PREF_QUALITY_KEY = "preferred_quality"

View File

@ -0,0 +1,27 @@
package eu.kanade.tachiyomi.animeextension.hi.yomovies.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.lib.playlistutils.PlaylistUtils
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers
import okhttp3.OkHttpClient
class MinoplresExtractor(private val client: OkHttpClient, private val headers: Headers) {
private val playlistUtils by lazy { PlaylistUtils(client, headers) }
fun videosFromUrl(url: String, name: String): List<Video> {
val newHeaders = headers.newBuilder().set("Referer", url).build()
val doc = client.newCall(GET(url, newHeaders)).execute()
.use { it.asJsoup() }
val script = doc.selectFirst("script:containsData(sources:)")?.data()
?: return emptyList()
val masterUrl = script.substringAfter("file:\"").substringBefore('"')
return playlistUtils.extractFromHls(
masterUrl,
referer = url,
videoNameGen = { "$name Minoplres - $it" },
)
}
}

View File

@ -50,7 +50,7 @@ class MovembedExtractor(private val client: OkHttpClient, private val headers: H
} }
// From Dopebox // From Dopebox
private fun <A, B> Iterable<A>.parallelMap(f: suspend (A) -> B): List<B> = private inline fun <A, B> Iterable<A>.parallelMap(crossinline f: suspend (A) -> B): List<B> =
runBlocking { runBlocking {
map { async(Dispatchers.Default) { f(it) } }.awaitAll() map { async(Dispatchers.Default) { f(it) } }.awaitAll()
} }