Skip to content

Commit 1c87e93

Browse files
committed
searchfilters: Make SoundcloudSearchQueryHandlerFactory singleton
1 parent 76c7730 commit 1c87e93

3 files changed

Lines changed: 128 additions & 101 deletions

File tree

extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public String getBaseUrl() {
5050

5151
@Override
5252
public SearchQueryHandlerFactory getSearchQHFactory() {
53-
return new SoundcloudSearchQueryHandlerFactory();
53+
return SoundcloudSearchQueryHandlerFactory.getInstance();
5454
}
5555

5656
@Override

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

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
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-
73
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
84
import org.schabi.newpipe.extractor.exceptions.ParsingException;
95
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
106
import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandlerFactory;
7+
import org.schabi.newpipe.extractor.search.filter.FilterContainer;
8+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
119
import org.schabi.newpipe.extractor.services.soundcloud.SoundcloudParsingHelper;
10+
import org.schabi.newpipe.extractor.services.soundcloud.search.filter.SoundcloudFilters;
1211

1312
import java.io.IOException;
1413
import java.io.UnsupportedEncodingException;
@@ -21,9 +20,17 @@
2120
public class SoundcloudSearchQueryHandlerFactory extends SearchQueryHandlerFactory {
2221

2322
public static final int ITEMS_PER_PAGE = 10;
23+
private static SoundcloudSearchQueryHandlerFactory instance = null;
2424

2525
private final SoundcloudFilters searchFilters = new SoundcloudFilters();
2626

27+
public static synchronized SoundcloudSearchQueryHandlerFactory getInstance() {
28+
if (instance == null) {
29+
instance = new SoundcloudSearchQueryHandlerFactory();
30+
}
31+
return instance;
32+
}
33+
2734
@Override
2835
public String getUrl(final String id,
2936
final List<FilterItem> selectedContentFilter,
@@ -53,17 +60,12 @@ public String getUrl(final String id,
5360
}
5461

5562
@Override
56-
public Filter getAvailableContentFilter() {
63+
public FilterContainer getAvailableContentFilter() {
5764
return searchFilters.getContentFilters();
5865
}
5966

6067
@Override
61-
public Filter getAvailableSortFilter() {
62-
return searchFilters.getSortFilters();
63-
}
64-
65-
@Override
66-
public Filter getContentFilterSortFilterVariant(final int contentFilterId) {
68+
public FilterContainer getContentFilterSortFilterVariant(final int contentFilterId) {
6769
return searchFilters.getContentFilterSortFilterVariant(contentFilterId);
6870
}
6971

extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/search/filter/SoundcloudFilters.java

Lines changed: 114 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,125 +1,149 @@
1+
// Created by evermind-zz 2022, licensed GNU GPL version 3 or later -->
2+
13
package org.schabi.newpipe.extractor.services.soundcloud.search.filter;
24

3-
import org.schabi.newpipe.extractor.search.filter.Filter;
5+
import org.schabi.newpipe.extractor.search.filter.FilterContainer;
46
import org.schabi.newpipe.extractor.search.filter.FilterGroup;
57
import org.schabi.newpipe.extractor.search.filter.FilterItem;
68
import org.schabi.newpipe.extractor.search.filter.SearchFiltersBase;
79

810
public final class SoundcloudFilters extends SearchFiltersBase {
911

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+
1034
public static final String TRACKS = "tracks";
1135
public static final String USERS = "users";
1236
public static final String PLAYLISTS = "playlists";
1337
public static final String ALL = "all";
1438

15-
public SoundcloudFilters() {
16-
init();
17-
build();
18-
}
19-
2039
@Override
2140
public String evaluateSelectedContentFilters() {
2241
if (selectedContentFilter != null && !selectedContentFilter.isEmpty()) {
23-
final SoundcloudContentFilterItem contentItem =
42+
final SoundcloudContentFilterItem contentFilter =
2443
// we assume there is just one content filter
2544
(SoundcloudContentFilterItem) selectedContentFilter.get(0);
26-
return contentItem.urlEndpoint;
45+
if (null != contentFilter) {
46+
return contentFilter.urlEndpoint;
47+
}
2748
}
2849
return "";
2950
}
3051

3152
@Override
3253
protected void init() {
3354
/* 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"));
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"));
4263

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-
}));
5664

65+
/* Sort filters */
5766
/* '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"));
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"));
7079

7180
/* 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"));
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"));
8291

8392
/* 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());
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);
112134
}
113135

114136
@Override
115137
public String evaluateSelectedSortFilters() {
116138
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);
139+
if (selectedSortFilter != null) {
140+
for (final FilterItem item : selectedSortFilter) {
141+
final SoundcloudSortFilterItem sortItem =
142+
(SoundcloudSortFilterItem) item;
143+
if (sortItem != null) {
144+
if (!sortItem.query.isEmpty()) {
145+
sortQuery.append("&").append(sortItem.query);
146+
}
123147
}
124148
}
125149
}
@@ -130,17 +154,18 @@ public String evaluateSelectedSortFilters() {
130154
private static class SoundcloudSortFilterItem extends FilterItem {
131155
private final String query;
132156

133-
SoundcloudSortFilterItem(final String name, final String query) {
134-
super(Filter.ITEM_IDENTIFIER_UNKNOWN, name);
157+
SoundcloudSortFilterItem(final int identifier, final String name, final String query) {
158+
super(identifier, name);
135159
this.query = query;
136160
}
137161
}
138162

139163
private static final class SoundcloudContentFilterItem extends FilterItem {
140164
private final String urlEndpoint;
141165

142-
private SoundcloudContentFilterItem(final String name, final String urlEndpoint) {
143-
super(Filter.ITEM_IDENTIFIER_UNKNOWN, name);
166+
private SoundcloudContentFilterItem(final int identifier, final String name,
167+
final String urlEndpoint) {
168+
super(identifier, name);
144169
this.urlEndpoint = urlEndpoint;
145170
}
146171
}

0 commit comments

Comments
 (0)