doppelte aus der liste entfernen

pull/24/head
eric 2025-08-07 17:27:01 +02:00
parent ef634e9009
commit c214cc6c80
3 changed files with 86 additions and 34 deletions

View File

@ -8,4 +8,33 @@
8. verhindern dass 3 mal hinterander der gleicher owner bzw. das gleiche lied kommt 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 9. songs die schon gespielt wurden in extra liste anzeigen um doppelte songs zu vermeiden
(evtl. feste liste für spätere runden) (evtl. feste liste für spätere runden)
10. Schauen ob andere auch einen song in der liste haben für mehrere auswahlen 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

View File

@ -1,5 +1,6 @@
package eric.Roullette.service; package eric.Roullette.service;
import com.neovisionaries.i18n.CountryCode;
import org.apache.hc.core5.http.ParseException; import org.apache.hc.core5.http.ParseException;
import se.michaelthelin.spotify.SpotifyApi; import se.michaelthelin.spotify.SpotifyApi;
import se.michaelthelin.spotify.SpotifyHttpManager; 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.PagingCursorbased;
import se.michaelthelin.spotify.model_objects.specification.PlayHistory; import se.michaelthelin.spotify.model_objects.specification.PlayHistory;
import se.michaelthelin.spotify.requests.data.player.GetCurrentUsersRecentlyPlayedTracksRequest; 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.io.IOException;
import java.net.URI; import java.net.URI;
import java.util.Arrays; import java.util.*;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; 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 clientId;
private final String clientSecret; private final String clientSecret;
private final URI redirectUri; private final URI redirectUri;
@ -40,7 +41,7 @@ package eric.Roullette.service;
.build(); .build();
return tempApi.authorizationCodeUri() return tempApi.authorizationCodeUri()
.scope("user-read-recently-played") .scope("user-read-recently-played user-library-read")
.state(user) // Der Benutzername wird im State mitgegeben .state(user) // Der Benutzername wird im State mitgegeben
.build() .build()
.execute(); .execute();
@ -80,33 +81,64 @@ package eric.Roullette.service;
if (history == null || history.getItems() == null) { if (history == null || history.getItems() == null) {
return Collections.emptyList(); return Collections.emptyList();
} }
return Arrays.stream(history.getItems()) List<String> recentTracks = Arrays.stream(history.getItems())
.map(item -> item.getTrack().getUri()) .map(item -> item.getTrack().getUri())
.distinct() .distinct()
.toList(); .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<String> 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<String> 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) { } catch (IOException | SpotifyWebApiException | ParseException e) {
e.printStackTrace(); e.printStackTrace();
return Collections.emptyList(); return Collections.emptyList();
} }
} }
private List<String> getRecentTracksLimit(SpotifyApi userApi, int limit) throws IOException, SpotifyWebApiException, ParseException { private List<String> getSavedTracks(String user, int limit, int offset) {
GetCurrentUsersRecentlyPlayedTracksRequest request = userApi.getCurrentUsersRecentlyPlayedTracks() SpotifyApi userApi = userApis.get(user);
.limit(limit)
.build();
PagingCursorbased<PlayHistory> history = request.execute();
List<String> 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);
if (userApi == null) {
System.err.println("Kein SpotifyApi-Client für Benutzer gefunden: " + user);
return Collections.emptyList();
}
try {
List<String> saved = new ArrayList<>();
while (saved.size() < limit) {
GetUsersSavedTracksRequest req = userApi.getUsersSavedTracks()
.limit(limit)
.offset(offset)
.market(CountryCode.DE)
.build();
Paging<SavedTrack> 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);
} }
} }

View File

@ -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