Skip to content

Commit 1503459

Browse files
committed
add kiosk for conferences
1 parent cb51254 commit 1503459

10 files changed

Lines changed: 224 additions & 6 deletions

File tree

extractor/src/main/java/org/schabi/newpipe/extractor/kiosk/KioskExtractor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
2121
*/
2222

23+
import org.schabi.newpipe.extractor.InfoItem;
2324
import org.schabi.newpipe.extractor.ListExtractor;
2425
import org.schabi.newpipe.extractor.StreamingService;
2526
import org.schabi.newpipe.extractor.exceptions.ParsingException;
@@ -29,7 +30,7 @@
2930

3031
import javax.annotation.Nonnull;
3132

32-
public abstract class KioskExtractor extends ListExtractor<StreamInfoItem> {
33+
public abstract class KioskExtractor<T extends InfoItem> extends ListExtractor<T> {
3334
private final String id;
3435

3536
public KioskExtractor(StreamingService streamingService,

extractor/src/main/java/org/schabi/newpipe/extractor/kiosk/KioskList.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ public void setDefaultKiosk(String kioskType) {
4949
defaultKiosk = kioskType;
5050
}
5151

52+
public KioskExtractor getDefaultKioskExtractor()
53+
throws ExtractionException, IOException {
54+
return getDefaultKioskExtractor("");
55+
}
56+
5257
public KioskExtractor getDefaultKioskExtractor(String nextPageUrl)
5358
throws ExtractionException, IOException {
5459
return getDefaultKioskExtractor(nextPageUrl, NewPipe.getPreferredLocalization());

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,25 @@
44
import org.schabi.newpipe.extractor.SuggestionExtractor;
55
import org.schabi.newpipe.extractor.channel.ChannelExtractor;
66
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
7+
import org.schabi.newpipe.extractor.kiosk.KioskExtractor;
78
import org.schabi.newpipe.extractor.kiosk.KioskList;
89
import org.schabi.newpipe.extractor.linkhandler.*;
910
import org.schabi.newpipe.extractor.playlist.PlaylistExtractor;
1011
import org.schabi.newpipe.extractor.search.SearchExtractor;
1112
import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCConferenceExtractor;
13+
import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCConferenceKiosk;
1214
import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCSearchExtractor;
1315
import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCStreamExtractor;
1416
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCConferenceLinkHandlerFactory;
17+
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCConferencesListLinkHandlerFactory;
1518
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCSearchQueryHandlerFactory;
1619
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCStreamLinkHandlerFactory;
1720
import org.schabi.newpipe.extractor.stream.StreamExtractor;
1821
import org.schabi.newpipe.extractor.subscription.SubscriptionExtractor;
1922
import org.schabi.newpipe.extractor.utils.Localization;
2023

24+
import java.io.IOException;
25+
2126
import static java.util.Arrays.asList;
2227
import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.*;
2328

@@ -77,7 +82,17 @@ public KioskList getKioskList() throws ExtractionException {
7782

7883
// add kiosks here e.g.:
7984
try {
80-
// Add kiosk here
85+
list.addKioskEntry(new KioskList.KioskExtractorFactory() {
86+
@Override
87+
public KioskExtractor createNewKiosk(StreamingService streamingService,
88+
String url,
89+
String kioskId,
90+
Localization localization) throws ExtractionException, IOException {
91+
return new MediaCCCConferenceKiosk(MediaCCCService.this,
92+
new MediaCCCConferencesListLinkHandlerFactory().fromUrl(url), kioskId, localization);
93+
}
94+
}, new MediaCCCConferencesListLinkHandlerFactory(), "conferences");
95+
list.setDefaultKiosk("conferences");
8196
} catch (Exception e) {
8297
throw new ExtractionException(e);
8398
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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.Downloader;
8+
import org.schabi.newpipe.extractor.StreamingService;
9+
import org.schabi.newpipe.extractor.channel.ChannelInfoItem;
10+
import org.schabi.newpipe.extractor.channel.ChannelInfoItemsCollector;
11+
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
12+
import org.schabi.newpipe.extractor.exceptions.ParsingException;
13+
import org.schabi.newpipe.extractor.kiosk.KioskExtractor;
14+
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
15+
import org.schabi.newpipe.extractor.services.media_ccc.extractors.infoItems.MediaCCCConferenceInfoItemExtractor;
16+
import org.schabi.newpipe.extractor.utils.Localization;
17+
18+
import javax.annotation.Nonnull;
19+
import java.io.IOException;
20+
21+
public class MediaCCCConferenceKiosk extends KioskExtractor<ChannelInfoItem> {
22+
23+
private JsonObject doc;
24+
25+
public MediaCCCConferenceKiosk(StreamingService streamingService,
26+
ListLinkHandler linkHandler,
27+
String kioskId,
28+
Localization localization) {
29+
super(streamingService, linkHandler, kioskId, localization);
30+
}
31+
32+
@Nonnull
33+
@Override
34+
public InfoItemsPage<ChannelInfoItem> getInitialPage() throws IOException, ExtractionException {
35+
JsonArray conferences = doc.getArray("conferences");
36+
ChannelInfoItemsCollector collector = new ChannelInfoItemsCollector(getServiceId());
37+
for(int i = 0; i < conferences.size(); i++) {
38+
collector.commit(new MediaCCCConferenceInfoItemExtractor(conferences.getObject(i)));
39+
}
40+
41+
return new InfoItemsPage<>(collector, "");
42+
}
43+
44+
@Override
45+
public String getNextPageUrl() throws IOException, ExtractionException {
46+
return "";
47+
}
48+
49+
@Override
50+
public InfoItemsPage<ChannelInfoItem> getPage(String pageUrl) throws IOException, ExtractionException {
51+
return InfoItemsPage.emptyPage();
52+
}
53+
54+
@Override
55+
public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException {
56+
String site = downloader.download(getLinkHandler().getUrl());
57+
try {
58+
doc = JsonParser.object().from(site);
59+
} catch (JsonParserException jpe) {
60+
throw new ExtractionException("Could not parse json.", jpe);
61+
}
62+
}
63+
64+
@Nonnull
65+
@Override
66+
public String getName() throws ParsingException {
67+
return doc.getString("Conferences");
68+
}
69+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
public class MediaCCCSearchExtractor extends SearchExtractor {
2222

23-
JsonObject doc;
23+
private JsonObject doc;
2424

2525
public MediaCCCSearchExtractor(StreamingService service, SearchQueryHandler linkHandler, Localization localization) {
2626
super(service, linkHandler, localization);
@@ -50,7 +50,7 @@ public String getNextPageUrl() throws IOException, ExtractionException {
5050

5151
@Override
5252
public InfoItemsPage<InfoItem> getPage(String pageUrl) throws IOException, ExtractionException {
53-
return null;
53+
return InfoItemsPage.emptyPage();
5454
}
5555

5656
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.schabi.newpipe.extractor.services.media_ccc.extractors.infoItems;
2+
3+
import com.grack.nanojson.JsonObject;
4+
import org.schabi.newpipe.extractor.channel.ChannelInfoItemExtractor;
5+
import org.schabi.newpipe.extractor.exceptions.ParsingException;
6+
7+
public class MediaCCCConferenceInfoItemExtractor implements ChannelInfoItemExtractor {
8+
9+
JsonObject conference;
10+
11+
public MediaCCCConferenceInfoItemExtractor(JsonObject conference) {
12+
this.conference = conference;
13+
}
14+
15+
@Override
16+
public String getDescription() throws ParsingException {
17+
return "";
18+
}
19+
20+
@Override
21+
public long getSubscriberCount() throws ParsingException {
22+
return -1;
23+
}
24+
25+
@Override
26+
public long getStreamCount() throws ParsingException {
27+
return -1;
28+
}
29+
30+
@Override
31+
public String getName() throws ParsingException {
32+
return conference.getString("title");
33+
}
34+
35+
@Override
36+
public String getUrl() throws ParsingException {
37+
return conference.getString("url");
38+
}
39+
40+
@Override
41+
public String getThumbnailUrl() throws ParsingException {
42+
return conference.getString("logo_url");
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.schabi.newpipe.extractor.services.media_ccc.linkHandler;
2+
3+
import org.schabi.newpipe.extractor.exceptions.ParsingException;
4+
import org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory;
5+
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
6+
7+
import java.util.List;
8+
9+
public class MediaCCCConferencesListLinkHandlerFactory extends ListLinkHandlerFactory {
10+
@Override
11+
public String getId(String url) throws ParsingException {
12+
return "conferences";
13+
}
14+
15+
@Override
16+
public String getUrl(String id, List<String> contentFilter, String sortFilter) throws ParsingException {
17+
return "https://api.media.ccc.de/public/conferences";
18+
}
19+
20+
@Override
21+
public boolean onAcceptUrl(String url) throws ParsingException {
22+
return url.equals("https://media.ccc.de/b/conferences")
23+
|| url.equals("https://api.media.ccc.de/public/conferences");
24+
}
25+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import java.util.Arrays;
1515
import java.util.List;
1616

17-
public class SoundcloudChartsExtractor extends KioskExtractor {
17+
public class SoundcloudChartsExtractor extends KioskExtractor<StreamInfoItem> {
1818
private StreamInfoItemsCollector collector = null;
1919
private String nextPageUrl = null;
2020

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeTrendingExtractor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
import javax.annotation.Nonnull;
3838
import java.io.IOException;
3939

40-
public class YoutubeTrendingExtractor extends KioskExtractor {
40+
public class YoutubeTrendingExtractor extends KioskExtractor<StreamInfoItem> {
4141

4242
private Document doc;
4343

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.schabi.newpipe.extractor.services.media_ccc;
2+
import org.junit.BeforeClass;
3+
import org.junit.Test;
4+
import org.schabi.newpipe.Downloader;
5+
import org.schabi.newpipe.extractor.InfoItem;
6+
import org.schabi.newpipe.extractor.NewPipe;
7+
import org.schabi.newpipe.extractor.channel.ChannelInfoItem;
8+
import org.schabi.newpipe.extractor.kiosk.KioskExtractor;
9+
import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCConferenceKiosk;
10+
import org.schabi.newpipe.extractor.utils.Localization;
11+
12+
import java.util.List;
13+
14+
import static org.schabi.newpipe.extractor.ServiceList.MediaCCC;
15+
import static org.junit.Assert.assertTrue;
16+
17+
18+
/**
19+
* Test {@link MediaCCCConferenceKiosk}
20+
*/
21+
public class MediaCCCConferenceListExtractorTest {
22+
23+
private static KioskExtractor extractor;
24+
25+
@BeforeClass
26+
public static void setUpClass() throws Exception {
27+
NewPipe.init(Downloader.getInstance(), new Localization("en", "en_GB"));
28+
extractor = MediaCCC.getKioskList().getDefaultKioskExtractor();
29+
extractor.fetchPage();
30+
}
31+
32+
@Test
33+
public void getConferencesListTest() throws Exception {
34+
assertTrue("returned list was to small",
35+
extractor.getInitialPage().getItems().size() >= 174);
36+
}
37+
38+
@Test
39+
public void conferenceTypeTest() throws Exception {
40+
assertTrue(contains(extractor.getInitialPage().getItems(), "FrOSCon 2016"));
41+
assertTrue(contains(extractor.getInitialPage().getItems(), "ChaosWest @ 35c3"));
42+
assertTrue(contains(extractor.getInitialPage().getItems(), "CTreffOS chaOStalks"));
43+
assertTrue(contains(extractor.getInitialPage().getItems(), "Datenspuren 2015"));
44+
assertTrue(contains(extractor.getInitialPage().getItems(), "Chaos Singularity 2017"));
45+
assertTrue(contains(extractor.getInitialPage().getItems(), "SIGINT10"));
46+
assertTrue(contains(extractor.getInitialPage().getItems(), "Vintage Computing Festival Berlin 2015"));
47+
assertTrue(contains(extractor.getInitialPage().getItems(), "FIfFKon 2015"));
48+
assertTrue(contains(extractor.getInitialPage().getItems(), "33C3: trailers"));
49+
assertTrue(contains(extractor.getInitialPage().getItems(), "Blinkenlights"));
50+
}
51+
52+
private boolean contains(List<InfoItem> itemList, String name) {
53+
for(InfoItem item : itemList) {
54+
if(item.getName().equals(name))
55+
return true;
56+
}
57+
return false;
58+
}
59+
}

0 commit comments

Comments
 (0)