Browse Source

add pagination

main
Stephanie Gredell 2 years ago
parent
commit
c353260768
  1. 1
      app/src/main/java/musicbot/Main.java
  2. 6
      app/src/main/java/musicbot/SpotifyClient.java
  3. 3
      app/src/main/java/musicbot/YoutubeSearch.java
  4. 14
      app/src/main/java/musicbot/commands/Genres.java
  5. 63
      app/src/main/java/musicbot/commands/Recommend.java

1
app/src/main/java/musicbot/Main.java

@ -17,5 +17,6 @@ public class Main { @@ -17,5 +17,6 @@ public class Main {
manager.add(new MusicVideo());
manager.add(new Recommend());
jda.addEventListener(manager);
jda.addEventListener(new Listeners());
}
}

6
app/src/main/java/musicbot/SpotifyClient.java

@ -52,7 +52,7 @@ public class SpotifyClient { @@ -52,7 +52,7 @@ public class SpotifyClient {
public List<Track> findTracks(final String query) {
try {
final SearchTracksRequest searchTracksRequest = SPOTIFY_API.searchTracks(query).limit(10).build();
final SearchTracksRequest searchTracksRequest = SPOTIFY_API.searchTracks(query).build();
final Paging<Track> tracks = searchTracksRequest.execute();
@ -63,8 +63,7 @@ public class SpotifyClient { @@ -63,8 +63,7 @@ public class SpotifyClient {
}
public List<Track> findRecommendations(final String artistId, final String genres) {
final GetRecommendationsRequest.Builder recommendationsRequestBuilder = SPOTIFY_API.getRecommendations()
.limit(5);
final GetRecommendationsRequest.Builder recommendationsRequestBuilder = SPOTIFY_API.getRecommendations();
if (!artistId.isEmpty()) {
recommendationsRequestBuilder
@ -80,7 +79,6 @@ public class SpotifyClient { @@ -80,7 +79,6 @@ public class SpotifyClient {
try {
final Recommendations recommendations = recommendationsRequest.execute();
System.out.println("Length: " + recommendations.getTracks().length);
return Arrays.stream(recommendations.getTracks()).collect(Collectors.toList());
} catch (IOException | SpotifyWebApiException | ParseException e) {

3
app/src/main/java/musicbot/YoutubeSearch.java

@ -35,9 +35,6 @@ public class YoutubeSearch { @@ -35,9 +35,6 @@ public class YoutubeSearch {
final List<SearchResult> searchResults = doSearch(title, artist);
final Optional<SearchResult> maybeResult = searchResults.stream().findFirst();
searchResults.stream().forEach(result -> {
System.out.println("result ID = " + result.getId());
});
return maybeResult.map(result -> "http://www.youtube.com/watch?v=" + result.getId().getVideoId())
.orElse("No videos found.");

14
app/src/main/java/musicbot/commands/Genres.java

@ -8,6 +8,7 @@ import net.dv8tion.jda.api.entities.MessageEmbed; @@ -8,6 +8,7 @@ import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.dv8tion.jda.api.interactions.commands.build.OptionData;
import net.dv8tion.jda.api.interactions.components.buttons.Button;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
@ -33,17 +34,16 @@ public class Genres implements MCommand { @@ -33,17 +34,16 @@ public class Genres implements MCommand {
@Override
public void execute(SlashCommandInteractionEvent event) {
event.deferReply().queue();
final SpotifyClient spotifyClient = new SpotifyClient();
final List<String> genres = spotifyClient.findGenres();
final List<List<String>> batches = Lists.partition(genres, 20);
final EmbedBuilder eb = new EmbedBuilder();
final List<MessageEmbed> embeds = batches.stream().map(genresList -> {
final EmbedBuilder eb = new EmbedBuilder();
genresList.forEach(genre -> eb.addField(genre, "", false));
return eb.build();
}).collect(Collectors.toList());
genres.subList(0, 10).forEach(genre -> eb.addField(genre, "", false));
event.getChannel().sendMessageEmbeds(embeds).queue();
event.getHook().sendMessageEmbeds(eb.build()).addActionRow(
Button.primary("genre_1", "More")
).queue();
}
}

63
app/src/main/java/musicbot/commands/Recommend.java

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
package musicbot.commands;
import musicbot.MCommand;
import musicbot.SpotifyClient;
import musicbot.RecommendationService;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
@ -9,7 +9,6 @@ import net.dv8tion.jda.api.interactions.commands.OptionMapping; @@ -9,7 +9,6 @@ import net.dv8tion.jda.api.interactions.commands.OptionMapping;
import net.dv8tion.jda.api.interactions.commands.OptionType;
import net.dv8tion.jda.api.interactions.commands.build.OptionData;
import net.dv8tion.jda.api.interactions.components.buttons.Button;
import se.michaelthelin.spotify.model_objects.specification.Artist;
import se.michaelthelin.spotify.model_objects.specification.ArtistSimplified;
import se.michaelthelin.spotify.model_objects.specification.Track;
@ -48,28 +47,21 @@ public class Recommend implements MCommand { @@ -48,28 +47,21 @@ public class Recommend implements MCommand {
public void execute(SlashCommandInteractionEvent event) {
event.deferReply().queue();
final OptionMapping artistInput = event.getOption("artist");
final OptionMapping genreInput = event.getOption("genre");
final String artistInput = event.getOption("artist") != null ? event.getOption("artist").getAsString() : "";
final String genreInput = event.getOption("genre") != null ? event.getOption("genre").getAsString() : "";
final Optional<String> maybeArtistId = findArtistId(artistInput);
final Optional<String> maybeGenre = findGenre(genreInput);
final SpotifyClient spotifyClient = new SpotifyClient();
final String artistId = maybeArtistId.orElse("");
final String genre = maybeGenre.orElse("");
final List<Track> tracks = spotifyClient.findRecommendations(artistId, genre);
final List<Track> tracks = new RecommendationService().getRecommendations(artistInput, genreInput, 1);
final EmbedBuilder eb = new EmbedBuilder();
if (!tracks.isEmpty()) {
final List<Track> trackList = tracks.subList(0, 5);
if (!trackList.isEmpty()) {
eb
.setTitle("Recommendations")
.setTitle("Recommendations based on \"" + artistInput + "\"")
.setDescription("Here are a list of recommendations based on your input. " +
"It will help you find new music to listen to.")
.setFooter("To find a song, select a button below.");
tracks.forEach(track -> {
trackList.forEach(track -> {
final List<String> trackArtists = Arrays.stream(track.getArtists())
.map(ArtistSimplified::getName)
.collect(Collectors.toList());
@ -80,10 +72,24 @@ public class Recommend implements MCommand { @@ -80,10 +72,24 @@ public class Recommend implements MCommand {
final MessageEmbed embed = eb.build();
final List<Button> buttons = tracks.stream().map(track ->
Button.primary(track.getName(), track.getName())).toList();
event.getHook().sendMessageEmbeds(embed).addActionRow(buttons).queue();
final List<Button> buttons = trackList.stream().map(track -> {
final String artists = String.join(
", ",
Arrays.stream(track.getArtists()).map(ArtistSimplified::getName)
.collect(Collectors.toList()));
return Button.primary("recommend_" + artists, track.getName());
}).collect(Collectors.toList());
final String buttonId = "more-recommend_" + artistInput + "--" + genreInput + "_" + "1";
event
.getHook()
.sendMessageEmbeds(embed)
.addActionRow(buttons)
.addActionRow(Button.secondary(buttonId, "Get more recommendations"))
.queue();
} else {
eb.setTitle("No recommendations found");
final MessageEmbed embed = eb.build();
@ -91,23 +97,4 @@ public class Recommend implements MCommand { @@ -91,23 +97,4 @@ public class Recommend implements MCommand {
event.getHook().sendMessageEmbeds(embed).queue();
}
}
private Optional<String> findArtistId(final OptionMapping artistInput) {
if (artistInput == null) {
return Optional.empty();
}
final SpotifyClient spotifyClient = new SpotifyClient();
final Optional<Artist> maybeArtist = spotifyClient.findArtist(artistInput.getAsString());
return maybeArtist.map(Artist::getId);
}
private Optional<String> findGenre(final OptionMapping genreInput) {
if (genreInput == null) {
return Optional.empty();
}
return Optional.of(genreInput.getAsString());
}
}

Loading…
Cancel
Save