Hello everyone. I'm just curious is there a better way to handle loading (and searching) audio tracks than my way:
List<AudioTrack> combinedTracks = new ArrayList<>();
for (Document track : mentionedUserTopTracks) {
CompletableFuture<AudioTrack> futureTrack =
PlayerManager.getInstance().getTrack(track.getString("trackUrl"), textChannel);
try {
AudioTrack audioTrack = futureTrack.get();
if (audioTrack != null) {
String trackTitle = track.getString("trackTitle");
Long userId = track.getLong("authorId");
User user = ctx.getEvent().getJDA().retrieveUserById(userId).complete();
if (user != null) {
trackUsers
.computeIfAbsent(trackTitle, k -> new ArrayList<>())
.add(user.getEffectiveName());
} else {
MessageSender.sendErrorMessage(
textChannel, "Error");
ErrorSender.sendError("Error!", "blend");
}
if (combinedTracks.stream()
.noneMatch(t -> t.getInfo().title.equals(audioTrack.getInfo().title))) {
combinedTracks.add(audioTrack);
}
}
} catch (InterruptedException | ExecutionException e) {
logExceptionMessage(e, "blend");
}
The function getTrack is CompletableFuture with logic based on:
public CompletableFuture<AudioTrack> getTrack(String trackUrl, TextChannel textChannel) {
final GuildMusicManager musicManager = getGuildMusicManager(textChannel.getGuild());
CompletableFuture<AudioTrack> futureTrack = new CompletableFuture<>();
this.audioPlayerManager.loadItemOrdered(
musicManager,
trackUrl,
new AudioLoadResultHandler() {
@Override
public void trackLoaded(AudioTrack audioTrack) {
futureTrack.complete(audioTrack);
}
@Override
public void playlistLoaded(AudioPlaylist audioPlaylist) {
futureTrack.complete(audioPlaylist.getTracks().getFirst());
}
@Override
public void noMatches() {
MessageSender.sendErrorMessage(
textChannel, "Ziom... Nie mogłem znaleźć wyników dla: " + trackUrl);
futureTrack.complete(null);
}
@Override
public void loadFailed(FriendlyException e) {
MessageSender.sendErrorMessage(
textChannel, "Nie udało się załadować: " + e.getMessage());
futureTrack.completeExceptionally(e);
}
});
return futureTrack;
}
I have the AudioTrack stored in database but unofrtunately as a String
track: "dev.lavalink.youtube.track.YoutubeAudioTrack@7145d10e"
Can i build an AudioTrack from this? Or even better, can i create an AudioTrack class specifically from that String in any way?