diff --git a/src/pt/megaflix/AndroidManifest.xml b/src/pt/megaflix/AndroidManifest.xml new file mode 100644 index 000000000..1c6c0139a --- /dev/null +++ b/src/pt/megaflix/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/src/pt/megaflix/build.gradle b/src/pt/megaflix/build.gradle new file mode 100644 index 000000000..912c09f84 --- /dev/null +++ b/src/pt/megaflix/build.gradle @@ -0,0 +1,22 @@ +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) +} + +ext { + extName = 'Megaflix' + pkgNameSuffix = 'pt.megaflix' + extClass = '.Megaflix' + extVersionCode = 1 + containsNsfw = true +} + +dependencies { + implementation(project(":lib-fembed-extractor")) + implementation(project(":lib-streamsb-extractor")) + implementation(project(":lib-streamtape-extractor")) + // for mixdrop and megaflix + implementation("dev.datlag.jsunpacker:jsunpacker:1.0.1") +} + +apply from: "$rootDir/common.gradle" diff --git a/src/pt/megaflix/res/mipmap-hdpi/ic_launcher.png b/src/pt/megaflix/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..bf99313a7 Binary files /dev/null and b/src/pt/megaflix/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/pt/megaflix/res/mipmap-mdpi/ic_launcher.png b/src/pt/megaflix/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..0bf5f9da7 Binary files /dev/null and b/src/pt/megaflix/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/pt/megaflix/res/mipmap-xhdpi/ic_launcher.png b/src/pt/megaflix/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..6ea93116b Binary files /dev/null and b/src/pt/megaflix/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/pt/megaflix/res/mipmap-xxhdpi/ic_launcher.png b/src/pt/megaflix/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..c441ac817 Binary files /dev/null and b/src/pt/megaflix/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/pt/megaflix/res/mipmap-xxxhdpi/ic_launcher.png b/src/pt/megaflix/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..524bfd1db Binary files /dev/null and b/src/pt/megaflix/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/Megaflix.kt b/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/Megaflix.kt new file mode 100644 index 000000000..cc21b4ced --- /dev/null +++ b/src/pt/megaflix/src/eu/kanade/tachiyomi/animeextension/pt/megaflix/Megaflix.kt @@ -0,0 +1,290 @@ +package eu.kanade.tachiyomi.animeextension.pt.megaflix + +import android.app.Application +import android.content.SharedPreferences +import android.util.Base64 +import androidx.preference.ListPreference +import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.animeextension.pt.megaflix.extractors.MegaflixExtractor +import eu.kanade.tachiyomi.animeextension.pt.megaflix.extractors.MixDropExtractor +import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource +import eu.kanade.tachiyomi.animesource.model.AnimeFilterList +import eu.kanade.tachiyomi.animesource.model.AnimesPage +import eu.kanade.tachiyomi.animesource.model.SAnime +import eu.kanade.tachiyomi.animesource.model.SEpisode +import eu.kanade.tachiyomi.animesource.model.Video +import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource +import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor +import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor +import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.asObservableSuccess +import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.runBlocking +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class Megaflix : ConfigurableAnimeSource, ParsedAnimeHttpSource() { + + override val name = "Megaflix" + + override val baseUrl = "https://megaflix.co" + + override val lang = "pt-BR" + + override val supportsLatest = true + + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + // ============================== Popular =============================== + override fun popularAnimeFromElement(element: Element): SAnime { + return SAnime.create().apply { + title = element.selectFirst("h2.entry-title")!!.text() + setUrlWithoutDomain(element.selectFirst("a.lnk-blk")!!.attr("href")) + thumbnail_url = "https:" + element.selectFirst("img")!!.attr("src") + } + } + + override fun popularAnimeNextPageSelector() = null + + override fun popularAnimeRequest(page: Int) = GET(baseUrl) + + override fun popularAnimeSelector() = "section#widget_list_movies_series-5 li > article" + + // ============================== Episodes ============================== + override fun episodeFromElement(element: Element): SEpisode { + return SEpisode.create().apply { + name = element.selectFirst("h2.entry-title")!!.text() + setUrlWithoutDomain(element.selectFirst("a.lnk-blk")!!.attr("href")) + episode_number = element.selectFirst("span.num-epi") + ?.text() + ?.substringAfter("x") + ?.toFloatOrNull() + ?: 0F + } + } + + override fun episodeListSelector() = "li > article.episodes" + + override fun episodeListParse(response: Response): List { + val items = response.asJsoup().select(episodeListSelector()) + return when { + items.isEmpty() -> listOf( + SEpisode.create().apply { + name = "Filme" + setUrlWithoutDomain(response.request.url.toString()) + episode_number = 1F + }, + ) + else -> items.map(::episodeFromElement) + } + } + + // =========================== Anime Details ============================ + override fun animeDetailsParse(document: Document): SAnime { + return SAnime.create().apply { + val infos = document.selectFirst("div.bd > article.post.single")!! + title = infos.selectFirst("h1.entry-title")!!.text() + thumbnail_url = "https:" + infos.selectFirst("img")!!.attr("src") + genre = infos.select("span.genres > a").eachText().joinToString() + description = infos.selectFirst("div.description")?.text() + } + } + + // ============================ Video Links ============================= + override fun videoListParse(response: Response): List