refactor: Make extensions use the blogger-extractor lib (#2174)
This commit is contained in:
3
multisrc/overrides/dooplay/animeplayer/additional.gradle
Normal file
3
multisrc/overrides/dooplay/animeplayer/additional.gradle
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
dependencies {
|
||||||
|
implementation(project(":lib-blogger-extractor"))
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.pt.animeplayer
|
package eu.kanade.tachiyomi.animeextension.pt.animeplayer
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.animeplayer.extractors.BloggerExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
|
import eu.kanade.tachiyomi.lib.bloggerextractor.BloggerExtractor
|
||||||
import eu.kanade.tachiyomi.multisrc.dooplay.DooPlay
|
import eu.kanade.tachiyomi.multisrc.dooplay.DooPlay
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.pt.animeplayer.extractors
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import okhttp3.Headers
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
|
|
||||||
class BloggerExtractor(private val client: OkHttpClient) {
|
|
||||||
fun videosFromUrl(url: String, headers: Headers): List<Video> {
|
|
||||||
return client.newCall(GET(url)).execute()
|
|
||||||
.use { it.body.string() }
|
|
||||||
.substringAfter("\"streams\":[")
|
|
||||||
.substringBefore("]")
|
|
||||||
.split("},")
|
|
||||||
.map {
|
|
||||||
val videoUrl = it.substringAfter("{\"play_url\":\"").substringBefore('"')
|
|
||||||
val format = it.substringAfter("\"format_id\":").substringBefore("}")
|
|
||||||
val quality = when (format) {
|
|
||||||
"18" -> "360p"
|
|
||||||
"22" -> "720p"
|
|
||||||
else -> "Unknown"
|
|
||||||
}
|
|
||||||
Video(videoUrl, quality, videoUrl, headers = headers)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,4 +1,5 @@
|
|||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(project(":lib-blogger-extractor"))
|
||||||
implementation(project(":lib-filemoon-extractor"))
|
implementation(project(":lib-filemoon-extractor"))
|
||||||
implementation(project(":lib-streamwish-extractor"))
|
implementation(project(":lib-streamwish-extractor"))
|
||||||
implementation(project(":lib-mixdrop-extractor"))
|
implementation(project(":lib-mixdrop-extractor"))
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.pt.animesgratis
|
package eu.kanade.tachiyomi.animeextension.pt.animesgratis
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.animesgratis.extractors.AnimesOnlinePlayerExtractor
|
import eu.kanade.tachiyomi.animeextension.pt.animesgratis.extractors.AnimesOnlinePlayerExtractor
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.animesgratis.extractors.BloggerExtractor
|
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.animesgratis.extractors.RuplayExtractor
|
import eu.kanade.tachiyomi.animeextension.pt.animesgratis.extractors.RuplayExtractor
|
||||||
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
|
import eu.kanade.tachiyomi.lib.bloggerextractor.BloggerExtractor
|
||||||
import eu.kanade.tachiyomi.lib.filemoonextractor.FilemoonExtractor
|
import eu.kanade.tachiyomi.lib.filemoonextractor.FilemoonExtractor
|
||||||
import eu.kanade.tachiyomi.lib.mixdropextractor.MixDropExtractor
|
import eu.kanade.tachiyomi.lib.mixdropextractor.MixDropExtractor
|
||||||
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
|
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.pt.animesgratis.extractors
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import okhttp3.Headers
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
|
|
||||||
class BloggerExtractor(private val client: OkHttpClient) {
|
|
||||||
fun videosFromUrl(url: String, headers: Headers): List<Video> {
|
|
||||||
return client.newCall(GET(url, headers)).execute()
|
|
||||||
.use { it.body.string() }
|
|
||||||
.takeIf { !it.contains("errorContainer") }
|
|
||||||
.let { it ?: return emptyList() }
|
|
||||||
.substringAfter("\"streams\":[")
|
|
||||||
.substringBefore("]")
|
|
||||||
.split("},")
|
|
||||||
.map {
|
|
||||||
val videoUrl = it.substringAfter("{\"play_url\":\"").substringBefore('"')
|
|
||||||
val format = it.substringAfter("\"format_id\":").substringBefore("}")
|
|
||||||
val quality = when (format) {
|
|
||||||
"18" -> "360p"
|
|
||||||
"22" -> "720p"
|
|
||||||
else -> "Unknown"
|
|
||||||
}
|
|
||||||
Video(videoUrl, quality, videoUrl, headers = headers)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
3
multisrc/overrides/dooplay/animesync/additional.gradle
Normal file
3
multisrc/overrides/dooplay/animesync/additional.gradle
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
dependencies {
|
||||||
|
implementation(project(":lib-blogger-extractor"))
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.pt.animesync
|
package eu.kanade.tachiyomi.animeextension.pt.animesync
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.animesync.extractors.BloggerExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
|
import eu.kanade.tachiyomi.lib.bloggerextractor.BloggerExtractor
|
||||||
import eu.kanade.tachiyomi.multisrc.dooplay.DooPlay
|
import eu.kanade.tachiyomi.multisrc.dooplay.DooPlay
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.pt.animesync.extractors
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import okhttp3.Headers
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
|
|
||||||
class BloggerExtractor(private val client: OkHttpClient) {
|
|
||||||
fun videosFromUrl(url: String, headers: Headers): List<Video> {
|
|
||||||
return client.newCall(GET(url)).execute()
|
|
||||||
.use { it.body.string() }
|
|
||||||
.substringAfter("\"streams\":[")
|
|
||||||
.substringBefore("]")
|
|
||||||
.split("},")
|
|
||||||
.map {
|
|
||||||
val url = it.substringAfter("{\"play_url\":\"").substringBefore('"')
|
|
||||||
val format = it.substringAfter("\"format_id\":").substringBefore("}")
|
|
||||||
val quality = when (format) {
|
|
||||||
"18" -> "360p"
|
|
||||||
"22" -> "720p"
|
|
||||||
else -> "Unknown"
|
|
||||||
}
|
|
||||||
Video(url, "Blogger - $quality", url, headers = headers)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -11,6 +11,7 @@ ext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(project(':lib-blogger-extractor'))
|
||||||
implementation(project(':lib-gdriveplayer-extractor'))
|
implementation(project(':lib-gdriveplayer-extractor'))
|
||||||
implementation(project(':lib-yourupload-extractor'))
|
implementation(project(':lib-yourupload-extractor'))
|
||||||
implementation(project(':lib-okru-extractor'))
|
implementation(project(':lib-okru-extractor'))
|
||||||
|
@ -5,7 +5,6 @@ import android.content.SharedPreferences
|
|||||||
import androidx.preference.ListPreference
|
import androidx.preference.ListPreference
|
||||||
import androidx.preference.MultiSelectListPreference
|
import androidx.preference.MultiSelectListPreference
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.animeextension.id.neonime.extractors.BloggerExtractor
|
|
||||||
import eu.kanade.tachiyomi.animeextension.id.neonime.extractors.LinkBoxExtractor
|
import eu.kanade.tachiyomi.animeextension.id.neonime.extractors.LinkBoxExtractor
|
||||||
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
|
||||||
@ -14,6 +13,7 @@ import eu.kanade.tachiyomi.animesource.model.SAnime
|
|||||||
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
||||||
|
import eu.kanade.tachiyomi.lib.bloggerextractor.BloggerExtractor
|
||||||
import eu.kanade.tachiyomi.lib.gdriveplayerextractor.GdrivePlayerExtractor
|
import eu.kanade.tachiyomi.lib.gdriveplayerextractor.GdrivePlayerExtractor
|
||||||
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
|
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
|
||||||
import eu.kanade.tachiyomi.lib.youruploadextractor.YourUploadExtractor
|
import eu.kanade.tachiyomi.lib.youruploadextractor.YourUploadExtractor
|
||||||
@ -228,7 +228,7 @@ class NeoNime : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
videoList.addAll(OkruExtractor(client).videosFromUrl(link))
|
videoList.addAll(OkruExtractor(client).videosFromUrl(link))
|
||||||
}
|
}
|
||||||
hosterSelection.contains("yourupload") && link.contains("blogger.com") -> {
|
hosterSelection.contains("yourupload") && link.contains("blogger.com") -> {
|
||||||
videoList.addAll(BloggerExtractor(client).videosFromUrl(link, it.text()))
|
videoList.addAll(BloggerExtractor(client).videosFromUrl(link, headers, it.text()))
|
||||||
}
|
}
|
||||||
hosterSelection.contains("linkbox") && link.contains("yourupload.com") -> {
|
hosterSelection.contains("linkbox") && link.contains("yourupload.com") -> {
|
||||||
videoList.addAll(YourUploadExtractor(client).videoFromUrl(link, headers, it.text(), "Original - "))
|
videoList.addAll(YourUploadExtractor(client).videoFromUrl(link, headers, it.text(), "Original - "))
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.id.neonime.extractors
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
|
||||||
import kotlinx.serialization.Serializable
|
|
||||||
import kotlinx.serialization.decodeFromString
|
|
||||||
import kotlinx.serialization.json.Json
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import uy.kohesive.injekt.injectLazy
|
|
||||||
|
|
||||||
@Serializable
|
|
||||||
data class VideoConfig(
|
|
||||||
val streams: List<Stream>,
|
|
||||||
) {
|
|
||||||
@Serializable
|
|
||||||
data class Stream(
|
|
||||||
val play_url: String,
|
|
||||||
val format_id: Int,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
class BloggerExtractor(private val client: OkHttpClient) {
|
|
||||||
|
|
||||||
private val json: Json by injectLazy()
|
|
||||||
|
|
||||||
fun videosFromUrl(url: String, name: String): List<Video> {
|
|
||||||
val document = client.newCall(GET(url)).execute().asJsoup()
|
|
||||||
|
|
||||||
val jsElement = document.selectFirst("script:containsData(VIDEO_CONFIG)") ?: return emptyList()
|
|
||||||
val js = jsElement.data()
|
|
||||||
val json = json.decodeFromString<VideoConfig>(js.substringAfter("var VIDEO_CONFIG = "))
|
|
||||||
|
|
||||||
return json.streams.map {
|
|
||||||
Video(it.play_url, "${it.format_id} - $name", it.play_url)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -12,4 +12,8 @@ ext {
|
|||||||
libVersion = '13'
|
libVersion = '13'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(project(':lib-blogger-extractor'))
|
||||||
|
}
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
apply from: "$rootDir/common.gradle"
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.pt.animesgames
|
package eu.kanade.tachiyomi.animeextension.pt.animesgames
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.animesgames.extractors.BloggerExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimesPage
|
import eu.kanade.tachiyomi.animesource.model.AnimesPage
|
||||||
import eu.kanade.tachiyomi.animesource.model.SAnime
|
import eu.kanade.tachiyomi.animesource.model.SAnime
|
||||||
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
||||||
|
import eu.kanade.tachiyomi.lib.bloggerextractor.BloggerExtractor
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.network.POST
|
import eu.kanade.tachiyomi.network.POST
|
||||||
import eu.kanade.tachiyomi.network.asObservableSuccess
|
import eu.kanade.tachiyomi.network.asObservableSuccess
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.pt.animesgames.extractors
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import okhttp3.Headers
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
|
|
||||||
class BloggerExtractor(private val client: OkHttpClient) {
|
|
||||||
fun videosFromUrl(url: String, headers: Headers): List<Video> {
|
|
||||||
return client.newCall(GET(url, headers)).execute()
|
|
||||||
.use { it.body.string() }
|
|
||||||
.takeIf { !it.contains("errorContainer") }
|
|
||||||
.let { it ?: return emptyList() }
|
|
||||||
.substringAfter("\"streams\":[")
|
|
||||||
.substringBefore("]")
|
|
||||||
.split("},")
|
|
||||||
.map {
|
|
||||||
val videoUrl = it.substringAfter("{\"play_url\":\"").substringBefore('"')
|
|
||||||
val format = it.substringAfter("\"format_id\":").substringBefore("}")
|
|
||||||
val quality = when (format) {
|
|
||||||
"18" -> "360p"
|
|
||||||
"22" -> "720p"
|
|
||||||
else -> "Unknown"
|
|
||||||
}
|
|
||||||
Video(videoUrl, quality, videoUrl, headers = headers)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -13,4 +13,8 @@ ext {
|
|||||||
containsNsfw = true
|
containsNsfw = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(project(':lib-blogger-extractor'))
|
||||||
|
}
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
apply from: "$rootDir/common.gradle"
|
||||||
|
@ -6,7 +6,6 @@ import androidx.preference.ListPreference
|
|||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.hentaistube.HentaisTubeFilters.applyFilterParams
|
import eu.kanade.tachiyomi.animeextension.pt.hentaistube.HentaisTubeFilters.applyFilterParams
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.hentaistube.dto.ItemsListDto
|
import eu.kanade.tachiyomi.animeextension.pt.hentaistube.dto.ItemsListDto
|
||||||
import eu.kanade.tachiyomi.animeextension.pt.hentaistube.extractors.BloggerExtractor
|
|
||||||
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
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimesPage
|
import eu.kanade.tachiyomi.animesource.model.AnimesPage
|
||||||
@ -14,6 +13,7 @@ import eu.kanade.tachiyomi.animesource.model.SAnime
|
|||||||
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
||||||
|
import eu.kanade.tachiyomi.lib.bloggerextractor.BloggerExtractor
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.network.asObservableSuccess
|
import eu.kanade.tachiyomi.network.asObservableSuccess
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
@ -1,28 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.pt.hentaistube.extractors
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import okhttp3.Headers
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
|
|
||||||
class BloggerExtractor(private val client: OkHttpClient) {
|
|
||||||
fun videosFromUrl(url: String, headers: Headers): List<Video> {
|
|
||||||
return client.newCall(GET(url, headers)).execute()
|
|
||||||
.use { it.body.string() }
|
|
||||||
.takeIf { !it.contains("errorContainer") }
|
|
||||||
.let { it ?: return emptyList() }
|
|
||||||
.substringAfter("\"streams\":[")
|
|
||||||
.substringBefore("]")
|
|
||||||
.split("},")
|
|
||||||
.map {
|
|
||||||
val videoUrl = it.substringAfter("{\"play_url\":\"").substringBefore('"')
|
|
||||||
val format = it.substringAfter("\"format_id\":").substringBefore("}")
|
|
||||||
val quality = when (format) {
|
|
||||||
"18" -> "360p"
|
|
||||||
"22" -> "720p"
|
|
||||||
else -> "Unknown"
|
|
||||||
}
|
|
||||||
Video(videoUrl, quality, videoUrl, headers = headers)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Reference in New Issue
Block a user