Skip to content

Commit fa6cc56

Browse files
Fix anime cover images and search not returning results for series and movies (#74)
* Initial plan * Fix anime cover not showing and anime search not returning results - Fix getArtwork() in TvSeriesApiImpl and MovieAPIImpl: call .getFilePath() on Artwork objects instead of concatenating the object directly (which called toString() instead of the file path) - Fix update() in MediaServiceImpl: ANIME_SERIE (case 5) was incorrectly using movieAPI for updates; now uses tvSeriesApi to properly handle TV series TMDB IDs - Fix findAnimeByIdOrName() to search both ANIME_SERIE (TV series) and ANIME_MOVIE categories so anime movies like 'kimi no na wa' are found - Add MediaRepository.findMediaByNameOrAlternativeTitleAndMediaCategoryIn() for multi-category DB queries used by anime search Co-authored-by: vitorhugo-java <65777252+vitorhugo-java@users.noreply.github.com> Agent-Logs-Url: https://github.com/EspacoGeek-Teams/SpringAPI_EspacoGeek/sessions/0513754b-713b-4688-beee-f869735040b8 --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: vitorhugo-java <65777252+vitorhugo-java@users.noreply.github.com>
1 parent 8880074 commit fa6cc56

4 files changed

Lines changed: 78 additions & 6 deletions

File tree

src/main/java/com/espacogeek/geek/data/api/impl/MovieAPIImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,8 @@ public MediaModel getArtwork(Integer id) {
179179
}
180180
var media = new MediaModel();
181181

182-
media.setCover(rawArtwork.getPosters().isEmpty() ? "" : ExternalCDN.TMDB.getUrl() + rawArtwork.getPosters().getFirst());
183-
media.setBanner(rawArtwork.getBackdrops().isEmpty() ? "" : ExternalCDN.TMDB.getUrl() + rawArtwork.getBackdrops().getFirst());
182+
media.setCover(rawArtwork.getPosters().isEmpty() ? "" : ExternalCDN.TMDB.getUrl() + rawArtwork.getPosters().getFirst().getFilePath());
183+
media.setBanner(rawArtwork.getBackdrops().isEmpty() ? "" : ExternalCDN.TMDB.getUrl() + rawArtwork.getBackdrops().getFirst().getFilePath());
184184

185185
return media;
186186
}

src/main/java/com/espacogeek/geek/data/api/impl/TvSeriesApiImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,8 @@ public MediaModel getArtwork(Integer id) {
187187
}
188188
var media = new MediaModel();
189189

190-
media.setCover(rawArtwork.getPosters().isEmpty() ? "" : ExternalCDN.TMDB.getUrl() + rawArtwork.getPosters().getFirst());
191-
media.setBanner(rawArtwork.getBackdrops().isEmpty() ? "" : ExternalCDN.TMDB.getUrl() + rawArtwork.getBackdrops().getFirst());
190+
media.setCover(rawArtwork.getPosters().isEmpty() ? "" : ExternalCDN.TMDB.getUrl() + rawArtwork.getPosters().getFirst().getFilePath());
191+
media.setBanner(rawArtwork.getBackdrops().isEmpty() ? "" : ExternalCDN.TMDB.getUrl() + rawArtwork.getBackdrops().getFirst().getFilePath());
192192

193193
return media;
194194
}

src/main/java/com/espacogeek/geek/repositories/MediaRepository.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,32 @@ Page<MediaModel> findMediaByNameOrAlternativeTitleAndMediaCategory(
5151
@Param("category") Integer category,
5252
@PageableDefault(size = 10, page = 0) Pageable pageable);
5353

54+
/**
55+
* Finds media by matching name or alternative title within multiple media
56+
* categories.
57+
*
58+
* @param name The name of the media to search for.
59+
* @param alternativeTitle The alternative title of the media to search for.
60+
* @param categories The IDs of the media categories to filter results by.
61+
* @param pageable Pagination information.
62+
* @return A page of MediaModel objects that match the search criteria.
63+
*/
64+
@Query("SELECT m FROM MediaModel m " +
65+
"WHERE m.mediaCategory.id IN :categories " +
66+
"AND (" +
67+
" m.name LIKE CONCAT('%', :name, '%') " +
68+
" OR EXISTS (" +
69+
" SELECT 1 FROM AlternativeTitleModel a " +
70+
" WHERE a.media = m " +
71+
" AND a.name LIKE CONCAT('%', :alternativeTitle, '%')" +
72+
" )" +
73+
")")
74+
Page<MediaModel> findMediaByNameOrAlternativeTitleAndMediaCategoryIn(
75+
@Param("name") String name,
76+
@Param("alternativeTitle") String alternativeTitle,
77+
@Param("categories") java.util.Collection<Integer> categories,
78+
@PageableDefault(size = 10, page = 0) Pageable pageable);
79+
5480
/**
5581
* Find Media by ExternalReference and TypeReference.
5682
*

src/main/java/com/espacogeek/geek/services/impl/MediaServiceImpl.java

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,51 @@ public Optional<String> randomArtwork() {
242242
@Override
243243
@SuppressWarnings("unchecked")
244244
public MediaPage findAnimeByIdOrName(Integer id, String name, Pageable pageable) {
245-
return findTmdbMediaByIdOrName(id, name, pageable, MediaDataController.MediaType.ANIME_SERIE, tvSeriesApi);
245+
Pageable safePageable = pageable != null ? pageable : Pageable.unpaged();
246+
247+
if (id != null) {
248+
List<MediaModel> medias = new ArrayList<>();
249+
this.mediaRepository.findById(id).ifPresent(media -> medias.add((MediaModel) media));
250+
return mountMediaPage(new PageImpl<>(medias, safePageable, medias.size()));
251+
}
252+
253+
var animeSerie = mediaCategoryService.findById(MediaDataController.MediaType.ANIME_SERIE.getId()).orElseThrow();
254+
var animeMovie = mediaCategoryService.findById(MediaDataController.MediaType.ANIME_MOVIE.getId()).orElseThrow();
255+
List<Integer> animeCategories = List.of(animeSerie.getId(), animeMovie.getId());
256+
257+
Page<MediaModel> results = (Page<MediaModel>) this.mediaRepository
258+
.findMediaByNameOrAlternativeTitleAndMediaCategoryIn(name, name, animeCategories, safePageable);
259+
260+
if (results.hasContent()) {
261+
List<MediaModel> refreshed = results.getContent().stream()
262+
.map(this::updateIfStale)
263+
.toList();
264+
return mountMediaPage(new PageImpl<>(refreshed, safePageable, results.getTotalElements()));
265+
}
266+
267+
if (name == null || name.isBlank()) {
268+
return mountMediaPage(Page.empty(safePageable));
269+
}
270+
271+
var tmdbTypeReference = typeReferenceService.findById(MediaDataController.ExternalReferenceType.TMDB.getId()).orElseThrow();
272+
List<MediaModel> seriesFetched = genericMediaDataController.searchMedia(name, tvSeriesApi, tmdbTypeReference, animeSerie);
273+
List<MediaModel> movieFetched = genericMediaDataController.searchMedia(name, movieAPI, tmdbTypeReference, animeMovie);
274+
275+
List<MediaModel> fetched = new ArrayList<>();
276+
fetched.addAll(seriesFetched);
277+
fetched.addAll(movieFetched);
278+
279+
if (fetched.isEmpty()) {
280+
return mountMediaPage(Page.empty(safePageable));
281+
}
282+
283+
int fromIndex = Math.min((int) safePageable.getOffset(), fetched.size());
284+
int toIndex = safePageable.isPaged()
285+
? Math.min(fromIndex + safePageable.getPageSize(), fetched.size())
286+
: fetched.size();
287+
List<MediaModel> pagedContent = fetched.subList(fromIndex, toIndex);
288+
289+
return mountMediaPage(new PageImpl<>(pagedContent, safePageable, fetched.size()));
246290
}
247291

248292
/**
@@ -257,8 +301,10 @@ public MediaPage findMovieByIdOrName(Integer id, String name, Pageable pageable)
257301
private MediaModel update(MediaModel media) {
258302
return switch (media.getMediaCategory().getId()) {
259303
case 1 -> MediaUtils.updateMedia(List.of(media), serieController).getFirst();
260-
case 4, 7, 5 ->
304+
case 4, 7 ->
261305
MediaUtils.updateGenericMedia(List.of(media), genericMediaDataController, typeReferenceService.findById(MediaDataController.ExternalReferenceType.TMDB.getId()).get(), movieAPI).getFirst();
306+
case 5 ->
307+
MediaUtils.updateGenericMedia(List.of(media), genericMediaDataController, typeReferenceService.findById(MediaDataController.ExternalReferenceType.TMDB.getId()).get(), tvSeriesApi).getFirst();
262308
case 2, 3 ->
263309
MediaUtils.updateGenericMedia(List.of(media), genericMediaDataController, typeReferenceService.findById(MediaDataController.ExternalReferenceType.IGDB.getId()).get(), gamesAndVNsAPI).getFirst();
264310
default -> media;

0 commit comments

Comments
 (0)