Replaced the bot's audio handling system by removing Lavaplayer dependencies and migrating to a Lavalink v4 node. Updated `MusicManager`, `TrackScheduler`, and related classes to utilize the `LavalinkClient`. Refactored playlist and track loading logic, task integrations, and event dispatch to integrate with the remote node. Deprecated the custom Udio source, preserving references for a future plugin port. Documented configuration and deployment details for the new audio architecture.
81 lines
3.2 KiB
Java
81 lines
3.2 KiB
Java
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));
|
|
}
|
|
}
|
|
}
|