Skip to content

Commit ed6ae32

Browse files
committed
[media.ccc.de] Add "recent" kiosk
1 parent b283769 commit ed6ae32

5 files changed

Lines changed: 180 additions & 10 deletions

File tree

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

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,14 @@
1414
import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandlerFactory;
1515
import org.schabi.newpipe.extractor.playlist.PlaylistExtractor;
1616
import org.schabi.newpipe.extractor.search.SearchExtractor;
17-
import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCConferenceExtractor;
18-
import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCConferenceKiosk;
19-
import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCSearchExtractor;
20-
import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCStreamExtractor;
21-
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCConferenceLinkHandlerFactory;
22-
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCConferencesListLinkHandlerFactory;
23-
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCSearchQueryHandlerFactory;
24-
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCStreamLinkHandlerFactory;
17+
import org.schabi.newpipe.extractor.services.media_ccc.extractors.*;
18+
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.*;
2519
import org.schabi.newpipe.extractor.stream.StreamExtractor;
2620
import org.schabi.newpipe.extractor.subscription.SubscriptionExtractor;
2721
import org.schabi.newpipe.extractor.suggestion.SuggestionExtractor;
2822

23+
import java.io.IOException;
24+
2925
import static java.util.Arrays.asList;
3026
import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.AUDIO;
3127
import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.VIDEO;
@@ -95,7 +91,18 @@ public KioskExtractor createNewKiosk(final StreamingService streamingService,
9591
new MediaCCCConferencesListLinkHandlerFactory().fromUrl(url), kioskId);
9692
}
9793
}, new MediaCCCConferencesListLinkHandlerFactory(), "conferences");
98-
list.setDefaultKiosk("conferences");
94+
95+
list.addKioskEntry(new KioskList.KioskExtractorFactory() {
96+
@Override
97+
public KioskExtractor createNewKiosk(final StreamingService streamingService,
98+
final String url, final String kioskId)
99+
throws ExtractionException {
100+
return new MediaCCCRecentKiosk(MediaCCCService.this,
101+
new MediaCCCRecentListLinkHandlerFactory().fromUrl(url), kioskId);
102+
}
103+
}, new MediaCCCRecentListLinkHandlerFactory(), "recent");
104+
105+
list.setDefaultKiosk("recent");
99106
} catch (Exception e) {
100107
throw new ExtractionException(e);
101108
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.schabi.newpipe.extractor.services.media_ccc.extractors;
2+
3+
import com.grack.nanojson.JsonArray;
4+
import com.grack.nanojson.JsonObject;
5+
import com.grack.nanojson.JsonParser;
6+
import com.grack.nanojson.JsonParserException;
7+
import org.schabi.newpipe.extractor.Page;
8+
import org.schabi.newpipe.extractor.StreamingService;
9+
import org.schabi.newpipe.extractor.downloader.Downloader;
10+
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
11+
import org.schabi.newpipe.extractor.exceptions.ParsingException;
12+
import org.schabi.newpipe.extractor.kiosk.KioskExtractor;
13+
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
14+
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
15+
import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector;
16+
17+
import javax.annotation.Nonnull;
18+
import java.io.IOException;
19+
20+
public class MediaCCCRecentKiosk extends KioskExtractor<StreamInfoItem> {
21+
22+
private JsonObject doc;
23+
24+
public MediaCCCRecentKiosk(StreamingService streamingService, ListLinkHandler linkHandler, String kioskId) {
25+
super(streamingService, linkHandler, kioskId);
26+
}
27+
28+
@Override
29+
public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException {
30+
final String site = downloader.get("https://api.media.ccc.de/public/events/recent",
31+
getExtractorLocalization()).responseBody();
32+
try {
33+
doc = JsonParser.object().from(site);
34+
} catch (JsonParserException jpe) {
35+
throw new ExtractionException("Could not parse json.", jpe);
36+
}
37+
}
38+
39+
@Nonnull
40+
@Override
41+
public InfoItemsPage<StreamInfoItem> getInitialPage() throws IOException, ExtractionException {
42+
final JsonArray events = doc.getArray("events");
43+
StreamInfoItemsCollector collector = new StreamInfoItemsCollector(getServiceId());
44+
for (int i = 0; i < events.size(); i++) {
45+
collector.commit(new MediaCCCRecentKioskExtractor(events.getObject(i)));
46+
}
47+
return new InfoItemsPage<>(collector, null);
48+
}
49+
50+
@Override
51+
public InfoItemsPage<StreamInfoItem> getPage(Page page) throws IOException, ExtractionException {
52+
return InfoItemsPage.emptyPage();
53+
}
54+
55+
@Nonnull
56+
@Override
57+
public String getName() throws ParsingException {
58+
return "recent";
59+
}
60+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package org.schabi.newpipe.extractor.services.media_ccc.extractors;
2+
3+
import com.grack.nanojson.JsonObject;
4+
import org.schabi.newpipe.extractor.exceptions.ParsingException;
5+
import org.schabi.newpipe.extractor.localization.DateWrapper;
6+
import org.schabi.newpipe.extractor.stream.StreamInfoItemExtractor;
7+
import org.schabi.newpipe.extractor.stream.StreamType;
8+
9+
import javax.annotation.Nullable;
10+
import java.time.ZonedDateTime;
11+
import java.time.format.DateTimeFormatter;
12+
13+
public class MediaCCCRecentKioskExtractor implements StreamInfoItemExtractor {
14+
15+
private final JsonObject event;
16+
17+
public MediaCCCRecentKioskExtractor(final JsonObject event) {
18+
this.event = event;
19+
}
20+
21+
@Override
22+
public String getName() throws ParsingException {
23+
return event.getString("title");
24+
}
25+
26+
@Override
27+
public String getUrl() throws ParsingException {
28+
return event.getString("frontend_link");
29+
}
30+
31+
@Override
32+
public String getThumbnailUrl() throws ParsingException {
33+
return event.getString("thumb_url");
34+
}
35+
36+
@Override
37+
public StreamType getStreamType() throws ParsingException {
38+
return StreamType.VIDEO_STREAM;
39+
}
40+
41+
@Override
42+
public boolean isAd() throws ParsingException {
43+
return false;
44+
}
45+
46+
@Override
47+
public long getDuration() throws ParsingException {
48+
return event.getInt("duration");
49+
}
50+
51+
@Override
52+
public long getViewCount() throws ParsingException {
53+
return event.getInt("view_count");
54+
}
55+
56+
@Override
57+
public String getUploaderName() throws ParsingException {
58+
return "";
59+
}
60+
61+
@Override
62+
public String getUploaderUrl() throws ParsingException {
63+
return event.getString("conference_url");
64+
}
65+
66+
@Nullable
67+
@Override
68+
public String getTextualUploadDate() throws ParsingException {
69+
return event.getString("date");
70+
}
71+
72+
@Nullable
73+
@Override
74+
public DateWrapper getUploadDate() throws ParsingException {
75+
final ZonedDateTime zonedDateTime = ZonedDateTime.parse(event.getString("date"),
76+
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSzzzz"));
77+
return new DateWrapper(zonedDateTime.toOffsetDateTime(), false);
78+
}
79+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import org.schabi.newpipe.extractor.exceptions.ParsingException;
88

99
public class MediaCCCConferenceInfoItemExtractor implements ChannelInfoItemExtractor {
10-
private JsonObject conference;
10+
private final JsonObject conference;
1111

1212
public MediaCCCConferenceInfoItemExtractor(final JsonObject conference) {
1313
this.conference = conference;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.schabi.newpipe.extractor.services.media_ccc.linkHandler;
2+
3+
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
4+
5+
import java.util.List;
6+
import java.util.regex.Pattern;
7+
8+
public class MediaCCCRecentListLinkHandlerFactory extends ListLinkHandlerFactory {
9+
@Override
10+
public String getId(String url) {
11+
return "recent";
12+
}
13+
14+
@Override
15+
public boolean onAcceptUrl(String url) {
16+
final String pattern = "^(https?://)?media.ccc.de/recent/?$";
17+
return Pattern.matches(pattern, url);
18+
}
19+
20+
@Override
21+
public String getUrl(String id, List<String> contentFilter, String sortFilter) {
22+
return "https://media.ccc.de/recent";
23+
}
24+
}

0 commit comments

Comments
 (0)