Skip to content

Commit

Permalink
Add spotify support
Browse files Browse the repository at this point in the history
  • Loading branch information
Rakambda committed Feb 18, 2025
1 parent 7f36bd0 commit dea6f5b
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 23 deletions.
4 changes: 4 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ repositories {
name = "Lavalink"
url = uri("https://maven.lavalink.dev/releases")
}
maven {
name = "topi314"
url = uri("https://maven.topi.wtf/releases")
}
maven {
name = "jitpack"
url = uri("https://jitpack.io")
Expand Down
5 changes: 4 additions & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
jda-version = "5.3.0"
lavaplayer-version = "2.2.3"
lavaplayer-youtube-v2-version = "1.11.4"
lavasrc-version = "4.4.1"
lp_cross-version = "0.1.1"
jetbrains-annotations-version = "26.0.2"
opus-version = "1.1.1"
Expand All @@ -16,14 +17,16 @@ sptringboot-dm-version = "1.1.7"
jda = { group = "net.dv8tion", name = "JDA", version.ref = "jda-version" }
lavaplayer = { group = "dev.arbjerg", name = "lavaplayer", version.ref = "lavaplayer-version" }
lavaplayer-youtube-v2 = { group = "dev.lavalink.youtube", name = "v2", version.ref = "lavaplayer-youtube-v2-version"}
lavasrc = { group = "com.github.topi314.lavasrc", name = "lavasrc", version.ref = "lavasrc-version"}
lavasrc-protocol = { group = "com.github.topi314.lavasrc", name = "lavasrc-protocol", version.ref = "lavasrc-version"}
lpCross = { group = "com.github.natanbc", name = "lp-cross", version.ref = "lp_cross-version" }
jetbrainsAnnotations = { group = "org.jetbrains", name = "annotations", version.ref = "jetbrains-annotations-version" }
opus-api = { group = "club.minnced", name = "opus-java-api", version.ref = "opus-version" }
opus-natives = { group = "club.minnced", name = "opus-java-natives", version.ref = "opus-version" }

[bundles]
opus = ["opus-api", "opus-natives"]
lavalink = ["lavaplayer", "lavaplayer-youtube-v2", "lpCross"]
lavalink = ["lavaplayer", "lavaplayer-youtube-v2", "lpCross", "lavasrc", "lavasrc-protocol"]

[plugins]
names = { id = "com.github.ben-manes.versions", version.ref = "names-version" }
Expand Down
50 changes: 32 additions & 18 deletions src/main/java/fr/rakambda/rsndiscord/spring/audio/AudioService.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
package fr.rakambda.rsndiscord.spring.audio;

import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutionException;
import com.github.topi314.lavasrc.mirror.DefaultMirroringAudioTrackResolver;
import com.github.topi314.lavasrc.spotify.SpotifySourceManager;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.source.AudioSourceManager;
import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import dev.lavalink.youtube.YoutubeAudioSourceManager;
Expand All @@ -18,17 +25,14 @@
import fr.rakambda.rsndiscord.spring.audio.scheduler.ITrackScheduler;
import fr.rakambda.rsndiscord.spring.audio.scheduler.ITrackSchedulerStatusListener;
import fr.rakambda.rsndiscord.spring.audio.scheduler.TrackScheduler;
import fr.rakambda.rsndiscord.spring.settings.MusicSettings;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.entities.channel.unions.AudioChannelUnion;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutionException;

@Slf4j
public class AudioService implements ITrackSchedulerStatusListener, ITrackLoadListener{
Expand All @@ -38,9 +42,31 @@ public class AudioService implements ITrackSchedulerStatusListener, ITrackLoadLi
@Getter
private final ITrackScheduler trackScheduler;

public AudioService(@NotNull Guild guild, int volume, @Nullable String refreshToken){
public AudioService(@NotNull Guild guild, int volume, @NotNull MusicSettings musicSettings){
this.guild = guild;

audioPlayerManager = new DefaultAudioPlayerManager();
audioPlayerManager.registerSourceManager(createYoutubeSourceManager(musicSettings.getYoutubeRefreshToken()));
audioPlayerManager.registerSourceManager(createSpotifySourceManager(musicSettings.getSpotifyClientId(), musicSettings.getSpotifyClientSecret(), musicSettings.getSpotifyCountryCode()));
audioPlayer = audioPlayerManager.createPlayer();

var trackScheduler = new TrackScheduler(audioPlayer);
trackScheduler.addListener(this);
this.trackScheduler = trackScheduler;

audioPlayer.setVolume(volume);
audioPlayer.addListener(trackScheduler);

AudioSourceManagers.registerRemoteSources(audioPlayerManager);
}

@NotNull
private AudioSourceManager createSpotifySourceManager(@NotNull String clientId, @NotNull String clientSecret, @Nullable String countryCode){
return new SpotifySourceManager(clientId, clientSecret, countryCode, audioPlayerManager, new DefaultMirroringAudioTrackResolver(null));
}

@NotNull
private AudioSourceManager createYoutubeSourceManager(@Nullable String refreshToken){
var youtubeAudioSourceManager = new YoutubeAudioSourceManager(true,
new MusicWithThumbnail(),
new WebWithThumbnail(),
Expand All @@ -54,19 +80,7 @@ public AudioService(@NotNull Guild guild, int volume, @Nullable String refreshTo
else{
youtubeAudioSourceManager.useOauth2(null, false);
}

audioPlayerManager = new DefaultAudioPlayerManager();
audioPlayerManager.registerSourceManager(youtubeAudioSourceManager);
audioPlayer = audioPlayerManager.createPlayer();

var trackScheduler = new TrackScheduler(audioPlayer);
trackScheduler.addListener(this);
this.trackScheduler = trackScheduler;

audioPlayer.setVolume(volume);
audioPlayer.addListener(trackScheduler);

AudioSourceManagers.registerRemoteSources(audioPlayerManager);
return youtubeAudioSourceManager;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package fr.rakambda.rsndiscord.spring.audio;

import fr.rakambda.rsndiscord.spring.settings.ApplicationSettings;
import fr.rakambda.rsndiscord.spring.settings.MusicSettings;
import fr.rakambda.rsndiscord.spring.storage.repository.AudioRepository;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Guild;
Expand All @@ -14,12 +15,12 @@
@Component
public class AudioServiceFactory{
private final AudioRepository audioRepository;
private final String refreshToken;
private final MusicSettings musicSettings;
private final Map<Long, AudioService> services;

public AudioServiceFactory( AudioRepository audioRepository, ApplicationSettings applicationSettings){
this.audioRepository = audioRepository;
refreshToken = applicationSettings.getYoutubeRefreshToken();
musicSettings = applicationSettings.getMusic();

services = new ConcurrentHashMap<>();
}
Expand All @@ -34,7 +35,7 @@ private AudioService buildService(@NotNull Guild guild){
var guildEntity = audioRepository.findByGuildId(guild.getIdLong()).orElseThrow();
var volume = Math.min(100, Math.max(0, guildEntity.getVolume()));

return new AudioService(guild, volume, refreshToken);
return new AudioService(guild, volume, musicSettings);
}

@NotNull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ public class ApplicationSettings{
private boolean development;
private List<Long> developmentGuilds = new LinkedList<>();
private String botToken;
private String youtubeRefreshToken;
private String amqpPrefix;
@NestedConfigurationProperty
private AnilistSettings anilist;
Expand All @@ -30,4 +29,6 @@ public class ApplicationSettings{
private TraktSettings trakt;
@NestedConfigurationProperty
private SimklSettings simkl;
@NestedConfigurationProperty
private MusicSettings music;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package fr.rakambda.rsndiscord.spring.settings;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class MusicSettings {
private String youtubeRefreshToken;
private String spotifyClientId;
private String spotifyClientSecret;
private String spotifyCountryCode;
}

0 comments on commit dea6f5b

Please sign in to comment.