From 0c7650f94fb8c9803f07cad725a6261f73e7e392 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Sat, 18 Apr 2020 19:09:38 +0200 Subject: [PATCH] Remove retry loop in getNextSegments This might cause blocks by MFC because we are asking for a resource, which is not available. --- .../download/hls/AbstractHlsDownload.java | 87 ++++++++----------- .../sites/jasmin/LiveJasminHlsDownload.java | 2 +- .../jasmin/LiveJasminMergedHlsDownload.java | 2 +- 3 files changed, 38 insertions(+), 53 deletions(-) diff --git a/common/src/main/java/ctbrec/recorder/download/hls/AbstractHlsDownload.java b/common/src/main/java/ctbrec/recorder/download/hls/AbstractHlsDownload.java index dd44e2be..f9397b4a 100644 --- a/common/src/main/java/ctbrec/recorder/download/hls/AbstractHlsDownload.java +++ b/common/src/main/java/ctbrec/recorder/download/hls/AbstractHlsDownload.java @@ -75,7 +75,7 @@ public abstract class AbstractHlsDownload extends AbstractDownload { }; } - protected SegmentPlaylist getNextSegments(String segmentsURL) throws Exception { + protected SegmentPlaylist getNextSegments(String segmentsURL) throws IOException, ParseException, PlaylistException { URL segmentsUrl = new URL(segmentsURL); Request request = new Request.Builder() .url(segmentsUrl) @@ -87,61 +87,46 @@ public abstract class AbstractHlsDownload extends AbstractDownload { .header(REFERER, Optional.ofNullable(model).map(Model::getSite).map(Site::getBaseUrl).orElse("")) .build(); - Exception lastException = null; - for (int tries = 1; tries <= 10 && running; tries++) { - try (Response response = client.execute(request)) { - if (response.isSuccessful()) { - String body = response.body().string(); - if (!body.contains("#EXTINF")) { - // no segments, empty playlist - return new SegmentPlaylist(segmentsURL); - } + try (Response response = client.execute(request)) { + if (response.isSuccessful()) { + String body = response.body().string(); + if (!body.contains("#EXTINF")) { + // no segments, empty playlist + return new SegmentPlaylist(segmentsURL); + } - InputStream inputStream = new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8)); - PlaylistParser parser = new PlaylistParser(inputStream, Format.EXT_M3U, Encoding.UTF_8, ParsingMode.LENIENT); - Playlist playlist = parser.parse(); - if (playlist.hasMediaPlaylist()) { - MediaPlaylist mediaPlaylist = playlist.getMediaPlaylist(); - SegmentPlaylist lsp = new SegmentPlaylist(segmentsURL); - lsp.seq = mediaPlaylist.getMediaSequenceNumber(); - lsp.targetDuration = mediaPlaylist.getTargetDuration(); - List tracks = mediaPlaylist.getTracks(); - for (TrackData trackData : tracks) { - String uri = trackData.getUri(); - if (!uri.startsWith("http")) { - String tmpurl = segmentsUrl.toString(); - tmpurl = tmpurl.substring(0, tmpurl.lastIndexOf('/') + 1); - uri = tmpurl + uri; - } - lsp.totalDuration += trackData.getTrackInfo().duration; - lsp.lastSegDuration = trackData.getTrackInfo().duration; - lsp.segments.add(uri); - if (trackData.hasEncryptionData()) { - lsp.encrypted = true; - EncryptionData data = trackData.getEncryptionData(); - lsp.encryptionKeyUrl = data.getUri(); - lsp.encryptionMethod = data.getMethod().getValue(); - } + InputStream inputStream = new ByteArrayInputStream(body.getBytes(StandardCharsets.UTF_8)); + PlaylistParser parser = new PlaylistParser(inputStream, Format.EXT_M3U, Encoding.UTF_8, ParsingMode.LENIENT); + Playlist playlist = parser.parse(); + if (playlist.hasMediaPlaylist()) { + MediaPlaylist mediaPlaylist = playlist.getMediaPlaylist(); + SegmentPlaylist lsp = new SegmentPlaylist(segmentsURL); + lsp.seq = mediaPlaylist.getMediaSequenceNumber(); + lsp.targetDuration = mediaPlaylist.getTargetDuration(); + List tracks = mediaPlaylist.getTracks(); + for (TrackData trackData : tracks) { + String uri = trackData.getUri(); + if (!uri.startsWith("http")) { + String tmpurl = segmentsUrl.toString(); + tmpurl = tmpurl.substring(0, tmpurl.lastIndexOf('/') + 1); + uri = tmpurl + uri; + } + lsp.totalDuration += trackData.getTrackInfo().duration; + lsp.lastSegDuration = trackData.getTrackInfo().duration; + lsp.segments.add(uri); + if (trackData.hasEncryptionData()) { + lsp.encrypted = true; + EncryptionData data = trackData.getEncryptionData(); + lsp.encryptionKeyUrl = data.getUri(); + lsp.encryptionMethod = data.getMethod().getValue(); } - return lsp; } - throw new InvalidPlaylistException("Playlist has no media playlist"); - } else { - throw new HttpException(response.code(), response.message()); - } - } catch (Exception e) { - LOG.debug("Couldn't download HLS playlist (try {}) {} - [{}]", tries, e.getMessage(), segmentsURL); - lastException = e; - if (!getModel().isOnline(true)) { - break; + return lsp; } + throw new InvalidPlaylistException("Playlist has no media playlist"); + } else { + throw new HttpException(response.code(), response.message()); } - waitSomeTime(100 * tries); - } - if (lastException != null) { - throw lastException; - } else { - throw new IOException("Couldn't download HLS playlist"); } } diff --git a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminHlsDownload.java b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminHlsDownload.java index be7e5c44..2fd0703a 100644 --- a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminHlsDownload.java +++ b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminHlsDownload.java @@ -26,7 +26,7 @@ public class LiveJasminHlsDownload extends HlsDownload { } @Override - protected SegmentPlaylist getNextSegments(String segments) throws Exception { + protected SegmentPlaylist getNextSegments(String segments) throws IOException, ParseException, PlaylistException { if(this.segmentUrl == null) { this.segmentUrl = segments; } diff --git a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminMergedHlsDownload.java b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminMergedHlsDownload.java index 046aa7d2..4170ddb7 100644 --- a/common/src/main/java/ctbrec/sites/jasmin/LiveJasminMergedHlsDownload.java +++ b/common/src/main/java/ctbrec/sites/jasmin/LiveJasminMergedHlsDownload.java @@ -26,7 +26,7 @@ public class LiveJasminMergedHlsDownload extends MergedFfmpegHlsDownload { } @Override - protected SegmentPlaylist getNextSegments(String segments) throws Exception { + protected SegmentPlaylist getNextSegments(String segments) throws IOException, ParseException, PlaylistException { if(this.segmentUrl == null) { this.segmentUrl = segments; }