From b2c692845980cf71acee9c25e11adbb0d449a029 Mon Sep 17 00:00:00 2001 From: Ritvik Saraf <13ritvik@gmail.com> Date: Wed, 26 Dec 2018 14:29:23 +0530 Subject: [PATCH] added logic for fetching related streams --- .../extractors/PeertubeStreamExtractor.java | 39 ++++++++++++++++--- .../PeertubeSearchQueryHandlerFactory.java | 2 +- .../PeertubeTrendingLinkHandlerFactory.java | 6 +++ 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeStreamExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeStreamExtractor.java index af2c1eb54..2b6afbc2f 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeStreamExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeStreamExtractor.java @@ -1,6 +1,8 @@ package org.schabi.newpipe.extractor.services.peertube.extractors; import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -17,7 +19,7 @@ import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; import org.schabi.newpipe.extractor.linkhandler.LinkHandler; import org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper; import org.schabi.newpipe.extractor.services.peertube.linkHandler.PeertubeChannelLinkHandlerFactory; -import org.schabi.newpipe.extractor.services.peertube.linkHandler.PeertubeTrendingLinkHandlerFactory; +import org.schabi.newpipe.extractor.services.peertube.linkHandler.PeertubeSearchQueryHandlerFactory; import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.Stream; import org.schabi.newpipe.extractor.stream.StreamExtractor; @@ -191,12 +193,36 @@ public class PeertubeStreamExtractor extends StreamExtractor { @Override public StreamInfoItemsCollector getRelatedStreams() throws IOException, ExtractionException { StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); - - //TODO fetch related videos not trending - String apiUrl = new PeertubeTrendingLinkHandlerFactory().getUrl(PeertubeTrendingLinkHandlerFactory.KIOSK_TRENDING); - getStreamsFromApi(collector, apiUrl); + List tags = getTags(); + String apiUrl = null; + if(!tags.isEmpty()) { + apiUrl = getRelatedStreamsUrl(tags); + + }else { + apiUrl = getUploaderUrl() + "/videos?start=0&count=8"; + } + if(!StringUtil.isBlank(apiUrl)) getStreamsFromApi(collector, apiUrl); return collector; } + + private List getTags(){ + try { + return (List) JsonUtils.getArray(json, "tags"); + } catch (Exception e) { + return Collections.emptyList(); + } + } + + private String getRelatedStreamsUrl(List tags) throws UnsupportedEncodingException { + String url = ServiceList.PeerTube.getBaseUrl() + PeertubeSearchQueryHandlerFactory.SEARCH_ENDPOINT; + StringBuilder params = new StringBuilder(); + params.append("start=0&count=8&sort=-createdAt"); + for(String tag : tags) { + params.append("&tagsOneOf="); + params.append(URLEncoder.encode(tag, "UTF-8")); + } + return url + "?" + params.toString(); + } private void getStreamsFromApi(StreamInfoItemsCollector collector, String apiUrl) throws ReCaptchaException, IOException, ParsingException { DownloadResponse response = getDownloader().get(apiUrl); @@ -226,7 +252,8 @@ public class PeertubeStreamExtractor extends StreamExtractor { if(c instanceof JsonObject) { final JsonObject item = (JsonObject) c; PeertubeStreamInfoItemExtractor extractor = new PeertubeStreamInfoItemExtractor(item); - collector.commit(extractor); + //do not add the same stream in related streams + if(!extractor.getUrl().equals(getUrl())) collector.commit(extractor); } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubeSearchQueryHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubeSearchQueryHandlerFactory.java index 536d1bf42..19a5ba26f 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubeSearchQueryHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubeSearchQueryHandlerFactory.java @@ -12,7 +12,7 @@ public class PeertubeSearchQueryHandlerFactory extends SearchQueryHandlerFactory public static final String CHARSET_UTF_8 = "UTF-8"; public static final String VIDEOS = "videos"; - private static final String SEARCH_ENDPOINT = "/api/v1/search/videos"; + public static final String SEARCH_ENDPOINT = "/api/v1/search/videos"; public static PeertubeSearchQueryHandlerFactory getInstance() { return new PeertubeSearchQueryHandlerFactory(); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubeTrendingLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubeTrendingLinkHandlerFactory.java index 33f8a3731..c481a1992 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubeTrendingLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubeTrendingLinkHandlerFactory.java @@ -12,6 +12,8 @@ import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory; public class PeertubeTrendingLinkHandlerFactory extends ListLinkHandlerFactory { + private static final PeertubeTrendingLinkHandlerFactory instance = new PeertubeTrendingLinkHandlerFactory(); + public static final Map KIOSK_MAP; public static final Map REVERSE_KIOSK_MAP; public static final String KIOSK_TRENDING = "Trending"; @@ -32,6 +34,10 @@ public class PeertubeTrendingLinkHandlerFactory extends ListLinkHandlerFactory { REVERSE_KIOSK_MAP = Collections.unmodifiableMap(reverseMap); } + public static PeertubeTrendingLinkHandlerFactory getInstance() { + return instance; + } + public String getUrl(String id, List contentFilters, String sortFilter) { String baseUrl = ServiceList.PeerTube.getBaseUrl(); return String.format(KIOSK_MAP.get(id), baseUrl);