Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import fr.shikkanime.platforms.AbstractPlatform.Episode
import fr.shikkanime.services.*
import fr.shikkanime.services.caches.ConfigCacheService
import fr.shikkanime.utils.*
import fr.shikkanime.wrappers.factories.AbstractCrunchyrollWrapper
import fr.shikkanime.wrappers.factories.AbstractCrunchyrollWrapper.BrowseObject
import fr.shikkanime.wrappers.impl.CrunchyrollWrapper
import fr.shikkanime.wrappers.impl.caches.*
Expand Down Expand Up @@ -519,8 +518,7 @@ class UpdateEpisodeMappingJob : AbstractJob {
val mainObject = episodeSource.also { browseObjects.add(it.convertToBrowseObject()) }

val variantIds = mainObject.getVariants().subtract(browseObjects.map { it.id }.toSet())
val variantObjects = variantIds.chunked(AbstractCrunchyrollWrapper.CRUNCHYROLL_CHUNK)
.flatMap { chunk -> CrunchyrollCachedWrapper.getObjects(countryCode.locale, *chunk.toTypedArray()) }
val variantObjects = CrunchyrollCachedWrapper.getChunkedObjects(countryCode.locale, *variantIds.toTypedArray())

return (browseObjects + variantObjects).mapNotNull { browseObject ->
try {
Expand Down
30 changes: 27 additions & 3 deletions src/main/kotlin/fr/shikkanime/platforms/CrunchyrollPlatform.kt
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,18 @@ class CrunchyrollPlatform : AbstractPlatform<CrunchyrollConfiguration, CountryCo
val list = mutableListOf<Episode>()

configuration!!.availableCountries.forEach { countryCode ->
val api = bypassFileContent?.takeIf { it.exists() }?.let {
val api = (bypassFileContent?.takeIf { it.exists() }?.let {
ObjectParser.fromJson(
ObjectParser.fromJson(it.readText()).getAsJsonArray("data"),
Array<AbstractCrunchyrollWrapper.BrowseObject>::class.java
).toList()
} ?: getApiContent(countryCode, zonedDateTime).toMutableList()
} ?: getApiContent(countryCode, zonedDateTime)).toMutableList()

retrieveAdditionalAudioVariants(countryCode, api)

// Preload all series
runCatching {
CrunchyrollCachedWrapper.getObjects(
CrunchyrollCachedWrapper.getChunkedObjects(
countryCode.locale,
*api.mapNotNull { it.episodeMetadata?.seriesId }.distinct().toTypedArray()
)
Expand All @@ -61,6 +63,28 @@ class CrunchyrollPlatform : AbstractPlatform<CrunchyrollConfiguration, CountryCo
return list
}

private suspend fun retrieveAdditionalAudioVariants(
countryCode: CountryCode,
api: MutableList<AbstractCrunchyrollWrapper.BrowseObject>,
) {
val currentIds = api.map { it.id }.toSet()

val variantIds = api.flatMap { browseObject ->
val metadata = browseObject.episodeMetadata ?: return@flatMap emptyList()
val versions = metadata.versions ?: emptyList()

val allAudioLocales = versions.map { it.audioLocale }.toSet() + setOfNotNull(metadata.audioLocale)
val allowedAudioLocales = LocaleUtils.getAllowedLocales(countryCode, allAudioLocales)

versions.filter { it.audioLocale in allowedAudioLocales && it.guid !in currentIds }.map { it.guid }
}.distinct()

if (variantIds.isNotEmpty()) {
val additionalObjects = runCatching { CrunchyrollWrapper.getChunkedObjects(countryCode.locale, *variantIds.toTypedArray()) }.getOrNull() ?: emptyList()
api.addAll(additionalObjects)
}
}

private suspend fun addToList(
list: MutableList<Episode>,
countryCode: CountryCode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ abstract class AbstractCrunchyrollWrapper {
abstract suspend fun getEpisode(locale: String, id: String): Episode
abstract suspend fun getEpisodeDiscoverByType(locale: String, type: String, id: String): BrowseObject
abstract suspend fun getObjects(locale: String, vararg ids: String): List<BrowseObject>
suspend fun getChunkedObjects(locale: String, vararg ids: String): List<BrowseObject> = ids.toSet().chunked(CRUNCHYROLL_CHUNK).flatMap { getObjects(locale, *it.toTypedArray()) }
abstract suspend fun getEpisodesBySeriesId(locale: String, id: String, original: Boolean? = null): Array<BrowseObject>
abstract suspend fun getSimulcasts(locale: String): Array<Simulcast>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,11 +115,9 @@ object CrunchyrollWrapper : AbstractCrunchyrollWrapper() {

val mainBrowseObjects = allEpisodes.map { it.convertToBrowseObject() }

val variantBrowseObjects = allEpisodes
val variantBrowseObjects = getChunkedObjects(locale, *allEpisodes
.flatMap { it.getVariants(original) }
.subtract(mainBrowseObjects.map { it.id }.toSet())
.chunked(CRUNCHYROLL_CHUNK)
.flatMap { chunk -> getObjects(locale, *chunk.toTypedArray()) }
.subtract(mainBrowseObjects.map { it.id }.toSet()).toTypedArray())

return (mainBrowseObjects + variantBrowseObjects).toTypedArray()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ object CrunchyrollCachedWrapper : AbstractCrunchyrollWrapper() {
val objects = alreadyCached.mapNotNull { objectCache[locale to it] }.toMutableList()

if (notCached.isNotEmpty()) {
val newObjects = CrunchyrollWrapper.getObjects(locale, *notCached.toTypedArray())
val newObjects = CrunchyrollWrapper.getChunkedObjects(locale, *notCached.toTypedArray())
newObjects.forEach { objectCache.putIfNotExists(locale to it.id, it) }
objects.addAll(newObjects)
}
Expand All @@ -131,11 +131,9 @@ object CrunchyrollCachedWrapper : AbstractCrunchyrollWrapper() {

val mainBrowseObjects = allEpisodes.map { it.convertToBrowseObject() }

val variantBrowseObjects = allEpisodes
val variantBrowseObjects = getChunkedObjects(locale, *allEpisodes
.flatMap { it.getVariants(original) }
.subtract(mainBrowseObjects.map { it.id }.toSet())
.chunked(CRUNCHYROLL_CHUNK)
.flatMap { chunk -> getObjects(locale, *chunk.toTypedArray()) }
.subtract(mainBrowseObjects.map { it.id }.toSet()).toTypedArray())

(mainBrowseObjects + variantBrowseObjects).toTypedArray()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,14 @@ class CrunchyrollPlatformTest : AbstractTest() {
simulcastNames = listOf(),
expectedAnimeName = "Jujutsu Kaisen",
expectedEpisodes = false
)
),
EpisodeTestCase(
testDate = "2026-01-03T13:30:00Z",
simulcastNames = listOf("Sentenced to Be a Hero"),
expectedAnimeName = "Sentenced to Be a Hero",
expectedEpisodeCount = 2,
episodeType = EpisodeType.EPISODE
),
)

@JvmStatic
Expand Down

Large diffs are not rendered by default.

Loading