From c214cc6c807e5a75c40a68798abdbefb71902f80 Mon Sep 17 00:00:00 2001 From: eric <3024947@stud.hs-mannheim.de> Date: Thu, 7 Aug 2025 17:27:01 +0200 Subject: [PATCH] doppelte aus der liste entfernen --- README.md | 31 ++++++- .../Roullette/service/SpotifyAuthService.java | 80 +++++++++++++------ src/main/resources/notes | 9 --- 3 files changed, 86 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 28cce5a..4b9073a 100644 --- a/README.md +++ b/README.md @@ -8,4 +8,33 @@ 8. verhindern dass 3 mal hinterander der gleicher owner bzw. das gleiche lied kommt 9. songs die schon gespielt wurden in extra liste anzeigen um doppelte songs zu vermeiden (evtl. feste liste für spätere runden) -10. Schauen ob andere auch einen song in der liste haben für mehrere auswahlen \ No newline at end of file +10. Schauen ob andere auch einen song in der liste haben für mehrere auswahlen + +spotify:track:6ek0XS2AUbzrHS0B5wPNcU +spotify:track:3nOi7ba91njKhrSVfXL8N9 +spotify:track:1C7L687da9iOT9M06lQTHP +spotify:track:4sV4WmntbXUn04VVCBXKfm +spotify:track:1yV6fdxy2NEhF8NZglc05q +spotify:track:28gFMOStVQEoLErPNjqceH +spotify:track:2aLV4tGii6GOGZFWXpR5ZG +spotify:track:19uJO0Mwn5Kk6rMgfopBAc +spotify:track:7p0VAEeIQ9AUzVNcgYFzSX +spotify:track:471ZsQCVcur6UdFSvpgsWG +spotify:track:2SWBdMOS22tRx8RQvmKm24 +spotify:track:2iircORdVvzwpunyffnUlp +spotify:track:1DE97qruXdH4h9jdg4Wskj +spotify:track:6PpCmm96cOwriuVgP2czcq +spotify:track:4Z6nIEWR0pdHFj7V2i6CiV +spotify:track:1ZTKPOOoxX8wIDQKwQVecR +spotify:track:6GgE5Q4T1MSBF32F6bzJWH +spotify:track:42N2DvfVcx5vypA0dyKsC4 +spotify:track:3mvdCmuRinGmBwhIkScUAR +spotify:track:5V1Yu5iHBU5DFkkto9Xvqd +spotify:track:33UgExC0xy3V2GMFntq5Cd +spotify:track:2hpQl8ryv3IonCg9LiAtGT +spotify:track:2szqc4gTZSQwl8izHzDIuS +spotify:track:4XuyUnS0hbnM0rdmQU4lqh +spotify:track:6njBU31h23SmbQyX8J16j2 +spotify:track:0xhiZpXkrUJ09cGitxGpVl +spotify:track:3sR7YC1QR2bx7aIsQdjEtT +spotify:track:5vh22BuxNDxbAD0ze4fdql \ No newline at end of file diff --git a/src/main/java/eric/Roullette/service/SpotifyAuthService.java b/src/main/java/eric/Roullette/service/SpotifyAuthService.java index 3f247b6..a5c199f 100644 --- a/src/main/java/eric/Roullette/service/SpotifyAuthService.java +++ b/src/main/java/eric/Roullette/service/SpotifyAuthService.java @@ -1,5 +1,6 @@ package eric.Roullette.service; + import com.neovisionaries.i18n.CountryCode; import org.apache.hc.core5.http.ParseException; import se.michaelthelin.spotify.SpotifyApi; import se.michaelthelin.spotify.SpotifyHttpManager; @@ -9,16 +10,16 @@ package eric.Roullette.service; import se.michaelthelin.spotify.model_objects.specification.PagingCursorbased; import se.michaelthelin.spotify.model_objects.specification.PlayHistory; import se.michaelthelin.spotify.requests.data.player.GetCurrentUsersRecentlyPlayedTracksRequest; - + import se.michaelthelin.spotify.requests.data.library.GetUsersSavedTracksRequest; + import se.michaelthelin.spotify.model_objects.specification.SavedTrack; import java.io.IOException; import java.net.URI; - import java.util.Arrays; - import java.util.Collections; - import java.util.List; - import java.util.Map; + import java.util.*; import java.util.concurrent.ConcurrentHashMap; - public class SpotifyAuthService { + import static com.neovisionaries.i18n.CountryCode.DE; + +public class SpotifyAuthService { private final String clientId; private final String clientSecret; private final URI redirectUri; @@ -40,7 +41,7 @@ package eric.Roullette.service; .build(); return tempApi.authorizationCodeUri() - .scope("user-read-recently-played") + .scope("user-read-recently-played user-library-read") .state(user) // Der Benutzername wird im State mitgegeben .build() .execute(); @@ -80,33 +81,64 @@ package eric.Roullette.service; if (history == null || history.getItems() == null) { return Collections.emptyList(); } - return Arrays.stream(history.getItems()) + List recentTracks = Arrays.stream(history.getItems()) .map(item -> item.getTrack().getUri()) .distinct() .toList(); -// Verwende die limitierte Methode, um die Anzahl der Tracks zu begrenzen -// return getRecentTracksLimit(userApi, limit); + + if (recentTracks.size() < limit) { + int newLimit = limit - recentTracks.size(); + // restliche songs mit kürzlich gespeicherten Tracks auffüllen + List savedTracks = getSavedTracks(user, newLimit, 0); + // Nur Tracks hinzufügen, die noch nicht in recentTracks sind + savedTracks.removeAll(recentTracks); + recentTracks = new java.util.ArrayList<>(recentTracks); + recentTracks.addAll(savedTracks.subList(0, Math.min(newLimit, savedTracks.size()))); + if(recentTracks.size() < limit){ + newLimit = limit - recentTracks.size(); + List savedTracks2 = getSavedTracks(user, newLimit, 50); + savedTracks2.removeAll(recentTracks); + recentTracks.addAll(savedTracks2.subList(0, Math.min(newLimit, savedTracks2.size()))); + } + } + return recentTracks.subList(0, Math.min(limit, recentTracks.size())); } catch (IOException | SpotifyWebApiException | ParseException e) { e.printStackTrace(); return Collections.emptyList(); } } - private List getRecentTracksLimit(SpotifyApi userApi, int limit) throws IOException, SpotifyWebApiException, ParseException { - GetCurrentUsersRecentlyPlayedTracksRequest request = userApi.getCurrentUsersRecentlyPlayedTracks() - .limit(limit) - .build(); - PagingCursorbased history = request.execute(); - - List uris = Arrays.stream(history.getItems()) - .map(item -> item.getTrack().getUri()) - .distinct() - .toList(); - if (uris.size() < limit) { - int newLimit = limit + (limit - uris.size()); - return getRecentTracksLimit(userApi, newLimit); + private List getSavedTracks(String user, int limit, int offset) { + SpotifyApi userApi = userApis.get(user); + if (userApi == null) { + System.err.println("Kein SpotifyApi-Client für Benutzer gefunden: " + user); + return Collections.emptyList(); + } + try { + List saved = new ArrayList<>(); + while (saved.size() < limit) { + GetUsersSavedTracksRequest req = userApi.getUsersSavedTracks() + .limit(limit) + .offset(offset) + .market(CountryCode.DE) + .build(); + Paging page = req.execute(); + if (page == null || page.getItems().length == 0){ + System.out.println("Keine weiteren gespeicherten Tracks gefunden."); + break; + } + for (SavedTrack st : page.getItems()) { + saved.add(st.getTrack().getUri()); + if (saved.size() == limit) break; + } + offset += limit; + } + return saved; + } catch (IOException | SpotifyWebApiException | ParseException e) { + e.printStackTrace(); + return Collections.emptyList(); } - return uris.subList(0, limit); } + } \ No newline at end of file diff --git a/src/main/resources/notes b/src/main/resources/notes index a841e64..e69de29 100644 --- a/src/main/resources/notes +++ b/src/main/resources/notes @@ -1,9 +0,0 @@ -1. Limit manuell einstellbar -2. songs die schon gespielt wurden nicht mehr spielen -3. songs die schon gespielt wurden nicht mehr in der Liste anzeigen -4. songs die schon gespielt wurden in einer extra Liste anzeigen -mehrere auswählbar, wenn man alle richtig hat einen extra punkt kriegen -verhindern dass 3 mal hinterander der gleicher owner bzw. das gleiche lied kommt -songs die schon gespielt wurden in extra liste anzeigen um doppelte songs zu vermeiden -(evtl. feste liste für spätere runden) -Schauen ob andere auch einen song in der liste haben für mehrere auswahlen \ No newline at end of file