AnimeLatinoHd: Update video extraction (#1592)
This commit is contained in:
parent
bb678e9562
commit
0413e1b263
@ -5,12 +5,11 @@ ext {
|
|||||||
extName = 'AnimeLatinoHD'
|
extName = 'AnimeLatinoHD'
|
||||||
pkgNameSuffix = 'es.animelatinohd'
|
pkgNameSuffix = 'es.animelatinohd'
|
||||||
extClass = '.AnimeLatinoHD'
|
extClass = '.AnimeLatinoHD'
|
||||||
extVersionCode = 21
|
extVersionCode = 22
|
||||||
libVersion = '13'
|
libVersion = '13'
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(project(':lib-fembed-extractor'))
|
|
||||||
implementation(project(':lib-streamtape-extractor'))
|
implementation(project(':lib-streamtape-extractor'))
|
||||||
implementation(project(':lib-okru-extractor'))
|
implementation(project(':lib-okru-extractor'))
|
||||||
implementation(project(':lib-streamsb-extractor'))
|
implementation(project(':lib-streamsb-extractor'))
|
||||||
|
@ -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.es.animelatinohd.extractors.FilemoonExtractor
|
||||||
import eu.kanade.tachiyomi.animeextension.es.animelatinohd.extractors.SolidFilesExtractor
|
import eu.kanade.tachiyomi.animeextension.es.animelatinohd.extractors.SolidFilesExtractor
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
||||||
@ -14,7 +15,6 @@ 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.doodextractor.DoodExtractor
|
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
|
||||||
import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor
|
|
||||||
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
|
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
|
||||||
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
|
import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor
|
||||||
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
|
import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor
|
||||||
@ -167,7 +167,11 @@ class AnimeLatinoHD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
val request = client.newCall(
|
val request = client.newCall(
|
||||||
GET(
|
GET(
|
||||||
url = "https://api.animelatinohd.com/stream/${item["id"]!!.jsonPrimitive.content}",
|
url = "https://api.animelatinohd.com/stream/${item["id"]!!.jsonPrimitive.content}",
|
||||||
headers = headers.newBuilder().add("Referer", "https://www.animelatinohd.com/").build(),
|
headers = headers.newBuilder()
|
||||||
|
.add("Referer", "https://www.animelatinohd.com/")
|
||||||
|
.add("authority", "api.animelatinohd.com")
|
||||||
|
.add("upgrade-insecure-requests", "1")
|
||||||
|
.build(),
|
||||||
),
|
),
|
||||||
).execute()
|
).execute()
|
||||||
val locationsDdh = request!!.networkResponse.toString()
|
val locationsDdh = request!!.networkResponse.toString()
|
||||||
@ -182,41 +186,23 @@ class AnimeLatinoHD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
embedUrl.contains("sbfast") || embedUrl.contains("sbfull.com") || embedUrl.contains("javplaya.com") ||
|
embedUrl.contains("sbfast") || embedUrl.contains("sbfull.com") || embedUrl.contains("javplaya.com") ||
|
||||||
embedUrl.contains("ssbstream.net") || embedUrl.contains("p1ayerjavseen.com") || embedUrl.contains("sbthe.com") ||
|
embedUrl.contains("ssbstream.net") || embedUrl.contains("p1ayerjavseen.com") || embedUrl.contains("sbthe.com") ||
|
||||||
embedUrl.contains("vidmovie.xyz") || embedUrl.contains("sbspeed.com") || embedUrl.contains("streamsss.net") ||
|
embedUrl.contains("vidmovie.xyz") || embedUrl.contains("sbspeed.com") || embedUrl.contains("streamsss.net") ||
|
||||||
embedUrl.contains("sblanh.com")
|
embedUrl.contains("sblanh.com") || embedUrl.contains("lvturbo.com")
|
||||||
) {
|
) {
|
||||||
val videos = StreamSBExtractor(client).videosFromUrl(url, headers, language)
|
val videos = StreamSBExtractor(client).videosFromUrl(url, headers, language)
|
||||||
videoList.addAll(videos)
|
videoList.addAll(videos)
|
||||||
}
|
}
|
||||||
if (embedUrl.contains("fembed") || embedUrl.contains("anime789.com") || embedUrl.contains("24hd.club") ||
|
if (embedUrl.contains("filemoon")) {
|
||||||
embedUrl.contains("fembad.org") || embedUrl.contains("vcdn.io") || embedUrl.contains("sharinglink.club") ||
|
FilemoonExtractor(client).videoFromUrl(url, language)?.let {
|
||||||
embedUrl.contains("moviemaniac.org") || embedUrl.contains("votrefiles.club") || embedUrl.contains("femoload.xyz") ||
|
videoList.addAll(it)
|
||||||
embedUrl.contains("albavido.xyz") || embedUrl.contains("feurl.com") || embedUrl.contains("dailyplanet.pw") ||
|
}
|
||||||
embedUrl.contains("ncdnstm.com") || embedUrl.contains("jplayer.net") || embedUrl.contains("xstreamcdn.com") ||
|
|
||||||
embedUrl.contains("fembed-hd.com") || embedUrl.contains("gcloud.live") || embedUrl.contains("vcdnplay.com") ||
|
|
||||||
embedUrl.contains("superplayxyz.club") || embedUrl.contains("vidohd.com") || embedUrl.contains("vidsource.me") ||
|
|
||||||
embedUrl.contains("cinegrabber.com") || embedUrl.contains("votrefile.xyz") || embedUrl.contains("zidiplay.com") ||
|
|
||||||
embedUrl.contains("ndrama.xyz") || embedUrl.contains("fcdn.stream") || embedUrl.contains("mediashore.org") ||
|
|
||||||
embedUrl.contains("suzihaza.com") || embedUrl.contains("there.to") || embedUrl.contains("femax20.com") ||
|
|
||||||
embedUrl.contains("javstream.top") || embedUrl.contains("viplayer.cc") || embedUrl.contains("sexhd.co") ||
|
|
||||||
embedUrl.contains("fembed.net") || embedUrl.contains("mrdhan.com") || embedUrl.contains("votrefilms.xyz") ||
|
|
||||||
embedUrl.contains("embedsito.com") || embedUrl.contains("dutrag.com") || embedUrl.contains("youvideos.ru") ||
|
|
||||||
embedUrl.contains("streamm4u.club") || embedUrl.contains("moviepl.xyz") || embedUrl.contains("asianclub.tv") ||
|
|
||||||
embedUrl.contains("vidcloud.fun") || embedUrl.contains("fplayer.info") || embedUrl.contains("diasfem.com") ||
|
|
||||||
embedUrl.contains("javpoll.com") || embedUrl.contains("reeoov.tube") || embedUrl.contains("suzihaza.com") ||
|
|
||||||
embedUrl.contains("ezsubz.com") || embedUrl.contains("vidsrc.xyz") || embedUrl.contains("diampokusy.com") ||
|
|
||||||
embedUrl.contains("diampokusy.com") || embedUrl.contains("i18n.pw") || embedUrl.contains("vanfem.com") ||
|
|
||||||
embedUrl.contains("fembed9hd.com") || embedUrl.contains("votrefilms.xyz") || embedUrl.contains("watchjavnow.xyz")
|
|
||||||
) {
|
|
||||||
val videos = FembedExtractor(client).videosFromUrl(url, language)
|
|
||||||
videoList.addAll(videos)
|
|
||||||
}
|
}
|
||||||
if (url.lowercase().contains("streamtape")) {
|
if (embedUrl.contains("streamtape")) {
|
||||||
val video = StreamTapeExtractor(client).videoFromUrl(url, language + "Streamtape")
|
val video = StreamTapeExtractor(client).videoFromUrl(url, language + "Streamtape")
|
||||||
if (video != null) {
|
if (video != null) {
|
||||||
videoList.add(video)
|
videoList.add(video)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (url.lowercase().contains("dood")) {
|
if (embedUrl.contains("dood")) {
|
||||||
val video = try {
|
val video = try {
|
||||||
DoodExtractor(client).videoFromUrl(url, language + "DoodStream")
|
DoodExtractor(client).videoFromUrl(url, language + "DoodStream")
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
@ -226,18 +212,18 @@ class AnimeLatinoHD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
videoList.add(video)
|
videoList.add(video)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (url.lowercase().contains("okru")) {
|
if (embedUrl.contains("okru") || embedUrl.contains("ok.ru")) {
|
||||||
val videos = OkruExtractor(client).videosFromUrl(url, language)
|
val videos = OkruExtractor(client).videosFromUrl(url, language)
|
||||||
videoList.addAll(videos)
|
videoList.addAll(videos)
|
||||||
}
|
}
|
||||||
if (url.lowercase().contains("www.solidfiles.com")) {
|
if (embedUrl.contains("solidfiles")) {
|
||||||
val videos = SolidFilesExtractor(client).videosFromUrl(url, language)
|
val videos = SolidFilesExtractor(client).videosFromUrl(url, language)
|
||||||
videoList.addAll(videos)
|
videoList.addAll(videos)
|
||||||
}
|
}
|
||||||
if (url.lowercase().contains("od.lk")) {
|
if (embedUrl.contains("od.lk")) {
|
||||||
videoList.add(Video(url, language + "Od.lk", url))
|
videoList.add(Video(url, language + "Od.lk", url))
|
||||||
}
|
}
|
||||||
if (url.lowercase().contains("cldup.com")) {
|
if (embedUrl.contains("cldup.com")) {
|
||||||
videoList.add(Video(url, language + "CldUp", url))
|
videoList.add(Video(url, language + "CldUp", url))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -278,16 +264,23 @@ class AnimeLatinoHD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request {
|
override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request {
|
||||||
val filterList = if (filters.isEmpty()) getFilterList() else filters
|
val filterList = if (filters.isEmpty()) getFilterList() else filters
|
||||||
val genreFilter = filterList.find { it is GenreFilter } as GenreFilter
|
val genreFilter = filterList.find { it is GenreFilter } as GenreFilter
|
||||||
return when {
|
val stateFilter = filterList.find { it is StateFilter } as StateFilter
|
||||||
query.isNotBlank() -> GET("$baseUrl/animes?page=$page&search=$query")
|
val typeFilter = filterList.find { it is TypeFilter } as TypeFilter
|
||||||
genreFilter.state != 0 -> GET("$baseUrl/animes?page=$page&genre=${genreFilter.toUriPart()}")
|
|
||||||
else -> GET("$baseUrl/animes?page=$page")
|
val filterUrl = if (query.isBlank()) {
|
||||||
|
"$baseUrl/animes?page=$page&genre=${genreFilter.toUriPart()}&status=${stateFilter.toUriPart()}&type=${typeFilter.toUriPart()}"
|
||||||
|
} else {
|
||||||
|
"$baseUrl/animes?page=$page&search=$query"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return GET(filterUrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getFilterList(): AnimeFilterList = AnimeFilterList(
|
override fun getFilterList(): AnimeFilterList = AnimeFilterList(
|
||||||
AnimeFilter.Header("La busqueda por texto ignora el filtro"),
|
AnimeFilter.Header("La busqueda por texto ignora los filtros"),
|
||||||
GenreFilter(),
|
GenreFilter(),
|
||||||
|
StateFilter(),
|
||||||
|
TypeFilter(),
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun searchAnimeFromElement(element: Element): SAnime {
|
override fun searchAnimeFromElement(element: Element): SAnime {
|
||||||
@ -376,6 +369,27 @@ class AnimeLatinoHD : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private class StateFilter : UriPartFilter(
|
||||||
|
"Estado",
|
||||||
|
arrayOf(
|
||||||
|
Pair("Todos", ""),
|
||||||
|
Pair("Finalizado", "0"),
|
||||||
|
Pair("En emisión", "1"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
private class TypeFilter : UriPartFilter(
|
||||||
|
"Tipo",
|
||||||
|
arrayOf(
|
||||||
|
Pair("Todos", ""),
|
||||||
|
Pair("Animes", "tv"),
|
||||||
|
Pair("Películas", "movie"),
|
||||||
|
Pair("Especiales", "special"),
|
||||||
|
Pair("OVAS", "ova"),
|
||||||
|
Pair("ONAS", "ona"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :
|
private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :
|
||||||
AnimeFilter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) {
|
AnimeFilter.Select<String>(displayName, vals.map { it.first }.toTypedArray()) {
|
||||||
fun toUriPart() = vals[state].second
|
fun toUriPart() = vals[state].second
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
package eu.kanade.tachiyomi.animeextension.es.animelatinohd.extractors
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
|
||||||
|
class FilemoonExtractor(private val client: OkHttpClient) {
|
||||||
|
|
||||||
|
fun videoFromUrl(url: String, prefix: String = ""): MutableList<Video>? {
|
||||||
|
try {
|
||||||
|
val jsE = client.newCall(GET(url)).execute().asJsoup().selectFirst("script:containsData(eval)")!!.data()
|
||||||
|
val masterUrl = JsUnpacker(jsE).unpack().toString()
|
||||||
|
.substringAfter("{file:\"").substringBefore("\"}")
|
||||||
|
val masterPlaylist = client.newCall(GET(masterUrl)).execute().body.string()
|
||||||
|
val videoList = mutableListOf<Video>()
|
||||||
|
masterPlaylist.substringAfter("#EXT-X-STREAM-INF:").split("#EXT-X-STREAM-INF:")
|
||||||
|
.forEach {
|
||||||
|
val quality = "$prefix Filemoon:" + it.substringAfter("RESOLUTION=").substringAfter("x").substringBefore(",") + "p "
|
||||||
|
val videoUrl = it.substringAfter("\n").substringBefore("\n")
|
||||||
|
videoList.add(Video(videoUrl, quality.trim(), videoUrl))
|
||||||
|
}
|
||||||
|
return videoList
|
||||||
|
} catch (e: Exception) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,214 @@
|
|||||||
|
package eu.kanade.tachiyomi.animeextension.es.animelatinohd.extractors
|
||||||
|
|
||||||
|
import java.util.regex.Pattern
|
||||||
|
import kotlin.math.pow
|
||||||
|
|
||||||
|
// https://github.com/cylonu87/JsUnpacker
|
||||||
|
class JsUnpacker(packedJS: String?) {
|
||||||
|
private var packedJS: String? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detects whether the javascript is P.A.C.K.E.R. coded.
|
||||||
|
*
|
||||||
|
* @return true if it's P.A.C.K.E.R. coded.
|
||||||
|
*/
|
||||||
|
fun detect(): Boolean {
|
||||||
|
val js = packedJS!!.replace(" ", "")
|
||||||
|
val p = Pattern.compile("eval\\(function\\(p,a,c,k,e,[rd]")
|
||||||
|
val m = p.matcher(js)
|
||||||
|
return m.find()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unpack the javascript
|
||||||
|
*
|
||||||
|
* @return the javascript unpacked or null.
|
||||||
|
*/
|
||||||
|
fun unpack(): String? {
|
||||||
|
val js = packedJS
|
||||||
|
try {
|
||||||
|
var p =
|
||||||
|
Pattern.compile("""\}\s*\('(.*)',\s*(.*?),\s*(\d+),\s*'(.*?)'\.split\('\|'\)""", Pattern.DOTALL)
|
||||||
|
var m = p.matcher(js)
|
||||||
|
if (m.find() && m.groupCount() == 4) {
|
||||||
|
val payload = m.group(1).replace("\\'", "'")
|
||||||
|
val radixStr = m.group(2)
|
||||||
|
val countStr = m.group(3)
|
||||||
|
val symtab = m.group(4).split("\\|".toRegex()).toTypedArray()
|
||||||
|
var radix = 36
|
||||||
|
var count = 0
|
||||||
|
try {
|
||||||
|
radix = radixStr.toInt()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
count = countStr.toInt()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
}
|
||||||
|
if (symtab.size != count) {
|
||||||
|
throw Exception("Unknown p.a.c.k.e.r. encoding")
|
||||||
|
}
|
||||||
|
val unbase = Unbase(radix)
|
||||||
|
p = Pattern.compile("\\b\\w+\\b")
|
||||||
|
m = p.matcher(payload)
|
||||||
|
val decoded = StringBuilder(payload)
|
||||||
|
var replaceOffset = 0
|
||||||
|
while (m.find()) {
|
||||||
|
val word = m.group(0)
|
||||||
|
val x = unbase.unbase(word)
|
||||||
|
var value: String? = null
|
||||||
|
if (x < symtab.size && x >= 0) {
|
||||||
|
value = symtab[x]
|
||||||
|
}
|
||||||
|
if (value != null && value.isNotEmpty()) {
|
||||||
|
decoded.replace(m.start() + replaceOffset, m.end() + replaceOffset, value)
|
||||||
|
replaceOffset += value.length - word.length
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return decoded.toString()
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
private inner class Unbase(private val radix: Int) {
|
||||||
|
private val ALPHABET_62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
private val ALPHABET_95 =
|
||||||
|
" !\"#$%&\\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
|
||||||
|
private var alphabet: String? = null
|
||||||
|
private var dictionary: HashMap<String, Int>? = null
|
||||||
|
fun unbase(str: String): Int {
|
||||||
|
var ret = 0
|
||||||
|
if (alphabet == null) {
|
||||||
|
ret = str.toInt(radix)
|
||||||
|
} else {
|
||||||
|
val tmp = StringBuilder(str).reverse().toString()
|
||||||
|
for (i in tmp.indices) {
|
||||||
|
ret += (radix.toDouble().pow(i.toDouble()) * dictionary!![tmp.substring(i, i + 1)]!!).toInt()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
if (radix > 36) {
|
||||||
|
when {
|
||||||
|
radix < 62 -> {
|
||||||
|
alphabet = ALPHABET_62.substring(0, radix)
|
||||||
|
}
|
||||||
|
radix in 63..94 -> {
|
||||||
|
alphabet = ALPHABET_95.substring(0, radix)
|
||||||
|
}
|
||||||
|
radix == 62 -> {
|
||||||
|
alphabet = ALPHABET_62
|
||||||
|
}
|
||||||
|
radix == 95 -> {
|
||||||
|
alphabet = ALPHABET_95
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dictionary = HashMap(95)
|
||||||
|
for (i in 0 until alphabet!!.length) {
|
||||||
|
dictionary!![alphabet!!.substring(i, i + 1)] = i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param packedJS javascript P.A.C.K.E.R. coded.
|
||||||
|
*/
|
||||||
|
init {
|
||||||
|
this.packedJS = packedJS
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val c =
|
||||||
|
listOf(
|
||||||
|
0x63,
|
||||||
|
0x6f,
|
||||||
|
0x6d,
|
||||||
|
0x2e,
|
||||||
|
0x67,
|
||||||
|
0x6f,
|
||||||
|
0x6f,
|
||||||
|
0x67,
|
||||||
|
0x6c,
|
||||||
|
0x65,
|
||||||
|
0x2e,
|
||||||
|
0x61,
|
||||||
|
0x6e,
|
||||||
|
0x64,
|
||||||
|
0x72,
|
||||||
|
0x6f,
|
||||||
|
0x69,
|
||||||
|
0x64,
|
||||||
|
0x2e,
|
||||||
|
0x67,
|
||||||
|
0x6d,
|
||||||
|
0x73,
|
||||||
|
0x2e,
|
||||||
|
0x61,
|
||||||
|
0x64,
|
||||||
|
0x73,
|
||||||
|
0x2e,
|
||||||
|
0x4d,
|
||||||
|
0x6f,
|
||||||
|
0x62,
|
||||||
|
0x69,
|
||||||
|
0x6c,
|
||||||
|
0x65,
|
||||||
|
0x41,
|
||||||
|
0x64,
|
||||||
|
0x73,
|
||||||
|
)
|
||||||
|
val z =
|
||||||
|
listOf(
|
||||||
|
0x63,
|
||||||
|
0x6f,
|
||||||
|
0x6d,
|
||||||
|
0x2e,
|
||||||
|
0x66,
|
||||||
|
0x61,
|
||||||
|
0x63,
|
||||||
|
0x65,
|
||||||
|
0x62,
|
||||||
|
0x6f,
|
||||||
|
0x6f,
|
||||||
|
0x6b,
|
||||||
|
0x2e,
|
||||||
|
0x61,
|
||||||
|
0x64,
|
||||||
|
0x73,
|
||||||
|
0x2e,
|
||||||
|
0x41,
|
||||||
|
0x64,
|
||||||
|
)
|
||||||
|
|
||||||
|
fun String.load(): String? {
|
||||||
|
return try {
|
||||||
|
var load = this
|
||||||
|
|
||||||
|
for (q in c.indices) {
|
||||||
|
if (c[q % 4] > 270) {
|
||||||
|
load += c[q % 3]
|
||||||
|
} else {
|
||||||
|
load += c[q].toChar()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Class.forName(load.substring(load.length - c.size, load.length)).name
|
||||||
|
} catch (_: Exception) {
|
||||||
|
try {
|
||||||
|
var f = c[2].toChar().toString()
|
||||||
|
for (w in z.indices) {
|
||||||
|
f += z[w].toChar()
|
||||||
|
}
|
||||||
|
return Class.forName(f.substring(0b001, f.length)).name
|
||||||
|
} catch (_: Exception) {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user