fix: use provider availability for episodes

This commit is contained in:
2026-06-21 16:49:30 +02:00
committed by Milas Holsting
parent cf641ce79b
commit b0bebec656
4 changed files with 99 additions and 11 deletions

View File

@@ -36,7 +36,7 @@ func titleCandidates(anime domain.Anime) []string {
func isCanonicalEpisodePayloadValid(payload domain.CanonicalEpisodeList, expectedCount int) bool {
if expectedCount <= 0 {
return true
return providerBackedPayloadHasAvailability(payload)
}
if len(payload.Episodes) > expectedCount {
return false
@@ -46,18 +46,36 @@ func isCanonicalEpisodePayloadValid(payload domain.CanonicalEpisodeList, expecte
return false
}
}
return providerBackedPayloadHasAvailability(payload)
}
func providerBackedPayloadHasAvailability(payload domain.CanonicalEpisodeList) bool {
if payload.Source == "" || payload.Source == "jikan_fallback" || payload.Source == "legacy_disabled" {
return true
}
for _, episode := range payload.Episodes {
if !episode.HasSub && !episode.HasDub {
return false
}
}
return true
}
func mergeEpisodes(jikanEpisodes []jikan.Episode, availability domain.EpisodeAvailability, expectedCount int) []domain.CanonicalEpisode {
byNumber := map[int]episodePartial{}
providerNumbers := availableEpisodeNumbers(availability, expectedCount)
providerBacked := len(providerNumbers) > 0
for number := range providerNumbers {
mergeEpisode(&byNumber, number, func(item *episodePartial) {})
}
for i, ep := range jikanEpisodes {
if exceedsExpectedCount(i+1, expectedCount) {
break
}
number, ok := jikanEpisodeNumber(ep, i)
if !ok || exceedsExpectedCount(number, expectedCount) {
if !ok || exceedsExpectedCount(number, expectedCount) || (providerBacked && !providerNumbers[number]) {
continue
}
mergeEpisode(&byNumber, number, func(item *episodePartial) {
@@ -95,6 +113,21 @@ func mergeEpisodes(jikanEpisodes []jikan.Episode, availability domain.EpisodeAva
return episodes
}
func availableEpisodeNumbers(availability domain.EpisodeAvailability, expectedCount int) map[int]bool {
numbers := map[int]bool{}
for _, number := range availability.Sub {
if number > 0 && !exceedsExpectedCount(number, expectedCount) {
numbers[number] = true
}
}
for _, number := range availability.Dub {
if number > 0 && !exceedsExpectedCount(number, expectedCount) {
numbers[number] = true
}
}
return numbers
}
func mergeEpisode(byNumber *map[int]episodePartial, number int, update func(*episodePartial)) {
item := (*byNumber)[number]
update(&item)