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 6d529d6b..3d3b9b1b 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 @@ -37,4 +37,7 @@ 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 getSubChannelName() throws ParsingException; + public abstract String getSubChannelUrl() throws ParsingException; + public abstract String getSubChannelAvatarUrl() 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 0fc44063..87457530 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 @@ -94,16 +94,61 @@ public class ChannelInfo extends ListInfo { info.addError(e); } + try { + info.setSubChannelName(extractor.getSubChannelName()); + } catch (Exception e) { + info.addError(e); + } + + try { + info.setSubChannelUrl(extractor.getSubChannelUrl()); + } catch (Exception e) { + info.addError(e); + } + + try { + info.setSubChannelAvatarUrl(extractor.getSubChannelAvatarUrl()); + } catch (Exception e) { + info.addError(e); + } + return info; } private String avatarUrl; + private String subChannelName; + private String subChannelUrl; + private String subChannelAvatarUrl; private String bannerUrl; private String feedUrl; private long subscriberCount = -1; private String description; private String[] donationLinks; + public String getSubChannelName() { + return subChannelName; + } + + public void setSubChannelName(String subChannelName) { + this.subChannelName = subChannelName; + } + + public String getSubChannelUrl() { + return subChannelUrl; + } + + public void setSubChannelUrl(String subChannelUrl) { + this.subChannelUrl = subChannelUrl; + } + + public String getSubChannelAvatarUrl() { + return subChannelAvatarUrl; + } + + public void setSubChannelAvatarUrl(String subChannelAvatarUrl) { + this.subChannelAvatarUrl = subChannelAvatarUrl; + } + public String getAvatarUrl() { return avatarUrl; } 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 index 4cd21c06..4ec6bb64 100644 --- 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 @@ -52,6 +52,21 @@ public class MediaCCCConferenceExtractor extends ChannelExtractor { return null; } + @Override + public String getSubChannelName() throws ParsingException { + return ""; + } + + @Override + public String getSubChannelUrl() throws ParsingException { + return ""; + } + + @Override + public String getSubChannelAvatarUrl() throws ParsingException { + return ""; + } + @Nonnull @Override public InfoItemsPage getInitialPage() { 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 index 894a0f0d..93772608 100644 --- 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 @@ -112,7 +112,25 @@ public class MediaCCCStreamExtractor extends StreamExtractor { @Nonnull @Override - public String getDashMpdUrl() { + public String getSubChannelUrl() throws ParsingException { + return ""; + } + + @Nonnull + @Override + public String getSubChannelName() throws ParsingException { + return ""; + } + + @Nonnull + @Override + public String getSubChannelAvatarUrl() throws ParsingException { + return ""; + } + + @Nonnull + @Override + public String getDashMpdUrl() throws ParsingException { return ""; } 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 81cb0afa..fd82e430 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 @@ -75,6 +75,21 @@ public class PeertubeAccountExtractor extends ChannelExtractor { } } + @Override + public String getSubChannelName() throws ParsingException { + return ""; + } + + @Override + public String getSubChannelUrl() throws ParsingException { + return ""; + } + + @Override + public String getSubChannelAvatarUrl() throws ParsingException { + return ""; + } + @Override public InfoItemsPage getInitialPage() throws IOException, ExtractionException { super.fetchPage(); 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 dc27be80..ff0ff97d 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 @@ -75,6 +75,27 @@ public class PeertubeChannelExtractor extends ChannelExtractor { } } + @Override + public String getSubChannelName() throws ParsingException { + return JsonUtils.getString(json, "ownerAccount.name"); + } + + @Override + public String getSubChannelUrl() throws ParsingException { + return JsonUtils.getString(json, "ownerAccount.url"); + } + + @Override + public String getSubChannelAvatarUrl() throws ParsingException { + String value; + try { + value = JsonUtils.getString(json, "ownerAccount.avatar.path"); + } catch (Exception e) { + value = "/client/assets/images/default-avatar.png"; + } + return baseUrl + value; + } + @Override public InfoItemsPage getInitialPage() throws IOException, ExtractionException { super.fetchPage(); 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 3cf65154..88ef0243 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 @@ -147,6 +147,29 @@ public class PeertubeStreamExtractor extends StreamExtractor { return baseUrl + value; } + @Override + public String getSubChannelUrl() throws ParsingException { + return JsonUtils.getString(json, "channel.url"); + } + + @Nonnull + @Override + public String getSubChannelName() throws ParsingException { + return JsonUtils.getString(json, "channel.displayName"); + } + + @Nonnull + @Override + public String getSubChannelAvatarUrl() throws ParsingException { + String value; + try { + value = JsonUtils.getString(json, "channel.avatar.path"); + } catch (Exception e) { + value = "/client/assets/images/default-avatar.png"; + } + return baseUrl + value; + } + @Override public String getDashMpdUrl() throws ParsingException { return ""; diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudChannelExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudChannelExtractor.java index a1d258b5..13afc4c7 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudChannelExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudChannelExtractor.java @@ -83,6 +83,21 @@ public class SoundcloudChannelExtractor extends ChannelExtractor { return user.getString("description", EMPTY_STRING); } + @Override + public String getSubChannelName() throws ParsingException { + return ""; + } + + @Override + public String getSubChannelUrl() throws ParsingException { + return ""; + } + + @Override + public String getSubChannelAvatarUrl() throws ParsingException { + return ""; + } + @Nonnull @Override public InfoItemsPage getInitialPage() throws ExtractionException { diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudStreamExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudStreamExtractor.java index 1c4c9cf1..beee2c3e 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudStreamExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/extractors/SoundcloudStreamExtractor.java @@ -142,6 +142,24 @@ public class SoundcloudStreamExtractor extends StreamExtractor { return SoundcloudParsingHelper.getAvatarUrl(track); } + @Nonnull + @Override + public String getSubChannelUrl() throws ParsingException { + return ""; + } + + @Nonnull + @Override + public String getSubChannelName() throws ParsingException { + return ""; + } + + @Nonnull + @Override + public String getSubChannelAvatarUrl() throws ParsingException { + return ""; + } + @Nonnull @Override public String getDashMpdUrl() { 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 38d57f95..7b614bff 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 @@ -212,6 +212,21 @@ public class YoutubeChannelExtractor extends ChannelExtractor { } } + @Override + public String getSubChannelName() throws ParsingException { + return ""; + } + + @Override + public String getSubChannelUrl() throws ParsingException { + return ""; + } + + @Override + public String getSubChannelAvatarUrl() throws ParsingException { + return ""; + } + @Nonnull @Override public InfoItemsPage getInitialPage() throws ExtractionException { diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java index 331c9000..22dc78c5 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java @@ -352,6 +352,24 @@ public class YoutubeStreamExtractor extends StreamExtractor { } } + @Nonnull + @Override + public String getSubChannelUrl() throws ParsingException { + return ""; + } + + @Nonnull + @Override + public String getSubChannelName() throws ParsingException { + return ""; + } + + @Nonnull + @Override + public String getSubChannelAvatarUrl() throws ParsingException { + return ""; + } + @Nonnull @Override public String getDashMpdUrl() throws ParsingException { diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamExtractor.java index 78a5fbf3..2cc64ab7 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamExtractor.java @@ -23,6 +23,7 @@ package org.schabi.newpipe.extractor.stream; import org.schabi.newpipe.extractor.Extractor; import org.schabi.newpipe.extractor.MediaFormat; 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.LinkHandler; @@ -148,7 +149,7 @@ public abstract class StreamExtractor extends Extractor { /** * The Url to the page of the creator/uploader of the stream. This must not be a homepage, * but the page offered by the service the extractor handles. This url will be handled by the - * ChannelExtractor, + * {@link ChannelExtractor}, * so be sure to implement that one before you return a value here, otherwise NewPipe will crash if one selects * this url. * @@ -178,6 +179,39 @@ public abstract class StreamExtractor extends Extractor { @Nonnull public abstract String getUploaderAvatarUrl() throws ParsingException; + /** + * The Url to the page of the sub-channel of the stream. This must not be a homepage, + * but the page offered by the service the extractor handles. This url will be handled by the + * {@link ChannelExtractor}, + * so be sure to implement that one before you return a value here, otherwise NewPipe will crash if one selects + * this url. + * + * @return the url to the page of the sub-channel of the stream or an empty String + * @throws ParsingException + */ + @Nonnull + public abstract String getSubChannelUrl() throws ParsingException; + + /** + * The name of the sub-channel of the stream. + * If the name is not available you can simply return an empty string. + * + * @return the name of the sub-channel of the stream or an empty String + * @throws ParsingException + */ + @Nonnull + public abstract String getSubChannelName() throws ParsingException; + + /** + * The url to the image file/profile picture/avatar of the sub-channel of the stream. + * If the url is not available you can return an empty String. + * + * @return The url of the image file of the sub-channel or an empty String + * @throws ParsingException + */ + @Nonnull + public abstract String getSubChannelAvatarUrl() throws ParsingException; + /** * Get the dash mpd url. If you don't know what a dash MPD is you can read about it * here. diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfo.java b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfo.java index 0e5ff080..aa1001b4 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfo.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfo.java @@ -223,6 +223,28 @@ public class StreamInfo extends Info { } catch (Exception e) { streamInfo.addError(e); } + try { + streamInfo.setUploaderAvatarUrl(extractor.getUploaderAvatarUrl()); + } catch (Exception e) { + streamInfo.addError(e); + } + + try { + streamInfo.setSubChannelName(extractor.getSubChannelName()); + } catch (Exception e) { + streamInfo.addError(e); + } + try { + streamInfo.setSubChannelUrl(extractor.getSubChannelUrl()); + } catch (Exception e) { + streamInfo.addError(e); + } + try { + streamInfo.setSubChannelAvatarUrl(extractor.getSubChannelAvatarUrl()); + } catch (Exception e) { + streamInfo.addError(e); + } + try { streamInfo.setDescription(extractor.getDescription()); } catch (Exception e) { @@ -243,11 +265,6 @@ public class StreamInfo extends Info { } catch (Exception e) { streamInfo.addError(e); } - try { - streamInfo.setUploaderAvatarUrl(extractor.getUploaderAvatarUrl()); - } catch (Exception e) { - streamInfo.addError(e); - } try { streamInfo.setStartPosition(extractor.getTimeStamp()); } catch (Exception e) { @@ -332,6 +349,10 @@ public class StreamInfo extends Info { private String uploaderUrl = ""; private String uploaderAvatarUrl = ""; + private String subChannelName = ""; + private String subChannelUrl = ""; + private String subChannelAvatarUrl = ""; + private List videoStreams = new ArrayList<>(); private List audioStreams = new ArrayList<>(); private List videoOnlyStreams = new ArrayList<>(); @@ -486,6 +507,30 @@ public class StreamInfo extends Info { this.uploaderAvatarUrl = uploaderAvatarUrl; } + public String getSubChannelName() { + return subChannelName; + } + + public void setSubChannelName(String subChannelName) { + this.subChannelName = subChannelName; + } + + public String getSubChannelUrl() { + return subChannelUrl; + } + + public void setSubChannelUrl(String subChannelUrl) { + this.subChannelUrl = subChannelUrl; + } + + public String getSubChannelAvatarUrl() { + return subChannelAvatarUrl; + } + + public void setSubChannelAvatarUrl(String subChannelAvatarUrl) { + this.subChannelAvatarUrl = subChannelAvatarUrl; + } + public List getVideoStreams() { return videoStreams; } diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/PeertubeChannelExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/PeertubeChannelExtractorTest.java index 9dc4b013..77d0623e 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/PeertubeChannelExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/PeertubeChannelExtractorTest.java @@ -84,6 +84,16 @@ public class PeertubeChannelExtractorTest { assertNotNull(extractor.getDescription()); } + @Test + public void testSubChannelName() throws ParsingException { + assertEquals("libux", extractor.getSubChannelName()); + } + + @Test + public void testSubChannelUrl() throws ParsingException { + assertEquals("https://peertube.mastodon.host/accounts/libux", extractor.getSubChannelUrl()); + } + @Test public void testAvatarUrl() throws ParsingException { assertIsSecureUrl(extractor.getAvatarUrl()); @@ -181,6 +191,16 @@ public class PeertubeChannelExtractorTest { assertNotNull(extractor.getDescription()); } + @Test + public void testSubChannelName() throws ParsingException { + assertEquals("booteille", extractor.getSubChannelName()); + } + + @Test + public void testSubChannelUrl() throws ParsingException { + assertEquals("https://peertube.mastodon.host/accounts/booteille", extractor.getSubChannelUrl()); + } + @Test public void testAvatarUrl() throws ParsingException { assertIsSecureUrl(extractor.getAvatarUrl()); diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/PeertubeStreamExtractorDefaultTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/PeertubeStreamExtractorDefaultTest.java index f5202f39..dd4c9c44 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/PeertubeStreamExtractorDefaultTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/peertube/PeertubeStreamExtractorDefaultTest.java @@ -87,6 +87,33 @@ public class PeertubeStreamExtractorDefaultTest { assertEquals("Framasoft", extractor.getUploaderName()); } + @Test + public void testGetUploaderUrl() throws ParsingException { + assertIsSecureUrl(extractor.getUploaderUrl()); + assertEquals("https://framatube.org/api/v1/accounts/framasoft@framatube.org", extractor.getUploaderUrl()); + } + + @Test + public void testGetUploaderAvatarUrl() throws ParsingException { + assertIsSecureUrl(extractor.getUploaderAvatarUrl()); + } + + @Test + public void testGetSubChannelName() throws ParsingException { + assertEquals("Les vidéos de Framasoft", extractor.getSubChannelName()); + } + + @Test + public void testGetSubChannelUrl() throws ParsingException { + assertIsSecureUrl(extractor.getSubChannelUrl()); + assertEquals("https://framatube.org/video-channels/bf54d359-cfad-4935-9d45-9d6be93f63e8", extractor.getSubChannelUrl()); + } + + @Test + public void testGetSubChannelAvatarUrl() throws ParsingException { + assertIsSecureUrl(extractor.getSubChannelAvatarUrl()); + } + @Test public void testGetLength() throws ParsingException { assertEquals(113, extractor.getLength()); @@ -98,22 +125,11 @@ public class PeertubeStreamExtractorDefaultTest { extractor.getViewCount() > 10); } - @Test - public void testGetUploaderUrl() throws ParsingException { - assertIsSecureUrl(extractor.getUploaderUrl()); - assertEquals("https://framatube.org/api/v1/accounts/framasoft@framatube.org", extractor.getUploaderUrl()); - } - @Test public void testGetThumbnailUrl() throws ParsingException { assertIsSecureUrl(extractor.getThumbnailUrl()); } - @Test - public void testGetUploaderAvatarUrl() throws ParsingException { - assertIsSecureUrl(extractor.getUploaderAvatarUrl()); - } - @Test public void testGetVideoStreams() throws IOException, ExtractionException { assertFalse(extractor.getVideoStreams().isEmpty());