Skip to content

Commit a6e57cd

Browse files
committed
channel list extractor
1 parent 05e90c0 commit a6e57cd

8 files changed

Lines changed: 165 additions & 1 deletion

File tree

extractor/src/main/java/org/schabi/newpipe/extractor/StreamingService.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.schabi.newpipe.extractor;
22

33
import org.schabi.newpipe.extractor.channel.ChannelExtractor;
4+
import org.schabi.newpipe.extractor.channel.list.ChannelListExtractor;
45
import org.schabi.newpipe.extractor.channel.tabs.ChannelTabExtractor;
56
import org.schabi.newpipe.extractor.comments.CommentsExtractor;
67
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
@@ -87,7 +88,7 @@ public enum LinkType {
8788
NONE,
8889
STREAM,
8990
CHANNEL,
90-
PLAYLIST
91+
PLAYLIST,
9192
}
9293

9394
private final int serviceId;
@@ -222,6 +223,17 @@ public abstract ChannelExtractor getChannelExtractor(ListLinkHandler linkHandler
222223
public abstract ChannelTabExtractor getChannelTabExtractor(ListLinkHandler linkHandler)
223224
throws ExtractionException;
224225

226+
/**
227+
* Must create a new instance of a ChannelListExtractor implementation.
228+
* @param linkHandler is pointing to the channel which should be handled by this new instance.
229+
* @return a new ChannelListExtractor
230+
* <p>
231+
* In services which there's no other way to retrieve them, null should be returned.
232+
*
233+
*/
234+
public abstract ChannelListExtractor getChannelListExtractor(ListLinkHandler linkHandler)
235+
throws ExtractionException;
236+
225237
/**
226238
* Must crete a new instance of a PlaylistExtractor implementation.
227239
* @param linkHandler is pointing to the playlist which should be handled by this new instance.
@@ -294,6 +306,20 @@ public ChannelTabExtractor getChannelTabExtractorFromIdAndBaseUrl(final String i
294306
id, Collections.singletonList(tab), "", baseUrl));
295307
}
296308

309+
public ChannelListExtractor getChannelListExtractor(final String url)
310+
throws ExtractionException {
311+
return getChannelListExtractor(getChannelTabLHFactory().fromUrl(url));
312+
}
313+
314+
public ChannelListExtractor getChannelListExtractor(final String id,
315+
final List<String> contentFilter,
316+
final String baseUrl)
317+
throws ExtractionException {
318+
return getChannelListExtractor(getChannelTabLHFactory().fromQuery(
319+
id, contentFilter, "", baseUrl));
320+
}
321+
322+
297323
public PlaylistExtractor getPlaylistExtractor(final String url) throws ExtractionException {
298324
return getPlaylistExtractor(getPlaylistLHFactory().fromUrl(url));
299325
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.schabi.newpipe.extractor.channel.list;
2+
3+
import org.schabi.newpipe.extractor.ListExtractor;
4+
import org.schabi.newpipe.extractor.StreamingService;
5+
import org.schabi.newpipe.extractor.channel.ChannelInfoItem;
6+
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
7+
8+
public abstract class ChannelListExtractor extends ListExtractor<ChannelInfoItem> {
9+
public ChannelListExtractor(final StreamingService service,
10+
final ListLinkHandler linkHandler) {
11+
super(service, linkHandler);
12+
}
13+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package org.schabi.newpipe.extractor.channel.list;
2+
3+
import org.schabi.newpipe.extractor.ListExtractor;
4+
import org.schabi.newpipe.extractor.ListInfo;
5+
import org.schabi.newpipe.extractor.NewPipe;
6+
import org.schabi.newpipe.extractor.Page;
7+
import org.schabi.newpipe.extractor.StreamingService;
8+
import org.schabi.newpipe.extractor.channel.ChannelInfoItem;
9+
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
10+
import org.schabi.newpipe.extractor.exceptions.ParsingException;
11+
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
12+
import org.schabi.newpipe.extractor.utils.ExtractorHelper;
13+
14+
import java.io.IOException;
15+
16+
import javax.annotation.Nonnull;
17+
18+
public class ChannelListInfo extends ListInfo<ChannelInfoItem> {
19+
public ChannelListInfo(final int serviceId,
20+
@Nonnull final ListLinkHandler linkHandler,
21+
final String name) {
22+
super(serviceId, linkHandler, name);
23+
}
24+
25+
public static ChannelListInfo getInfo(final String url)
26+
throws IOException, ExtractionException {
27+
return getInfo(NewPipe.getServiceByUrl(url), url);
28+
}
29+
30+
public static ChannelListInfo getInfo(final StreamingService service, final String url)
31+
throws IOException, ExtractionException {
32+
final ChannelListExtractor extractor = service.getChannelListExtractor(url);
33+
extractor.fetchPage();
34+
return getInfo(extractor);
35+
}
36+
37+
/**
38+
* Get a {@link ChannelListInfo} instance from the given service and link handler.
39+
*
40+
* @param service streaming service
41+
* @param linkHandler Channel list handler (from {@link ChannelListInfo})
42+
* @return the extracted {@link ChannelListInfo}
43+
*/
44+
@Nonnull
45+
public static ChannelListInfo getInfo(@Nonnull final StreamingService service,
46+
@Nonnull final ListLinkHandler linkHandler)
47+
throws ExtractionException, IOException {
48+
final ChannelListExtractor extractor = service.getChannelListExtractor(linkHandler);
49+
extractor.fetchPage();
50+
51+
return getInfo(extractor);
52+
}
53+
54+
/**
55+
* Get a {@link ChannelListInfo} instance from a {@link ChannelListExtractor}.
56+
*
57+
* @param extractor an extractor where {@code fetchPage()} was already got called on
58+
* @return the extracted {@link ChannelListInfo}
59+
*/
60+
@Nonnull
61+
public static ChannelListInfo getInfo(@Nonnull final ChannelListExtractor extractor)
62+
throws ParsingException {
63+
final ChannelListInfo info =
64+
new ChannelListInfo(extractor.getServiceId(),
65+
extractor.getLinkHandler(),
66+
extractor.getName());
67+
try {
68+
69+
info.setOriginalUrl(extractor.getOriginalUrl());
70+
} catch (final Exception e) {
71+
info.addError(e);
72+
}
73+
74+
final ListExtractor.InfoItemsPage<ChannelInfoItem> page
75+
= ExtractorHelper.getItemsPageOrLogError(info, extractor);
76+
info.setRelatedItems(page.getItems());
77+
info.setNextPage(page.getNextPage());
78+
79+
return info;
80+
}
81+
82+
public static ListExtractor.InfoItemsPage<ChannelInfoItem> getMoreItems(
83+
@Nonnull final StreamingService service,
84+
@Nonnull final ListLinkHandler linkHandler,
85+
@Nonnull final Page page) throws ExtractionException, IOException {
86+
return service.getChannelListExtractor(linkHandler).getPage(page);
87+
}
88+
89+
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import org.schabi.newpipe.extractor.StreamingService;
1414
import org.schabi.newpipe.extractor.channel.ChannelExtractor;
15+
import org.schabi.newpipe.extractor.channel.list.ChannelListExtractor;
1516
import org.schabi.newpipe.extractor.channel.tabs.ChannelTabExtractor;
1617
import org.schabi.newpipe.extractor.comments.CommentsExtractor;
1718
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
@@ -154,6 +155,12 @@ public ChannelTabExtractor getChannelTabExtractor(final ListLinkHandler linkHand
154155
}
155156
}
156157

158+
@Override
159+
public ChannelListExtractor getChannelListExtractor(final ListLinkHandler linkHandler)
160+
throws ExtractionException {
161+
return null;
162+
}
163+
157164
@Override
158165
public PlaylistExtractor getPlaylistExtractor(final ListLinkHandler linkHandler) {
159166
return new BandcampPlaylistExtractor(this, linkHandler);

extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import org.schabi.newpipe.extractor.StreamingService;
88
import org.schabi.newpipe.extractor.channel.ChannelExtractor;
9+
import org.schabi.newpipe.extractor.channel.list.ChannelListExtractor;
910
import org.schabi.newpipe.extractor.channel.tabs.ChannelTabExtractor;
1011
import org.schabi.newpipe.extractor.comments.CommentsExtractor;
1112
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
@@ -100,6 +101,12 @@ public ChannelTabExtractor getChannelTabExtractor(final ListLinkHandler linkHand
100101
}
101102
}
102103

104+
@Override
105+
public ChannelListExtractor getChannelListExtractor(final ListLinkHandler linkHandler)
106+
throws ExtractionException {
107+
return null;
108+
}
109+
103110
@Override
104111
public PlaylistExtractor getPlaylistExtractor(final ListLinkHandler linkHandler) {
105112
return null;

extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/PeertubeService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import org.schabi.newpipe.extractor.StreamingService;
88
import org.schabi.newpipe.extractor.channel.ChannelExtractor;
9+
import org.schabi.newpipe.extractor.channel.list.ChannelListExtractor;
910
import org.schabi.newpipe.extractor.channel.tabs.ChannelTabExtractor;
1011
import org.schabi.newpipe.extractor.comments.CommentsExtractor;
1112
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
@@ -117,6 +118,12 @@ public ChannelTabExtractor getChannelTabExtractor(final ListLinkHandler linkHand
117118
return new PeertubeChannelTabExtractor(this, linkHandler);
118119
}
119120

121+
@Override
122+
public ChannelListExtractor getChannelListExtractor(final ListLinkHandler linkHandler)
123+
throws ExtractionException {
124+
return null;
125+
}
126+
120127
@Override
121128
public PlaylistExtractor getPlaylistExtractor(final ListLinkHandler linkHandler)
122129
throws ExtractionException {

extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import org.schabi.newpipe.extractor.StreamingService;
88
import org.schabi.newpipe.extractor.channel.ChannelExtractor;
9+
import org.schabi.newpipe.extractor.channel.list.ChannelListExtractor;
910
import org.schabi.newpipe.extractor.channel.tabs.ChannelTabExtractor;
1011
import org.schabi.newpipe.extractor.comments.CommentsExtractor;
1112
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
@@ -99,6 +100,12 @@ public ChannelTabExtractor getChannelTabExtractor(final ListLinkHandler linkHand
99100
return new SoundcloudChannelTabExtractor(this, linkHandler);
100101
}
101102

103+
@Override
104+
public ChannelListExtractor getChannelListExtractor(final ListLinkHandler linkHandler)
105+
throws ExtractionException {
106+
return null;
107+
}
108+
102109
@Override
103110
public PlaylistExtractor getPlaylistExtractor(final ListLinkHandler linkHandler) {
104111
return new SoundcloudPlaylistExtractor(this, linkHandler);

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeService.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import org.schabi.newpipe.extractor.StreamingService;
1010
import org.schabi.newpipe.extractor.channel.ChannelExtractor;
11+
import org.schabi.newpipe.extractor.channel.list.ChannelListExtractor;
1112
import org.schabi.newpipe.extractor.channel.tabs.ChannelTabExtractor;
1213
import org.schabi.newpipe.extractor.comments.CommentsExtractor;
1314
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
@@ -25,6 +26,7 @@
2526
import org.schabi.newpipe.extractor.playlist.PlaylistExtractor;
2627
import org.schabi.newpipe.extractor.search.SearchExtractor;
2728
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeChannelExtractor;
29+
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeFeaturedChannelListExtractor;
2830
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeChannelTabExtractor;
2931
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeCommentsExtractor;
3032
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeFeedExtractor;
@@ -136,6 +138,12 @@ public ChannelTabExtractor getChannelTabExtractor(final ListLinkHandler linkHand
136138
}
137139
}
138140

141+
@Override
142+
public ChannelListExtractor getChannelListExtractor(final ListLinkHandler linkHandler)
143+
throws ExtractionException {
144+
return new YoutubeFeaturedChannelListExtractor(this, linkHandler);
145+
}
146+
139147
@Override
140148
public PlaylistExtractor getPlaylistExtractor(final ListLinkHandler linkHandler) {
141149
if (YoutubeParsingHelper.isYoutubeMixId(linkHandler.getId())) {

0 commit comments

Comments
 (0)