package org.schabi.newpipe.extractor.services.peertube.extractors; import com.grack.nanojson.JsonObject; import com.grack.nanojson.JsonParser; import com.grack.nanojson.JsonParserException; import org.schabi.newpipe.extractor.Page; 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.Description; import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector; import org.schabi.newpipe.extractor.utils.Utils; import javax.annotation.Nonnull; import java.io.IOException; import static org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper.COUNT_KEY; import static org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper.ITEMS_PER_PAGE; import static org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper.START_KEY; import static org.schabi.newpipe.extractor.services.peertube.PeertubeParsingHelper.collectStreamsFrom; import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; public class PeertubePlaylistExtractor extends PlaylistExtractor { private JsonObject playlistInfo; public PeertubePlaylistExtractor(final StreamingService service, final ListLinkHandler linkHandler) { super(service, linkHandler); } @Nonnull @Override public String getThumbnailUrl() throws ParsingException { return getBaseUrl() + playlistInfo.getString("thumbnailPath"); } @Override public String getUploaderUrl() { return playlistInfo.getObject("ownerAccount").getString("url"); } @Override public String getUploaderName() { return playlistInfo.getObject("ownerAccount").getString("displayName"); } @Override public String getUploaderAvatarUrl() throws ParsingException { return getBaseUrl() + playlistInfo.getObject("ownerAccount").getObject("avatar").getString("path"); } @Override public boolean isUploaderVerified() throws ParsingException { return false; } @Override public long getStreamCount() { return playlistInfo.getLong("videosLength"); } @Nonnull @Override public Description getDescription() throws ParsingException { final String description = playlistInfo.getString("description"); if (isNullOrEmpty(description)) { return Description.EMPTY_DESCRIPTION; } return new Description(description, Description.PLAIN_TEXT); } @Nonnull @Override public String getSubChannelName() { return playlistInfo.getObject("videoChannel").getString("displayName"); } @Nonnull @Override public String getSubChannelUrl() { 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 { return getPage(new Page(getUrl() + "/videos?" + START_KEY + "=0&" + COUNT_KEY + "=" + ITEMS_PER_PAGE)); } @Override public InfoItemsPage getPage(final Page page) throws IOException, ExtractionException { if (page == null || isNullOrEmpty(page.getUrl())) { throw new IllegalArgumentException("Page doesn't contain an URL"); } final Response response = getDownloader().get(page.getUrl()); JsonObject json = null; if (response != null && !Utils.isBlank(response.responseBody())) { try { json = JsonParser.object().from(response.responseBody()); } catch (final Exception e) { throw new ParsingException("Could not parse json data for playlist info", e); } } if (json != null) { PeertubeParsingHelper.validate(json); final long total = json.getLong("total"); final StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); collectStreamsFrom(collector, json, getBaseUrl()); return new InfoItemsPage<>(collector, PeertubeParsingHelper.getNextPage(page.getUrl(), total)); } else { throw new ExtractionException("Unable to get PeerTube playlist info"); } } @Override public void onFetchPage(@Nonnull final Downloader downloader) throws IOException, ExtractionException { final Response response = downloader.get(getUrl()); try { playlistInfo = JsonParser.object().from(response.responseBody()); } catch (final JsonParserException jpe) { throw new ExtractionException("Could not parse json", jpe); } PeertubeParsingHelper.validate(playlistInfo); } @Nonnull @Override public String getName() throws ParsingException { return playlistInfo.getString("displayName"); } }