Skip to content

Commit 70e5a66

Browse files
committed
Allow clients to transform playback URIs as needed.
1 parent d987127 commit 70e5a66

File tree

3 files changed

+41
-10
lines changed

3 files changed

+41
-10
lines changed

common/src/main/java/dev/lavalink/youtube/clients/Web.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@
99
import dev.lavalink.youtube.clients.skeleton.StreamingNonMusicClient;
1010
import org.apache.http.client.methods.CloseableHttpResponse;
1111
import org.apache.http.client.methods.HttpGet;
12+
import org.apache.http.client.utils.URIBuilder;
1213
import org.apache.http.util.EntityUtils;
1314
import org.jetbrains.annotations.NotNull;
1415
import org.jetbrains.annotations.Nullable;
1516
import org.slf4j.Logger;
1617
import org.slf4j.LoggerFactory;
1718

1819
import java.io.IOException;
20+
import java.net.URI;
21+
import java.net.URISyntaxException;
1922
import java.util.List;
2023
import java.util.Map;
2124
import java.util.Objects;
@@ -131,6 +134,25 @@ public ClientConfig getBaseClientConfig(@NotNull HttpInterface httpInterface) {
131134
return BASE_CONFIG.copy();
132135
}
133136

137+
@Override
138+
@NotNull
139+
public URI transformPlaybackUri(@NotNull URI originalUri, @NotNull URI resolvedPlaybackUri) {
140+
if (poToken == null) {
141+
return resolvedPlaybackUri;
142+
}
143+
144+
log.debug("Applying 'pot' parameter on playback URI: {}", resolvedPlaybackUri);
145+
URIBuilder builder = new URIBuilder(resolvedPlaybackUri);
146+
builder.addParameter("pot", poToken);
147+
148+
try {
149+
return builder.build();
150+
} catch (URISyntaxException e) {
151+
log.debug("Failed to apply 'pot' parameter.", e);
152+
return resolvedPlaybackUri;
153+
}
154+
}
155+
134156
@Override
135157
@NotNull
136158
protected List<AudioTrack> extractSearchResults(@NotNull YoutubeAudioSourceManager source,

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.jetbrains.annotations.Nullable;
1515

1616
import java.io.IOException;
17+
import java.net.URI;
1718
import java.util.List;
1819
import java.util.stream.Collectors;
1920

@@ -133,6 +134,21 @@ default AudioTrack findSelectedTrack(@NotNull List<AudioTrack> tracks,
133134
return null;
134135
}
135136

137+
/**
138+
* Transforms a given playback URL as necessary. For example, you can add query parameters
139+
* or resolve any challenge parameters that might be needed.
140+
* @param originalUri The original stream URI. This will be completely unmodified, and is
141+
* provided as it has been received from YouTube.
142+
* @param resolvedPlaybackUri The playback URI. This will have already been
143+
* transformed by the SignatureCipherManager.
144+
* @return The new playback URI.
145+
*/
146+
@NotNull
147+
default URI transformPlaybackUri(@NotNull URI originalUri,
148+
@NotNull URI resolvedPlaybackUri) {
149+
return resolvedPlaybackUri;
150+
}
151+
136152
/**
137153
* Builds an audio track with the given parameters.
138154
* Hint: You can use {@link YoutubeAudioSourceManager#buildAudioTrack(AudioTrackInfo)} to

common/src/main/java/dev/lavalink/youtube/track/YoutubeAudioTrack.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,9 @@
1515
import dev.lavalink.youtube.UrlTools;
1616
import dev.lavalink.youtube.UrlTools.UrlInfo;
1717
import dev.lavalink.youtube.YoutubeAudioSourceManager;
18-
import dev.lavalink.youtube.clients.Web;
1918
import dev.lavalink.youtube.clients.skeleton.Client;
2019
import dev.lavalink.youtube.track.format.StreamFormat;
2120
import dev.lavalink.youtube.track.format.TrackFormats;
22-
import org.apache.http.client.utils.URIBuilder;
2321
import org.jetbrains.annotations.NotNull;
2422
import org.jetbrains.annotations.Nullable;
2523
import org.slf4j.Logger;
@@ -190,17 +188,12 @@ private FormatWithUrl loadBestFormatWithUrl(@NotNull HttpInterface httpInterface
190188

191189
StreamFormat format = formats.getBestFormat();
192190

193-
URI signedUrl = sourceManager.getCipherManager()
191+
URI resolvedUrl = sourceManager.getCipherManager()
194192
.resolveFormatUrl(httpInterface, formats.getPlayerScriptUrl(), format);
195193

196-
if (client.getIdentifier().equals(Web.BASE_CONFIG.getName()) && Web.poToken != null) {
197-
log.debug("Format origin is {}, setting 'pot' parameter.", client.getIdentifier());
198-
URIBuilder builder = new URIBuilder(signedUrl);
199-
builder.addParameter("pot", Web.poToken);
200-
signedUrl = builder.build();
201-
}
194+
resolvedUrl = client.transformPlaybackUri(format.getUrl(), resolvedUrl);
202195

203-
return new FormatWithUrl(format, signedUrl);
196+
return new FormatWithUrl(format, resolvedUrl);
204197
}
205198

206199
@Override

0 commit comments

Comments
 (0)