Made sure to close okhttp responses properly to avoid resource leaks

This commit is contained in:
0xboobface 2018-07-25 14:06:30 +02:00
parent c3d916e033
commit 6136f095ec
2 changed files with 71 additions and 54 deletions

View File

@ -38,18 +38,21 @@ public class Chaturbate {
.addHeader("X-Requested-With", "XMLHttpRequest")
.build();
Response response = client.execute(req);
if(response.isSuccessful()) {
String content = response.body().string();
LOG.debug("Raw stream info: {}", content);
Moshi moshi = new Moshi.Builder().build();
JsonAdapter<StreamInfo> adapter = moshi.adapter(StreamInfo.class);
StreamInfo streamInfo = adapter.fromJson(content);
return streamInfo;
} else {
int code = response.code();
String message = response.message();
try {
if(response.isSuccessful()) {
String content = response.body().string();
LOG.debug("Raw stream info: {}", content);
Moshi moshi = new Moshi.Builder().build();
JsonAdapter<StreamInfo> adapter = moshi.adapter(StreamInfo.class);
StreamInfo streamInfo = adapter.fromJson(content);
return streamInfo;
} else {
int code = response.code();
String message = response.message();
throw new IOException("Server responded with " + code + " - " + message + " headers: [" + response.headers() + "]");
}
} finally {
response.close();
throw new IOException("Server responded with " + code + " - " + message + " headers: [" + response.headers() + "]");
}
}
@ -83,10 +86,14 @@ public class Chaturbate {
LOG.trace("Loading master playlist {}", streamInfo.url);
Request req = new Request.Builder().url(streamInfo.url).build();
Response response = client.execute(req);
InputStream inputStream = response.body().byteStream();
PlaylistParser parser = new PlaylistParser(inputStream, Format.EXT_M3U, Encoding.UTF_8);
Playlist playlist = parser.parse();
MasterPlaylist master = playlist.getMasterPlaylist();
return master;
try {
InputStream inputStream = response.body().byteStream();
PlaylistParser parser = new PlaylistParser(inputStream, Format.EXT_M3U, Encoding.UTF_8);
Playlist playlist = parser.parse();
MasterPlaylist master = playlist.getMasterPlaylist();
return master;
} finally {
response.close();
}
}
}

View File

@ -146,55 +146,63 @@ public class HlsDownload implements Download {
URL segmentsUrl = new URL(segments);
Request request = new Request.Builder().url(segmentsUrl).addHeader("connection", "keep-alive").build();
Response response = client.execute(request);
InputStream inputStream = response.body().byteStream();
PlaylistParser parser = new PlaylistParser(inputStream, Format.EXT_M3U, Encoding.UTF_8);
Playlist playlist = parser.parse();
if(playlist.hasMediaPlaylist()) {
MediaPlaylist mediaPlaylist = playlist.getMediaPlaylist();
LiveStreamingPlaylist lsp = new LiveStreamingPlaylist();
lsp.seq = mediaPlaylist.getMediaSequenceNumber();
lsp.targetDuration = mediaPlaylist.getTargetDuration();
List<TrackData> tracks = mediaPlaylist.getTracks();
for (TrackData trackData : tracks) {
String uri = trackData.getUri();
if(!uri.startsWith("http")) {
String _url = segmentsUrl.toString();
_url = _url.substring(0, _url.lastIndexOf('/') + 1);
String segmentUri = _url + uri;
lsp.totalDuration += trackData.getTrackInfo().duration;
lsp.lastSegDuration = trackData.getTrackInfo().duration;
lsp.segments.add(segmentUri);
try {
InputStream inputStream = response.body().byteStream();
PlaylistParser parser = new PlaylistParser(inputStream, Format.EXT_M3U, Encoding.UTF_8);
Playlist playlist = parser.parse();
if(playlist.hasMediaPlaylist()) {
MediaPlaylist mediaPlaylist = playlist.getMediaPlaylist();
LiveStreamingPlaylist lsp = new LiveStreamingPlaylist();
lsp.seq = mediaPlaylist.getMediaSequenceNumber();
lsp.targetDuration = mediaPlaylist.getTargetDuration();
List<TrackData> tracks = mediaPlaylist.getTracks();
for (TrackData trackData : tracks) {
String uri = trackData.getUri();
if(!uri.startsWith("http")) {
String _url = segmentsUrl.toString();
_url = _url.substring(0, _url.lastIndexOf('/') + 1);
String segmentUri = _url + uri;
lsp.totalDuration += trackData.getTrackInfo().duration;
lsp.lastSegDuration = trackData.getTrackInfo().duration;
lsp.segments.add(segmentUri);
}
}
return lsp;
}
return lsp;
return null;
} finally {
response.close();
}
return null;
}
private String parseMaster(String url, int streamUrlIndex) throws IOException, ParseException, PlaylistException {
Request request = new Request.Builder().url(url).addHeader("connection", "keep-alive").build();
Response response = client.execute(request);
InputStream inputStream = response.body().byteStream();
try {
InputStream inputStream = response.body().byteStream();
PlaylistParser parser = new PlaylistParser(inputStream, Format.EXT_M3U, Encoding.UTF_8);
Playlist playlist = parser.parse();
if(playlist.hasMasterPlaylist()) {
MasterPlaylist master = playlist.getMasterPlaylist();
PlaylistData bestQuality = null;
if(streamUrlIndex >= 0 && streamUrlIndex < master.getPlaylists().size()) {
bestQuality = master.getPlaylists().get(streamUrlIndex);
} else {
bestQuality = master.getPlaylists().get(master.getPlaylists().size()-1);
}
String uri = bestQuality.getUri();
if(!uri.startsWith("http")) {
String masterUrl = url;
String baseUri = masterUrl.substring(0, masterUrl.lastIndexOf('/') + 1);
String segmentUri = baseUri + uri;
return segmentUri;
PlaylistParser parser = new PlaylistParser(inputStream, Format.EXT_M3U, Encoding.UTF_8);
Playlist playlist = parser.parse();
if(playlist.hasMasterPlaylist()) {
MasterPlaylist master = playlist.getMasterPlaylist();
PlaylistData bestQuality = null;
if(streamUrlIndex >= 0 && streamUrlIndex < master.getPlaylists().size()) {
bestQuality = master.getPlaylists().get(streamUrlIndex);
} else {
bestQuality = master.getPlaylists().get(master.getPlaylists().size()-1);
}
String uri = bestQuality.getUri();
if(!uri.startsWith("http")) {
String masterUrl = url;
String baseUri = masterUrl.substring(0, masterUrl.lastIndexOf('/') + 1);
String segmentUri = baseUri + uri;
return segmentUri;
}
}
return null;
} finally {
response.close();
}
return null;
}
public static class LiveStreamingPlaylist {
@ -238,6 +246,8 @@ public class HlsDownload implements Download {
break;
} catch(Exception e) {
LOG.error("Error while downloading segment. Retrying " + i, e);
} finally {
response.close();
}
}
return false;