Skip to content

Commit d9bae45

Browse files
authored
[v1-legacy] Fix Target host is not specified with HLS relative urls in m3u8 playlists (#49)
* Backporting relative URL to absolute URL conversion. * Fix bad logic
1 parent 254e34d commit d9bae45

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

main/src/main/java/com/sedmelluq/discord/lavaplayer/container/playlists/HlsStreamSegmentUrlProvider.java

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public class HlsStreamSegmentUrlProvider extends M3uStreamSegmentUrlProvider {
1919
private volatile String segmentPlaylistUrl;
2020

2121
public HlsStreamSegmentUrlProvider(String streamListUrl, String segmentPlaylistUrl) {
22+
super(streamListUrl);
2223
this.streamListUrl = streamListUrl;
2324
this.segmentPlaylistUrl = segmentPlaylistUrl;
2425
}

main/src/main/java/com/sedmelluq/discord/lavaplayer/source/stream/M3uStreamSegmentUrlProvider.java

+34-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.io.IOException;
1414
import java.io.InputStream;
1515
import java.net.URI;
16+
import java.net.URISyntaxException;
1617
import java.util.ArrayList;
1718
import java.util.List;
1819

@@ -29,8 +30,25 @@ public abstract class M3uStreamSegmentUrlProvider {
2930
private static final long SEGMENT_WAIT_STEP_MS = 200;
3031
private static final RequestConfig streamingRequestConfig = RequestConfig.custom().setSocketTimeout(5000).setConnectionRequestTimeout(5000).setConnectTimeout(5000).build();
3132

33+
protected String baseUrl;
3234
protected SegmentInfo lastSegment;
3335

36+
protected M3uStreamSegmentUrlProvider() {
37+
this(null);
38+
}
39+
40+
protected M3uStreamSegmentUrlProvider(String originUrl) {
41+
if (originUrl != null) {
42+
if (originUrl.endsWith("/")) {
43+
originUrl = originUrl.substring(0, originUrl.length() - 1);
44+
}
45+
46+
this.baseUrl = originUrl.substring(0, originUrl.lastIndexOf("/"));
47+
} else {
48+
this.baseUrl = null;
49+
}
50+
}
51+
3452
protected static String createSegmentUrl(String playlistUrl, String segmentName) {
3553
return URI.create(playlistUrl).resolve(segmentName).toString();
3654
}
@@ -118,6 +136,20 @@ public InputStream getNextSegmentStream(HttpInterface httpInterface) {
118136

119137
protected abstract HttpUriRequest createSegmentGetRequest(String url);
120138

139+
protected boolean isAbsoluteUrl(String url) {
140+
try {
141+
// A URL is considered absolute if we don't have a baseUrl (so cannot convert a relative URL)
142+
// or if URI#isAbsolute returns true.
143+
return this.baseUrl == null || new URI(url).isAbsolute();
144+
} catch (URISyntaxException e) {
145+
return false;
146+
}
147+
}
148+
149+
protected String getAbsoluteUrl(String url) {
150+
return baseUrl + ((url.startsWith("/")) ? url : "/" + url);
151+
}
152+
121153
protected List<ChannelStreamInfo> loadChannelStreamsList(String[] lines) {
122154
ExtendedM3uParser.Line streamInfoLine = null;
123155

@@ -129,7 +161,8 @@ protected List<ChannelStreamInfo> loadChannelStreamsList(String[] lines) {
129161
if (line.isData() && streamInfoLine != null) {
130162
String quality = getQualityFromM3uDirective(streamInfoLine);
131163
if (quality != null) {
132-
streams.add(new ChannelStreamInfo(quality, line.lineData));
164+
String lineData = line.lineData;
165+
streams.add(new ChannelStreamInfo(quality, isAbsoluteUrl(lineData) ? lineData : getAbsoluteUrl(lineData)));
133166
}
134167

135168
streamInfoLine = null;

main/src/main/java/com/sedmelluq/discord/lavaplayer/source/twitch/TwitchStreamSegmentUrlProvider.java

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public class TwitchStreamSegmentUrlProvider extends M3uStreamSegmentUrlProvider
3535
* @param manager Twitch source manager.
3636
*/
3737
public TwitchStreamSegmentUrlProvider(String channelName, TwitchStreamAudioSourceManager manager) {
38+
super(null);
3839
this.channelName = channelName;
3940
this.manager = manager;
4041
this.tokenExpirationTime = -1;

0 commit comments

Comments
 (0)