Skip to content

Commit 1e8474b

Browse files
AudricVTheta-DevStypox
committed
[PeerTube] Add tabs support for accounts and video channels
Support of channels and videos has been added for accounts and support of videos and playlists has been added for video channels. The following changes have been also done: - collectStreamsFrom method in PeertubeParsingHelper has been renamed to collectItemsFrom; - PeertubeChannelInfoItemExtractor.getStreamCount method has been fixed due to ChannelExtractor's new inheritance; - the declaration of the UnsupportedOperationException exception thrown has been added to the service's LinkHandlers; - a channel tab LinkHandlerFactory has been added, PeertubeChannelTabLinkHandlerFactory; - all service's LinkHandlers are now using properly the singleton pattern. Co-authored-by: ThetaDev <t.testboy@gmail.com> Co-authored-by: Stypox <stypox@pm.me>
1 parent 652c2c8 commit 1e8474b

27 files changed

Lines changed: 440 additions & 221 deletions

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

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@
66

77
import org.schabi.newpipe.extractor.StreamingService;
88
import org.schabi.newpipe.extractor.channel.ChannelExtractor;
9+
import org.schabi.newpipe.extractor.channel.tabs.ChannelTabExtractor;
910
import org.schabi.newpipe.extractor.comments.CommentsExtractor;
1011
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
1112
import org.schabi.newpipe.extractor.kiosk.KioskList;
1213
import org.schabi.newpipe.extractor.linkhandler.LinkHandler;
1314
import org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory;
1415
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
1516
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
17+
import org.schabi.newpipe.extractor.linkhandler.ReadyChannelTabListLinkHandler;
1618
import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandler;
1719
import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandlerFactory;
1820
import org.schabi.newpipe.extractor.playlist.PlaylistExtractor;
@@ -27,8 +29,6 @@
2729
import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCStreamExtractor;
2830
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCConferenceLinkHandlerFactory;
2931
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCConferencesListLinkHandlerFactory;
30-
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCLiveListLinkHandlerFactory;
31-
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCRecentListLinkHandlerFactory;
3232
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCSearchQueryHandlerFactory;
3333
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCStreamLinkHandlerFactory;
3434
import org.schabi.newpipe.extractor.stream.StreamExtractor;
@@ -47,12 +47,17 @@ public SearchExtractor getSearchExtractor(final SearchQueryHandler query) {
4747

4848
@Override
4949
public LinkHandlerFactory getStreamLHFactory() {
50-
return new MediaCCCStreamLinkHandlerFactory();
50+
return MediaCCCStreamLinkHandlerFactory.getInstance();
5151
}
5252

5353
@Override
5454
public ListLinkHandlerFactory getChannelLHFactory() {
55-
return new MediaCCCConferenceLinkHandlerFactory();
55+
return MediaCCCConferenceLinkHandlerFactory.getInstance();
56+
}
57+
58+
@Override
59+
public ListLinkHandlerFactory getChannelTabLHFactory() {
60+
return null;
5661
}
5762

5863
@Override
@@ -62,7 +67,7 @@ public ListLinkHandlerFactory getPlaylistLHFactory() {
6267

6368
@Override
6469
public SearchQueryHandlerFactory getSearchQHFactory() {
65-
return new MediaCCCSearchQueryHandlerFactory();
70+
return MediaCCCSearchQueryHandlerFactory.getInstance();
6671
}
6772

6873
@Override
@@ -78,6 +83,22 @@ public ChannelExtractor getChannelExtractor(final ListLinkHandler linkHandler) {
7883
return new MediaCCCConferenceExtractor(this, linkHandler);
7984
}
8085

86+
@Override
87+
public ChannelTabExtractor getChannelTabExtractor(final ListLinkHandler linkHandler) {
88+
if (linkHandler instanceof ReadyChannelTabListLinkHandler) {
89+
return ((ReadyChannelTabListLinkHandler) linkHandler).getChannelTabExtractor(this);
90+
}
91+
92+
/*
93+
Channel tab extractors are only supported in conferences and should only come from a
94+
ReadyChannelTabListLinkHandler instance with a ChannelTabExtractorBuilder instance of the
95+
conferences extractor
96+
97+
If that's not the case, return null in this case, so no channel tabs support
98+
*/
99+
return null;
100+
}
101+
81102
@Override
82103
public PlaylistExtractor getPlaylistExtractor(final ListLinkHandler linkHandler) {
83104
return null;
@@ -91,36 +112,37 @@ public SuggestionExtractor getSuggestionExtractor() {
91112
@Override
92113
public KioskList getKioskList() throws ExtractionException {
93114
final KioskList list = new KioskList(this);
115+
final ListLinkHandlerFactory h = MediaCCCConferencesListLinkHandlerFactory.getInstance();
94116

95117
// add kiosks here e.g.:
96118
try {
97119
list.addKioskEntry(
98120
(streamingService, url, kioskId) -> new MediaCCCConferenceKiosk(
99121
MediaCCCService.this,
100-
new MediaCCCConferencesListLinkHandlerFactory().fromUrl(url),
122+
h.fromUrl(url),
101123
kioskId
102124
),
103-
new MediaCCCConferencesListLinkHandlerFactory(),
125+
h,
104126
MediaCCCConferenceKiosk.KIOSK_ID
105127
);
106128

107129
list.addKioskEntry(
108130
(streamingService, url, kioskId) -> new MediaCCCRecentKiosk(
109131
MediaCCCService.this,
110-
new MediaCCCRecentListLinkHandlerFactory().fromUrl(url),
132+
h.fromUrl(url),
111133
kioskId
112134
),
113-
new MediaCCCRecentListLinkHandlerFactory(),
135+
h,
114136
MediaCCCRecentKiosk.KIOSK_ID
115137
);
116138

117139
list.addKioskEntry(
118140
(streamingService, url, kioskId) -> new MediaCCCLiveStreamKiosk(
119141
MediaCCCService.this,
120-
new MediaCCCLiveListLinkHandlerFactory().fromUrl(url),
142+
h.fromUrl(url),
121143
kioskId
122144
),
123-
new MediaCCCLiveListLinkHandlerFactory(),
145+
h,
124146
MediaCCCLiveStreamKiosk.KIOSK_ID
125147
);
126148

extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCConferenceExtractor.java

Lines changed: 64 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,29 @@
11
package org.schabi.newpipe.extractor.services.media_ccc.extractors;
22

3-
import com.grack.nanojson.JsonArray;
43
import com.grack.nanojson.JsonObject;
54
import com.grack.nanojson.JsonParser;
65
import com.grack.nanojson.JsonParserException;
6+
7+
import org.schabi.newpipe.extractor.InfoItem;
8+
import org.schabi.newpipe.extractor.ListExtractor;
9+
import org.schabi.newpipe.extractor.MultiInfoItemsCollector;
710
import org.schabi.newpipe.extractor.Page;
811
import org.schabi.newpipe.extractor.StreamingService;
912
import org.schabi.newpipe.extractor.channel.ChannelExtractor;
13+
import org.schabi.newpipe.extractor.channel.tabs.ChannelTabExtractor;
14+
import org.schabi.newpipe.extractor.channel.tabs.ChannelTabs;
1015
import org.schabi.newpipe.extractor.downloader.Downloader;
1116
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
1217
import org.schabi.newpipe.extractor.exceptions.ParsingException;
1318
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
19+
import org.schabi.newpipe.extractor.linkhandler.ReadyChannelTabListLinkHandler;
1420
import org.schabi.newpipe.extractor.services.media_ccc.extractors.infoItems.MediaCCCStreamInfoItemExtractor;
1521
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCConferenceLinkHandlerFactory;
16-
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
17-
import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector;
1822

19-
import javax.annotation.Nonnull;
2023
import java.io.IOException;
24+
import java.util.List;
25+
26+
import javax.annotation.Nonnull;
2127

2228
public class MediaCCCConferenceExtractor extends ChannelExtractor {
2329
private JsonObject conferenceData;
@@ -74,18 +80,9 @@ public boolean isVerified() {
7480

7581
@Nonnull
7682
@Override
77-
public InfoItemsPage<StreamInfoItem> getInitialPage() {
78-
final StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId());
79-
final JsonArray events = conferenceData.getArray("events");
80-
for (int i = 0; i < events.size(); i++) {
81-
collector.commit(new MediaCCCStreamInfoItemExtractor(events.getObject(i)));
82-
}
83-
return new InfoItemsPage<>(collector, null);
84-
}
85-
86-
@Override
87-
public InfoItemsPage<StreamInfoItem> getPage(final Page page) {
88-
return InfoItemsPage.emptyPage();
83+
public List<ListLinkHandler> getTabs() throws ParsingException {
84+
return List.of(new ReadyChannelTabListLinkHandler(getUrl(), getId(),
85+
ChannelTabs.VIDEOS, new VideosTabExtractorBuilder(conferenceData)));
8986
}
9087

9188
@Override
@@ -105,4 +102,55 @@ public void onFetchPage(@Nonnull final Downloader downloader)
105102
public String getName() throws ParsingException {
106103
return conferenceData.getString("title");
107104
}
105+
106+
private static final class VideosTabExtractorBuilder
107+
implements ReadyChannelTabListLinkHandler.ChannelTabExtractorBuilder {
108+
109+
private final JsonObject conferenceData;
110+
111+
VideosTabExtractorBuilder(final JsonObject conferenceData) {
112+
this.conferenceData = conferenceData;
113+
}
114+
115+
@Nonnull
116+
@Override
117+
public ChannelTabExtractor build(@Nonnull final StreamingService service,
118+
@Nonnull final ListLinkHandler linkHandler) {
119+
return new VideosChannelTabExtractor(service, linkHandler, conferenceData);
120+
}
121+
}
122+
123+
private static final class VideosChannelTabExtractor extends ChannelTabExtractor {
124+
private final JsonObject conferenceData;
125+
126+
VideosChannelTabExtractor(final StreamingService service,
127+
final ListLinkHandler linkHandler,
128+
final JsonObject conferenceData) {
129+
super(service, linkHandler);
130+
this.conferenceData = conferenceData;
131+
}
132+
133+
@Override
134+
public void onFetchPage(@Nonnull final Downloader downloader) {
135+
// Nothing to do here, as data was already fetched
136+
}
137+
138+
@Nonnull
139+
@Override
140+
public ListExtractor.InfoItemsPage<InfoItem> getInitialPage() {
141+
final MultiInfoItemsCollector collector =
142+
new MultiInfoItemsCollector(getServiceId());
143+
conferenceData.getArray("events")
144+
.stream()
145+
.filter(JsonObject.class::isInstance)
146+
.map(JsonObject.class::cast)
147+
.forEach(event -> collector.commit(new MediaCCCStreamInfoItemExtractor(event)));
148+
return new InfoItemsPage<>(collector, null);
149+
}
150+
151+
@Override
152+
public InfoItemsPage<InfoItem> getPage(final Page page) {
153+
return InfoItemsPage.emptyPage();
154+
}
155+
}
108156
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCRecentKioskExtractor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public String getUploaderName() throws ParsingException {
6565

6666
@Override
6767
public String getUploaderUrl() throws ParsingException {
68-
return new MediaCCCConferenceLinkHandlerFactory()
68+
return MediaCCCConferenceLinkHandlerFactory.getInstance()
6969
.fromUrl(event.getString("conference_url")) // API URL
7070
.getUrl(); // web URL
7171
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/extractors/MediaCCCSearchExtractor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ public MediaCCCSearchExtractor(final StreamingService service,
3838
super(service, linkHandler);
3939
try {
4040
conferenceKiosk = new MediaCCCConferenceKiosk(service,
41-
new MediaCCCConferencesListLinkHandlerFactory().fromId("conferences"),
41+
MediaCCCConferencesListLinkHandlerFactory.getInstance()
42+
.fromId("conferences"),
4243
"conferences");
4344
} catch (final Exception e) {
4445
e.printStackTrace();

extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/linkHandler/MediaCCCConferenceLinkHandlerFactory.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,35 @@
66

77
import java.util.List;
88

9-
public class MediaCCCConferenceLinkHandlerFactory extends ListLinkHandlerFactory {
9+
public final class MediaCCCConferenceLinkHandlerFactory extends ListLinkHandlerFactory {
10+
11+
private static final MediaCCCConferenceLinkHandlerFactory INSTANCE
12+
= new MediaCCCConferenceLinkHandlerFactory();
13+
1014
public static final String CONFERENCE_API_ENDPOINT
1115
= "https://api.media.ccc.de/public/conferences/";
1216
public static final String CONFERENCE_PATH = "https://media.ccc.de/c/";
1317
private static final String ID_PATTERN
1418
= "(?:(?:(?:api\\.)?media\\.ccc\\.de/public/conferences/)"
1519
+ "|(?:media\\.ccc\\.de/[bc]/))([^/?&#]*)";
1620

21+
private MediaCCCConferenceLinkHandlerFactory() {
22+
}
23+
24+
public static MediaCCCConferenceLinkHandlerFactory getInstance() {
25+
return INSTANCE;
26+
}
27+
1728
@Override
1829
public String getUrl(final String id,
1930
final List<String> contentFilter,
20-
final String sortFilter) throws ParsingException {
31+
final String sortFilter)
32+
throws ParsingException, UnsupportedOperationException {
2133
return CONFERENCE_PATH + id;
2234
}
2335

2436
@Override
25-
public String getId(final String url) throws ParsingException {
37+
public String getId(final String url) throws ParsingException, UnsupportedOperationException {
2638
return Parser.matchGroup1(ID_PATTERN, url);
2739
}
2840

extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/linkHandler/MediaCCCConferencesListLinkHandlerFactory.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,28 @@
55

66
import java.util.List;
77

8-
public class MediaCCCConferencesListLinkHandlerFactory extends ListLinkHandlerFactory {
8+
public final class MediaCCCConferencesListLinkHandlerFactory extends ListLinkHandlerFactory {
9+
10+
private static final MediaCCCConferencesListLinkHandlerFactory INSTANCE =
11+
new MediaCCCConferencesListLinkHandlerFactory();
12+
13+
private MediaCCCConferencesListLinkHandlerFactory() {
14+
}
15+
16+
public static MediaCCCConferencesListLinkHandlerFactory getInstance() {
17+
return INSTANCE;
18+
}
19+
920
@Override
10-
public String getId(final String url) throws ParsingException {
21+
public String getId(final String url) throws ParsingException, UnsupportedOperationException {
1122
return "conferences";
1223
}
1324

1425
@Override
15-
public String getUrl(final String id, final List<String> contentFilter,
16-
final String sortFilter) throws ParsingException {
26+
public String getUrl(final String id,
27+
final List<String> contentFilter,
28+
final String sortFilter)
29+
throws ParsingException, UnsupportedOperationException {
1730
return "https://media.ccc.de/public/conferences";
1831
}
1932

extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/linkHandler/MediaCCCLiveListLinkHandlerFactory.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,22 @@
66
import java.util.List;
77
import java.util.regex.Pattern;
88

9-
public class MediaCCCLiveListLinkHandlerFactory extends ListLinkHandlerFactory {
9+
public final class MediaCCCLiveListLinkHandlerFactory extends ListLinkHandlerFactory {
10+
11+
private static final MediaCCCLiveListLinkHandlerFactory INSTANCE =
12+
new MediaCCCLiveListLinkHandlerFactory();
13+
1014
private static final String STREAM_PATTERN = "^(?:https?://)?media\\.ccc\\.de/live$";
1115

16+
private MediaCCCLiveListLinkHandlerFactory() {
17+
}
18+
19+
public static MediaCCCLiveListLinkHandlerFactory getInstance() {
20+
return INSTANCE;
21+
}
22+
1223
@Override
13-
public String getId(final String url) throws ParsingException {
24+
public String getId(final String url) throws ParsingException, UnsupportedOperationException {
1425
return "live";
1526
}
1627

@@ -22,7 +33,8 @@ public boolean onAcceptUrl(final String url) throws ParsingException {
2233
@Override
2334
public String getUrl(final String id,
2435
final List<String> contentFilter,
25-
final String sortFilter) throws ParsingException {
36+
final String sortFilter)
37+
throws ParsingException, UnsupportedOperationException {
2638
// FIXME: wrong URL; should be https://streaming.media.ccc.de/{conference_slug}/{room_slug}
2739
return "https://media.ccc.de/live";
2840
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/linkHandler/MediaCCCLiveStreamLinkHandlerFactory.java

Lines changed: 0 additions & 32 deletions
This file was deleted.

0 commit comments

Comments
 (0)