From f71279734577326918f56c2d88fc62aede17b78e Mon Sep 17 00:00:00 2001 From: FireMasterK <20838718+FireMasterK@users.noreply.github.com> Date: Wed, 20 Jan 2021 21:05:13 +0530 Subject: [PATCH] livestreams: add quality selector --- .../me/kavin/piped/utils/ResponseHelper.java | 56 +++++++++++-------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/src/main/java/me/kavin/piped/utils/ResponseHelper.java b/src/main/java/me/kavin/piped/utils/ResponseHelper.java index 6da116e..bbdcada 100644 --- a/src/main/java/me/kavin/piped/utils/ResponseHelper.java +++ b/src/main/java/me/kavin/piped/utils/ResponseHelper.java @@ -86,38 +86,48 @@ public class ResponseHelper { if (lbryURL != null) videoStreams.add(new PipedStream(lbryURL, "MP4", "LBRY", "video/mp4", false)); - String hls = null; + final String hls; boolean livestream = false; if ((hls = info.getHlsUrl()) != null && !hls.isEmpty()) livestream = true; - long minexpire = Long.MAX_VALUE; + if (hls != null) { - ObjectArrayList allStreams = new ObjectArrayList<>(); - - allStreams.addAll(info.getVideoStreams()); - allStreams.addAll(info.getAudioStreams()); - allStreams.addAll(info.getVideoOnlyStreams()); - - for (Stream stream : allStreams) { - - long expire = Long.parseLong(StringUtils.substringBetween(stream.getUrl(), "expire=", "&")); - - if (expire < minexpire) - minexpire = expire; + Stream resp = Constants.h2client + .send(HttpRequest.newBuilder(URI.create(hls)).GET().build(), BodyHandlers.ofLines()).body(); + ObjectArrayList lines = new ObjectArrayList<>(); + resp.forEach(line -> lines.add(line)); + for (int i = lines.size() - 1; i > 2; i--) { + String line = lines.get(i); + if (line.startsWith("https://manifest.googlevideo.com")) { + String prevLine = lines.get(i - 1); + String height = StringUtils.substringBetween(prevLine, "RESOLUTION=", ",").split("x")[1]; + int fps = Integer.parseInt(StringUtils.substringBetween(prevLine, "FRAME-RATE=", ",")); + String quality = height + "p"; + if (fps > 30) + quality += fps; + videoStreams.add(new PipedStream(line, "HLS", quality, "application/x-mpegURL", false)); + } + } } - info.getVideoOnlyStreams().forEach(stream -> videoStreams.add(new PipedStream(rewriteURL(stream.getUrl()), - String.valueOf(stream.getFormat()), stream.getResolution(), stream.getFormat().getMimeType(), true))); - info.getVideoStreams().forEach(stream -> videoStreams.add(new PipedStream(rewriteURL(stream.getUrl()), - String.valueOf(stream.getFormat()), stream.getResolution(), stream.getFormat().getMimeType(), false))); + if (!livestream) { + info.getVideoOnlyStreams() + .forEach(stream -> videoStreams + .add(new PipedStream(rewriteURL(stream.getUrl()), String.valueOf(stream.getFormat()), + stream.getResolution(), stream.getFormat().getMimeType(), true))); + info.getVideoStreams() + .forEach(stream -> videoStreams + .add(new PipedStream(rewriteURL(stream.getUrl()), String.valueOf(stream.getFormat()), + stream.getResolution(), stream.getFormat().getMimeType(), false))); - info.getAudioStreams() - .forEach(stream -> audioStreams - .add(new PipedStream(rewriteURL(stream.getUrl()), String.valueOf(stream.getFormat()), - stream.getAverageBitrate() + " kbps", stream.getFormat().getMimeType(), false))); + info.getAudioStreams() + .forEach(stream -> audioStreams + .add(new PipedStream(rewriteURL(stream.getUrl()), String.valueOf(stream.getFormat()), + stream.getAverageBitrate() + " kbps", stream.getFormat().getMimeType(), false))); + } final List relatedStreams = new ObjectArrayList<>(); @@ -184,8 +194,6 @@ public class ResponseHelper { } - final List relatedStreams = new ObjectArrayList<>(); - public static final byte[] trendingResponse() throws ParsingException, ExtractionException, IOException { final List relatedStreams = new ObjectArrayList<>();