package me.bobert.netneutrality.music.source; /* * Copyright (c) anthorob * * https://discord.gg/qUa6zNFZsd */ import com.sedmelluq.discord.lavaplayer.container.mp3.Mp3AudioTrack; import com.sedmelluq.discord.lavaplayer.tools.FriendlyException; import com.sedmelluq.discord.lavaplayer.tools.JsonBrowser; import com.sedmelluq.discord.lavaplayer.tools.io.HttpClientTools; import com.sedmelluq.discord.lavaplayer.tools.io.HttpInterface; import com.sedmelluq.discord.lavaplayer.tools.io.PersistentHttpStream; import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo; import com.sedmelluq.discord.lavaplayer.track.DelegatedAudioTrack; import com.sedmelluq.discord.lavaplayer.track.playback.LocalAudioTrackExecutor; import org.apache.commons.io.IOUtils; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.IOException; import java.net.URI; import java.nio.charset.StandardCharsets; import static com.sedmelluq.discord.lavaplayer.tools.FriendlyException.Severity.SUSPICIOUS; public class UdioAudioTrack extends DelegatedAudioTrack { private static final Logger log = LogManager.getLogger(UdioAudioTrack.class); private final UdioAudioSourceManager sourceManager; /** * @param trackInfo Track info * @param sourceManager Source manager which was used to find this track */ public UdioAudioTrack(AudioTrackInfo trackInfo, UdioAudioSourceManager sourceManager) { super(trackInfo); this.sourceManager = sourceManager; } @Override public void process(LocalAudioTrackExecutor localExecutor) throws Exception { try (HttpInterface httpInterface = sourceManager.getHttpInterface()) { String playbackUrl = loadPlaybackUrl(httpInterface); log.debug("Starting Udio track from URL: {}", playbackUrl); try (PersistentHttpStream stream = new PersistentHttpStream(httpInterface, new URI(playbackUrl), null)) { processDelegate(new Mp3AudioTrack(trackInfo, stream), localExecutor); } } } private String loadPlaybackUrl(HttpInterface httpInterface) throws IOException { JsonBrowser trackInfo = loadTrackInfo(httpInterface); if (trackInfo == null) { throw new FriendlyException("Udio: Failed to extract track information from web page.", SUSPICIOUS, null); } return trackInfo.get("song_path").text(); } private JsonBrowser loadTrackInfo(HttpInterface httpInterface) throws IOException { try (CloseableHttpResponse response = httpInterface.execute(new HttpGet(trackInfo.identifier))) { int statusCode = response.getStatusLine().getStatusCode(); if (!HttpClientTools.isSuccessWithContent(statusCode)) { throw new FriendlyException("Server responded with an error.", SUSPICIOUS, new IllegalStateException("Response code for player config is " + statusCode)); } return sourceManager.loadTrackInfoFromPageContent(IOUtils.toString(response.getEntity().getContent(), StandardCharsets.UTF_8)); } } }