Skip to content

Commit

Permalink
Upgrade to Lavalink v4
Browse files Browse the repository at this point in the history
- Use sponsorblock plugin
- Use lavsrc
- Add option to specify search provider
- Search on deezer by default
  • Loading branch information
DRSchlaubi committed Jul 18, 2023
1 parent d8e34d8 commit 60b26d0
Show file tree
Hide file tree
Showing 35 changed files with 190 additions and 458 deletions.
5 changes: 4 additions & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ kord = "0.10.0-SNAPSHOT"
jjwt = "0.11.5"
api = "3.20.0"
ksp = "1.8.22-1.0.11"
lavakord = "5.0.2"

[libraries]
kord-rest = { group = "dev.kord", name = "kord-rest", version.ref = "kord" }
Expand All @@ -28,7 +29,9 @@ commons-text = { group = "org.apache.commons", name = "commons-text", version =
google-cloud-bom = { group = "com.google.cloud", name = "libraries-bom", version = "26.6.0" }
google-cloud-translate = { group = "com.google.cloud", name = "google-cloud-translate" }
google-apis-youtube = { group = "com.google.apis", name = "google-api-services-youtube", version = "v3-rev20230521-2.0.0" }
lavakord-kord = { group = "dev.schlaubi.lavakord", name = "kord", version = "4.1.0" }
lavakord-kord = { group = "dev.schlaubi.lavakord", name = "kord", version.ref = "lavakord" }
lavakord-sponsorblock = { group = "dev.schlaubi.lavakord", name = "sponsorblock", version.ref = "lavakord" }
lavakord-lavsrc = { group = "dev.schlaubi.lavakord", name = "lavasrc", version.ref = "lavakord" }
spotify = { group = "se.michaelthelin.spotify", name = "spotify-web-api-java", version = "8.0.0" }
krontab = { group = "dev.inmo", name = "krontab", version = "0.10.0" }
ksp-api = { group = "com.google.devtools.ksp", name = "symbol-processing-api", version.ref = "ksp" }
Expand Down
2 changes: 1 addition & 1 deletion music/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
subprojects {
version = "2.25.0-SNAPSHOT"
version = "3.0.0-SNAPSHOT"
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ suspend fun MusicModule.commands() {
clearCommand()
fixCommand()
nextCommand()
radioCommand()

if (Config.HAPPI_KEY != null) {
lyricsCommand()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ suspend fun MusicModule.lyricsCommand() = publicSlashCommand(::LyricsArguments)
}

action {
val query = arguments.name ?: player.playingTrack?.title
val query = arguments.name ?: player.playingTrack?.info?.title
?.replace("\\(.+(?!\\))".toRegex(), "") // replace anything in brackets like (official music video)

if (query == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import com.kotlindiscord.kord.extensions.commands.application.slash.EphemeralSla
import com.kotlindiscord.kord.extensions.commands.application.slash.ephemeralSubCommand
import com.kotlindiscord.kord.extensions.commands.converters.impl.int
import com.kotlindiscord.kord.extensions.types.respond
import dev.schlaubi.lavakord.audio.player.Track
import dev.arbjerg.lavalink.protocol.v4.Track
import dev.schlaubi.mikmusic.core.MusicModule

class SingleSongMoveArguments : Arguments() {
Expand Down Expand Up @@ -69,7 +69,7 @@ suspend fun MusicModule.moveCommand() {
description = "commands.move.top.description"

doMove(SingleSongMoveArguments::song, { 0 }) { track ->
translate("commands.move.top.success", arrayOf(track.title))
translate("commands.move.top.success", arrayOf(track.info.title))
}
}

Expand All @@ -81,7 +81,7 @@ suspend fun MusicModule.moveCommand() {
translate(
"commands.move.move.success",
arrayOf(
track.title,
track.info.title,
arguments.from, arguments.to
)
)
Expand Down Expand Up @@ -110,7 +110,7 @@ suspend fun MusicModule.moveCommand() {
translate(
"commands.move.last.success",
arrayOf(
track.title,
track.info.title,
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import dev.schlaubi.mikmusic.checks.anyMusicPlaying
import dev.schlaubi.mikmusic.checks.musicQuizAntiCheat
import dev.schlaubi.mikmusic.core.MusicModule
import dev.schlaubi.mikmusic.util.addSong
import kotlin.time.DurationUnit
import kotlin.time.toDuration

class NowPlayingArguments : Arguments() {
val index by optionalInt {
Expand Down Expand Up @@ -54,7 +56,11 @@ suspend fun MusicModule.nowPlayingCommand() = publicSlashCommand(::NowPlayingArg
field {
name = translate("commands.now_playing.progress")
value =
"${player.positionDuration.toString().replace(regex, "")}/${playingTrack.length}"
"${player.positionDuration.toString().replace(regex, "")}/${
playingTrack.info.length.toDuration(
DurationUnit.MILLISECONDS
)
}"
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class RadioArguments : Arguments() {
}
}

/*
suspend fun MusicModule.radioCommand() {
ephemeralSlashCommand(::RadioArguments) {
name = "radio"
Expand All @@ -46,3 +47,4 @@ suspend fun MusicModule.radioCommand() {
}
}
}
*/
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ suspend fun MusicModule.removeCommand() = ephemeralControlSlashCommand {
val track = musicPlayer.removeQueueEntry(arguments.position - 1)
if (track != null) {
respond {
content = translate("commands.remove.song.removed", arrayOf(track.title))
content = translate("commands.remove.song.removed", arrayOf(track.info.title))
}
} else {
respond {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ import com.kotlindiscord.kord.extensions.commands.Arguments
import com.kotlindiscord.kord.extensions.commands.converters.impl.optionalBoolean
import com.kotlindiscord.kord.extensions.extensions.ephemeralSlashCommand
import com.kotlindiscord.kord.extensions.types.respond
import dev.schlaubi.lavakord.plugins.sponsorblock.model.Category
import dev.schlaubi.lavakord.plugins.sponsorblock.rest.disableSponsorblock
import dev.schlaubi.lavakord.plugins.sponsorblock.rest.putSponsorblockCategories
import dev.schlaubi.mikbot.plugin.api.settings.SettingsModule
import dev.schlaubi.mikbot.plugin.api.settings.guildAdminOnly
import dev.schlaubi.mikbot.plugin.api.util.safeGuild
Expand Down Expand Up @@ -33,9 +36,9 @@ suspend fun SettingsModule.sponsorBlockCommand() {

val player = musicModule.getMusicPlayer(safeGuild)
if (newSetting) {
player.launchSponsorBlockJob()
player.player.putSponsorblockCategories(Category.MusicOfftopic)
} else {
player.cancelSponsorBlockJob()
player.player.disableSponsorblock()
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,39 @@
package dev.schlaubi.mikmusic.playlist

import dev.arbjerg.lavalink.protocol.v4.Track
import dev.kord.common.entity.Snowflake
import dev.schlaubi.lavakord.audio.player.Track
import dev.schlaubi.mikmusic.core.TrackSerializer
import dev.schlaubi.lavakord.audio.Node
import dev.schlaubi.lavakord.rest.decodeTrack
import dev.schlaubi.lavakord.rest.decodeTracks
import kotlinx.serialization.Contextual
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.builtins.ListSerializer
import org.litote.kmongo.Id

object TrackListSerializer : KSerializer<List<Track>> by ListSerializer(TrackSerializer)
@JvmInline
@Serializable
value class EncodedTrack(val value: String) {
suspend fun toTrack(lavalink: Node): Track = lavalink.decodeTrack(value)
}

object TrackListSerializer : KSerializer<List<EncodedTrack>> by ListSerializer(EncodedTrack.serializer())

fun List<Track>.mapToEncoded(): List<EncodedTrack> = map(Track::toEncodedTrack)

fun Track.toEncodedTrack() = EncodedTrack(encoded)

@Serializable
data class Playlist(
@SerialName("_id") @Contextual
val id: Id<Playlist>,
val authorId: Snowflake,
val name: String,
@Serializable(with = TrackListSerializer::class) val songs: List<@Contextual Track>,
@Serializable(with = TrackListSerializer::class) val songs: List<EncodedTrack>,
val public: Boolean = false,
val usages: Int = 0
)
val usages: Int = 0,
) {
suspend fun getTracks(lavalink: Node) =
lavalink.decodeTracks(songs.map(EncodedTrack::value))
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import dev.schlaubi.mikmusic.autocomplete.autoCompletedYouTubeQuery
import dev.schlaubi.mikmusic.player.queue.QueueOptions
import dev.schlaubi.mikmusic.player.queue.findTracks
import dev.schlaubi.mikmusic.playlist.PlaylistDatabase
import dev.schlaubi.mikmusic.playlist.mapToEncoded

class PlaylistAddArguments : PlaylistArguments(), QueueOptions {
override val query by autoCompletedYouTubeQuery("commands.playlist.add.arguments.query.description")
Expand All @@ -31,7 +32,7 @@ fun PlaylistModule.addCommand() = ephemeralSubCommand(::PlaylistAddArguments) {
action {
checkPermissions { playlist ->
val result = findTracks(musicPlayer, arguments.search) ?: return@action
val tracks = result.tracks
val tracks = result.tracks.mapToEncoded()

PlaylistDatabase.collection.save(playlist.copy(songs = playlist.songs + tracks))

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ fun PlaylistModule.loadCommand() = ephemeralSubCommand(::LoadArguments) {

musicPlayer.queueTrack(
force = false, onTop = false,
tracks = playlist.songs.mapToQueuedTrack(user)
tracks = playlist.getTracks(musicPlayer.node).mapToQueuedTrack(user)
)

respond {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package dev.schlaubi.mikmusic.playlist.commands
import com.kotlindiscord.kord.extensions.commands.converters.impl.int
import com.kotlindiscord.kord.extensions.types.respond
import dev.schlaubi.mikmusic.playlist.PlaylistDatabase
import dev.schlaubi.mikmusic.util.format

class PlaylistRemoveArguments : PlaylistArguments() {
val index by int {
Expand Down Expand Up @@ -37,7 +36,7 @@ fun PlaylistModule.removeCommand() = ephemeralSubCommand(::PlaylistRemoveArgumen
)

respond {
content = translate("commands.playlist.remove.removed", arrayOf(item.format(), playlist.name))
content = translate("commands.playlist.remove.removed", arrayOf(item.toTrack(musicPlayer.node), playlist.name))
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import dev.schlaubi.mikmusic.player.queue.QueueOptions
import dev.schlaubi.mikmusic.player.queue.findTracks
import dev.schlaubi.mikmusic.playlist.Playlist
import dev.schlaubi.mikmusic.playlist.PlaylistDatabase
import dev.schlaubi.mikmusic.playlist.mapToEncoded
import org.litote.kmongo.newId

class PlaylistSaveArguments : Arguments(), QueueOptions {
Expand Down Expand Up @@ -55,7 +56,7 @@ fun PlaylistModule.saveCommand() = ephemeralSubCommand(::PlaylistSaveArguments)
newId(),
user.id,
arguments.name,
tracks,
tracks.mapToEncoded(),
arguments.public
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package dev.schlaubi.mikmusic.playlist.commands

import com.kotlindiscord.kord.extensions.types.editingPaginator
import com.kotlindiscord.kord.extensions.types.respond
import dev.arbjerg.lavalink.protocol.v4.Track
import dev.schlaubi.mikbot.plugin.api.util.forList
import dev.schlaubi.mikmusic.util.format

Expand All @@ -22,7 +23,7 @@ fun PlaylistModule.songsCommand() = ephemeralSubCommand(::PlaylistSongsArguments

editingPaginator {
forList(
user, playlist.songs, { it.format() },
user, playlist.getTracks(musicPlayer.node), Track::format,
{ current, total ->
translate(
"commands.playlist.songs.paginator.title",
Expand Down
4 changes: 2 additions & 2 deletions music/player/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ group = "dev.schlaubi.mikbot"

dependencies {
api(libs.lavakord.kord)
api(libs.lavakord.sponsorblock)
api(libs.lavakord.lavsrc)

// Plattform support
implementation(libs.google.apis.youtube)
api(libs.spotify)

// SponsorBlock Client
implementation(projects.clients.sponsorblockKt)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,9 @@ import dev.schlaubi.mikmusic.core.audio.LavalinkManager
import dev.schlaubi.mikmusic.musicchannel.MusicInteractionModule
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import org.litote.kmongo.serialization.registerSerializer

@PluginMain
class MusicPlugin(wrapper: PluginContext) : Plugin(wrapper) {
override fun start() {
registerSerializer(TrackSerializer)
}

override fun ExtensibleBotBuilder.ExtensionsBuilder.addExtensions() {
add(::LavalinkManager)
add(::MusicModule)
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import dev.schlaubi.lavakord.LavaKord
import dev.schlaubi.lavakord.audio.Node
import dev.schlaubi.lavakord.kord.getLink
import dev.schlaubi.lavakord.kord.lavakord
import dev.schlaubi.lavakord.plugins.lavasrc.LavaSrc
import dev.schlaubi.lavakord.plugins.sponsorblock.Sponsorblock
import dev.schlaubi.mikbot.plugin.api.PluginContext
import dev.schlaubi.mikbot.plugin.api.io.Database
import dev.schlaubi.mikbot.plugin.api.io.getCollection
Expand All @@ -21,7 +23,12 @@ class LavalinkManager(context: PluginContext) : MikBotModule(context) {
}

suspend fun load() {
lavalink = kord.lavakord()
lavalink = kord.lavakord {
plugins {
install(Sponsorblock)
install(LavaSrc)
}
}

lavalinkServers.find().toList().forEach { (url, password) ->
lavalink.addNode(url, password)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ import dev.schlaubi.mikmusic.util.addSong
import dev.schlaubi.mikmusic.util.format
import kotlinx.datetime.Clock
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.DurationUnit
import kotlin.time.toDuration

const val playPause = "playPause"
const val stop = "stop"
Expand Down Expand Up @@ -69,7 +71,8 @@ suspend fun updateMessage(
}
}

val remainingTime = playingTrack.length - musicPlayer.player.position.milliseconds
val remainingTime = playingTrack.info.length
.toDuration(DurationUnit.MILLISECONDS) - musicPlayer.player.position.milliseconds
val nextSongAt = Clock.System.now() + remainingTime

if (musicPlayer.queuedTracks.isNotEmpty()) {
Expand Down
Loading

0 comments on commit 60b26d0

Please sign in to comment.