Skip to content

Commit 32610fa

Browse files
committed
searchfilters: convert Soundcloud to use new framework
Available content filters: - All - Tracks - Users - Playlists Available sort filters: - 'Sort by' - Length - license
1 parent da0a22f commit 32610fa

6 files changed

Lines changed: 204 additions & 44 deletions

File tree

extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/linkHandler/SoundcloudChannelLinkHandlerFactory.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.schabi.newpipe.extractor.services.soundcloud.linkHandler;
22

3+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
4+
35
import org.schabi.newpipe.extractor.exceptions.ParsingException;
46
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
57
import org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper;
@@ -35,8 +37,8 @@ public String getId(final String url) throws ParsingException {
3537

3638
@Override
3739
public String getUrl(final String id,
38-
final List<String> contentFilter,
39-
final String sortFilter) throws ParsingException {
40+
final List<FilterItem> contentFilter,
41+
final List<FilterItem> sortFilter) throws ParsingException {
4042
try {
4143
return SoundcloudParsingHelper.resolveUrlWithEmbedPlayer(
4244
"https://api.soundcloud.com/users/" + id);

extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/linkHandler/SoundcloudChartsLinkHandlerFactory.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.schabi.newpipe.extractor.services.soundcloud.linkHandler;
22

3+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
4+
35
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
46
import org.schabi.newpipe.extractor.utils.Parser;
57

@@ -22,8 +24,8 @@ public String getId(final String url) {
2224

2325
@Override
2426
public String getUrl(final String id,
25-
final List<String> contentFilter,
26-
final String sortFilter) {
27+
final List<FilterItem> contentFilter,
28+
final List<FilterItem> sortFilter) {
2729
if (id.equals("Top 50")) {
2830
return "https://soundcloud.com/charts/top";
2931
} else {

extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/linkHandler/SoundcloudCommentsLinkHandlerFactory.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.schabi.newpipe.extractor.services.soundcloud.linkHandler;
22

3+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
4+
35
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
46
import org.schabi.newpipe.extractor.exceptions.ParsingException;
57
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
@@ -23,8 +25,8 @@ public static SoundcloudCommentsLinkHandlerFactory getInstance() {
2325

2426
@Override
2527
public String getUrl(final String id,
26-
final List<String> contentFilter,
27-
final String sortFilter) throws ParsingException {
28+
final List<FilterItem> contentFilter,
29+
final List<FilterItem> sortFilter) throws ParsingException {
2830
try {
2931
return "https://api-v2.soundcloud.com/tracks/" + id + "/comments" + "?client_id="
3032
+ clientId() + "&threaded=0" + "&filter_replies=1";

extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/linkHandler/SoundcloudPlaylistLinkHandlerFactory.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.schabi.newpipe.extractor.services.soundcloud.linkHandler;
22

3+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
4+
35
import org.schabi.newpipe.extractor.exceptions.ParsingException;
46
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
57
import org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper;
@@ -35,8 +37,8 @@ public String getId(final String url) throws ParsingException {
3537

3638
@Override
3739
public String getUrl(final String id,
38-
final List<String> contentFilter,
39-
final String sortFilter)
40+
final List<FilterItem> contentFilter,
41+
final List<FilterItem> sortFilter)
4042
throws ParsingException {
4143
try {
4244
return SoundcloudParsingHelper.resolveUrlWithEmbedPlayer(

extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/linkHandler/SoundcloudSearchQueryHandlerFactory.java

Lines changed: 18 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
import org.schabi.newpipe.extractor.exceptions.ParsingException;
55
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
66
import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandlerFactory;
7+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
78
import org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper;
9+
import org.schabi.newpipe.extractor.services.soundcloud.search.filter.SoundcloudFilters;
810

911
import java.io.IOException;
1012
import java.io.UnsupportedEncodingException;
@@ -14,41 +16,30 @@
1416
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper.SOUNDCLOUD_API_V2_URL;
1517
import static org.schabi.newpipe.extractor.utils.Utils.UTF_8;
1618

17-
public class SoundcloudSearchQueryHandlerFactory extends SearchQueryHandlerFactory {
18-
19-
public static final String TRACKS = "tracks";
20-
public static final String USERS = "users";
21-
public static final String PLAYLISTS = "playlists";
22-
public static final String ALL = "all";
19+
public final class SoundcloudSearchQueryHandlerFactory extends SearchQueryHandlerFactory {
2320

2421
public static final int ITEMS_PER_PAGE = 10;
2522

23+
private SoundcloudSearchQueryHandlerFactory() {
24+
super(new SoundcloudFilters());
25+
}
26+
2627
@Override
2728
public String getUrl(final String id,
28-
final List<String> contentFilter,
29-
final String sortFilter)
29+
final List<FilterItem> selectedContentFilter,
30+
final List<FilterItem> selectedSortFilter)
3031
throws ParsingException {
31-
try {
32-
String url = SOUNDCLOUD_API_V2_URL + "search";
3332

34-
if (!contentFilter.isEmpty()) {
35-
switch (contentFilter.get(0)) {
36-
case TRACKS:
37-
url += "/tracks";
38-
break;
39-
case USERS:
40-
url += "/users";
41-
break;
42-
case PLAYLISTS:
43-
url += "/playlists";
44-
break;
45-
case ALL:
46-
default:
47-
break;
48-
}
49-
}
33+
String url = SOUNDCLOUD_API_V2_URL + "search";
34+
String sortQuery = "";
35+
36+
searchFilters.setSelectedContentFilter(selectedContentFilter);
37+
searchFilters.setSelectedSortFilter(selectedSortFilter);
38+
url += searchFilters.evaluateSelectedContentFilters();
39+
sortQuery = searchFilters.evaluateSelectedSortFilters();
5040

51-
return url + "?q=" + URLEncoder.encode(id, UTF_8) + "&client_id="
41+
try {
42+
return url + "?q=" + URLEncoder.encode(id, UTF_8) + sortQuery + "&client_id="
5243
+ SoundcloudParsingHelper.clientId() + "&limit=" + ITEMS_PER_PAGE
5344
+ "&offset=0";
5445

@@ -60,13 +51,4 @@ public String getUrl(final String id,
6051
throw new ParsingException("Could not get client id", e);
6152
}
6253
}
63-
64-
@Override
65-
public String[] getAvailableContentFilter() {
66-
return new String[]{
67-
ALL,
68-
TRACKS,
69-
USERS,
70-
PLAYLISTS};
71-
}
7254
}
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
// Created by evermind-zz 2022, licensed GNU GPL version 3 or later
2+
3+
package org.schabi.newpipe.extractor.services.soundcloud.search.filter;
4+
5+
import org.schabi.newpipe.extractor.search.filter.BaseSearchFilters;
6+
import org.schabi.newpipe.extractor.search.filter.FilterContainer;
7+
import org.schabi.newpipe.extractor.search.filter.FilterGroup;
8+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
9+
10+
public final class SoundcloudFilters extends BaseSearchFilters {
11+
12+
public static final int ID_CF_MAIN_GRP = 0;
13+
public static final int ID_CF_MAIN_ALL = 1;
14+
public static final int ID_CF_MAIN_TRACKS = 2;
15+
public static final int ID_CF_MAIN_USERS = 3;
16+
public static final int ID_CF_MAIN_PLAYLISTS = 4;
17+
public static final int ID_SF_DATE_GRP = 5;
18+
public static final int ID_SF_DATE_ALL = 6;
19+
public static final int ID_SF_DATE_LAST_HOUR = 7;
20+
public static final int ID_SF_DATE_LAST_DAY = 8;
21+
public static final int ID_SF_DATE_LAST_WEEK = 9;
22+
public static final int ID_SF_DATE_LAST_MONTH = 10;
23+
public static final int ID_SF_DATE_LAST_YEAR = 11;
24+
public static final int ID_SF_DURATION_GRP = 12;
25+
public static final int ID_SF_DURATION_ALL = 13;
26+
public static final int ID_SF_DURATION_SHORT = 14;
27+
public static final int ID_SF_DURATION_MEDIUM = 15;
28+
public static final int ID_SF_DURATION_LONG = 16;
29+
public static final int ID_SF_DURATION_EPIC = 17;
30+
public static final int ID_SF_LICENSE_GRP = 18;
31+
public static final int ID_SF_LICENSE_ALL = 19;
32+
public static final int ID_SF_LICENSE_COMMERCE = 20;
33+
34+
public static final String TRACKS = "tracks";
35+
public static final String USERS = "users";
36+
public static final String PLAYLISTS = "playlists";
37+
public static final String ALL = "all";
38+
39+
@Override
40+
public String evaluateSelectedContentFilters() {
41+
if (selectedContentFilter != null && !selectedContentFilter.isEmpty()) {
42+
final SoundcloudContentFilterItem contentFilter =
43+
// we assume there is just one content filter
44+
(SoundcloudContentFilterItem) selectedContentFilter.get(0);
45+
if (null != contentFilter) {
46+
return contentFilter.urlEndpoint;
47+
}
48+
}
49+
return "";
50+
}
51+
52+
@Override
53+
protected void init() {
54+
/* content filters */
55+
groupsFactory.addFilterItem(new SoundcloudContentFilterItem(
56+
ID_CF_MAIN_ALL, ALL, ""));
57+
groupsFactory.addFilterItem(new SoundcloudContentFilterItem(
58+
ID_CF_MAIN_TRACKS, TRACKS, "/tracks"));
59+
groupsFactory.addFilterItem(new SoundcloudContentFilterItem(
60+
ID_CF_MAIN_USERS, USERS, "/users"));
61+
groupsFactory.addFilterItem(new SoundcloudContentFilterItem(
62+
ID_CF_MAIN_PLAYLISTS, PLAYLISTS, "/playlists"));
63+
64+
65+
/* Sort filters */
66+
/* 'Date' filter items */
67+
groupsFactory.addFilterItem(new SoundcloudSortFilterItem(
68+
ID_SF_DATE_ALL, "all", ""));
69+
groupsFactory.addFilterItem(new SoundcloudSortFilterItem(
70+
ID_SF_DATE_LAST_HOUR, "Past hour", "filter.created_at=last_hour"));
71+
groupsFactory.addFilterItem(new SoundcloudSortFilterItem(
72+
ID_SF_DATE_LAST_DAY, "Past day", "filter.created_at=last_day"));
73+
groupsFactory.addFilterItem(new SoundcloudSortFilterItem(
74+
ID_SF_DATE_LAST_WEEK, "Past week", "filter.created_at=last_week"));
75+
groupsFactory.addFilterItem(new SoundcloudSortFilterItem(
76+
ID_SF_DATE_LAST_MONTH, "Past month", "filter.created_at=last_month"));
77+
groupsFactory.addFilterItem(new SoundcloudSortFilterItem(
78+
ID_SF_DATE_LAST_YEAR, "Past year", "filter.created_at=last_year"));
79+
80+
/* duration' filter items */
81+
groupsFactory.addFilterItem(new SoundcloudSortFilterItem(
82+
ID_SF_DURATION_ALL, "all", ""));
83+
groupsFactory.addFilterItem(new SoundcloudSortFilterItem(
84+
ID_SF_DURATION_SHORT, "< 2 min", "filter.duration=short"));
85+
groupsFactory.addFilterItem(new SoundcloudSortFilterItem(
86+
ID_SF_DURATION_MEDIUM, "2-10 min", "filter.duration=medium"));
87+
groupsFactory.addFilterItem(new SoundcloudSortFilterItem(
88+
ID_SF_DURATION_LONG, "10-30 min", "filter.duration=long"));
89+
groupsFactory.addFilterItem(new SoundcloudSortFilterItem(
90+
ID_SF_DURATION_EPIC, "> 30 min", "filter.duration=epic"));
91+
92+
/* license */
93+
groupsFactory.addFilterItem(new SoundcloudSortFilterItem(
94+
ID_SF_LICENSE_ALL, "all", ""));
95+
groupsFactory.addFilterItem(new SoundcloudSortFilterItem(
96+
ID_SF_LICENSE_COMMERCE, "To modify commercially",
97+
"filter.license=to_modify_commercially"));
98+
99+
final FilterContainer allMainCFGrpSortFilters = new FilterContainer(new FilterGroup[]{
100+
groupsFactory.createFilterGroup(ID_SF_DATE_GRP, "Sort by", true,
101+
ID_SF_DATE_ALL, new FilterItem[]{
102+
groupsFactory.getFilterForId(ID_SF_DATE_ALL),
103+
groupsFactory.getFilterForId(ID_SF_DATE_LAST_HOUR),
104+
groupsFactory.getFilterForId(ID_SF_DATE_LAST_DAY),
105+
groupsFactory.getFilterForId(ID_SF_DATE_LAST_WEEK),
106+
groupsFactory.getFilterForId(ID_SF_DATE_LAST_MONTH),
107+
groupsFactory.getFilterForId(ID_SF_DATE_LAST_YEAR),
108+
}, null),
109+
groupsFactory.createFilterGroup(ID_SF_DURATION_GRP, "Length", true,
110+
ID_SF_DURATION_ALL, new FilterItem[]{
111+
groupsFactory.getFilterForId(ID_SF_DURATION_ALL),
112+
groupsFactory.getFilterForId(ID_SF_DURATION_SHORT),
113+
groupsFactory.getFilterForId(ID_SF_DURATION_MEDIUM),
114+
groupsFactory.getFilterForId(ID_SF_DURATION_LONG),
115+
groupsFactory.getFilterForId(ID_SF_DURATION_EPIC),
116+
}, null),
117+
groupsFactory.createFilterGroup(ID_SF_LICENSE_GRP, "License", true,
118+
ID_SF_LICENSE_ALL, new FilterItem[]{
119+
groupsFactory.getFilterForId(ID_SF_LICENSE_ALL),
120+
groupsFactory.getFilterForId(ID_SF_LICENSE_COMMERCE),
121+
}, null),
122+
});
123+
124+
/* content filters */
125+
addContentFilterGroup(groupsFactory.createFilterGroup(ID_CF_MAIN_GRP, null, true,
126+
ID_CF_MAIN_ALL, new FilterItem[]{
127+
groupsFactory.getFilterForId(ID_CF_MAIN_ALL),
128+
groupsFactory.getFilterForId(ID_CF_MAIN_TRACKS),
129+
groupsFactory.getFilterForId(ID_CF_MAIN_USERS),
130+
groupsFactory.getFilterForId(ID_CF_MAIN_PLAYLISTS),
131+
}, allMainCFGrpSortFilters));
132+
133+
addContentFilterSortVariant(ID_CF_MAIN_TRACKS, allMainCFGrpSortFilters);
134+
}
135+
136+
@Override
137+
public String evaluateSelectedSortFilters() {
138+
final StringBuilder sortQuery = new StringBuilder();
139+
if (selectedSortFilter != null) {
140+
for (final FilterItem item : selectedSortFilter) {
141+
final SoundcloudSortFilterItem sortItem =
142+
(SoundcloudSortFilterItem) item;
143+
if (sortItem != null && !sortItem.query.isEmpty()) {
144+
sortQuery.append("&").append(sortItem.query);
145+
}
146+
}
147+
}
148+
149+
return sortQuery.toString();
150+
}
151+
152+
private static class SoundcloudSortFilterItem extends FilterItem {
153+
private final String query;
154+
155+
SoundcloudSortFilterItem(final int identifier, final String name, final String query) {
156+
super(identifier, name);
157+
this.query = query;
158+
}
159+
}
160+
161+
private static final class SoundcloudContentFilterItem extends FilterItem {
162+
private final String urlEndpoint;
163+
164+
private SoundcloudContentFilterItem(final int identifier, final String name,
165+
final String urlEndpoint) {
166+
super(identifier, name);
167+
this.urlEndpoint = urlEndpoint;
168+
}
169+
}
170+
}

0 commit comments

Comments
 (0)