diff --git a/src/main/java/netneutrality/music/SourceFinder.java b/src/main/java/netneutrality/music/SourceFinder.java index fc9e835..a8fef91 100644 --- a/src/main/java/netneutrality/music/SourceFinder.java +++ b/src/main/java/netneutrality/music/SourceFinder.java @@ -31,7 +31,6 @@ public class SourceFinder { private static final Pattern udioPattern = Pattern.compile("^https://www.udio.com/songs/[0-9A-Za-z]+$", Pattern.CASE_INSENSITIVE); private static final Pattern mp3Pattern = Pattern.compile("^https?://(?:.*)(?:.mp3)$", Pattern.CASE_INSENSITIVE); - public static AudioSourceType getSource(String url) { Matcher youtubeMatcher = youtubePattern.matcher(url); Matcher youtubeMusicMatcher = youtubeMusicPattern.matcher(url); diff --git a/src/main/java/netneutrality/music/source/UdioAudioSourceManager.java b/src/main/java/netneutrality/music/source/UdioAudioSourceManager.java index 2c191cb..9a07188 100644 --- a/src/main/java/netneutrality/music/source/UdioAudioSourceManager.java +++ b/src/main/java/netneutrality/music/source/UdioAudioSourceManager.java @@ -5,6 +5,8 @@ package netneutrality.music.source;/* * https://discord.gg/CdFcyQ */ +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.io.JsonEOFException; import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager; import com.sedmelluq.discord.lavaplayer.source.AudioSourceManager; import com.sedmelluq.discord.lavaplayer.tools.DataFormatTools; @@ -25,6 +27,8 @@ import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.DataInput; import java.io.DataOutput; @@ -38,6 +42,9 @@ import static com.sedmelluq.discord.lavaplayer.tools.FriendlyException.Severity. public class UdioAudioSourceManager implements AudioSourceManager, HttpConfigurable { + private static final Logger log = LoggerFactory.getLogger(UdioAudioSourceManager.class); + + private static final String TRACK_URL_REGEX = "^https://www.udio.com/songs/[0-9A-Za-z]+$"; private static final Pattern trackUrlPattern = Pattern.compile(TRACK_URL_REGEX); @@ -58,9 +65,6 @@ public class UdioAudioSourceManager implements AudioSourceManager, HttpConfigura @Override public AudioItem loadItem(AudioPlayerManager manager, AudioReference reference) { - // start = "og:audio:url\",\"content\":\" - // end = \"}], - if (!trackUrlPattern.matcher(reference.identifier).matches()) { return null; } @@ -90,17 +94,10 @@ public class UdioAudioSourceManager implements AudioSourceManager, HttpConfigura } private AudioTrack loadTrackFromPageContent(String trackUrl, String content) throws IOException { - JsonBrowser config = loadConfigJsonFromPageContent(content); + JsonBrowser trackInfo = loadTrackInfoFromPageContent(content); - if (config == null) { - throw new FriendlyException("Track information not found on the page.", SUSPICIOUS, null); - } - - JsonBrowser trackInfo; - try { - trackInfo = config.index(3).get("children").index(3).get("children").index(3).get("track"); - } catch (NullPointerException e) { - throw new FriendlyException("Track information not found on the page.", SUSPICIOUS, null); + if (trackInfo == null) { + throw new FriendlyException("Udio: Failed to extract track information from web page.", SUSPICIOUS, null); } return new UdioAudioTrack(new AudioTrackInfo( @@ -113,15 +110,24 @@ public class UdioAudioSourceManager implements AudioSourceManager, HttpConfigura ), this); } - JsonBrowser loadConfigJsonFromPageContent(String content) throws IOException { - String configText = DataFormatTools.extractBetween(content, "self.__next_f.push([1,\"8:", "\\n"); - System.out.println(configText); + JsonBrowser loadTrackInfoFromPageContent(String content) throws IOException { + // start = self.__next_f.push([1,"8: + // end = \n"]) - if (configText != null) { - configText = configText.replace("\\", ""); - System.out.println(configText); + String json = DataFormatTools.extractBetween(content, "self.__next_f.push([1,\"8:", "\\n\"])"); + + if (json != null) { + json = json.replace("\\", ""); + + try { + JsonBrowser parsedJson = JsonBrowser.parse(json); + return parsedJson.index(3).get("children").index(3).get("children").index(3).get("track"); + } catch (JsonParseException e) { + log.debug("Udio HTML: {}", content); + + return null; + } - return JsonBrowser.parse(configText); } return null; diff --git a/src/main/java/netneutrality/music/source/UdioAudioTrack.java b/src/main/java/netneutrality/music/source/UdioAudioTrack.java index e44f97f..d62d3be 100644 --- a/src/main/java/netneutrality/music/source/UdioAudioTrack.java +++ b/src/main/java/netneutrality/music/source/UdioAudioTrack.java @@ -59,17 +59,10 @@ public class UdioAudioTrack extends DelegatedAudioTrack { } private String loadPlaybackUrl(HttpInterface httpInterface) throws IOException { - JsonBrowser config = loadPlayerConfig(httpInterface); + JsonBrowser trackInfo = loadPlayerConfig(httpInterface); - if (config == null) { - throw new FriendlyException("Track information not present on the page.", SUSPICIOUS, null); - } - - JsonBrowser trackInfo; - try { - trackInfo = config.index(3).get("children").index(3).get("children").index(3).get("track"); - } catch (NullPointerException e) { - throw new FriendlyException("Track information not found on the page.", SUSPICIOUS, null); + if (trackInfo == null) { + throw new FriendlyException("Udio: Failed to extract track information from web page.", SUSPICIOUS, null); } return trackInfo.get("song_path").text(); @@ -84,7 +77,7 @@ public class UdioAudioTrack extends DelegatedAudioTrack { new IllegalStateException("Response code for player config is " + statusCode)); } - return sourceManager.loadConfigJsonFromPageContent(IOUtils.toString(response.getEntity().getContent(), StandardCharsets.UTF_8)); + return sourceManager.loadTrackInfoFromPageContent(IOUtils.toString(response.getEntity().getContent(), StandardCharsets.UTF_8)); } } }