diff --git a/src/ar/animelek/build.gradle b/src/ar/animelek/build.gradle index 7ffbde148..e4c4f8951 100644 --- a/src/ar/animelek/build.gradle +++ b/src/ar/animelek/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'AnimeLek' pkgNameSuffix = 'ar.animelek' extClass = '.AnimeLek' - extVersionCode = 9 + extVersionCode = 10 libVersion = '13' } diff --git a/src/ar/animelek/src/eu/kanade/tachiyomi/animeextension/ar/animelek/AnimeLek.kt b/src/ar/animelek/src/eu/kanade/tachiyomi/animeextension/ar/animelek/AnimeLek.kt index 953c10990..e7d0cc20d 100644 --- a/src/ar/animelek/src/eu/kanade/tachiyomi/animeextension/ar/animelek/AnimeLek.kt +++ b/src/ar/animelek/src/eu/kanade/tachiyomi/animeextension/ar/animelek/AnimeLek.kt @@ -115,7 +115,7 @@ class AnimeLek : ConfigurableAnimeSource, ParsedAnimeHttpSource() { .set("Referer", url) .set("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0") .set("Accept-Language", "en-US,en;q=0.5") - .set("watchsb", "streamsb") + .set("watchsb", "sbstream") .build() val videos = StreamSBExtractor(client).videosFromUrl(url, headers) videoList.addAll(videos) diff --git a/src/ar/animelek/src/eu/kanade/tachiyomi/animeextension/ar/animelek/extractors/StreamSBExtractor.kt b/src/ar/animelek/src/eu/kanade/tachiyomi/animeextension/ar/animelek/extractors/StreamSBExtractor.kt index 4235c4a65..ba04e69ad 100644 --- a/src/ar/animelek/src/eu/kanade/tachiyomi/animeextension/ar/animelek/extractors/StreamSBExtractor.kt +++ b/src/ar/animelek/src/eu/kanade/tachiyomi/animeextension/ar/animelek/extractors/StreamSBExtractor.kt @@ -29,7 +29,7 @@ class StreamSBExtractor(private val client: OkHttpClient) { val id = url.substringAfter("e/") val bytes = id.toByteArray() val bytesToHex = bytesToHex(bytes) - val master = "$sbUrl/sources43/566d337678566f743674494a7c7c${bytesToHex}7c7c346b6767586d6934774855537c7c73747265616d7362/6565417268755339773461447c7c346133383438333436313335376136323337373433383634376337633465366534393338373136643732373736343735373237613763376334363733353737303533366236333463353333363534366137633763373337343732363536313664373336327c7c6b586c3163614468645a47617c7c73747265616d7362" + val master = "$sbUrl/sources48/625a364258615242766475327c7c${bytesToHex}7c7c4761574550654f7461566d347c7c73747265616d7362" // "https://sbplay2.com/sourcesx38/4f395a53447166635a3836787c7c${bytesToHex}7c7c7965344f61436d467845586c7c7c73747265616d7362/6e56314c77564e6a6c6631737c7c333735383537363836633662373635323636376133343637376337633335346334343332353735343333366633343635346336383763376334313561373633343761346133303665363837363537353937633763373337343732363536313664373336327c7c395239444c3961626d634e6a7c7c73747265616d7362" val json = Json.decodeFromString( client.newCall(GET(master, headers)) diff --git a/src/ar/animerco/build.gradle b/src/ar/animerco/build.gradle index 2119a64b3..cb0a6828a 100644 --- a/src/ar/animerco/build.gradle +++ b/src/ar/animerco/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'Animerco' pkgNameSuffix = 'ar.animerco' extClass = '.Animerco' - extVersionCode = 11 + extVersionCode = 12 libVersion = '13' } diff --git a/src/ar/animerco/src/eu/kanade/tachiyomi/animeextension/ar/animerco/Animerco.kt b/src/ar/animerco/src/eu/kanade/tachiyomi/animeextension/ar/animerco/Animerco.kt index 0efc60d1e..08d69a46c 100644 --- a/src/ar/animerco/src/eu/kanade/tachiyomi/animeextension/ar/animerco/Animerco.kt +++ b/src/ar/animerco/src/eu/kanade/tachiyomi/animeextension/ar/animerco/Animerco.kt @@ -195,7 +195,7 @@ class Animerco : ConfigurableAnimeSource, ParsedAnimeHttpSource() { .set("Referer", embedUrl) .set("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:96.0) Gecko/20100101 Firefox/96.0") .set("Accept-Language", "en-US,en;q=0.5") - .set("watchsb", "streamsb") + .set("watchsb", "sbstream") .build() val videos = StreamSBExtractor(client).videosFromUrl(embedUrl, headers) videoList.addAll(videos) diff --git a/src/ar/animerco/src/eu/kanade/tachiyomi/animeextension/ar/animerco/extractors/StreamSBExtractor.kt b/src/ar/animerco/src/eu/kanade/tachiyomi/animeextension/ar/animerco/extractors/StreamSBExtractor.kt index d62219bc4..07bcd017a 100644 --- a/src/ar/animerco/src/eu/kanade/tachiyomi/animeextension/ar/animerco/extractors/StreamSBExtractor.kt +++ b/src/ar/animerco/src/eu/kanade/tachiyomi/animeextension/ar/animerco/extractors/StreamSBExtractor.kt @@ -29,7 +29,7 @@ class StreamSBExtractor(private val client: OkHttpClient) { val id = url.substringAfter("e/").substringBefore(".html") val bytes = id.toByteArray() val bytesToHex = bytesToHex(bytes) - val master = "$sbUrl/sources43/566d337678566f743674494a7c7c${bytesToHex}7c7c346b6767586d6934774855537c7c73747265616d7362/6565417268755339773461447c7c346133383438333436313335376136323337373433383634376337633465366534393338373136643732373736343735373237613763376334363733353737303533366236333463353333363534366137633763373337343732363536313664373336327c7c6b586c3163614468645a47617c7c73747265616d7362" + val master = "$sbUrl/sources48/625a364258615242766475327c7c${bytesToHex}7c7c4761574550654f7461566d347c7c73747265616d7362" val json = Json.decodeFromString( client.newCall(GET(master, headers)) .execute().body!!.string() diff --git a/src/ar/animetitans/AndroidManifest.xml b/src/ar/animetitans/AndroidManifest.xml new file mode 100644 index 000000000..acb4de356 --- /dev/null +++ b/src/ar/animetitans/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/ar/animetitans/build.gradle b/src/ar/animetitans/build.gradle new file mode 100644 index 000000000..06ea93571 --- /dev/null +++ b/src/ar/animetitans/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + extName = 'AnimeTitans' + pkgNameSuffix = 'ar.animetitans' + extClass = '.AnimeTitans' + extVersionCode = 1 + libVersion = '13' +} + +apply from: "$rootDir/common.gradle" diff --git a/src/ar/animetitans/res/mipmap-hdpi/ic_launcher.png b/src/ar/animetitans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..7cc449fea Binary files /dev/null and b/src/ar/animetitans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/ar/animetitans/res/mipmap-mdpi/ic_launcher.png b/src/ar/animetitans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..4044b082f Binary files /dev/null and b/src/ar/animetitans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/ar/animetitans/res/mipmap-xhdpi/ic_launcher.png b/src/ar/animetitans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..226a31e5b Binary files /dev/null and b/src/ar/animetitans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/ar/animetitans/res/mipmap-xxhdpi/ic_launcher.png b/src/ar/animetitans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..9f24fabb4 Binary files /dev/null and b/src/ar/animetitans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/ar/animetitans/res/mipmap-xxxhdpi/ic_launcher.png b/src/ar/animetitans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..cc6497b73 Binary files /dev/null and b/src/ar/animetitans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/ar/animetitans/res/play_store_512.png b/src/ar/animetitans/res/play_store_512.png new file mode 100644 index 000000000..f29b90ac7 Binary files /dev/null and b/src/ar/animetitans/res/play_store_512.png differ diff --git a/src/ar/animetitans/src/eu/kanade/tachiyomi/animeextension/ar/animetitans/AnimeTitans.kt b/src/ar/animetitans/src/eu/kanade/tachiyomi/animeextension/ar/animetitans/AnimeTitans.kt new file mode 100644 index 000000000..a728a39dc --- /dev/null +++ b/src/ar/animetitans/src/eu/kanade/tachiyomi/animeextension/ar/animetitans/AnimeTitans.kt @@ -0,0 +1,586 @@ +package eu.kanade.tachiyomi.animeextension.ar.animetitans + +import android.app.Application +import android.content.SharedPreferences +import android.util.Log +import androidx.preference.ListPreference +import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.animeextension.ar.animetitans.extractors.AnimeTitansExtractor +import eu.kanade.tachiyomi.animeextension.ar.animetitans.extractors.FembedExtractor +import eu.kanade.tachiyomi.animeextension.ar.animetitans.extractors.SharedExtractor +import eu.kanade.tachiyomi.animeextension.ar.animetitans.extractors.StreamSBExtractor +import eu.kanade.tachiyomi.animeextension.ar.animetitans.extractors.VidBomExtractor +import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource +import eu.kanade.tachiyomi.animesource.model.AnimeFilter +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.network.GET +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.HttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull +import okhttp3.OkHttpClient +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 +import java.lang.Exception +import java.text.SimpleDateFormat +import java.util.Base64 +import java.util.Locale + +class AnimeTitans : ConfigurableAnimeSource, ParsedAnimeHttpSource() { + + override val name = "AnimeTitans" + + override val baseUrl = "https://animetitans.com" + + override val lang = "ar" + + override val supportsLatest = true + + private val AnimeUrlDirectory: String = "/anime" + + private val dateFormat: SimpleDateFormat = SimpleDateFormat("MMM d, yyy", Locale.US) + + override val client: OkHttpClient = network.cloudflareClient + + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + // Popular (Search with popular order and nothing else) + override fun popularAnimeRequest(page: Int) = searchAnimeRequest(page, "", AnimeFilterList(OrderByFilter("popular"))) + override fun popularAnimeParse(response: Response) = searchAnimeParse(response) + + // Latest (Search with update order and nothing else) + override fun latestUpdatesRequest(page: Int) = searchAnimeRequest(page, "", AnimeFilterList(OrderByFilter("update"))) + override fun latestUpdatesParse(response: Response) = searchAnimeParse(response) + + // Episodes + + override fun episodeListSelector() = "ul li[data-index]" + + private fun parseEpisodeDate(date: String): Long { + return SimpleDateFormat("MMM d, yyy", Locale("ar")).parse(date)?.time ?: 0L + } + + override fun episodeFromElement(element: Element): SEpisode { + val episode = SEpisode.create() + val epNum = getNumberFromEpsString(element.select(".epl-num").text()) + val urlElements = element.select("a") + episode.setUrlWithoutDomain(urlElements.attr("href")) + episode.name = element.select(".epl-title").text().ifBlank { urlElements.first().text() } + episode.episode_number = when { + (epNum.isNotEmpty()) -> epNum.toFloat() + else -> 1F + } + episode.date_upload = element.select(".epl-date").first()?.text()?.let { parseEpisodeDate(it) } ?: 0L + return episode + } + + private fun getNumberFromEpsString(epsStr: String): String { + return epsStr.filter { it.isDigit() } + } + + // Video urls + + override fun videoListParse(response: Response): List