Skip to content

Commit f484f20

Browse files
evermind-zzStypox
authored andcommitted
searchfilters: convert Soundcloud to use new framework
Available content filters: - All - Tracks - Users - Playlists Available sort filters: - 'Sort by' - Length - license
1 parent c7ef8a9 commit f484f20

6 files changed

Lines changed: 201 additions & 38 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, UnsupportedOperat
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, UnsupportedOperationException {
4143
try {
4244
return SoundcloudParsingHelper.resolveUrlWithEmbedPlayer(

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.exceptions.ParsingException;
46
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
57
import org.schabi.newpipe.extractor.utils.Parser;
@@ -34,8 +36,8 @@ public String getId(final String url) throws ParsingException, UnsupportedOperat
3436

3537
@Override
3638
public String getUrl(final String id,
37-
final List<String> contentFilter,
38-
final String sortFilter)
39+
final List<FilterItem> contentFilter,
40+
final List<FilterItem> sortFilter)
3941
throws ParsingException, UnsupportedOperationException {
4042
if (id.equals("Top 50")) {
4143
return "https://soundcloud.com/charts/top";

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)
28+
final List<FilterItem> contentFilter,
29+
final List<FilterItem> sortFilter)
2830
throws ParsingException, UnsupportedOperationException {
2931
try {
3032
return "https://api-v2.soundcloud.com/tracks/" + id + "/comments" + "?client_id="

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, UnsupportedOperat
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, UnsupportedOperationException {
4143
try {
4244
return SoundcloudParsingHelper.resolveUrlWithEmbedPlayer(

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

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
import org.schabi.newpipe.extractor.exceptions.ParsingException;
77
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
88
import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandlerFactory;
9+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
910
import org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper;
11+
import org.schabi.newpipe.extractor.services.soundcloud.search.filter.SoundcloudFilters;
1012
import org.schabi.newpipe.extractor.utils.Utils;
1113

1214
import java.io.IOException;
@@ -26,6 +28,7 @@ public final class SoundcloudSearchQueryHandlerFactory extends SearchQueryHandle
2628
public static final int ITEMS_PER_PAGE = 10;
2729

2830
private SoundcloudSearchQueryHandlerFactory() {
31+
super(new SoundcloudFilters());
2932
}
3033

3134
public static SoundcloudSearchQueryHandlerFactory getInstance() {
@@ -34,32 +37,23 @@ public static SoundcloudSearchQueryHandlerFactory getInstance() {
3437

3538
@Override
3639
public String getUrl(final String id,
37-
final List<String> contentFilter,
38-
final String sortFilter)
40+
final List<FilterItem> selectedContentFilter,
41+
final List<FilterItem> selectedSortFilter)
3942
throws ParsingException, UnsupportedOperationException {
40-
try {
41-
String url = SOUNDCLOUD_API_V2_URL + "search";
4243

43-
if (!contentFilter.isEmpty()) {
44-
switch (contentFilter.get(0)) {
45-
case TRACKS:
46-
url += "/tracks";
47-
break;
48-
case USERS:
49-
url += "/users";
50-
break;
51-
case PLAYLISTS:
52-
url += "/playlists";
53-
break;
54-
case ALL:
55-
default:
56-
break;
57-
}
58-
}
44+
String url = SOUNDCLOUD_API_V2_URL + "search";
45+
String sortQuery = "";
46+
47+
searchFilters.setSelectedContentFilter(selectedContentFilter);
48+
searchFilters.setSelectedSortFilter(selectedSortFilter);
49+
url += searchFilters.evaluateSelectedContentFilters();
50+
sortQuery = searchFilters.evaluateSelectedSortFilters();
5951

52+
try {
6053
return url + "?q=" + Utils.encodeUrlUtf8(id)
6154
+ "&client_id=" + SoundcloudParsingHelper.clientId()
62-
+ "&limit=" + ITEMS_PER_PAGE + "&offset=0";
55+
+ "&limit=" + ITEMS_PER_PAGE + "&offset=0"
56+
+ sortQuery;
6357

6458
} catch (final UnsupportedEncodingException e) {
6559
throw new ParsingException("Could not encode query", e);
@@ -69,13 +63,4 @@ public String getUrl(final String id,
6963
throw new ParsingException("Could not get client id", e);
7064
}
7165
}
72-
73-
@Override
74-
public String[] getAvailableContentFilter() {
75-
return new String[]{
76-
ALL,
77-
TRACKS,
78-
USERS,
79-
PLAYLISTS};
80-
}
8166
}
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)