Skip to content

Commit ef57634

Browse files
committed
implement searchextractor for mediaccc
1 parent 8114ce6 commit ef57634

7 files changed

Lines changed: 292 additions & 1 deletion

File tree

extractor/.attach_pid31246

Whitespace-only changes.

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

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

3+
import org.schabi.newpipe.extractor.services.media_ccc.MediaCCCService;
34
import org.schabi.newpipe.extractor.services.soundcloud.SoundcloudService;
45
import org.schabi.newpipe.extractor.services.youtube.YoutubeService;
56

@@ -36,6 +37,7 @@ private ServiceList() {
3637

3738
public static final YoutubeService YouTube;
3839
public static final SoundcloudService SoundCloud;
40+
public static final MediaCCCService MediaCCC;
3941

4042
/**
4143
* When creating a new service, put this service in the end of this list,
@@ -44,7 +46,8 @@ private ServiceList() {
4446
private static final List<StreamingService> SERVICES = unmodifiableList(
4547
asList(
4648
YouTube = new YoutubeService(0),
47-
SoundCloud = new SoundcloudService(1)
49+
SoundCloud = new SoundcloudService(1),
50+
MediaCCC = new MediaCCCService(2)
4851
));
4952

5053
/**
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package org.schabi.newpipe.extractor.services.media_ccc;
2+
3+
import org.schabi.newpipe.extractor.StreamingService;
4+
import org.schabi.newpipe.extractor.SuggestionExtractor;
5+
import org.schabi.newpipe.extractor.channel.ChannelExtractor;
6+
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
7+
import org.schabi.newpipe.extractor.kiosk.KioskList;
8+
import org.schabi.newpipe.extractor.linkhandler.*;
9+
import org.schabi.newpipe.extractor.playlist.PlaylistExtractor;
10+
import org.schabi.newpipe.extractor.search.SearchExtractor;
11+
import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCSearchExtractor;
12+
import org.schabi.newpipe.extractor.services.media_ccc.linkHandler.MediaCCCSearchQueryHandlerFactory;
13+
import org.schabi.newpipe.extractor.stream.StreamExtractor;
14+
import org.schabi.newpipe.extractor.subscription.SubscriptionExtractor;
15+
import org.schabi.newpipe.extractor.utils.Localization;
16+
17+
import static java.util.Arrays.asList;
18+
import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.*;
19+
20+
public class MediaCCCService extends StreamingService {
21+
public MediaCCCService(int id) {
22+
super(id, "Media.CCC", asList(AUDIO, VIDEO));
23+
}
24+
25+
@Override
26+
public SearchExtractor getSearchExtractor(SearchQueryHandler query, Localization localization) {
27+
return new MediaCCCSearchExtractor(this, query, localization);
28+
}
29+
30+
@Override
31+
public LinkHandlerFactory getStreamLHFactory() {
32+
return null;
33+
}
34+
35+
@Override
36+
public ListLinkHandlerFactory getChannelLHFactory() {
37+
return null;
38+
}
39+
40+
@Override
41+
public ListLinkHandlerFactory getPlaylistLHFactory() {
42+
return null;
43+
}
44+
45+
@Override
46+
public SearchQueryHandlerFactory getSearchQHFactory() {
47+
return new MediaCCCSearchQueryHandlerFactory();
48+
}
49+
50+
@Override
51+
public StreamExtractor getStreamExtractor(LinkHandler linkHandler, Localization localization) {
52+
return null;
53+
}
54+
55+
@Override
56+
public ChannelExtractor getChannelExtractor(ListLinkHandler linkHandler, Localization localization) {
57+
return null;
58+
}
59+
60+
@Override
61+
public PlaylistExtractor getPlaylistExtractor(ListLinkHandler linkHandler, Localization localization) {
62+
return null;
63+
}
64+
65+
@Override
66+
public SuggestionExtractor getSuggestionExtractor(Localization localization) {
67+
return null;
68+
}
69+
70+
@Override
71+
public KioskList getKioskList() throws ExtractionException {
72+
KioskList list = new KioskList(getServiceId());
73+
74+
// add kiosks here e.g.:
75+
try {
76+
// Add kiosk here
77+
} catch (Exception e) {
78+
throw new ExtractionException(e);
79+
}
80+
81+
return list;
82+
}
83+
84+
@Override
85+
public SubscriptionExtractor getSubscriptionExtractor() {
86+
return null;
87+
}
88+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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.InfoItem;
9+
import org.schabi.newpipe.extractor.InfoItemsCollector;
10+
import org.schabi.newpipe.extractor.StreamingService;
11+
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
12+
import org.schabi.newpipe.extractor.exceptions.ParsingException;
13+
import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandler;
14+
import org.schabi.newpipe.extractor.search.SearchExtractor;
15+
import org.schabi.newpipe.extractor.services.media_ccc.extractors.infoItems.MediaCCCStreamInfoItemExtractor;
16+
import org.schabi.newpipe.extractor.utils.Localization;
17+
18+
import javax.annotation.Nonnull;
19+
import java.io.IOException;
20+
21+
public class MediaCCCSearchExtractor extends SearchExtractor {
22+
23+
JsonObject doc;
24+
25+
public MediaCCCSearchExtractor(StreamingService service, SearchQueryHandler linkHandler, Localization localization) {
26+
super(service, linkHandler, localization);
27+
}
28+
29+
@Override
30+
public String getSearchSuggestion() throws ParsingException {
31+
return null;
32+
}
33+
34+
@Nonnull
35+
@Override
36+
public InfoItemsPage<InfoItem> getInitialPage() throws IOException, ExtractionException {
37+
InfoItemsCollector searchItems = getInfoItemSearchCollector();
38+
JsonArray events = doc.getArray("events");
39+
for(int i = 0; i < events.size(); i++) {
40+
searchItems.commit(new MediaCCCStreamInfoItemExtractor(
41+
events.getObject(i)));
42+
}
43+
return new InfoItemsPage<>(searchItems, null);
44+
}
45+
46+
@Override
47+
public String getNextPageUrl() throws IOException, ExtractionException {
48+
return null;
49+
}
50+
51+
@Override
52+
public InfoItemsPage<InfoItem> getPage(String pageUrl) throws IOException, ExtractionException {
53+
return null;
54+
}
55+
56+
@Override
57+
public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException {
58+
final String site;
59+
final String url = getUrl();
60+
site = downloader.download(url, getLocalization());
61+
try {
62+
doc = JsonParser.object().from(site);
63+
} catch (JsonParserException jpe) {
64+
throw new ExtractionException("Could not parse json.", jpe);
65+
}
66+
}
67+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package org.schabi.newpipe.extractor.services.media_ccc.extractors.infoItems;
2+
3+
import com.grack.nanojson.JsonObject;
4+
import org.schabi.newpipe.extractor.exceptions.ParsingException;
5+
import org.schabi.newpipe.extractor.stream.StreamInfoItemExtractor;
6+
import org.schabi.newpipe.extractor.stream.StreamType;
7+
8+
public class MediaCCCStreamInfoItemExtractor implements StreamInfoItemExtractor {
9+
10+
JsonObject event;
11+
12+
public MediaCCCStreamInfoItemExtractor(JsonObject event) {
13+
this.event = event;
14+
}
15+
16+
@Override
17+
public StreamType getStreamType() throws ParsingException {
18+
return StreamType.VIDEO_STREAM;
19+
}
20+
21+
@Override
22+
public boolean isAd() throws ParsingException {
23+
return false;
24+
}
25+
26+
@Override
27+
public long getDuration() throws ParsingException {
28+
return event.getInt("length");
29+
}
30+
31+
@Override
32+
public long getViewCount() throws ParsingException {
33+
return event.getInt("view_count");
34+
}
35+
36+
@Override
37+
public String getUploaderName() throws ParsingException {
38+
return event.getString("conference_url")
39+
.replace("https://api.media.ccc.de/public/conferences/", "");
40+
}
41+
42+
@Override
43+
public String getUploaderUrl() throws ParsingException {
44+
return event.getString("conference_url");
45+
}
46+
47+
@Override
48+
public String getUploadDate() throws ParsingException {
49+
return event.getString("release_date");
50+
}
51+
52+
@Override
53+
public String getName() throws ParsingException {
54+
return event.getString("title");
55+
}
56+
57+
@Override
58+
public String getUrl() throws ParsingException {
59+
return "https://api.media.ccc.de/public/events/" +
60+
event.getString("guid");
61+
}
62+
63+
@Override
64+
public String getThumbnailUrl() throws ParsingException {
65+
return event.getString("thumbnails_url");
66+
}
67+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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.SearchQueryHandlerFactory;
5+
6+
import java.io.UnsupportedEncodingException;
7+
import java.net.URLEncoder;
8+
import java.util.List;
9+
10+
public class MediaCCCSearchQueryHandlerFactory extends SearchQueryHandlerFactory {
11+
12+
@Override
13+
public String[] getAvailableContentFilter() {
14+
return null;
15+
}
16+
17+
@Override
18+
public String[] getAvailableSortFilter() {
19+
return null;
20+
}
21+
22+
@Override
23+
public String getUrl(String querry, List<String> contentFilter, String sortFilter) throws ParsingException {
24+
try {
25+
return "https://api.media.ccc.de/public/events/search?q=" + URLEncoder.encode(querry, "UTF-8");
26+
} catch (UnsupportedEncodingException e) {
27+
throw new ParsingException("Could not create search string with querry: " + querry, e);
28+
}
29+
}
30+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.schabi.newpipe.extractor.services.media_ccc;
2+
3+
import org.junit.BeforeClass;
4+
import org.junit.Test;
5+
import org.schabi.newpipe.Downloader;
6+
import org.schabi.newpipe.extractor.InfoItem;
7+
import org.schabi.newpipe.extractor.ListExtractor;
8+
import org.schabi.newpipe.extractor.NewPipe;
9+
import org.schabi.newpipe.extractor.search.SearchExtractor;
10+
import org.schabi.newpipe.extractor.services.media_ccc.extractors.MediaCCCSearchExtractor;
11+
import org.schabi.newpipe.extractor.utils.Localization;
12+
13+
import static junit.framework.TestCase.assertTrue;
14+
import static org.schabi.newpipe.extractor.ServiceList.MediaCCC;
15+
16+
/**
17+
* Test for {@link MediaCCCSearchExtractor}
18+
*/
19+
public class MediaCCCSearchExtractorTest {
20+
private static SearchExtractor extractor;
21+
private static ListExtractor.InfoItemsPage<InfoItem> itemsPage;
22+
23+
@BeforeClass
24+
public static void setUpClass() throws Exception {
25+
NewPipe.init(Downloader.getInstance(), new Localization("GB", "en"));
26+
extractor = MediaCCC.getSearchExtractor("source");
27+
extractor.fetchPage();
28+
itemsPage = extractor.getInitialPage();
29+
}
30+
31+
@Test
32+
public void testCount() throws Exception {
33+
assertTrue(Integer.toString(itemsPage.getItems().size()),
34+
itemsPage.getItems().size() >= 25);
35+
}
36+
}

0 commit comments

Comments
 (0)