Skip to content

Commit 81c3fa3

Browse files
committed
add support for returning playlist urls
1 parent 21be589 commit 81c3fa3

File tree

3 files changed

+72
-8
lines changed

3 files changed

+72
-8
lines changed
Lines changed: 24 additions & 0 deletions
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

Lines changed: 22 additions & 8 deletions
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;
@@ -87,17 +88,17 @@ protected JsonBrowser loadTrackInfoFromInnertube(@NotNull YoutubeAudioSourceMana
8788

8889
/**
8990
* Retrieve raw JSON data for a specific video by its ID.
90-
* @param source The source manager linked to this client.
91-
* @param httpInterface The interface to use for HTTP requests.
92-
* @param videoId The ID of the video to retrieve information for.
93-
* @param status The last playability status, or {@code null} if an attempt to retrieve
94-
* information has not been made yet.
91+
* @param source The source manager linked to this client.
92+
* @param httpInterface The interface to use for HTTP requests.
93+
* @param videoId The ID of the video to retrieve information for.
94+
* @param status The last playability status, or {@code null} if an attempt to retrieve
95+
* information has not been made yet.
9596
* @param validatePlayabilityStatus Whether to validate playability status. This may be {@code false}
9697
* in situations where only video metadata is required. If video data
9798
* does not exist, this is forcefully checked regardless of provided value.
9899
* @return The raw JSON data as received from YouTube.
99100
* @throws CannotBeLoaded If a video does not exist, is private, or otherwise inaccessible.
100-
* @throws IOException If a HTTP request fails, etc.
101+
* @throws IOException If a HTTP request fails, etc.
101102
*/
102103
@NotNull
103104
protected JsonBrowser loadTrackInfoFromInnertube(@NotNull YoutubeAudioSourceManager source,
@@ -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
Lines changed: 26 additions & 0 deletions
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)