From 9cf78e4386a6ac03f414791503a32e4c9c9565a7 Mon Sep 17 00:00:00 2001 From: Reperak Date: Tue, 23 Nov 2021 21:00:04 -0600 Subject: [PATCH 1/3] Move custom AudioLoadResultHandler implementation to own class --- .../audio/CustomAudioLoadResultHandler.java | 40 +++++++++++++++++++ .../ztereomusic/command/commands/Play.java | 25 +----------- 2 files changed, 42 insertions(+), 23 deletions(-) create mode 100644 src/main/java/codes/ztereohype/ztereomusic/audio/CustomAudioLoadResultHandler.java diff --git a/src/main/java/codes/ztereohype/ztereomusic/audio/CustomAudioLoadResultHandler.java b/src/main/java/codes/ztereohype/ztereomusic/audio/CustomAudioLoadResultHandler.java new file mode 100644 index 0000000..f35bab2 --- /dev/null +++ b/src/main/java/codes/ztereohype/ztereomusic/audio/CustomAudioLoadResultHandler.java @@ -0,0 +1,40 @@ +package codes.ztereohype.ztereomusic.audio; + +import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler; +import com.sedmelluq.discord.lavaplayer.tools.FriendlyException; +import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist; +import com.sedmelluq.discord.lavaplayer.track.AudioTrack; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; + +public class CustomAudioLoadResultHandler implements AudioLoadResultHandler { + private final TrackManager trackManager; + private final MessageReceivedEvent messageEvent; + + public CustomAudioLoadResultHandler(TrackManager trackManager, MessageReceivedEvent messageEvent) { + this.trackManager = trackManager; + this.messageEvent = messageEvent; + } + + @Override + public void trackLoaded(AudioTrack track) { + this.trackManager.queue(track); + } + + @Override + public void playlistLoaded(AudioPlaylist playlist) { + for (AudioTrack track : playlist.getTracks()) { + this.trackManager.queue(track); + } + } + + @Override + public void noMatches() { + this.messageEvent.getMessage().reply("I found no matches for that song!").queue(); + } + + @Override + public void loadFailed(FriendlyException throwable) { + this.messageEvent.getMessage().reply("everything blew up and died. i'm sorry.").queue(); + } +} + diff --git a/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java b/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java index 6a8149e..dcaa040 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java +++ b/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java @@ -1,6 +1,7 @@ package codes.ztereohype.ztereomusic.command.commands; import codes.ztereohype.ztereomusic.ZtereoMUSIC; +import codes.ztereohype.ztereomusic.audio.CustomAudioLoadResultHandler; import codes.ztereohype.ztereomusic.audio.TrackManager; import codes.ztereohype.ztereomusic.audio.TrackManagers; import codes.ztereohype.ztereomusic.command.Command; @@ -71,28 +72,6 @@ public class Play implements Command { TrackManager trackManager = TrackManagers.getGuildTrackManager(guild, messageChannel, manager.getConnectedChannel(), voiceChannel); - playerManager.loadItem(identifier, new AudioLoadResultHandler() { - @Override - public void trackLoaded(AudioTrack track) { - trackManager.queue(track); - } - - @Override - public void playlistLoaded(AudioPlaylist playlist) { - for (AudioTrack track : playlist.getTracks()) { - trackManager.queue(track); - } - } - - @Override - public void noMatches() { - messageEvent.getMessage().reply("I found no matches for that song!").queue(); - } - - @Override - public void loadFailed(FriendlyException throwable) { - messageEvent.getMessage().reply("everything blew up and died. i'm sorry.").queue(); - } - }); + playerManager.loadItem(identifier, new CustomAudioLoadResultHandler(trackManager, messageEvent)); } } From d31d36538ec05dcc2b396ff6787b391700ccadee Mon Sep 17 00:00:00 2001 From: Reperak Date: Tue, 23 Nov 2021 21:30:09 -0600 Subject: [PATCH 2/3] Refactor YouTube interface, make error handling safer --- .../ztereomusic/command/commands/Play.java | 15 ++++---- .../ztereomusic/networking/YoutubeSearch.java | 36 +++++++++---------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java b/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java index dcaa040..f93efda 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java +++ b/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java @@ -12,12 +12,14 @@ import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; import com.sedmelluq.discord.lavaplayer.tools.FriendlyException; import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist; import com.sedmelluq.discord.lavaplayer.track.AudioTrack; +import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; import net.dv8tion.jda.api.entities.*; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import net.dv8tion.jda.api.managers.AudioManager; import java.io.IOException; import java.util.Objects; +import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -55,15 +57,14 @@ public class Play implements Command { Matcher matchedUrls = urlPattern.matcher(mergedArgs); boolean urlFound = matchedUrls.find(); - // todo: clean up this bullshit try catch thing String identifier; if (!urlFound) { - // youtube api shit - try { - identifier = YoutubeSearch.getVideoUrl(mergedArgs); - } catch (IOException e) { - e.printStackTrace(); - identifier = "error"; + Optional query = YoutubeSearch.query(mergedArgs); + if (query.isPresent()) { + identifier = query.get(); + } else { + messageEvent.getChannel().sendMessage("I found no matches for that song!").queue(); + return; } } else { // set identifier to the parsed url diff --git a/src/main/java/codes/ztereohype/ztereomusic/networking/YoutubeSearch.java b/src/main/java/codes/ztereohype/ztereomusic/networking/YoutubeSearch.java index b972509..bb57b98 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/networking/YoutubeSearch.java +++ b/src/main/java/codes/ztereohype/ztereomusic/networking/YoutubeSearch.java @@ -10,32 +10,30 @@ import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.nio.charset.StandardCharsets; +import java.util.Optional; public class YoutubeSearch { - public static String getVideoUrl(String title) throws IOException { - String apiKey = ZtereoMUSIC.getInstance().getConfig().getPropreties().get("yt_api_key"); - String query; + private static final String API_KEY = ZtereoMUSIC.getInstance().getConfig().getPropreties().get("yt_api_key"); + private static final Json JSON = Json.json(); - title = (title.contains(" ")) ? title.replace(" ","+") : title; - query = "https://www.googleapis.com/youtube/v3/search?part=snippet&q=%22"+title+"%22&type=video&key="+apiKey; + public static Optional query(String title) { + String query = "https://www.googleapis.com/youtube/v3/search?part=snippet&q=%22" + + title.replace(' ', '+') + "%22&type=video&key=" + API_KEY; - // todo: add safety here, sounds a bit unsafe to me tbh but idk - InputStream inputStream = new URL(query).openStream(); - String jsonResponse = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8); - - //todo: clean up this bullshit try/catch shit and error - Json json = Json.json(); - JsonNode parsedResponse; - JsonPath path = JsonPath.parse("items[0].id.videoId"); - String videoId; + String jsonResponse; try { - parsedResponse = json.parse(jsonResponse); - videoId = parsedResponse.query(path).asString(); + jsonResponse = new String(new URL(query).openStream().readAllBytes()); + } catch (IOException e) { + e.printStackTrace(); + return Optional.empty(); + } + JsonPath path = JsonPath.parse("items[0].id.videoId"); + + try { + return Optional.ofNullable(JSON.parse(jsonResponse).query(path).asString()); } catch (JsonSyntaxException e) { e.printStackTrace(); - videoId = "error"; + return Optional.empty(); } - - return videoId; } } From 3df3a069c87721f821ae8e91b74897824ae66de0 Mon Sep 17 00:00:00 2001 From: Reperak Date: Tue, 23 Nov 2021 21:32:24 -0600 Subject: [PATCH 3/3] Defer Regex compilation to initialization --- .../codes/ztereohype/ztereomusic/command/commands/Play.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java b/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java index f93efda..6b43acb 100644 --- a/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java +++ b/src/main/java/codes/ztereohype/ztereomusic/command/commands/Play.java @@ -24,6 +24,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class Play implements Command { + private static final Pattern URL_PATTERN = Pattern.compile("^(http|https)://([a-z]+\\.[a-z]+)+/\\S+$", Pattern.CASE_INSENSITIVE); CommandMeta meta = new CommandMeta("play", "Play music!", new String[]{"p"}, false, false); @Override @@ -52,9 +53,7 @@ public class Play implements Command { // check if args merged are/have url, if so try to feed it into lava, else try to youtube api the fuck out of it. String mergedArgs = String.join(" ", args); - - Pattern urlPattern = Pattern.compile("^(http|https)://([a-z]+\\.[a-z]+)+/\\S+$", Pattern.CASE_INSENSITIVE); - Matcher matchedUrls = urlPattern.matcher(mergedArgs); + Matcher matchedUrls = URL_PATTERN.matcher(mergedArgs); boolean urlFound = matchedUrls.find(); String identifier;