Skip to content

Commit 01a46c9

Browse files
committed
add support for returning playlist urls
1 parent 21be589 commit 01a46c9

File tree

3 files changed

+66
-2
lines changed

3 files changed

+66
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package dev.lavalink.youtube;
2+
3+
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
4+
import com.sedmelluq.discord.lavaplayer.track.BasicAudioPlaylist;
5+
import org.jetbrains.annotations.Nullable;
6+
7+
import java.util.List;
8+
9+
public class YoutubeAudioPlaylist extends BasicAudioPlaylist {
10+
11+
@Nullable
12+
protected final String url;
13+
14+
public YoutubeAudioPlaylist(String name, List<AudioTrack> tracks, AudioTrack selectedTrack, boolean isSearchResult, @Nullable String url) {
15+
super(name, tracks, selectedTrack, isSearchResult);
16+
this.url = url;
17+
}
18+
19+
@Nullable
20+
public String getUrl() {
21+
return url;
22+
}
23+
24+
}

common/src/main/java/dev/lavalink/youtube/clients/skeleton/NonMusicClient.java

+16-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.sedmelluq.discord.lavaplayer.track.*;
88
import dev.lavalink.youtube.CannotBeLoaded;
99
import dev.lavalink.youtube.OptionDisabledException;
10+
import dev.lavalink.youtube.YoutubeAudioPlaylist;
1011
import dev.lavalink.youtube.YoutubeAudioSourceManager;
1112
import dev.lavalink.youtube.cipher.SignatureCipher;
1213
import dev.lavalink.youtube.cipher.SignatureCipherManager;
@@ -429,6 +430,12 @@ public AudioItem loadMix(@NotNull YoutubeAudioSourceManager source,
429430
JsonBrowser titleElement = playlist.get("title");
430431
String title = titleElement.isNull() ? "YouTube mix" : titleElement.text();
431432

433+
String playlistUrl = "https://www.youtube.com/watch?";
434+
if (selectedVideoId != null) {
435+
playlistUrl += "v=" + selectedVideoId + "&";
436+
}
437+
playlistUrl += "list=" + mixId;
438+
432439
List<AudioTrack> tracks = playlist.get("contents").values().stream()
433440
.map(item -> extractAudioTrack(item.get("playlistPanelVideoRenderer"), source))
434441
.filter(Objects::nonNull)
@@ -440,7 +447,7 @@ public AudioItem loadMix(@NotNull YoutubeAudioSourceManager source,
440447
throw new FriendlyException("Could not find tracks from mix.", SUSPICIOUS, null);
441448
}
442449

443-
return new BasicAudioPlaylist(title, tracks, findSelectedTrack(tracks, selectedVideoId), false);
450+
return new YoutubeAudioPlaylist(title, tracks, findSelectedTrack(tracks, selectedVideoId), false, playlistUrl);
444451
}
445452

446453
@Override
@@ -466,6 +473,13 @@ public AudioItem loadPlaylist(@NotNull YoutubeAudioSourceManager source,
466473
new RuntimeException("Playlist name was not found, JSON: " + json.format()));
467474
}
468475

476+
String playlistUrl;
477+
if (selectedVideoId == null) {
478+
playlistUrl = "https://www.youtube.com/playlist?list=" + playlistId;
479+
} else {
480+
playlistUrl = "https://www.youtube.com/watch?v=" + selectedVideoId + "&list=" + playlistId;
481+
}
482+
469483
JsonBrowser playlistVideoList = extractPlaylistVideoList(json);
470484

471485
List<AudioTrack> tracks = new ArrayList<>();
@@ -498,7 +512,7 @@ public AudioItem loadPlaylist(@NotNull YoutubeAudioSourceManager source,
498512
throw new FriendlyException("Could not find tracks from playlist.", SUSPICIOUS, new RuntimeException("JSON: " + json.format()));
499513
}
500514

501-
return new BasicAudioPlaylist(playlistName, tracks, findSelectedTrack(tracks, selectedVideoId), false);
515+
return new YoutubeAudioPlaylist(playlistName, tracks, findSelectedTrack(tracks, selectedVideoId), false, playlistUrl);
502516
}
503517

504518
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package dev.lavalink.youtube.plugin;
2+
3+
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
4+
import dev.arbjerg.lavalink.api.AudioPluginInfoModifier;
5+
import dev.lavalink.youtube.YoutubeAudioPlaylist;
6+
import kotlinx.serialization.json.JsonElementKt;
7+
import kotlinx.serialization.json.JsonObject;
8+
import org.jetbrains.annotations.NotNull;
9+
import org.springframework.stereotype.Component;
10+
11+
import java.util.Map;
12+
13+
@Component
14+
public class YoutubeAudioPluginInfoModifier implements AudioPluginInfoModifier {
15+
16+
@Override
17+
public JsonObject modifyAudioPlaylistPluginInfo(@NotNull AudioPlaylist playlist) {
18+
if (playlist instanceof YoutubeAudioPlaylist extendedPlaylist) {
19+
return new JsonObject(Map.of(
20+
"url", JsonElementKt.JsonPrimitive(extendedPlaylist.getUrl())
21+
));
22+
}
23+
return null;
24+
}
25+
26+
}

0 commit comments

Comments
 (0)