diff --git a/src/ar/animeiat/AndroidManifest.xml b/src/ar/animeiat/AndroidManifest.xml new file mode 100644 index 000000000..568741e54 --- /dev/null +++ b/src/ar/animeiat/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/ar/animeiat/build.gradle b/src/ar/animeiat/build.gradle new file mode 100644 index 000000000..30249807e --- /dev/null +++ b/src/ar/animeiat/build.gradle @@ -0,0 +1,13 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlinx-serialization' + +ext { + extName = 'Animeiat' + pkgNameSuffix = 'ar.animeiat' + extClass = '.Animeiat' + extVersionCode = 1 + libVersion = '13' +} + +apply from: "$rootDir/common.gradle" diff --git a/src/ar/animeiat/res/mipmap-hdpi/ic_launcher.png b/src/ar/animeiat/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..ae82a79a9 Binary files /dev/null and b/src/ar/animeiat/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/ar/animeiat/res/mipmap-mdpi/ic_launcher.png b/src/ar/animeiat/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..948ba867e Binary files /dev/null and b/src/ar/animeiat/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/ar/animeiat/res/mipmap-xhdpi/ic_launcher.png b/src/ar/animeiat/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..3e0238e0a Binary files /dev/null and b/src/ar/animeiat/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/ar/animeiat/res/mipmap-xxhdpi/ic_launcher.png b/src/ar/animeiat/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..3dca58bff Binary files /dev/null and b/src/ar/animeiat/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/ar/animeiat/res/mipmap-xxxhdpi/ic_launcher.png b/src/ar/animeiat/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..cedf6b447 Binary files /dev/null and b/src/ar/animeiat/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/ar/animeiat/res/web_hi_res_512.png b/src/ar/animeiat/res/web_hi_res_512.png new file mode 100644 index 000000000..06a6eece9 Binary files /dev/null and b/src/ar/animeiat/res/web_hi_res_512.png differ diff --git a/src/ar/animeiat/src/eu/kanade/tachiyomi/animeextension/ar/animeiat/Animeiat.kt b/src/ar/animeiat/src/eu/kanade/tachiyomi/animeextension/ar/animeiat/Animeiat.kt new file mode 100644 index 000000000..8540c66a8 --- /dev/null +++ b/src/ar/animeiat/src/eu/kanade/tachiyomi/animeextension/ar/animeiat/Animeiat.kt @@ -0,0 +1,232 @@ +package eu.kanade.tachiyomi.animeextension.ar.animeiat + +import android.app.Application +import android.content.SharedPreferences +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.preference.ListPreference +import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.animeextension.ar.animeiat.dto.AnimeEpisodesList +import eu.kanade.tachiyomi.animeextension.ar.animeiat.dto.AnimePageResponse +import eu.kanade.tachiyomi.animeextension.ar.animeiat.dto.LatestAnimeResponse +import eu.kanade.tachiyomi.animeextension.ar.animeiat.dto.PopularAnimeResponse +import eu.kanade.tachiyomi.animeextension.ar.animeiat.dto.StreamLinks +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.AnimeHttpSource +import eu.kanade.tachiyomi.network.GET +import kotlinx.serialization.json.Json +import okhttp3.Request +import okhttp3.Response +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import java.util.Base64 + +class Animeiat : ConfigurableAnimeSource, AnimeHttpSource() { + + override val name = "Animeiat" + + override val baseUrl = "https://api.animeiat.co/v1" + + override val lang = "ar" + + override val supportsLatest = true + + private val json = Json { + ignoreUnknownKeys = true + } + + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + // ============================== Popular =============================== + override fun popularAnimeParse(response: Response): AnimesPage { + val responseJson = json.decodeFromString(response.body.string()) + val animeList = responseJson.data.map { + SAnime.create().apply { + url = "/anime/${it.slug}" + title = it.anime_name + thumbnail_url = "https://api.animeiat.co/storage/${it.poster_path}" + } + } + val hasNextPage = responseJson.meta.current_page < responseJson.meta.last_page + return AnimesPage(animeList, hasNextPage) + } + + override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/anime?page=$page") + + // ============================== Episodes ============================== + override fun episodeListParse(response: Response): List { + val episodeList = mutableListOf() + val pagesUrl = response.request.url.toString() + "/episodes" + val firstPage = client.newCall(GET(pagesUrl)).execute() + fun addEpisodes(res: Response) { + val jr = json.decodeFromString(res.body.string()) + episodeList.addAll( + jr.data.map { + SEpisode.create().apply { + name = it.title + episode_number = it.number + url = "episode/${it.slug}" + } + }, + ) + jr.links.next?.let { + addEpisodes(client.newCall(GET(it)).execute()) + } + } + addEpisodes(firstPage) + return episodeList.reversed() + } + + // ============================ Video Links ============================= + override fun videoListRequest(episode: SEpisode): Request = GET("$baseUrl/${episode.url}") + + @RequiresApi(Build.VERSION_CODES.O) + override fun videoListParse(response: Response): List