From 83b30ec6e2ba82174d0c281a52c0b2cc90c998f3 Mon Sep 17 00:00:00 2001 From: Walkyst <41806921+Walkyst@users.noreply.github.com> Date: Sat, 3 Sep 2022 22:09:05 +0300 Subject: [PATCH] Support for VKMusic --- src/main/java/lavalink/client/LavalinkUtil.kt | 4 +- .../lavalink/client/source/vk/VkAudioTrack.kt | 47 +++++++++++++++++++ .../client/source/vk/VkSourceManager.kt | 42 +++++++++++++++++ .../java/lavalink/client/source/vk/VkUtils.kt | 19 ++++++++ 4 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lavalink/client/source/vk/VkAudioTrack.kt create mode 100644 src/main/java/lavalink/client/source/vk/VkSourceManager.kt create mode 100644 src/main/java/lavalink/client/source/vk/VkUtils.kt diff --git a/src/main/java/lavalink/client/LavalinkUtil.kt b/src/main/java/lavalink/client/LavalinkUtil.kt index 75bdecb..8efc8e5 100644 --- a/src/main/java/lavalink/client/LavalinkUtil.kt +++ b/src/main/java/lavalink/client/LavalinkUtil.kt @@ -21,6 +21,7 @@ */ package lavalink.client +//import lavalink.client.source.invidious.InvidiousSourceManager import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager import com.sedmelluq.discord.lavaplayer.source.bandcamp.BandcampAudioSourceManager import com.sedmelluq.discord.lavaplayer.source.http.HttpAudioSourceManager @@ -33,8 +34,8 @@ import com.sedmelluq.discord.lavaplayer.tools.io.MessageInput import com.sedmelluq.discord.lavaplayer.tools.io.MessageOutput import com.sedmelluq.discord.lavaplayer.track.AudioTrack import lavalink.client.player.LavalinkPlayer -//import lavalink.client.source.invidious.InvidiousSourceManager import lavalink.client.source.spotify.SpotifySourceManager +import lavalink.client.source.vk.VkSourceManager import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.io.IOException @@ -45,6 +46,7 @@ object LavalinkUtil { init { /* These are only to encode/decode messages */ + playerManager.registerSourceManager(VkSourceManager("")) playerManager.registerSourceManager(SpotifySourceManager(playerManager)) //playerManager.registerSourceManager(InvidiousSourceManager.createDefault()) playerManager.registerSourceManager(YoutubeAudioSourceManager()) diff --git a/src/main/java/lavalink/client/source/vk/VkAudioTrack.kt b/src/main/java/lavalink/client/source/vk/VkAudioTrack.kt new file mode 100644 index 0000000..0c2e49f --- /dev/null +++ b/src/main/java/lavalink/client/source/vk/VkAudioTrack.kt @@ -0,0 +1,47 @@ +package lavalink.client.source.vk + +import com.sedmelluq.discord.lavaplayer.container.mp3.Mp3AudioTrack +import com.sedmelluq.discord.lavaplayer.source.AudioSourceManager +import com.sedmelluq.discord.lavaplayer.tools.JsonBrowser +import com.sedmelluq.discord.lavaplayer.tools.io.HttpInterface +import com.sedmelluq.discord.lavaplayer.tools.io.PersistentHttpStream +import com.sedmelluq.discord.lavaplayer.track.AudioTrack +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.http.client.methods.HttpGet +import org.apache.http.util.EntityUtils +import java.net.URI + +class VkAudioTrack( + trackInfo: AudioTrackInfo, + private val sourceManager: VkSourceManager +) : DelegatedAudioTrack(trackInfo) { + + override fun process(executor: LocalAudioTrackExecutor) { + sourceManager.httpInterfaceManager.`interface`.use { httpInterface -> + processStatic(executor, httpInterface) + } + } + + private fun processStatic(executor: LocalAudioTrackExecutor, httpInterface: HttpInterface) { + httpInterface.execute(HttpGet(VkUtils.getTrackUrl(trackInfo.identifier, sourceManager.accessToken))).use { + processDelegate(Mp3AudioTrack( + trackInfo, + PersistentHttpStream( + httpInterface, + URI(JsonBrowser.parse(EntityUtils.toString(it.entity)).get("response").index(0).get("url").text()), + null + ) + ), executor) + } + } + + override fun makeClone(): AudioTrack { + return VkAudioTrack(trackInfo, sourceManager) + } + + override fun getSourceManager(): AudioSourceManager { + return sourceManager + } +} \ No newline at end of file diff --git a/src/main/java/lavalink/client/source/vk/VkSourceManager.kt b/src/main/java/lavalink/client/source/vk/VkSourceManager.kt new file mode 100644 index 0000000..957af1e --- /dev/null +++ b/src/main/java/lavalink/client/source/vk/VkSourceManager.kt @@ -0,0 +1,42 @@ +package lavalink.client.source.vk + +import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager +import com.sedmelluq.discord.lavaplayer.source.AudioSourceManager +import com.sedmelluq.discord.lavaplayer.tools.ExceptionTools +import com.sedmelluq.discord.lavaplayer.tools.io.HttpClientTools +import com.sedmelluq.discord.lavaplayer.tools.io.HttpInterfaceManager +import com.sedmelluq.discord.lavaplayer.track.AudioItem +import com.sedmelluq.discord.lavaplayer.track.AudioReference +import com.sedmelluq.discord.lavaplayer.track.AudioTrack +import com.sedmelluq.discord.lavaplayer.track.AudioTrackInfo +import java.io.DataInput +import java.io.DataOutput + +class VkSourceManager( + val accessToken: String +) : AudioSourceManager { + + val httpInterfaceManager: HttpInterfaceManager = HttpClientTools.createDefaultThreadLocalManager() + + override fun getSourceName(): String { + return "vk" + } + + override fun loadItem(manager: AudioPlayerManager, reference: AudioReference): AudioItem? { + return null + } + + override fun isTrackEncodable(track: AudioTrack): Boolean = false + + override fun encodeTrack(track: AudioTrack, output: DataOutput) { + // Nothing + } + + override fun decodeTrack(trackInfo: AudioTrackInfo, input: DataInput): AudioTrack { + return VkAudioTrack(trackInfo, this) + } + + override fun shutdown() { + ExceptionTools.closeWithWarnings(httpInterfaceManager) + } +} \ No newline at end of file diff --git a/src/main/java/lavalink/client/source/vk/VkUtils.kt b/src/main/java/lavalink/client/source/vk/VkUtils.kt new file mode 100644 index 0000000..957270d --- /dev/null +++ b/src/main/java/lavalink/client/source/vk/VkUtils.kt @@ -0,0 +1,19 @@ +package lavalink.client.source.vk + +import org.apache.http.client.utils.URIBuilder +import java.net.URI + +object VkUtils { + + private const val VK_ORIGIN = "https://api.vk.com/method/" + private const val AUDIO_GET_BY_ID = "audio.getById" + private const val API_VERSION = "5.131" + + fun getTrackUrl(trackId: String, accessToken: String): URI { + return URIBuilder("$VK_ORIGIN$AUDIO_GET_BY_ID") + .addParameter("access_token", accessToken) + .addParameter("v", API_VERSION) + .addParameter("audios", trackId) + .build() + } +} \ No newline at end of file