1+ // Created by evermind-zz 2022, licensed GNU GPL version 3 or later -->
2+
13package 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 ;
46import org .schabi .newpipe .extractor .search .filter .FilterGroup ;
57import org .schabi .newpipe .extractor .search .filter .FilterItem ;
68import org .schabi .newpipe .extractor .search .filter .SearchFiltersBase ;
79
810public 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