Skip to content

Commit f0e2c85

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 94e5c9d commit f0e2c85

6 files changed

Lines changed: 198 additions & 41 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(
Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package org.schabi.newpipe.extractor.services.soundcloud.linkHandler;
22

3+
import org.schabi.newpipe.extractor.search.filter.Filter;
4+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
5+
import org.schabi.newpipe.extractor.services.soundcloud.search.filter.SoundcloudFilters;
6+
37
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
48
import org.schabi.newpipe.extractor.exceptions.ParsingException;
59
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
@@ -16,39 +20,26 @@
1620

1721
public class SoundcloudSearchQueryHandlerFactory extends SearchQueryHandlerFactory {
1822

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";
23-
2423
public static final int ITEMS_PER_PAGE = 10;
2524

25+
private final SoundcloudFilters searchFilters = new SoundcloudFilters();
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 {
32+
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();
40+
3141
try {
32-
String url = SOUNDCLOUD_API_V2_URL + "search";
33-
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-
}
50-
51-
return url + "?q=" + URLEncoder.encode(id, UTF_8) + "&client_id="
42+
return url + "?q=" + URLEncoder.encode(id, UTF_8) + sortQuery + "&client_id="
5243
+ SoundcloudParsingHelper.clientId() + "&limit=" + ITEMS_PER_PAGE
5344
+ "&offset=0";
5445

@@ -62,11 +53,22 @@ public String getUrl(final String id,
6253
}
6354

6455
@Override
65-
public String[] getAvailableContentFilter() {
66-
return new String[]{
67-
ALL,
68-
TRACKS,
69-
USERS,
70-
PLAYLISTS};
56+
public Filter getAvailableContentFilter() {
57+
return searchFilters.getContentFilters();
58+
}
59+
60+
@Override
61+
public Filter getAvailableSortFilter() {
62+
return searchFilters.getSortFilters();
63+
}
64+
65+
@Override
66+
public Filter getContentFilterSortFilterVariant(final int contentFilterId) {
67+
return searchFilters.getContentFilterSortFilterVariant(contentFilterId);
68+
}
69+
70+
@Override
71+
public FilterItem getFilterItem(final int filterId) {
72+
return searchFilters.getFilterItem(filterId);
7173
}
7274
}
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
package org.schabi.newpipe.extractor.services.soundcloud.search.filter;
2+
3+
import org.schabi.newpipe.extractor.search.filter.Filter;
4+
import org.schabi.newpipe.extractor.search.filter.FilterGroup;
5+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
6+
import org.schabi.newpipe.extractor.search.filter.SearchFiltersBase;
7+
8+
public final class SoundcloudFilters extends SearchFiltersBase {
9+
10+
public static final String TRACKS = "tracks";
11+
public static final String USERS = "users";
12+
public static final String PLAYLISTS = "playlists";
13+
public static final String ALL = "all";
14+
15+
public SoundcloudFilters() {
16+
init();
17+
build();
18+
}
19+
20+
@Override
21+
public String evaluateSelectedContentFilters() {
22+
if (selectedContentFilter != null && !selectedContentFilter.isEmpty()) {
23+
final SoundcloudContentFilterItem contentItem =
24+
// we assume there is just one content filter
25+
(SoundcloudContentFilterItem) selectedContentFilter.get(0);
26+
return contentItem.urlEndpoint;
27+
}
28+
return "";
29+
}
30+
31+
@Override
32+
protected void init() {
33+
/* content filters */
34+
final int contentFilterAll = builder.addFilterItem(
35+
new SoundcloudContentFilterItem(ALL, ""));
36+
final int contentFilterTracks = builder.addFilterItem(
37+
new SoundcloudContentFilterItem(TRACKS, "/tracks"));
38+
final int contentFilterUsers = builder.addFilterItem(
39+
new SoundcloudContentFilterItem(USERS, "/users"));
40+
final int contentFilterPlaylists = builder.addFilterItem(
41+
new SoundcloudContentFilterItem(PLAYLISTS, "/playlists"));
42+
43+
/* set default content filter */
44+
45+
// 'ALL' this is the default search content filter.
46+
this.defaultContentFilterId = contentFilterAll;
47+
48+
49+
/* content filters with sort filters */
50+
addContentFilter(builder.createSortGroup(null, true, new FilterItem[]{
51+
builder.getFilterForId(contentFilterAll),
52+
builder.getFilterForId(contentFilterTracks),
53+
builder.getFilterForId(contentFilterUsers),
54+
builder.getFilterForId(contentFilterPlaylists),
55+
}));
56+
57+
/* 'Date' filter items */
58+
final int filterIdDateAll = builder.addSortItem(
59+
new SoundcloudSortFilterItem("all", ""));
60+
final int filterIdDateLastHour = builder.addSortItem(
61+
new SoundcloudSortFilterItem("Past hour", "filter.created_at=last_hour"));
62+
final int filterIdDateLastDay = builder.addSortItem(
63+
new SoundcloudSortFilterItem("Past day", "filter.created_at=last_day"));
64+
final int filterIdDateLastWeek = builder.addSortItem(
65+
new SoundcloudSortFilterItem("Past week", "filter.created_at=last_week"));
66+
final int filterIdDateLastMonth = builder.addSortItem(
67+
new SoundcloudSortFilterItem("Past month", "filter.created_at=last_month"));
68+
final int filterIdDateLastYear = builder.addSortItem(
69+
new SoundcloudSortFilterItem("Past year", "filter.created_at=last_year"));
70+
71+
/* duration' filter items */
72+
final int filterIdDurationAll = builder.addSortItem(
73+
new SoundcloudSortFilterItem("all", ""));
74+
final int filterIdDurationShort = builder.addSortItem(
75+
new SoundcloudSortFilterItem("< 2 min", "filter.duration=short"));
76+
final int filterIdDurationMedium = builder.addSortItem(
77+
new SoundcloudSortFilterItem("2-10 min", "filter.duration=medium"));
78+
final int filterIdDurationLong = builder.addSortItem(
79+
new SoundcloudSortFilterItem("10-30 min", "filter.duration=long"));
80+
final int filterIdDurationEpic = builder.addSortItem(
81+
new SoundcloudSortFilterItem("> 30 min", "filter.duration=epic"));
82+
83+
/* license */
84+
final int filterIdLicenseAll = builder.addSortItem(
85+
new SoundcloudSortFilterItem("all", ""));
86+
final int filterIdLicenseCommerce = builder.addSortItem(
87+
new SoundcloudSortFilterItem("To modify commercially",
88+
"filter.license=to_modify_commercially"));
89+
90+
addContentFilterSortVariant(contentFilterTracks,
91+
new Filter.Builder(new FilterGroup[]{
92+
builder.createSortGroup("Sort by", true, new FilterItem[]{
93+
builder.getFilterForId(filterIdDateAll),
94+
builder.getFilterForId(filterIdDateLastHour),
95+
builder.getFilterForId(filterIdDateLastDay),
96+
builder.getFilterForId(filterIdDateLastWeek),
97+
builder.getFilterForId(filterIdDateLastMonth),
98+
builder.getFilterForId(filterIdDateLastYear),
99+
}),
100+
builder.createSortGroup("Length", true, new FilterItem[]{
101+
builder.getFilterForId(filterIdDurationAll),
102+
builder.getFilterForId(filterIdDurationShort),
103+
builder.getFilterForId(filterIdDurationMedium),
104+
builder.getFilterForId(filterIdDurationLong),
105+
builder.getFilterForId(filterIdDurationEpic),
106+
}),
107+
builder.createSortGroup("License", true, new FilterItem[]{
108+
builder.getFilterForId(filterIdLicenseAll),
109+
builder.getFilterForId(filterIdLicenseCommerce),
110+
}),
111+
}).build());
112+
}
113+
114+
@Override
115+
public String evaluateSelectedSortFilters() {
116+
final StringBuilder sortQuery = new StringBuilder();
117+
for (final FilterItem item : selectedSortFilter) {
118+
final SoundcloudSortFilterItem sortItem =
119+
(SoundcloudSortFilterItem) item;
120+
if (sortItem != null) {
121+
if (!sortItem.query.isEmpty()) {
122+
sortQuery.append("&").append(sortItem.query);
123+
}
124+
}
125+
}
126+
127+
return sortQuery.toString();
128+
}
129+
130+
private static class SoundcloudSortFilterItem extends FilterItem {
131+
private final String query;
132+
133+
SoundcloudSortFilterItem(final String name, final String query) {
134+
super(Filter.ITEM_IDENTIFIER_UNKNOWN, name);
135+
this.query = query;
136+
}
137+
}
138+
139+
private static final class SoundcloudContentFilterItem extends FilterItem {
140+
private final String urlEndpoint;
141+
142+
private SoundcloudContentFilterItem(final String name, final String urlEndpoint) {
143+
super(Filter.ITEM_IDENTIFIER_UNKNOWN, name);
144+
this.urlEndpoint = urlEndpoint;
145+
}
146+
}
147+
}

0 commit comments

Comments
 (0)