From b392d892adf943d9e704cca472a4283f6d66003c Mon Sep 17 00:00:00 2001 From: anthorob Date: Wed, 26 Jun 2024 00:05:07 -0400 Subject: [PATCH] Udio: fix json extraction from updated webpage and add artwork url to audio track --- .../music/source/UdioAudioSourceManager.java | 76 +++++++++++-------- .../netneutrality/utils/MessageFunction.java | 4 + .../source/UdioAudioSourceManagerTest.java | 7 ++ 3 files changed, 54 insertions(+), 33 deletions(-) diff --git a/src/main/java/netneutrality/music/source/UdioAudioSourceManager.java b/src/main/java/netneutrality/music/source/UdioAudioSourceManager.java index 264e96e..dd6f9bc 100644 --- a/src/main/java/netneutrality/music/source/UdioAudioSourceManager.java +++ b/src/main/java/netneutrality/music/source/UdioAudioSourceManager.java @@ -48,10 +48,6 @@ public class UdioAudioSourceManager implements AudioSourceManager { httpInterfaceManager = HttpClientTools.createDefaultThreadLocalManager(); } - public HttpInterface getHttpInterface() { - return httpInterfaceManager.getInterface(); - } - @Override public String getSourceName() { return "udio"; @@ -71,6 +67,32 @@ public class UdioAudioSourceManager implements AudioSourceManager { } + + + @Override + public boolean isTrackEncodable(AudioTrack track) { + return true; + } + + @Override + public void encodeTrack(AudioTrack track, DataOutput output) throws IOException { + + } + + @Override + public AudioTrack decodeTrack(AudioTrackInfo trackInfo, DataInput input) throws IOException { + return new UdioAudioTrack(trackInfo, this); + } + + @Override + public void shutdown() { + ExceptionTools.closeWithWarnings(httpInterfaceManager); + } + + public HttpInterface getHttpInterface() { + return httpInterfaceManager.getInterface(); + } + private AudioItem loadFromTrackPage(HttpInterface httpInterface, String trackUrl) throws IOException { try (CloseableHttpResponse response = httpInterface.execute(new HttpGet(trackUrl))) { @@ -95,21 +117,22 @@ public class UdioAudioSourceManager implements AudioSourceManager { throw new FriendlyException("Udio: Failed to extract track information from web page.", SUSPICIOUS, null); } - return new UdioAudioTrack(new AudioTrackInfo( - trackInfo.get("title").text(), - trackInfo.get("artist").text(), - (long) (trackInfo.get("duration").as(Double.class) * 1000.0), - trackUrl, - false, - trackUrl - ), this); + String title = trackInfo.get("title").text(); + String artist = trackInfo.get("artist").text(); + long duration = (long) (trackInfo.get("duration").as(Double.class) * 1000.0); + String playbackUrl = trackInfo.get("song_path").text(); + String artworkUrl = getArtworkUrlFromImagePath(trackInfo); + + AudioTrackInfo audioTrackInfo = new AudioTrackInfo(title, artist, duration, trackUrl, false, playbackUrl, artworkUrl, null); + + return new UdioAudioTrack(audioTrackInfo, this); } - JsonBrowser loadTrackInfoFromPageContent(String content) throws IOException { - // start = self.__next_f.push([1,"8: - // end = \n"]) + protected JsonBrowser loadTrackInfoFromPageContent(String content) throws IOException { + String startTag = "self.__next_f.push([1,\"9:"; + String endTag = "\\n\"])"; - String json = DataFormatTools.extractBetween(content, "self.__next_f.push([1,\"8:", "\\n\"])"); + String json = DataFormatTools.extractBetween(content, startTag, endTag); if (json == null) { log.error("Track JSON not found in page"); @@ -127,24 +150,11 @@ public class UdioAudioSourceManager implements AudioSourceManager { } } - @Override - public boolean isTrackEncodable(AudioTrack track) { - return true; - } + private String getArtworkUrlFromImagePath(JsonBrowser trackInfo) { + String imagePath = trackInfo.get("image_path").text(); + String artworkOptions = "width=3840,quality=50"; - @Override - public void encodeTrack(AudioTrack track, DataOutput output) throws IOException { - - } - - @Override - public AudioTrack decodeTrack(AudioTrackInfo trackInfo, DataInput input) throws IOException { - return new UdioAudioTrack(trackInfo, this); - } - - @Override - public void shutdown() { - ExceptionTools.closeWithWarnings(httpInterfaceManager); + return imagePath.replace("public", artworkOptions); } } diff --git a/src/main/java/netneutrality/utils/MessageFunction.java b/src/main/java/netneutrality/utils/MessageFunction.java index 72fcc92..35408b1 100644 --- a/src/main/java/netneutrality/utils/MessageFunction.java +++ b/src/main/java/netneutrality/utils/MessageFunction.java @@ -63,6 +63,10 @@ public class MessageFunction { thumbnail = String.format("https://i3.ytimg.com/vi/%s/hqdefault.jpg", track.getIdentifier()); } + if (type == SourceFinder.AudioSourceType.Udio) { + thumbnail = track.getInfo().artworkUrl; + } + if (thumbnail != null) { message.setThumbnail(thumbnail); } diff --git a/src/test/java/netneutrality/music/source/UdioAudioSourceManagerTest.java b/src/test/java/netneutrality/music/source/UdioAudioSourceManagerTest.java index e82f49b..0ce0ba3 100644 --- a/src/test/java/netneutrality/music/source/UdioAudioSourceManagerTest.java +++ b/src/test/java/netneutrality/music/source/UdioAudioSourceManagerTest.java @@ -11,6 +11,7 @@ import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo; import org.junit.Test; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; public class UdioAudioSourceManagerTest { @@ -27,5 +28,11 @@ public class UdioAudioSourceManagerTest { AudioTrackInfo info = audioTrack.getInfo(); assertNotNull(info); + + assertNotNull(info.artworkUrl); + + String artworkOptions = "width=3840,quality=50"; + assertTrue(info.artworkUrl.contains(artworkOptions)); + } }