diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistExtractor.java index 2a901dbf0..90b89022f 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistExtractor.java @@ -6,6 +6,8 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import javax.annotation.Nonnull; + public abstract class PlaylistExtractor extends ListExtractor { public PlaylistExtractor(StreamingService service, ListLinkHandler linkHandler) { @@ -20,4 +22,9 @@ public abstract class PlaylistExtractor extends ListExtractor { public abstract String getUploaderAvatarUrl() throws ParsingException; public abstract long getStreamCount() throws ParsingException; + + @Nonnull public abstract String getSubChannelName() throws ParsingException; + @Nonnull public abstract String getSubChannelUrl() throws ParsingException; + @Nonnull public abstract String getSubChannelAvatarUrl() throws ParsingException; + } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/PeertubeParsingHelper.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/PeertubeParsingHelper.java index 7821aa297..50711ab97 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/PeertubeParsingHelper.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/PeertubeParsingHelper.java @@ -4,6 +4,7 @@ import com.grack.nanojson.JsonObject; import org.jsoup.helper.StringUtil; import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException; import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.utils.Parser; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -13,6 +14,11 @@ import java.util.TimeZone; public class PeertubeParsingHelper { + public static final String START_KEY = "start"; + public static final String COUNT_KEY = "count"; + public static final int ITEMS_PER_PAGE = 12; + public static final String START_PATTERN = "start=(\\d*)"; + private PeertubeParsingHelper() { } @@ -38,4 +44,26 @@ public class PeertubeParsingHelper { return uploadDate; } + public static String getNextPageUrl(String prevPageUrl, long total) { + String prevStart; + try { + prevStart = Parser.matchGroup1(START_PATTERN, prevPageUrl); + } catch (Parser.RegexException e) { + return ""; + } + if (StringUtil.isBlank(prevStart)) return ""; + long nextStart = 0; + try { + nextStart = Long.parseLong(prevStart) + ITEMS_PER_PAGE; + } catch (NumberFormatException e) { + return ""; + } + + if (nextStart >= total) { + return ""; + } else { + return prevPageUrl.replace(START_KEY + "=" + prevStart, START_KEY + "=" + nextStart); + } + } + } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/PeertubeService.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/PeertubeService.java index e025c2be0..77deece79 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/PeertubeService.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/PeertubeService.java @@ -44,8 +44,7 @@ public class PeertubeService extends StreamingService { @Override public ListLinkHandlerFactory getPlaylistLHFactory() { - // TODO Auto-generated method stub - return null; + return PeertubePlaylistLinkHandlerFactory.getInstance(); } @Override @@ -70,7 +69,6 @@ public class PeertubeService extends StreamingService { @Override public SubscriptionExtractor getSubscriptionExtractor() { - // TODO Auto-generated method stub return null; } @@ -88,8 +86,7 @@ public class PeertubeService extends StreamingService { @Override public PlaylistExtractor getPlaylistExtractor(ListLinkHandler linkHandler) throws ExtractionException { - // TODO Auto-generated method stub - return null; + return new PeertubePlaylistExtractor(this, linkHandler); } @Override diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeAccountExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeAccountExtractor.java index d5bdacc6a..90783e9fb 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeAccountExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeAccountExtractor.java @@ -16,17 +16,12 @@ import org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector; import org.schabi.newpipe.extractor.utils.JsonUtils; -import org.schabi.newpipe.extractor.utils.Parser; -import org.schabi.newpipe.extractor.utils.Parser.RegexException; import java.io.IOException; -public class PeertubeAccountExtractor extends ChannelExtractor { +import static org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper.*; - private static final String START_KEY = "start"; - private static final String COUNT_KEY = "count"; - private static final int ITEMS_PER_PAGE = 12; - private static final String START_PATTERN = "start=(\\d*)"; +public class PeertubeAccountExtractor extends ChannelExtractor { private InfoItemsPage initPage; private long total; @@ -135,36 +130,12 @@ public class PeertubeAccountExtractor extends ChannelExtractor { StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); if (json != null) { PeertubeParsingHelper.validate(json); - Number number = JsonUtils.getNumber(json, "total"); - if (number != null) this.total = number.longValue(); + total = JsonUtils.getNumber(json, "total").longValue(); collectStreamsFrom(collector, json, pageUrl); } else { throw new ExtractionException("Unable to get PeerTube kiosk info"); } - return new InfoItemsPage<>(collector, getNextPageUrl(pageUrl)); - } - - - private String getNextPageUrl(String prevPageUrl) { - String prevStart; - try { - prevStart = Parser.matchGroup1(START_PATTERN, prevPageUrl); - } catch (RegexException e) { - return ""; - } - if (StringUtil.isBlank(prevStart)) return ""; - long nextStart = 0; - try { - nextStart = Long.valueOf(prevStart) + ITEMS_PER_PAGE; - } catch (NumberFormatException e) { - return ""; - } - - if (nextStart >= total) { - return ""; - } else { - return prevPageUrl.replace(START_KEY + "=" + prevStart, START_KEY + "=" + String.valueOf(nextStart)); - } + return new InfoItemsPage<>(collector, PeertubeParsingHelper.getNextPageUrl(pageUrl, total)); } @Override diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeChannelExtractor.java index c8f7f4cb3..b41e21015 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeChannelExtractor.java @@ -21,12 +21,9 @@ import org.schabi.newpipe.extractor.utils.Parser.RegexException; import java.io.IOException; -public class PeertubeChannelExtractor extends ChannelExtractor { +import static org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper.*; - private static final String START_KEY = "start"; - private static final String COUNT_KEY = "count"; - private static final int ITEMS_PER_PAGE = 12; - private static final String START_PATTERN = "start=(\\d*)"; +public class PeertubeChannelExtractor extends ChannelExtractor { private InfoItemsPage initPage; private long total; @@ -141,36 +138,12 @@ public class PeertubeChannelExtractor extends ChannelExtractor { StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); if (json != null) { PeertubeParsingHelper.validate(json); - Number number = JsonUtils.getNumber(json, "total"); - if (number != null) this.total = number.longValue(); + this.total = JsonUtils.getNumber(json, "total").longValue(); collectStreamsFrom(collector, json, pageUrl); } else { throw new ExtractionException("Unable to get PeerTube kiosk info"); } - return new InfoItemsPage<>(collector, getNextPageUrl(pageUrl)); - } - - - private String getNextPageUrl(String prevPageUrl) { - String prevStart; - try { - prevStart = Parser.matchGroup1(START_PATTERN, prevPageUrl); - } catch (RegexException e) { - return ""; - } - if (StringUtil.isBlank(prevStart)) return ""; - long nextStart = 0; - try { - nextStart = Long.valueOf(prevStart) + ITEMS_PER_PAGE; - } catch (NumberFormatException e) { - return ""; - } - - if (nextStart >= total) { - return ""; - } else { - return prevPageUrl.replace(START_KEY + "=" + prevStart, START_KEY + "=" + String.valueOf(nextStart)); - } + return new InfoItemsPage<>(collector, PeertubeParsingHelper.getNextPageUrl(pageUrl, total)); } @Override @@ -182,8 +155,7 @@ public class PeertubeChannelExtractor extends ChannelExtractor { throw new ExtractionException("Unable to extract PeerTube channel data"); } - String pageUrl = getUrl() + "/videos?" + START_KEY + "=0&" + COUNT_KEY + "=" + ITEMS_PER_PAGE; - this.initPage = getPage(pageUrl); + this.initPage = getPage(getUrl() + "/videos?" + START_KEY + "=0&" + COUNT_KEY + "=" + ITEMS_PER_PAGE); } private void setInitialData(String responseBody) throws ExtractionException { diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeCommentsExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeCommentsExtractor.java index d7b16b093..61db17f59 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeCommentsExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeCommentsExtractor.java @@ -13,18 +13,16 @@ import org.schabi.newpipe.extractor.downloader.Response; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; +import org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper; import org.schabi.newpipe.extractor.utils.JsonUtils; import org.schabi.newpipe.extractor.utils.Parser; import org.schabi.newpipe.extractor.utils.Parser.RegexException; import java.io.IOException; -public class PeertubeCommentsExtractor extends CommentsExtractor { +import static org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper.*; - private static final String START_KEY = "start"; - private static final String COUNT_KEY = "count"; - private static final int ITEMS_PER_PAGE = 12; - private static final String START_PATTERN = "start=(\\d*)"; +public class PeertubeCommentsExtractor extends CommentsExtractor { private InfoItemsPage initPage; private long total; @@ -83,35 +81,12 @@ public class PeertubeCommentsExtractor extends CommentsExtractor { } else { throw new ExtractionException("Unable to get peertube comments info"); } - return new InfoItemsPage<>(collector, getNextPageUrl(pageUrl)); + return new InfoItemsPage<>(collector, PeertubeParsingHelper.getNextPageUrl(pageUrl, total)); } @Override public void onFetchPage(Downloader downloader) throws IOException, ExtractionException { - String pageUrl = getUrl() + "?" + START_KEY + "=0&" + COUNT_KEY + "=" + ITEMS_PER_PAGE; - this.initPage = getPage(pageUrl); - } - - private String getNextPageUrl(String prevPageUrl) { - String prevStart; - try { - prevStart = Parser.matchGroup1(START_PATTERN, prevPageUrl); - } catch (RegexException e) { - return ""; - } - if (StringUtil.isBlank(prevStart)) return ""; - long nextStart = 0; - try { - nextStart = Long.valueOf(prevStart) + ITEMS_PER_PAGE; - } catch (NumberFormatException e) { - return ""; - } - - if (nextStart >= total) { - return ""; - } else { - return prevPageUrl.replace(START_KEY + "=" + prevStart, START_KEY + "=" + String.valueOf(nextStart)); - } + this.initPage = getPage(getUrl() + "?" + START_KEY + "=0&" + COUNT_KEY + "=" + ITEMS_PER_PAGE); } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubePlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubePlaylistExtractor.java index 1a96111ab..c689096ab 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubePlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubePlaylistExtractor.java @@ -1,85 +1,135 @@ package org.schabi.newpipe.extractor.services.peertube.extractors; +import com.grack.nanojson.JsonArray; +import com.grack.nanojson.JsonObject; +import com.grack.nanojson.JsonParser; +import com.grack.nanojson.JsonParserException; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.downloader.Downloader; +import org.schabi.newpipe.extractor.downloader.Response; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; +import org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper; import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector; +import org.schabi.newpipe.extractor.utils.JsonUtils; +import javax.annotation.Nonnull; import java.io.IOException; +import static org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper.*; + public class PeertubePlaylistExtractor extends PlaylistExtractor { + private JsonObject playlistInfo; + private JsonObject playlistVideos; + private String initialPageUrl; + + private long total; + public PeertubePlaylistExtractor(StreamingService service, ListLinkHandler linkHandler) { super(service, linkHandler); - // TODO Auto-generated constructor stub } @Override public String getThumbnailUrl() throws ParsingException { - // TODO Auto-generated method stub - return null; + return getBaseUrl() + playlistInfo.getString("thumbnailPath"); } @Override public String getBannerUrl() throws ParsingException { - // TODO Auto-generated method stub return null; } @Override public String getUploaderUrl() throws ParsingException { - // TODO Auto-generated method stub - return null; + return playlistInfo.getObject("ownerAccount").getString("url"); } @Override public String getUploaderName() throws ParsingException { - // TODO Auto-generated method stub - return null; + return playlistInfo.getObject("ownerAccount").getString("displayName"); } @Override public String getUploaderAvatarUrl() throws ParsingException { - // TODO Auto-generated method stub - return null; + return getBaseUrl() + playlistInfo.getObject("ownerAccount").getObject("avatar").getString("path"); } @Override public long getStreamCount() throws ParsingException { - // TODO Auto-generated method stub - return 0; + return playlistInfo.getNumber("videosLength").longValue(); } + @Nonnull + @Override + public String getSubChannelName() throws ParsingException { + return playlistInfo.getObject("videoChannel").getString("displayName"); + } + + @Nonnull + @Override + public String getSubChannelUrl() throws ParsingException { + return playlistInfo.getObject("videoChannel").getString("url"); + } + + @Nonnull + @Override + public String getSubChannelAvatarUrl() throws ParsingException { + return getBaseUrl() + playlistInfo.getObject("videoChannel").getObject("avatar").getString("path"); + } + + @Nonnull @Override public InfoItemsPage getInitialPage() throws IOException, ExtractionException { - // TODO Auto-generated method stub - return null; + return getPage(initialPageUrl); } @Override public String getNextPageUrl() throws IOException, ExtractionException { - // TODO Auto-generated method stub - return null; + return PeertubeParsingHelper.getNextPageUrl(initialPageUrl, total); } @Override public InfoItemsPage getPage(String pageUrl) throws IOException, ExtractionException { - // TODO Auto-generated method stub - return null; + Response response = getDownloader().get(pageUrl); + try { + playlistVideos = JsonParser.object().from(response.responseBody()); + } catch (JsonParserException jpe) { + throw new ExtractionException("Could not parse json", jpe); + } + PeertubeParsingHelper.validate(playlistVideos); + + this.total = JsonUtils.getNumber(playlistVideos, "total").longValue(); + + StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); + + JsonArray videos = playlistVideos.getArray("data"); + for (Object o : videos) { + JsonObject video = ((JsonObject) o).getObject("video"); + collector.commit(new PeertubeStreamInfoItemExtractor(video, getBaseUrl())); + } + + return new InfoItemsPage<>(collector, PeertubeParsingHelper.getNextPageUrl(pageUrl, total)); } @Override - public void onFetchPage(Downloader downloader) throws IOException, ExtractionException { - + public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { + Response response = downloader.get(getUrl()); + try { + playlistInfo = JsonParser.object().from(response.responseBody()); + } catch (JsonParserException jpe) { + throw new ExtractionException("Could not parse json", jpe); + } + PeertubeParsingHelper.validate(playlistInfo); + initialPageUrl = getUrl() + "/videos?" + START_KEY + "=0&" + COUNT_KEY + "=" + ITEMS_PER_PAGE; } + @Nonnull @Override public String getName() throws ParsingException { - // TODO Auto-generated method stub - return null; + return playlistInfo.getString("displayName"); } - } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeSearchExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeSearchExtractor.java index 61fcdd6df..8313d08ed 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeSearchExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeSearchExtractor.java @@ -15,18 +15,16 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandler; import org.schabi.newpipe.extractor.search.InfoItemsSearchCollector; import org.schabi.newpipe.extractor.search.SearchExtractor; +import org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper; import org.schabi.newpipe.extractor.utils.JsonUtils; import org.schabi.newpipe.extractor.utils.Parser; import org.schabi.newpipe.extractor.utils.Parser.RegexException; import java.io.IOException; -public class PeertubeSearchExtractor extends SearchExtractor { +import static org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper.*; - private static final String START_KEY = "start"; - private static final String COUNT_KEY = "count"; - private static final int ITEMS_PER_PAGE = 12; - private static final String START_PATTERN = "start=(\\d*)"; +public class PeertubeSearchExtractor extends SearchExtractor { private InfoItemsPage initPage; private long total; @@ -88,9 +86,8 @@ public class PeertubeSearchExtractor extends SearchExtractor { } if (json != null) { - Number number = JsonUtils.getNumber(json, "total"); - if (number != null) this.total = number.longValue(); - return new InfoItemsPage<>(collectStreamsFrom(json), getNextPageUrl(pageUrl)); + total = JsonUtils.getNumber(json, "total").longValue(); + return new InfoItemsPage<>(collectStreamsFrom(json), PeertubeParsingHelper.getNextPageUrl(pageUrl, total)); } else { throw new ExtractionException("Unable to get peertube search info"); } @@ -98,31 +95,7 @@ public class PeertubeSearchExtractor extends SearchExtractor { @Override public void onFetchPage(Downloader downloader) throws IOException, ExtractionException { - String pageUrl = getUrl() + "&" + START_KEY + "=0&" + COUNT_KEY + "=" + ITEMS_PER_PAGE; - this.initPage = getPage(pageUrl); + initPage = getPage(getUrl() + "&" + START_KEY + "=0&" + COUNT_KEY + "=" + ITEMS_PER_PAGE); } - private String getNextPageUrl(String prevPageUrl) { - String prevStart; - try { - prevStart = Parser.matchGroup1(START_PATTERN, prevPageUrl); - } catch (RegexException e) { - return ""; - } - if (StringUtil.isBlank(prevStart)) return ""; - long nextStart = 0; - try { - nextStart = Long.valueOf(prevStart) + ITEMS_PER_PAGE; - } catch (NumberFormatException e) { - return ""; - } - - if (nextStart >= total) { - return ""; - } else { - return prevPageUrl.replace(START_KEY + "=" + prevStart, START_KEY + "=" + String.valueOf(nextStart)); - } - } - - } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeTrendingExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeTrendingExtractor.java index e4bc1dff8..679d2bef0 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeTrendingExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/extractors/PeertubeTrendingExtractor.java @@ -11,20 +11,16 @@ import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.kiosk.KioskExtractor; import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler; +import org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector; import org.schabi.newpipe.extractor.utils.JsonUtils; -import org.schabi.newpipe.extractor.utils.Parser; -import org.schabi.newpipe.extractor.utils.Parser.RegexException; import java.io.IOException; -public class PeertubeTrendingExtractor extends KioskExtractor { +import static org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper.*; - private static final String START_KEY = "start"; - private static final String COUNT_KEY = "count"; - private static final int ITEMS_PER_PAGE = 12; - private static final String START_PATTERN = "start=(\\d*)"; +public class PeertubeTrendingExtractor extends KioskExtractor { private InfoItemsPage initPage; private long total; @@ -89,35 +85,12 @@ public class PeertubeTrendingExtractor extends KioskExtractor { } else { throw new ExtractionException("Unable to get peertube kiosk info"); } - return new InfoItemsPage<>(collector, getNextPageUrl(pageUrl)); + return new InfoItemsPage<>(collector, PeertubeParsingHelper.getNextPageUrl(pageUrl, total)); } @Override public void onFetchPage(Downloader downloader) throws IOException, ExtractionException { - String pageUrl = getUrl() + "&" + START_KEY + "=0&" + COUNT_KEY + "=" + ITEMS_PER_PAGE; - this.initPage = getPage(pageUrl); - } - - private String getNextPageUrl(String prevPageUrl) { - String prevStart; - try { - prevStart = Parser.matchGroup1(START_PATTERN, prevPageUrl); - } catch (RegexException e) { - return ""; - } - if (StringUtil.isBlank(prevStart)) return ""; - long nextStart = 0; - try { - nextStart = Long.valueOf(prevStart) + ITEMS_PER_PAGE; - } catch (NumberFormatException e) { - return ""; - } - - if (nextStart >= total) { - return ""; - } else { - return prevPageUrl.replace(START_KEY + "=" + prevStart, START_KEY + "=" + String.valueOf(nextStart)); - } + this.initPage = getPage(getUrl() + "&" + START_KEY + "=0&" + COUNT_KEY + "=" + ITEMS_PER_PAGE); } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubePlaylistLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubePlaylistLinkHandlerFactory.java index dd1bd77f5..72b1d87fd 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubePlaylistLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubePlaylistLinkHandlerFactory.java @@ -11,8 +11,7 @@ import java.util.List; public class PeertubePlaylistLinkHandlerFactory extends ListLinkHandlerFactory { private static final PeertubePlaylistLinkHandlerFactory instance = new PeertubePlaylistLinkHandlerFactory(); - private static final String ID_PATTERN = "/video-channels/([^/?&#]*)"; - private static final String VIDEO_CHANNELS_ENDPOINT = "/api/v1/video-channels/"; + private static final String ID_PATTERN = "/videos/watch/playlist/([^/?&#]*)"; public static PeertubePlaylistLinkHandlerFactory getInstance() { return instance; @@ -26,7 +25,7 @@ public class PeertubePlaylistLinkHandlerFactory extends ListLinkHandlerFactory { @Override public String getUrl(String id, List contentFilters, String sortFilter, String baseUrl) { - return baseUrl + VIDEO_CHANNELS_ENDPOINT + id; + return baseUrl + "/api/v1/video-playlists/" + id; } @Override @@ -34,9 +33,13 @@ public class PeertubePlaylistLinkHandlerFactory extends ListLinkHandlerFactory { return Parser.matchGroup1(ID_PATTERN, url); } - @Override public boolean onAcceptUrl(final String url) { - return url.contains("/video-channels/"); + try { + getId(url); + return true; + } catch (ParsingException e) { + return false; + } } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubeStreamLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubeStreamLinkHandlerFactory.java index 222dc1290..f181d3e71 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubeStreamLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/linkHandler/PeertubeStreamLinkHandlerFactory.java @@ -37,6 +37,12 @@ public class PeertubeStreamLinkHandlerFactory extends LinkHandlerFactory { @Override public boolean onAcceptUrl(final String url) throws FoundAdException { - return url.contains("/videos/"); + if (url.contains("/playlist/")) return false; + try { + getId(url); + return true; + } catch (ParsingException e) { + return false; + } } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudPlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudPlaylistExtractor.java index 4cff6bb67..484c08fd4 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudPlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudPlaylistExtractor.java @@ -116,6 +116,24 @@ public class SoundcloudPlaylistExtractor extends PlaylistExtractor { return playlist.getNumber("track_count", 0).longValue(); } + @Nonnull + @Override + public String getSubChannelName() throws ParsingException { + return ""; + } + + @Nonnull + @Override + public String getSubChannelUrl() throws ParsingException { + return ""; + } + + @Nonnull + @Override + public String getSubChannelAvatarUrl() throws ParsingException { + return ""; + } + @Nonnull @Override public InfoItemsPage getInitialPage() throws IOException, ExtractionException { diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubePlaylistExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubePlaylistExtractor.java index b7c6d6c22..e73d69af0 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubePlaylistExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubePlaylistExtractor.java @@ -150,6 +150,24 @@ public class YoutubePlaylistExtractor extends PlaylistExtractor { } } + @Nonnull + @Override + public String getSubChannelName() throws ParsingException { + return ""; + } + + @Nonnull + @Override + public String getSubChannelUrl() throws ParsingException { + return ""; + } + + @Nonnull + @Override + public String getSubChannelAvatarUrl() throws ParsingException { + return ""; + } + @Nonnull @Override public InfoItemsPage getInitialPage() { diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/PeertubePlaylistExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/PeertubePlaylistExtractorTest.java new file mode 100644 index 000000000..47e2960fc --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/PeertubePlaylistExtractorTest.java @@ -0,0 +1,72 @@ +package org.schabi.newpipe.extractor.services.peertube; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.schabi.newpipe.DownloaderTestImpl; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.services.peertube.extractors.PeertubePlaylistExtractor; + +import static org.junit.Assert.assertEquals; +import static org.schabi.newpipe.extractor.ServiceList.PeerTube; + +public class PeertubePlaylistExtractorTest { + + public static class Shocking { + private static PeertubePlaylistExtractor extractor; + + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(DownloaderTestImpl.getInstance()); + extractor = (PeertubePlaylistExtractor) PeerTube + .getPlaylistExtractor("https://framatube.org/videos/watch/playlist/96b0ee2b-a5a7-4794-8769-58d8ccb79ab7"); + extractor.fetchPage(); + } + + @Test + public void testGetName() throws ParsingException { + assertEquals("Shocking !", extractor.getName()); + } + + @Test + public void testGetThumbnailUrl() throws ParsingException { + assertEquals("https://framatube.org/static/thumbnails/playlist-96b0ee2b-a5a7-4794-8769-58d8ccb79ab7.jpg", extractor.getThumbnailUrl()); + } + + @Test + public void testGetUploaderUrl() throws ParsingException { + assertEquals("https://skeptikon.fr/accounts/metadechoc", extractor.getUploaderUrl()); + } + + @Test + public void testGetUploaderAvatarUrl() throws ParsingException { + assertEquals("https://framatube.org/lazy-static/avatars/cd0f781d-0287-4be2-94f1-24cd732337b2.jpg", extractor.getUploaderAvatarUrl()); + } + + @Test + public void testGetUploaderName() throws ParsingException { + assertEquals("Méta de Choc", extractor.getUploaderName()); + } + + @Test + public void testGetStreamCount() throws ParsingException { + assertEquals(35, extractor.getStreamCount()); + } + + @Test + public void testGetSubChannelUrl() throws ParsingException { + assertEquals("https://skeptikon.fr/video-channels/metadechoc_channel", extractor.getSubChannelUrl()); + } + + @Test + public void testGetSubChannelName() throws ParsingException { + assertEquals("SHOCKING !", extractor.getSubChannelName()); + } + + @Test + public void testGetSubChannelAvatarUrl() throws ParsingException { + assertEquals("https://framatube.org/lazy-static/avatars/f1dcd0e8-e651-42ed-ae81-bb3bd4aff2bc.png", + extractor.getSubChannelAvatarUrl()); + } + } +} diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/PeertubePlaylistLinkHandlerFactoryTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/PeertubePlaylistLinkHandlerFactoryTest.java index ac04a01ee..4b1cc38a4 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/PeertubePlaylistLinkHandlerFactoryTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/PeertubePlaylistLinkHandlerFactoryTest.java @@ -25,12 +25,17 @@ public class PeertubePlaylistLinkHandlerFactoryTest { @Test public void acceptUrlTest() throws ParsingException { - assertTrue(linkHandler.acceptUrl("https://peertube.mastodon.host/video-channels/b45e84fb-c47f-475b-94f2-718126154d33/videos")); + assertTrue(linkHandler.acceptUrl("https://framatube.org/videos/watch/playlist/d8ca79f9-e4c7-4269-8183-d78ed269c909")); + assertTrue(linkHandler.acceptUrl("https://framatube.org/videos/watch/playlist/d8ca79f9-e4c7-4269-8183-d78ed269c909/videos")); + assertTrue(linkHandler.acceptUrl("https://framatube.org/videos/watch/playlist/dacdc4ef-5160-4846-9b70-a655880da667")); + assertTrue(linkHandler.acceptUrl("https://framatube.org/videos/watch/playlist/96b0ee2b-a5a7-4794-8769-58d8ccb79ab7")); } @Test public void getIdFromUrl() throws ParsingException { - assertEquals("b45e84fb-c47f-475b-94f2-718126154d33", linkHandler.fromUrl("https://peertube.mastodon.host/video-channels/b45e84fb-c47f-475b-94f2-718126154d33").getId()); - assertEquals("b45e84fb-c47f-475b-94f2-718126154d33", linkHandler.fromUrl("https://peertube.mastodon.host/video-channels/b45e84fb-c47f-475b-94f2-718126154d33/videos").getId()); + assertEquals("d8ca79f9-e4c7-4269-8183-d78ed269c909", linkHandler.getId("https://framatube.org/videos/watch/playlist/d8ca79f9-e4c7-4269-8183-d78ed269c909")); + assertEquals("dacdc4ef-5160-4846-9b70-a655880da667", linkHandler.getId("https://framatube.org/videos/watch/playlist/dacdc4ef-5160-4846-9b70-a655880da667")); + assertEquals("bfc145f5-1be7-48a6-9b9e-4f1967199dad", linkHandler.getId("https://framatube.org/videos/watch/playlist/bfc145f5-1be7-48a6-9b9e-4f1967199dad")); + assertEquals("96b0ee2b-a5a7-4794-8769-58d8ccb79ab7", linkHandler.getId("https://framatube.org/videos/watch/playlist/96b0ee2b-a5a7-4794-8769-58d8ccb79ab7")); } }