Skip to content

Commit 9e2248d

Browse files
InfinityLoop130834j
andcommitted
feat && refactor: merge client upstream PR #8837 and extractor upstream PR #904(evermind-zz: content and sort filter framework) and refactor BiliBili and NicoNico service to fit in it. Also partially merge extractor PR #18 (34j: Add content filters).
Co-authored-by: 34j <[email protected]>
1 parent a20338e commit 9e2248d

File tree

11 files changed

+190
-40
lines changed

11 files changed

+190
-40
lines changed

extractor/src/main/java/org/schabi/newpipe/extractor/services/bilibili/extractors/BilibiliChannelExtractor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
1818
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
1919
import org.schabi.newpipe.extractor.services.bilibili.linkHandler.BilibiliSearchQueryHandlerFactory;
20+
import org.schabi.newpipe.extractor.services.bilibili.search.filter.BilibiliFilters;
2021
import org.schabi.newpipe.extractor.services.bilibili.utils;
2122
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
2223
import org.schabi.newpipe.extractor.stream.StreamInfoItemsCollector;
@@ -59,7 +60,8 @@ public void onFetchPage(@Nonnull Downloader downloader) throws IOException, Extr
5960
try {
6061
json = JsonParser.object().from(response);
6162
userJson = JsonParser.object().from(userResponse);
62-
String liveResponse = downloader.get(new BilibiliSearchQueryHandlerFactory().getUrl(getName(), Collections.singletonList("live_room"), "")).responseBody();
63+
String liveResponse = downloader.get(new BilibiliSearchQueryHandlerFactory().getUrl(getName(),
64+
Collections.singletonList(new BilibiliFilters.BilibiliContentFilterItem("live_room", "search_type=live_room")), null)).responseBody();
6365
liveJson = JsonParser.object().from(liveResponse);
6466
String recordResponse = downloader.get("https://api.bilibili.com/x/polymer/space/seasons_series_list?mid=" +getId() +"&page_num=1&page_size=10").responseBody();
6567
JsonArray series_list = JsonParser.object().from(recordResponse).getObject("data").getObject("items_lists").getArray("series_list");

extractor/src/main/java/org/schabi/newpipe/extractor/services/bilibili/linkHandler/BilibiliChannelLinkHandlerFactory.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import org.schabi.newpipe.extractor.exceptions.ParsingException;
77
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
8+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
89

910
public class BilibiliChannelLinkHandlerFactory extends ListLinkHandlerFactory{
1011

@@ -34,7 +35,8 @@ public boolean onAcceptUrl(final String url) throws ParsingException {
3435
}
3536

3637
@Override
37-
public String getUrl(String id, List<String> contentFilter, String sortFilter) throws ParsingException {
38+
public String getUrl(String id, final List<FilterItem> contentFilter,
39+
final List<FilterItem> sortFilter) throws ParsingException {
3840
return baseUrl + id;
3941
}
4042

extractor/src/main/java/org/schabi/newpipe/extractor/services/bilibili/linkHandler/BilibiliCommentsLinkHandlerFactory.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
66
import org.schabi.newpipe.extractor.exceptions.ParsingException;
77
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
8+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
89
import org.schabi.newpipe.extractor.services.bilibili.utils;
910
import org.schabi.newpipe.extractor.services.soundcloud.linkHandler.SoundcloudStreamLinkHandlerFactory;
1011

@@ -42,7 +43,8 @@ public boolean onAcceptUrl(String url) throws ParsingException {
4243
}
4344

4445
@Override
45-
public String getUrl(String id, List<String> contentFilter, String sortFilter) throws ParsingException {
46+
public String getUrl(String id, final List<FilterItem> contentFilter,
47+
final List<FilterItem> sortFilter) throws ParsingException {
4648
id = id.startsWith("BV")? String.valueOf(new utils().bv2av(id)) :id;
4749
if(id.contains("&root")){
4850
return "https://api.bilibili.com/x/v2/reply/reply?type=1&ps=20&oid=" + id;

extractor/src/main/java/org/schabi/newpipe/extractor/services/bilibili/linkHandler/BilibiliFeedLinkHandlerFactory.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44

55
import org.schabi.newpipe.extractor.exceptions.ParsingException;
66
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
7+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
78

89
public class BilibiliFeedLinkHandlerFactory extends ListLinkHandlerFactory{
910

1011
@Override
11-
public String getUrl(String id, List<String> contentFilter, String sortFilter) throws ParsingException {
12+
public String getUrl(String id, final List<FilterItem> contentFilter,
13+
final List<FilterItem> sortFilter) throws ParsingException {
1214
// TODO Auto-generated method stub
1315
return "https://www.bilibili.com";
1416
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/bilibili/linkHandler/BilibiliSearchQueryHandlerFactory.java

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66

77
import org.schabi.newpipe.extractor.exceptions.ParsingException;
88
import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandlerFactory;
9+
import org.schabi.newpipe.extractor.search.filter.Filter;
10+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
11+
import org.schabi.newpipe.extractor.services.bilibili.search.filter.BilibiliFilters;
12+
import org.schabi.newpipe.extractor.services.niconico.search.filter.NiconicoFilters;
913

1014
import java.io.UnsupportedEncodingException;
1115
import java.net.URLEncoder;
@@ -17,39 +21,34 @@ public class BilibiliSearchQueryHandlerFactory extends SearchQueryHandlerFactory
1721
private static final String VIDEOS = "video";
1822
private static final String LIVE = "live_room";
1923
private static final String USER = "bili_user";
20-
private static final String SEARCH_URL = "https://api.bilibili.com/x/web-interface/search/type?search_type=";
24+
private static final String SEARCH_URL = "https://api.bilibili.com/x/web-interface/search/type?";
25+
26+
private final BilibiliFilters searchFilters = new BilibiliFilters();
2127

2228
@Override
23-
public String getUrl(final String query, final List<String> contentFilters, final String sortFilter)
29+
public String getUrl(final String query, final List<FilterItem> selectedContentFilter,
30+
final List<FilterItem> selectedSortFilter)
2431
throws ParsingException {
25-
try {
26-
if (!contentFilters.isEmpty()) {
27-
final String contentFilter = contentFilters.get(0);
28-
final String searchString = query;
29-
switch (contentFilter) {
30-
case VIDEOS:
31-
default:
32-
return SEARCH_URL + VIDEOS + "&keyword=" + URLEncoder.encode(searchString, UTF_8) + "&page=1";
33-
case LIVE:
34-
return SEARCH_URL + LIVE + "&keyword=" + URLEncoder.encode(searchString, UTF_8) + "&page=1";
35-
case USER:
36-
return SEARCH_URL + USER + "&keyword=" + URLEncoder.encode(searchString, UTF_8) + "&page=1";
37-
}
38-
}
39-
40-
return SEARCH_URL + VIDEOS + "&keyword=" + URLEncoder.encode(query, UTF_8) + "&page=1";
4132

33+
searchFilters.setSelectedSortFilter(selectedSortFilter);
34+
searchFilters.setSelectedContentFilter(selectedContentFilter);
35+
36+
final String filterQuery = searchFilters.evaluateSelectedContentFilters();
37+
38+
try {
39+
return SEARCH_URL + filterQuery + "&keyword=" + URLEncoder.encode(query, UTF_8) + "&page=1";
4240
} catch (final UnsupportedEncodingException e) {
4341
throw new ParsingException("query \"" + query + "\" could not be encoded", e);
4442
}
4543
}
4644

4745
@Override
48-
public String[] getAvailableContentFilter() {
49-
return new String[]{
50-
VIDEOS,
51-
LIVE,
52-
USER
53-
};
46+
public Filter getAvailableContentFilter() {
47+
return searchFilters.getContentFilters();
48+
}
49+
50+
@Override
51+
public FilterItem getFilterItem(final int filterId) {
52+
return searchFilters.getFilterItem(filterId);
5453
}
5554
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package org.schabi.newpipe.extractor.services.bilibili.search.filter;
2+
3+
import org.schabi.newpipe.extractor.search.filter.Filter;
4+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
5+
import org.schabi.newpipe.extractor.search.filter.SearchFiltersBase;
6+
import org.schabi.newpipe.extractor.services.bandcamp.search.filter.BandcampFilters;
7+
import org.schabi.newpipe.extractor.services.niconico.search.filter.NiconicoFilters;
8+
9+
public class BilibiliFilters extends SearchFiltersBase {
10+
private static final String VIDEOS = "Video";
11+
private static final String LIVES = "LiveRoom";
12+
private static final String USERS = "Channel";
13+
14+
public BilibiliFilters() {
15+
init();
16+
build();
17+
}
18+
19+
public String evaluateSelectedContentFilters() {
20+
if (selectedSortFilter != null) {
21+
String sortQuery = "";
22+
23+
if (selectedContentFilter != null && !selectedContentFilter.isEmpty()) {
24+
final BilibiliFilters.BilibiliContentFilterItem contentItem =
25+
// we assume that there is just one content filter
26+
(BilibiliFilters.BilibiliContentFilterItem) selectedContentFilter.get(0);
27+
if (contentItem != null) {
28+
if (!contentItem.query.isEmpty()) {
29+
sortQuery = "&" + contentItem.query;
30+
}
31+
}
32+
}
33+
return sortQuery;
34+
}
35+
return "";
36+
}
37+
@Override
38+
protected void init() {
39+
/* content filters */
40+
final int contentFilterVideos = builder.addFilterItem(
41+
new BilibiliFilters.BilibiliContentFilterItem(VIDEOS, "search_type=video"));
42+
final int contentFilterLives = builder.addFilterItem(
43+
new BilibiliFilters.BilibiliContentFilterItem(LIVES, "search_type=live_room"));
44+
final int contentFilterUsers = builder.addFilterItem(
45+
new BilibiliFilters.BilibiliContentFilterItem(USERS, "search_type=bili_user"));
46+
47+
this.defaultContentFilterId = contentFilterVideos;
48+
49+
/* content filters with sort filters */
50+
addContentFilter(builder.createSortGroup(null, true, new FilterItem[]{
51+
builder.getFilterForId(contentFilterVideos),
52+
builder.getFilterForId(contentFilterLives),
53+
builder.getFilterForId(contentFilterUsers),
54+
}));
55+
}
56+
57+
public static class BilibiliContentFilterItem extends FilterItem {
58+
private final String query;
59+
60+
public BilibiliContentFilterItem(final String name, final String query) {
61+
super(Filter.ITEM_IDENTIFIER_UNKNOWN, name);
62+
this.query = query;
63+
}
64+
}
65+
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/niconico/linkHandler/NiconicoSearchQueryHandlerFactory.java

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44

55
import org.schabi.newpipe.extractor.exceptions.ParsingException;
66
import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandlerFactory;
7+
import org.schabi.newpipe.extractor.search.filter.Filter;
8+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
79
import org.schabi.newpipe.extractor.services.niconico.NiconicoService;
10+
import org.schabi.newpipe.extractor.services.niconico.search.filter.NiconicoFilters;
811

912
import java.io.UnsupportedEncodingException;
1013
import java.net.URLEncoder;
@@ -15,13 +18,20 @@ public class NiconicoSearchQueryHandlerFactory extends SearchQueryHandlerFactory
1518
private static final String SEARCH_URL
1619
= "https://api.search.nicovideo.jp/api/v2/snapshot/video/contents/search";
1720

21+
private final NiconicoFilters searchFilters = new NiconicoFilters();
22+
1823
@Override
1924
public String getUrl(final String id,
20-
final List<String> contentFilter,
21-
final String sortFilter) throws ParsingException {
25+
final List<FilterItem> selectedContentFilter,
26+
final List<FilterItem> selectedSortFilter) throws ParsingException {
27+
28+
searchFilters.setSelectedSortFilter(selectedSortFilter);
29+
searchFilters.setSelectedContentFilter(selectedContentFilter);
30+
31+
final String filterQuery = searchFilters.evaluateSelectedContentFilters();
32+
2233
try {
23-
return SEARCH_URL + "?q=" + URLEncoder.encode(id, UTF_8)
24-
+ "&targets=title,description,tags"
34+
return SEARCH_URL + "?q=" + URLEncoder.encode(id, UTF_8) + filterQuery
2535
+ "&fields=contentId,title,userId,channelId"
2636
+ ",viewCounter,lengthSeconds,thumbnailUrl,startTime"
2737
+ "&_sort=-viewCounter"
@@ -34,9 +44,12 @@ public String getUrl(final String id,
3444
}
3545

3646
@Override
37-
public String[] getAvailableContentFilter() {
38-
return new String[] {
39-
"all"
40-
};
47+
public Filter getAvailableContentFilter() {
48+
return searchFilters.getContentFilters();
49+
}
50+
51+
@Override
52+
public FilterItem getFilterItem(final int filterId) {
53+
return searchFilters.getFilterItem(filterId);
4154
}
4255
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/niconico/linkHandler/NiconicoTrendLinkHandlerFactory.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.schabi.newpipe.extractor.exceptions.ParsingException;
44
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
5+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
56
import org.schabi.newpipe.extractor.services.niconico.NiconicoService;
67

78
import java.util.List;
@@ -18,8 +19,8 @@ public boolean onAcceptUrl(final String url) throws ParsingException {
1819
}
1920

2021
@Override
21-
public String getUrl(final String id, final List<String> contentFilter,
22-
final String sortFilter) throws ParsingException {
22+
public String getUrl(final String id, final List<FilterItem> contentFilter,
23+
final List<FilterItem> sortFilter) throws ParsingException {
2324
return NiconicoService.DAILY_TREND_URL;
2425
}
2526
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/niconico/linkHandler/NiconicoUserLinkHandlerFactory.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.schabi.newpipe.extractor.exceptions.ParsingException;
44
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
5+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
56
import org.schabi.newpipe.extractor.services.niconico.NiconicoService;
67
import org.schabi.newpipe.extractor.utils.Parser;
78

@@ -19,8 +20,8 @@ public boolean onAcceptUrl(final String url) throws ParsingException {
1920
}
2021

2122
@Override
22-
public String getUrl(final String id, final List<String> contentFilter,
23-
final String sortFilter) throws ParsingException {
23+
public String getUrl(final String id, final List<FilterItem> contentFilter,
24+
final List<FilterItem> sortFilter) throws ParsingException {
2425
return NiconicoService.USER_URL + id;
2526
}
2627
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package org.schabi.newpipe.extractor.services.niconico.search.filter;
2+
3+
import org.schabi.newpipe.extractor.search.filter.Filter;
4+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
5+
import org.schabi.newpipe.extractor.search.filter.SearchFiltersBase;
6+
import org.schabi.newpipe.extractor.services.bandcamp.search.filter.BandcampFilters;
7+
8+
public class NiconicoFilters extends SearchFiltersBase {
9+
10+
private static final String ALL = "All";
11+
private static final String TAGS_ONLY = "TagsOnly";
12+
13+
public NiconicoFilters() {
14+
init();
15+
build();
16+
}
17+
18+
@Override
19+
public String evaluateSelectedContentFilters() {
20+
if (selectedSortFilter != null) {
21+
String sortQuery = "";
22+
23+
if (selectedContentFilter != null && !selectedContentFilter.isEmpty()) {
24+
final NiconicoFilters.NiconicoContentFilterItem contentItem =
25+
// we assume that there is just one content filter
26+
(NiconicoFilters.NiconicoContentFilterItem ) selectedContentFilter.get(0);
27+
if (contentItem != null) {
28+
if (!contentItem.query.isEmpty()) {
29+
sortQuery = "&" + contentItem.query;
30+
}
31+
}
32+
}
33+
return sortQuery;
34+
}
35+
return "";
36+
}
37+
38+
@Override
39+
protected void init() {
40+
/* content filters */
41+
final int contentFilterAll = builder.addFilterItem(
42+
new NiconicoFilters.NiconicoContentFilterItem(ALL, "targets=title,description,tags"));
43+
final int contentFilterTagsOnly = builder.addFilterItem(
44+
new NiconicoFilters.NiconicoContentFilterItem(TAGS_ONLY, "targets=tagsExact"));
45+
this.defaultContentFilterId = contentFilterAll;
46+
47+
/* content filters with sort filters */
48+
addContentFilter(builder.createSortGroup(null, true, new FilterItem[]{
49+
builder.getFilterForId(contentFilterAll),
50+
builder.getFilterForId(contentFilterTagsOnly),
51+
}));
52+
}
53+
54+
public static class NiconicoContentFilterItem extends FilterItem {
55+
private final String query;
56+
57+
public NiconicoContentFilterItem(final String name, final String query) {
58+
super(Filter.ITEM_IDENTIFIER_UNKNOWN, name);
59+
this.query = query;
60+
}
61+
}
62+
}

0 commit comments

Comments
 (0)