Fix: per-artist monitoring filter instead of global type filter

This commit is contained in:
2026-07-06 13:07:25 +02:00
parent 5997daaebc
commit 49e1efd363
@@ -30,43 +30,54 @@ public class FeedService {
var artists = artistService.findAll(); var artists = artistService.findAll();
if (artists.isEmpty()) return List.of(); if (artists.isEmpty()) return List.of();
var artistMbids = new ArrayList<String>(); var artistMbids = artistMbidsWithRefresh(artists);
for (var a : artists) {
if (cacheService.needsRefresh(a.mbid())) {
var types = getMonitoredTypes(a);
releaseGroupService.fetchAndCache(a.mbid(), a.name(), types);
}
artistMbids.add(a.mbid());
}
var allTypes = List.of("Album", "Single", "EP", "Broadcast", "Other"); var allTypes = List.of("Album", "Single", "EP", "Broadcast", "Other");
var monitoredTypes = new ArrayList<String>(); var allEntries = db.getFeed(artistMbids, allTypes, 0, 0).entries();
for (var a : artists) { return filterByArtistMonitoring(allEntries, artists);
monitoredTypes.addAll(getMonitoredTypes(a));
}
return db.getFeed(artistMbids, monitoredTypes.isEmpty() ? allTypes : monitoredTypes, 0, 0).entries();
} }
public FeedResult getFeedEntries(int page) { public FeedResult getFeedEntries(int page) {
var artists = artistService.findAll(); var artists = artistService.findAll();
if (artists.isEmpty()) return new FeedResult(List.of(), false); if (artists.isEmpty()) return new FeedResult(List.of(), false);
var artistMbids = new ArrayList<String>(); var artistMbids = artistMbidsWithRefresh(artists);
var allTypes = List.of("Album", "Single", "EP", "Broadcast", "Other");
var allEntries = db.getFeed(artistMbids, allTypes, 0, 0).entries();
var filtered = filterByArtistMonitoring(allEntries, artists);
var fromIndex = (page - 1) * PAGE_SIZE;
if (fromIndex >= filtered.size()) return new FeedResult(List.of(), false);
var toIndex = Math.min(fromIndex + PAGE_SIZE, filtered.size());
var pageEntries = filtered.subList(fromIndex, toIndex);
var hasMore = toIndex < filtered.size();
return new FeedResult(pageEntries, hasMore);
}
private List<String> artistMbidsWithRefresh(List<TrackedArtist> artists) {
var mbids = new ArrayList<String>();
for (var a : artists) { for (var a : artists) {
if (cacheService.needsRefresh(a.mbid())) { if (cacheService.needsRefresh(a.mbid())) {
var types = getMonitoredTypes(a); var types = getMonitoredTypes(a);
releaseGroupService.fetchAndCache(a.mbid(), a.name(), types); releaseGroupService.fetchAndCache(a.mbid(), a.name(), types);
} }
artistMbids.add(a.mbid()); mbids.add(a.mbid());
}
return mbids;
} }
var allTypes = List.of("Album", "Single", "EP", "Broadcast", "Other"); private List<ReleaseGroup> filterByArtistMonitoring(List<ReleaseGroup> entries, List<TrackedArtist> artists) {
var monitoredTypes = new ArrayList<String>(); var flags = new java.util.HashMap<String, java.util.Set<String>>();
for (var a : artists) { for (var a : artists) {
monitoredTypes.addAll(getMonitoredTypes(a)); flags.put(a.mbid(), java.util.Set.copyOf(getMonitoredTypes(a)));
} }
var result = new ArrayList<ReleaseGroup>();
return db.getFeed(artistMbids, monitoredTypes.isEmpty() ? allTypes : monitoredTypes, PAGE_SIZE, (page - 1) * PAGE_SIZE); for (var e : entries) {
var artistFlags = flags.get(e.artistMbid());
if (artistFlags != null && artistFlags.contains(e.primaryType())) {
result.add(e);
}
}
return result;
} }
private List<String> getMonitoredTypes(TrackedArtist a) { private List<String> getMonitoredTypes(TrackedArtist a) {