@@ -146,30 +146,16 @@ func SearchAnimeEnhanced(name string, source string) (*models.Anime, error) {
146146
147147 util .Debug ("Search results summary" , "total" , len (animes ))
148148
149- // Show sources breakdown in debug only
150- animefireCount := 0
151- allanimeCount := 0
152- animedriveCount := 0
153- flixhqCount := 0
154- nineAnimeCount := 0
155- superflixCount := 0
156- for _ , anime := range animes {
157- if strings .Contains (anime .Source , "AnimeFire" ) {
158- animefireCount ++
159- } else if anime .Source == "AllAnime" {
160- allanimeCount ++
161- } else if anime .Source == "AnimeDrive" {
162- animedriveCount ++
163- } else if anime .Source == "FlixHQ" {
164- flixhqCount ++
165- } else if anime .Source == "9Anime" {
166- nineAnimeCount ++
167- } else if anime .Source == "SuperFlix" {
168- superflixCount ++
169- }
170- }
171-
172- util .Debug ("Source breakdown" , "AnimeFire" , animefireCount , "AllAnime" , allanimeCount , "AnimeDrive" , animedriveCount , "FlixHQ" , flixhqCount , "9Anime" , nineAnimeCount , "SuperFlix" , superflixCount )
149+ breakdown := countSourceBreakdown (animes )
150+ util .Debug ("Source breakdown" ,
151+ "AnimeFire" , breakdown .AnimeFire ,
152+ "AllAnime" , breakdown .AllAnime ,
153+ "AnimeDrive" , breakdown .AnimeDrive ,
154+ "FlixHQ" , breakdown .FlixHQ ,
155+ "9Anime" , breakdown .NineAnime ,
156+ "SuperFlix" , breakdown .SuperFlix ,
157+ "Goyabu" , breakdown .Goyabu ,
158+ )
173159
174160 // Sort results by language priority: Portuguese first, then Multilanguage, Movies/TV, English, others
175161 sort .SliceStable (animes , func (i , j int ) bool {
@@ -279,10 +265,12 @@ func GetAnimeEpisodesEnhanced(anime *models.Anime) ([]models.Episode, error) {
279265 // Determine source type from multiple indicators with enhanced logic
280266 var sourceName string
281267
282- // Priority 1: Check the Source field (most reliable)
268+ // Priority 1: Check the Source field (most reliable). Use a case-insensitive
269+ // match for AnimeFire because the scraper emits "Animefire.io" (lowercase 'f')
270+ // while older code paths/tests sometimes use the camelcase spelling "AnimeFire".
283271 if anime .Source == "AllAnime" {
284272 sourceName = "AllAnime"
285- } else if strings .Contains (anime .Source , "AnimeFire " ) {
273+ } else if strings .Contains (strings . ToLower ( anime .Source ) , "animefire " ) {
286274 sourceName = "Animefire.io"
287275 } else if anime .Source == "AnimeDrive" {
288276 sourceName = "AnimeDrive"
@@ -1151,6 +1139,49 @@ func GetSuperFlixStreamURL(media *models.Anime, episode *models.Episode, quality
11511139 return result .StreamURL , nil
11521140}
11531141
1142+ // sourceBreakdown holds per-source result counts for the debug "Source breakdown"
1143+ // diagnostic line. Counted via countSourceBreakdown so the predicate stays
1144+ // testable in isolation.
1145+ type sourceBreakdown struct {
1146+ AnimeFire int
1147+ AllAnime int
1148+ AnimeDrive int
1149+ FlixHQ int
1150+ NineAnime int
1151+ SuperFlix int
1152+ Goyabu int
1153+ }
1154+
1155+ // countSourceBreakdown tallies anime results by Source field using
1156+ // case-insensitive matching for AnimeFire. The scraper canonical Source is
1157+ // "Animefire.io" (lowercase 'f'), but older callers and tests sometimes emit
1158+ // "AnimeFire"; both must be counted so the diagnostic line never lies.
1159+ func countSourceBreakdown (animes []* models.Anime ) sourceBreakdown {
1160+ var b sourceBreakdown
1161+ for _ , anime := range animes {
1162+ if anime == nil {
1163+ continue
1164+ }
1165+ switch {
1166+ case strings .Contains (strings .ToLower (anime .Source ), "animefire" ):
1167+ b .AnimeFire ++
1168+ case anime .Source == "AllAnime" :
1169+ b .AllAnime ++
1170+ case anime .Source == "AnimeDrive" :
1171+ b .AnimeDrive ++
1172+ case anime .Source == "FlixHQ" :
1173+ b .FlixHQ ++
1174+ case anime .Source == "9Anime" :
1175+ b .NineAnime ++
1176+ case anime .Source == "SuperFlix" :
1177+ b .SuperFlix ++
1178+ case anime .Source == "Goyabu" :
1179+ b .Goyabu ++
1180+ }
1181+ }
1182+ return b
1183+ }
1184+
11541185// languagePriority returns a sort key for language-based ordering.
11551186// Lower values sort first: Portuguese → Multilanguage → English → Movies/TV → Unknown.
11561187func languagePriority (name string ) int {
0 commit comments