
Client for the MyAnimeList API offering OAuth2 PKCE authentication, secure token persistence via KSafe, DI support, and rich endpoints (anime, manga, user, forum) with field filtering.
Kotlin Multiplatform library for the MyAnimeList API.
// 1. Initialize KoaniClient
val client = KoaniClient(clientId = "YOUR_CLIENT_ID")
// 2. Fetch anime details requesting only TITLE and MEAN fields
val anime = client.anime.getAnimeDetails(
animeId = 5114,
fields = listOf(
AnimeField.TITLE,
AnimeField.MEAN
)
)
println("${anime.title} — Score: ${anime.mean}")[!NOTE] API Versioning: The major version of Koani follows the versioning of the MyAnimeList API (for example, Koani
v2.x.xtargets MyAnimeList APIv2).
Add Koani to your gradle/libs.versions.toml:
[versions]
koani = "<latest-version>"
[libraries]
# Core client library (Required)
koani-core = { module = "io.github.rribeiro5:koani-core", version.ref = "koani" }
# Optional: Secure token persistence support using KSafe
koani-auth-persistence-ksafe = { module = "io.github.rribeiro5:koani-auth-persistence-ksafe", version.ref = "koani" }Then in your module's build.gradle.kts:
kotlin {
sourceSets {
commonMain.dependencies {
implementation(libs.koani.core)
// Optional: Secure token persistence support
implementation(libs.koani.auth.persistence.ksafe)
}
}
}import io.github.rribeiro5.koani.KoaniClient
import io.github.rribeiro5.koani.error.KoaniException
suspend fun main() {
val client = KoaniClient(clientId = "YOUR_MYANIMELIST_CLIENT_ID")
try {
val searchResult = client.anime.getAnimeList(query = "Fullmetal Alchemist", limit = 5)
searchResult.data.forEach { anime ->
println("${anime.id}: ${anime.title}")
}
} catch (e: KoaniException) {
println("API Error: ${e.message}")
}
}Visit our official documentation website for complete guides and references:
🔗 https://rribeiro5.github.io/koani/
This project is licensed under the MIT License.
Kotlin Multiplatform library for the MyAnimeList API.
// 1. Initialize KoaniClient
val client = KoaniClient(clientId = "YOUR_CLIENT_ID")
// 2. Fetch anime details requesting only TITLE and MEAN fields
val anime = client.anime.getAnimeDetails(
animeId = 5114,
fields = listOf(
AnimeField.TITLE,
AnimeField.MEAN
)
)
println("${anime.title} — Score: ${anime.mean}")[!NOTE] API Versioning: The major version of Koani follows the versioning of the MyAnimeList API (for example, Koani
v2.x.xtargets MyAnimeList APIv2).
Add Koani to your gradle/libs.versions.toml:
[versions]
koani = "<latest-version>"
[libraries]
# Core client library (Required)
koani-core = { module = "io.github.rribeiro5:koani-core", version.ref = "koani" }
# Optional: Secure token persistence support using KSafe
koani-auth-persistence-ksafe = { module = "io.github.rribeiro5:koani-auth-persistence-ksafe", version.ref = "koani" }Then in your module's build.gradle.kts:
kotlin {
sourceSets {
commonMain.dependencies {
implementation(libs.koani.core)
// Optional: Secure token persistence support
implementation(libs.koani.auth.persistence.ksafe)
}
}
}import io.github.rribeiro5.koani.KoaniClient
import io.github.rribeiro5.koani.error.KoaniException
suspend fun main() {
val client = KoaniClient(clientId = "YOUR_MYANIMELIST_CLIENT_ID")
try {
val searchResult = client.anime.getAnimeList(query = "Fullmetal Alchemist", limit = 5)
searchResult.data.forEach { anime ->
println("${anime.id}: ${anime.title}")
}
} catch (e: KoaniException) {
println("API Error: ${e.message}")
}
}Visit our official documentation website for complete guides and references:
🔗 https://rribeiro5.github.io/koani/
This project is licensed under the MIT License.