From 2148edc7d7b199d4910ba83c429b9c0882bd7739 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 23 Dec 2018 19:41:18 +0100 Subject: [PATCH] add channel and strem extractor for mediaccc --- .../extractor/channel/ChannelExtractor.java | 1 - .../extractor/channel/ChannelInfo.java | 5 - .../services/media_ccc/MediaCCCService.java | 12 +- .../MediaCCCConferenceExtractor.java | 94 ++++++++ .../extractors/MediaCCCStreamExtractor.java | 222 ++++++++++++++++++ .../MediaCCCSuggestionExtractor.java | 21 ++ .../MediaCCCStreamInfoItemExtractor.java | 2 +- .../MediaCCCConferenceLinkHandlerFactory.java | 32 +++ .../MediaCCCSearchQueryHandlerFactory.java | 4 +- .../MediaCCCStreamLinkHandlerFactory.java | 27 +++ .../SoundcloudChannelExtractor.java | 5 - .../extractors/YoutubeChannelExtractor.java | 23 -- .../MediaCCCConferenceExtractorTest.java | 51 ++++ .../MediaCCCSearchExtractorTest.java | 25 ++ .../MediaCCCStreamExtractorTest.java | 83 +++++++ .../youtube/YoutubeChannelExtractorTest.java | 23 -- .../YoutubeSearchExtractorDefaultTest.java | 14 +- 17 files changed, 575 insertions(+), 69 deletions(-) create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCConferenceExtractor.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCStreamExtractor.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCSuggestionExtractor.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/linkHandler/MediaCCCConferenceLinkHandlerFactory.java create mode 100644 extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/linkHandler/MediaCCCStreamLinkHandlerFactory.java create mode 100644 extractor/src/test/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCConferenceExtractorTest.java create mode 100644 extractor/src/test/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCStreamExtractorTest.java diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/channel/ChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/channel/ChannelExtractor.java index 5b74826e6..5172e0977 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/channel/ChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/channel/ChannelExtractor.java @@ -38,5 +38,4 @@ public abstract class ChannelExtractor extends ListExtractor { public abstract String getFeedUrl() throws ParsingException; public abstract long getSubscriberCount() throws ParsingException; public abstract String getDescription() throws ParsingException; - public abstract String[] getDonationLinks() throws ParsingException; } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java b/extractor/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java index 20abdfe42..a848725f6 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java @@ -92,11 +92,6 @@ public class ChannelInfo extends ListInfo { } catch (Exception e) { info.addError(e); } - try { - info.setDonationLinks(extractor.getDonationLinks()); - } catch (Exception e) { - info.addError(e); - } return info; } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCService.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCService.java index 1a78110b5..af8b21a26 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCService.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCService.java @@ -8,8 +8,12 @@ import org.schabi.newpipe.extractor.kiosk.KioskList; import org.schabi.newpipe.extractor.linkhandler.*; import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; import org.schabi.newpipe.extractor.search.SearchExtractor; +import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCConferenceExtractor; import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCSearchExtractor; +import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCStreamExtractor; +import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCConferenceLinkHandlerFactory; import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCSearchQueryHandlerFactory; +import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCStreamLinkHandlerFactory; import org.schabi.newpipe.extractor.stream.StreamExtractor; import org.schabi.newpipe.extractor.subscription.SubscriptionExtractor; import org.schabi.newpipe.extractor.utils.Localization; @@ -29,12 +33,12 @@ public class MediaCCCService extends StreamingService { @Override public LinkHandlerFactory getStreamLHFactory() { - return null; + return new MediaCCCStreamLinkHandlerFactory(); } @Override public ListLinkHandlerFactory getChannelLHFactory() { - return null; + return new MediaCCCConferenceLinkHandlerFactory(); } @Override @@ -49,12 +53,12 @@ public class MediaCCCService extends StreamingService { @Override public StreamExtractor getStreamExtractor(LinkHandler linkHandler, Localization localization) { - return null; + return new MediaCCCStreamExtractor(this, linkHandler, localization); } @Override public ChannelExtractor getChannelExtractor(ListLinkHandler linkHandler, Localization localization) { - return null; + return new MediaCCCConferenceExtractor(this, linkHandler, localization); } @Override diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCConferenceExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCConferenceExtractor.java new file mode 100644 index 000000000..faa4b444c --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCConferenceExtractor.java @@ -0,0 +1,94 @@ +package org.schabi.newpipe.extractor.services.media_ccc.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.Downloader; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.channel.ChannelExtractor; +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.media_ccc.extractors.infoItems.MediaCCCStreamInfoItemExtractor; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; +import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector; +import org.schabi.newpipe.extractor.utils.Localization; + +import javax.annotation.Nonnull; +import java.io.IOException; + +public class MediaCCCConferenceExtractor extends ChannelExtractor { + + private JsonObject conferenceData; + + public MediaCCCConferenceExtractor(StreamingService service, ListLinkHandler linkHandler, Localization localization) { + super(service, linkHandler, localization); + } + + @Override + public String getAvatarUrl() throws ParsingException { + return conferenceData.getString("logo_url"); + } + + @Override + public String getBannerUrl() throws ParsingException { + return conferenceData.getString("logo_url"); + } + + @Override + public String getFeedUrl() throws ParsingException { + return null; + } + + @Override + public long getSubscriberCount() throws ParsingException { + return -1; + } + + @Override + public String getDescription() throws ParsingException { + return null; + } + + @Nonnull + @Override + public InfoItemsPage getInitialPage() throws IOException, ExtractionException { + StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId()); + JsonArray events = conferenceData.getArray("events"); + for(int i = 0; i < events.size(); i++) { + collector.commit(new MediaCCCStreamInfoItemExtractor(events.getObject(i))); + } + return new InfoItemsPage<>(collector, null); + } + + @Override + public String getNextPageUrl() throws IOException, ExtractionException { + return null; + } + + @Override + public InfoItemsPage getPage(String pageUrl) throws IOException, ExtractionException { + return null; + } + + @Override + public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { + try { + conferenceData = JsonParser.object().from(downloader.download(getUrl())); + } catch (JsonParserException jpe) { + throw new ExtractionException("Could not parse json returnd by url: " + getUrl()); + } + } + + @Nonnull + @Override + public String getName() throws ParsingException { + return conferenceData.getString("title"); + } + + @Override + public String getOriginalUrl() throws ParsingException { + return "https://media.ccc.de/c/" + conferenceData.getString("acronym"); + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCStreamExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCStreamExtractor.java new file mode 100644 index 000000000..6c0e0fad8 --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCStreamExtractor.java @@ -0,0 +1,222 @@ +package org.schabi.newpipe.extractor.services.media_ccc.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.Downloader; +import org.schabi.newpipe.extractor.MediaFormat; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.linkhandler.LinkHandler; +import org.schabi.newpipe.extractor.stream.*; +import org.schabi.newpipe.extractor.utils.Localization; +import org.schabi.newpipe.extractor.utils.Parser; + +import javax.annotation.Nonnull; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class MediaCCCStreamExtractor extends StreamExtractor { + + private JsonObject data; + private JsonObject conferenceData; + + public MediaCCCStreamExtractor(StreamingService service, LinkHandler linkHandler, Localization localization) { + super(service, linkHandler, localization); + } + + @Nonnull + @Override + public String getUploadDate() throws ParsingException { + return data.getString("release_date"); + } + + @Nonnull + @Override + public String getThumbnailUrl() throws ParsingException { + return data.getString("thumb_url"); + } + + @Nonnull + @Override + public String getDescription() throws ParsingException { + return data.getString("description"); + } + + @Override + public int getAgeLimit() throws ParsingException { + return 0; + } + + @Override + public long getLength() throws ParsingException { + return data.getInt("length"); + } + + @Override + public long getTimeStamp() throws ParsingException { + return 0; + } + + @Override + public long getViewCount() throws ParsingException { + return data.getInt("view_count"); + } + + @Override + public long getLikeCount() throws ParsingException { + return -1; + } + + @Override + public long getDislikeCount() throws ParsingException { + return -1; + } + + @Nonnull + @Override + public String getUploaderUrl() throws ParsingException { + return data.getString("conference_url"); + } + + @Nonnull + @Override + public String getUploaderName() throws ParsingException { + return data.getString("conference_url") + .replace("https://api.media.ccc.de/public/conferences/", ""); + } + + @Nonnull + @Override + public String getUploaderAvatarUrl() throws ParsingException { + return conferenceData.getString("logo_url"); + } + + @Nonnull + @Override + public String getDashMpdUrl() throws ParsingException { + return null; + } + + @Nonnull + @Override + public String getHlsUrl() throws ParsingException { + return null; + } + + @Override + public List getAudioStreams() throws IOException, ExtractionException { + final JsonArray recordings = data.getArray("recordings"); + final List audioStreams = new ArrayList<>(); + for(int i = 0; i < recordings.size(); i++) { + final JsonObject recording = recordings.getObject(i); + final String mimeType = recording.getString("mime_type"); + if(mimeType.startsWith("audio")) { + //first we need to resolve the actual video data from CDN + final MediaFormat mediaFormat; + if(mimeType.endsWith("opus")) { + mediaFormat = MediaFormat.OPUS; + } else if(mimeType.endsWith("mpeg")) { + mediaFormat = MediaFormat.MP3; + } else { + throw new ExtractionException("Unknown media format: " + mimeType); + } + + audioStreams.add(new AudioStream(recording.getString("recording_url"), mediaFormat, -1)); + } + } + return audioStreams; + } + + @Override + public List getVideoStreams() throws IOException, ExtractionException { + final JsonArray recordings = data.getArray("recordings"); + final List videoStreams = new ArrayList<>(); + for(int i = 0; i < recordings.size(); i++) { + final JsonObject recording = recordings.getObject(i); + final String mimeType = recording.getString("mime_type"); + if(mimeType.startsWith("video")) { + //first we need to resolve the actual video data from CDN + + final MediaFormat mediaFormat; + if(mimeType.endsWith("webm")) { + mediaFormat = MediaFormat.WEBM; + } else if(mimeType.endsWith("mp4")) { + mediaFormat = MediaFormat.MPEG_4; + } else { + throw new ExtractionException("Unknown media format: " + mimeType); + } + + + videoStreams.add(new VideoStream(recording.getString("recording_url"), + mediaFormat, + Integer.toString(recording.getInt("height")))); + } + } + return videoStreams; + } + + @Override + public List getVideoOnlyStreams() throws IOException, ExtractionException { + return null; + } + + @Nonnull + @Override + public List getSubtitlesDefault() throws IOException, ExtractionException { + return null; + } + + @Nonnull + @Override + public List getSubtitles(MediaFormat format) throws IOException, ExtractionException { + return null; + } + + @Override + public StreamType getStreamType() throws ParsingException { + return StreamType.VIDEO_STREAM; + } + + @Override + public StreamInfoItem getNextStream() throws IOException, ExtractionException { + return null; + } + + @Override + public StreamInfoItemsCollector getRelatedStreams() throws IOException, ExtractionException { + return null; + } + + @Override + public String getErrorMessage() { + return null; + } + + @Override + public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException { + try { + data = JsonParser.object().from( + downloader.download(getLinkHandler().getUrl())); + conferenceData = JsonParser.object() + .from(downloader.download(getUploaderUrl())); + } catch (JsonParserException jpe) { + throw new ExtractionException("Could not parse json returned by url: " + getLinkHandler().getUrl(), jpe); + } + + } + + @Nonnull + @Override + public String getName() throws ParsingException { + return data.getString("title"); + } + + @Override + public String getOriginalUrl() throws ParsingException { + return data.getString("frontend_link"); + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCSuggestionExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCSuggestionExtractor.java new file mode 100644 index 000000000..9c6b4742d --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCSuggestionExtractor.java @@ -0,0 +1,21 @@ +package org.schabi.newpipe.extractor.services.media_ccc.extractors; + +import org.schabi.newpipe.extractor.SuggestionExtractor; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.utils.Localization; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class MediaCCCSuggestionExtractor extends SuggestionExtractor { + + public MediaCCCSuggestionExtractor(int serviceId, Localization localization) { + super(serviceId, localization); + } + + @Override + public List suggestionList(String query) throws IOException, ExtractionException { + return new ArrayList<>(0); + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/infoItems/MediaCCCStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/infoItems/MediaCCCStreamInfoItemExtractor.java index adb57e886..99bd45adb 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/infoItems/MediaCCCStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/infoItems/MediaCCCStreamInfoItemExtractor.java @@ -62,6 +62,6 @@ public class MediaCCCStreamInfoItemExtractor implements StreamInfoItemExtractor @Override public String getThumbnailUrl() throws ParsingException { - return event.getString("thumbnails_url"); + return event.getString("thumb_url"); } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/linkHandler/MediaCCCConferenceLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/linkHandler/MediaCCCConferenceLinkHandlerFactory.java new file mode 100644 index 000000000..b1207a9a2 --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/linkHandler/MediaCCCConferenceLinkHandlerFactory.java @@ -0,0 +1,32 @@ +package org.schabi.newpipe.extractor.services.media_ccc.linkHandler; + +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory; +import org.schabi.newpipe.extractor.utils.Parser; + +import java.util.List; + +public class MediaCCCConferenceLinkHandlerFactory extends ListLinkHandlerFactory { + + @Override + public String getUrl(String id, List contentFilter, String sortFilter) throws ParsingException { + return "https://api.media.ccc.de/public/conferences/" + id; + } + + @Override + public String getId(String url) throws ParsingException { + if(url.startsWith("https://api.media.ccc.de/public/conferences/")) { + return url.replace("https://api.media.ccc.de/public/conferences/", ""); + } else if(url.startsWith("https://media.ccc.de/c/")) { + return Parser.matchGroup1("https://media.ccc.de/c/([^?#]*)", url); + } else { + throw new ParsingException("Could not get id from url: " + url); + } + } + + @Override + public boolean onAcceptUrl(String url) throws ParsingException { + return url.startsWith("https://api.media.ccc.de/public/conferences/") + || url.startsWith("https://media.ccc.de/c/"); + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/linkHandler/MediaCCCSearchQueryHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/linkHandler/MediaCCCSearchQueryHandlerFactory.java index f94c253e3..b9747dc8f 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/linkHandler/MediaCCCSearchQueryHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/linkHandler/MediaCCCSearchQueryHandlerFactory.java @@ -11,12 +11,12 @@ public class MediaCCCSearchQueryHandlerFactory extends SearchQueryHandlerFactory @Override public String[] getAvailableContentFilter() { - return null; + return new String[0]; } @Override public String[] getAvailableSortFilter() { - return null; + return new String[0]; } @Override diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/linkHandler/MediaCCCStreamLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/linkHandler/MediaCCCStreamLinkHandlerFactory.java new file mode 100644 index 000000000..fc6bf39e4 --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/linkHandler/MediaCCCStreamLinkHandlerFactory.java @@ -0,0 +1,27 @@ +package org.schabi.newpipe.extractor.services.media_ccc.linkHandler; + +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory; + +public class MediaCCCStreamLinkHandlerFactory extends LinkHandlerFactory { + + @Override + public String getId(String url) throws ParsingException { + if(url.startsWith("https://api.media.ccc.de/public/events/") && + !url.contains("?q=")) { + return url.replace("https://api.media.ccc.de/public/events/", ""); + } + throw new ParsingException("Could not get id from url: " + url); + } + + @Override + public String getUrl(String id) throws ParsingException { + return "https://api.media.ccc.de/public/events/" + id; + } + + @Override + public boolean onAcceptUrl(String url) throws ParsingException { + return url.startsWith("https://api.media.ccc.de/public/events/") && + !url.contains("?q="); + } +} diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelExtractor.java index 888432ef5..1942a04d1 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelExtractor.java @@ -127,9 +127,4 @@ public class SoundcloudChannelExtractor extends ChannelExtractor { return new InfoItemsPage<>(collector, nextPageUrl); } - - @Override - public String[] getDonationLinks() { - return new String[0]; - } } diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeChannelExtractor.java index b8a8c7bda..d48b57a6a 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeChannelExtractor.java @@ -189,29 +189,6 @@ public class YoutubeChannelExtractor extends ChannelExtractor { return new InfoItemsPage<>(collector, getNextPageUrlFromAjaxPage(ajaxJson, pageUrl)); } - @Override - public String[] getDonationLinks() throws ParsingException { - try { - ArrayList links = new ArrayList<>(); - Element linkHolder = doc.select("div[id=\"header-links\"]").first(); - if(linkHolder == null) { - // this occures if no links are embeded into the channel - return new String[0]; - } - for(Element a : linkHolder.select("a")) { - String link = a.attr("abs:href"); - if(DonationLinkHelper.getDonatoinServiceByLink(link) != DonationLinkHelper.DonationService.NO_DONATION) { - links.add(link); - } - } - String[] retLinks = new String[links.size()]; - retLinks = links.toArray(retLinks); - return retLinks; - } catch (Exception e) { - throw new ParsingException("Could not get donation links", e); - } - } - private String getNextPageUrlFromAjaxPage(final JsonObject ajaxJson, final String pageUrl) throws ParsingException { String loadMoreHtmlDataRaw = ajaxJson.getString("load_more_widget_html"); diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCConferenceExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCConferenceExtractorTest.java new file mode 100644 index 000000000..3ea6aaaae --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCConferenceExtractorTest.java @@ -0,0 +1,51 @@ +package org.schabi.newpipe.extractor.services.media_ccc; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.schabi.newpipe.Downloader; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.channel.ChannelExtractor; +import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCConferenceExtractor; +import org.schabi.newpipe.extractor.utils.Localization; + +import static junit.framework.TestCase.assertEquals; +import static org.schabi.newpipe.extractor.ServiceList.MediaCCC; + +/** + * Test {@link MediaCCCConferenceExtractor} + */ +public class MediaCCCConferenceExtractorTest { + private static ChannelExtractor extractor; + + @BeforeClass + public static void setUpClass() throws Exception { + NewPipe.init(Downloader.getInstance(), new Localization("en", "en_GB")); + extractor = MediaCCC.getChannelExtractor("https://api.media.ccc.de/public/conferences/froscon2017"); + extractor.fetchPage(); + } + + @Test + public void testName() throws Exception { + assertEquals("FrOSCon 2017", extractor.getName()); + } + + @Test + public void testGetUrl() throws Exception { + assertEquals("https://api.media.ccc.de/public/conferences/froscon2017", extractor.getUrl()); + } + + @Test + public void testGetOriginalUrl() throws Exception { + assertEquals("https://media.ccc.de/c/froscon2017", extractor.getOriginalUrl()); + } + + @Test + public void testGetThumbnailUrl() throws Exception { + assertEquals("https://static.media.ccc.de/media/events/froscon/2017/logo.png", extractor.getAvatarUrl()); + } + + @Test + public void testGetInitalPage() throws Exception { + assertEquals(97,extractor.getInitialPage().getItems().size()); + } +} diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCSearchExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCSearchExtractorTest.java index c88c0bca5..c08777a43 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCSearchExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCSearchExtractorTest.java @@ -10,7 +10,9 @@ import org.schabi.newpipe.extractor.search.SearchExtractor; import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCSearchExtractor; import org.schabi.newpipe.extractor.utils.Localization; +import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertTrue; +import static org.junit.Assert.assertFalse; import static org.schabi.newpipe.extractor.ServiceList.MediaCCC; /** @@ -33,4 +35,27 @@ public class MediaCCCSearchExtractorTest { assertTrue(Integer.toString(itemsPage.getItems().size()), itemsPage.getItems().size() >= 25); } + + @Test + public void testServiceId() throws Exception { + assertEquals(2, extractor.getServiceId()); + } + + @Test + public void testName() throws Exception { + assertFalse(itemsPage.getItems().get(0).getName(), itemsPage.getItems().get(0).getName().isEmpty()); + } + + @Test + public void testUrl() throws Exception { + assertTrue("Url should start with: https://api.media.ccc.de/public/events/", + itemsPage.getItems().get(0).getUrl().startsWith("https://api.media.ccc.de/public/events/")); + } + + @Test + public void testThumbnailUrl() throws Exception { + assertTrue(itemsPage.getItems().get(0).getThumbnailUrl(), + itemsPage.getItems().get(0).getThumbnailUrl().startsWith("https://static.media.ccc.de/media/") + && itemsPage.getItems().get(0).getThumbnailUrl().endsWith(".jpg")); + } } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCStreamExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCStreamExtractorTest.java new file mode 100644 index 000000000..8aba91535 --- /dev/null +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCStreamExtractorTest.java @@ -0,0 +1,83 @@ +package org.schabi.newpipe.extractor.services.media_ccc; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.schabi.newpipe.Downloader; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.services.BaseExtractorTest; +import org.schabi.newpipe.extractor.stream.StreamExtractor; +import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCStreamExtractor; +import org.schabi.newpipe.extractor.utils.Localization; + +import static junit.framework.TestCase.assertEquals; +import static org.schabi.newpipe.extractor.ServiceList.MediaCCC; + +/** + * Test {@link MediaCCCStreamExtractor} + */ +public class MediaCCCStreamExtractorTest implements BaseExtractorTest { + private static StreamExtractor extractor; + + @BeforeClass + public static void setUpClass() throws Exception { + NewPipe.init(Downloader.getInstance(), new Localization("GB", "en")); + + extractor = MediaCCC.getStreamExtractor("https://api.media.ccc.de/public/events/8afc16c2-d76a-53f6-85e4-90494665835d"); + extractor.fetchPage(); + } + + @Override + public void testServiceId() throws Exception { + assertEquals(2, extractor.getServiceId()); + } + + @Override + public void testName() throws Exception { + assertEquals("tmux - Warum ein schwarzes Fenster am Bildschirm reicht", extractor.getName()); + } + + @Override + public void testId() throws Exception { + assertEquals("", extractor.getId()); + } + + @Override + public void testUrl() throws Exception { + assertEquals("", extractor.getUrl()); + } + + @Override + public void testOriginalUrl() throws Exception { + assertEquals("", extractor.getOriginalUrl()); + } + + @Test + public void testThumbnail() throws Exception { + assertEquals("https://static.media.ccc.de/media/events/gpn/gpn18/105-hd.jpg", extractor.getThumbnailUrl()); + } + + @Test + public void testUploaderName() throws Exception { + assertEquals("gpn18", extractor.getUploaderName()); + } + + @Test + public void testUploaderUrl() throws Exception { + assertEquals("https://api.media.ccc.de/public/conferences/gpn18", extractor.getUploaderUrl()); + } + + @Test + public void testUploaderAvatarUrl() throws Exception { + assertEquals("https://static.media.ccc.de/media/events/gpn/gpn18/logo.png", extractor.getUploaderAvatarUrl()); + } + + @Test + public void testVideoStreams() throws Exception { + assertEquals(4, extractor.getVideoStreams().size()); + } + + @Test + public void testAudioStreams() throws Exception { + assertEquals(2, extractor.getAudioStreams().size()); + } +} diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractorTest.java index 622514416..efa8cbbea 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractorTest.java @@ -106,13 +106,6 @@ public class YoutubeChannelExtractorTest { public void testSubscriberCount() throws Exception { assertTrue("Wrong subscriber count", extractor.getSubscriberCount() >= 0); } - - @Test - public void testChannelDonation() throws Exception { - // this needs to be ignored since wed have to upgrade channel extractor to the new yt interface - // in order to make this work - assertTrue(extractor.getDonationLinks().length == 0); - } } // Youtube RED/Premium ad blocking test @@ -204,12 +197,6 @@ public class YoutubeChannelExtractorTest { assertTrue("Wrong subscriber count", extractor.getSubscriberCount() >= 0); } - @Test - public void testChannelDonation() throws Exception { - // this needs to be ignored since wed have to upgrade channel extractor to the new yt interface - // in order to make this work - assertTrue(extractor.getDonationLinks().length == 0); - } } public static class Kurzgesagt implements BaseChannelExtractorTest { @@ -312,11 +299,6 @@ public class YoutubeChannelExtractorTest { public void testSubscriberCount() throws Exception { assertTrue("Wrong subscriber count", extractor.getSubscriberCount() >= 5e6); } - - @Test - public void testChannelDonation() throws Exception { - assertTrue(extractor.getDonationLinks().length == 1); - } } public static class CaptainDisillusion implements BaseChannelExtractorTest { @@ -501,11 +483,6 @@ public class YoutubeChannelExtractorTest { public void testSubscriberCount() throws Exception { assertTrue("Wrong subscriber count", extractor.getSubscriberCount() >= 50); } - - @Test - public void testChannelDonation() throws Exception { - assertTrue(extractor.getDonationLinks().length == 0); - } } }; diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/search/YoutubeSearchExtractorDefaultTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/search/YoutubeSearchExtractorDefaultTest.java index 63cd349a1..f25b00197 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/search/YoutubeSearchExtractorDefaultTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/search/YoutubeSearchExtractorDefaultTest.java @@ -6,6 +6,7 @@ import org.schabi.newpipe.Downloader; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.channel.ChannelExtractor; import org.schabi.newpipe.extractor.channel.ChannelInfoItem; import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeSearchExtractor; import org.schabi.newpipe.extractor.stream.StreamInfoItem; @@ -63,13 +64,16 @@ public class YoutubeSearchExtractorDefaultTest extends YoutubeSearchExtractorBas @Test public void testResultList_FirstElement() { InfoItem firstInfoItem = itemsPage.getItems().get(0); - if(! (firstInfoItem instanceof ChannelInfoItem)) - firstInfoItem = itemsPage.getItems().get(1); + InfoItem secondInfoItem = itemsPage.getItems().get(1); + + InfoItem channelItem = firstInfoItem instanceof ChannelInfoItem ? firstInfoItem + : secondInfoItem; // The channel should be the first item - assertTrue(firstInfoItem instanceof ChannelInfoItem); - assertEquals("name", "PewDiePie", firstInfoItem.getName()); - assertEquals("url","https://www.youtube.com/user/PewDiePie", firstInfoItem.getUrl()); + assertTrue((firstInfoItem instanceof ChannelInfoItem) + || (secondInfoItem instanceof ChannelInfoItem)); + assertEquals("name", "PewDiePie", channelItem.getName()); + assertEquals("url","https://www.youtube.com/user/PewDiePie", channelItem.getUrl()); } @Test