Skip to content

Commit 304b26b

Browse files
evermind-zzInfinityLoop1308
authored andcommitted
searchfilters: convert youtube to new framework
Available content filters: Youtube - all - videos - channels - playlists Youtube Music - Songs - Videos - Albums - Playlists - Artists Available sort filters: - 'Sort by' - Upload Date - Duration - Features
1 parent c59502e commit 304b26b

13 files changed

Lines changed: 801 additions & 124 deletions

extractor/build.gradle

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
plugins {
22
id 'checkstyle'
3+
id 'com.squareup.wire' version '4.3.0'
34
}
45

56
test {
@@ -18,6 +19,11 @@ checkstyle {
1819
toolVersion checkstyleVersion
1920
}
2021

22+
wire {
23+
java {
24+
}
25+
}
26+
2127
checkstyleTest {
2228
enabled false // do not checkstyle test files
2329
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeService.java

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

3+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
4+
import org.schabi.newpipe.extractor.services.youtube.search.filter.YoutubeFilters;
5+
36
import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.AUDIO;
47
import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.COMMENTS;
58
import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.LIVE;
@@ -120,9 +123,15 @@ public PlaylistExtractor getPlaylistExtractor(final ListLinkHandler linkHandler)
120123

121124
@Override
122125
public SearchExtractor getSearchExtractor(final SearchQueryHandler query) {
123-
final List<String> contentFilters = query.getContentFilters();
126+
final List<FilterItem> contentFilters = query.getContentFilters();
127+
128+
if (contentFilters.isEmpty()) {
129+
// something is odd
130+
throw new RuntimeException("contentFilters is empty. WHY?");
131+
}
124132

125-
if (!contentFilters.isEmpty() && contentFilters.get(0).startsWith("music_")) {
133+
final FilterItem filterItem = contentFilters.get(0);
134+
if (filterItem instanceof YoutubeFilters.MusicYoutubeContentFilterItem) {
126135
return new YoutubeMusicSearchExtractor(this, query);
127136
} else {
128137
return new YoutubeSearchExtractor(this, query);
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.schabi.newpipe.extractor.services.youtube.extractors;
2+
3+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
4+
5+
import org.schabi.newpipe.extractor.StreamingService;
6+
import org.schabi.newpipe.extractor.linkhandler.SearchQueryHandler;
7+
import org.schabi.newpipe.extractor.search.SearchExtractor;
8+
9+
public abstract class YoutubeBaseSearchExtractor extends SearchExtractor {
10+
public YoutubeBaseSearchExtractor(final StreamingService service,
11+
final SearchQueryHandler linkHandler) {
12+
super(service, linkHandler);
13+
}
14+
15+
@SuppressWarnings("unchecked")
16+
protected <T extends FilterItem> T getSelectedContentFilterItem() {
17+
final FilterItem filterItem = getLinkHandler().getContentFilters().get(0);
18+
19+
if (filterItem != null) {
20+
return (T) filterItem;
21+
}
22+
throw new RuntimeException("no content filter set");
23+
}
24+
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeMusicSearchExtractor.java

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import static org.schabi.newpipe.extractor.utils.Utils.UTF_8;
1515
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
1616

17+
import org.schabi.newpipe.extractor.services.youtube.search.filter.YoutubeFilters;
1718
import com.grack.nanojson.JsonArray;
1819
import com.grack.nanojson.JsonObject;
1920
import com.grack.nanojson.JsonParser;
@@ -32,7 +33,6 @@
3233
import org.schabi.newpipe.extractor.localization.DateWrapper;
3334
import org.schabi.newpipe.extractor.localization.TimeAgoParser;
3435
import org.schabi.newpipe.extractor.MultiInfoItemsCollector;
35-
import org.schabi.newpipe.extractor.search.SearchExtractor;
3636
import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper;
3737
import org.schabi.newpipe.extractor.utils.JsonUtils;
3838
import org.schabi.newpipe.extractor.utils.Parser;
@@ -47,14 +47,23 @@
4747
import javax.annotation.Nonnull;
4848
import javax.annotation.Nullable;
4949

50-
public class YoutubeMusicSearchExtractor extends SearchExtractor {
50+
public class YoutubeMusicSearchExtractor extends YoutubeBaseSearchExtractor {
5151
private JsonObject initialData;
5252

5353
public YoutubeMusicSearchExtractor(final StreamingService service,
5454
final SearchQueryHandler linkHandler) {
5555
super(service, linkHandler);
5656
}
5757

58+
private String getSearchType() {
59+
final YoutubeFilters.MusicYoutubeContentFilterItem contentFilterItem =
60+
getSelectedContentFilterItem();
61+
if (contentFilterItem.getName() != null) {
62+
return contentFilterItem.getName();
63+
}
64+
return "";
65+
}
66+
5867
@Override
5968
public void onFetchPage(@Nonnull final Downloader downloader)
6069
throws IOException, ExtractionException {
@@ -63,28 +72,11 @@ public void onFetchPage(@Nonnull final Downloader downloader)
6372
final String url = "https://music.youtube.com/youtubei/v1/search?alt=json&key="
6473
+ youtubeMusicKeys[0] + DISABLE_PRETTY_PRINT_PARAMETER;
6574

66-
final String params;
67-
68-
switch (getLinkHandler().getContentFilters().get(0)) {
69-
case MUSIC_SONGS:
70-
params = "Eg-KAQwIARAAGAAgACgAMABqChAEEAUQAxAKEAk%3D";
71-
break;
72-
case MUSIC_VIDEOS:
73-
params = "Eg-KAQwIABABGAAgACgAMABqChAEEAUQAxAKEAk%3D";
74-
break;
75-
case MUSIC_ALBUMS:
76-
params = "Eg-KAQwIABAAGAEgACgAMABqChAEEAUQAxAKEAk%3D";
77-
break;
78-
case MUSIC_PLAYLISTS:
79-
params = "Eg-KAQwIABAAGAAgACgBMABqChAEEAUQAxAKEAk%3D";
80-
break;
81-
case MUSIC_ARTISTS:
82-
params = "Eg-KAQwIABAAGAAgASgAMABqChAEEAUQAxAKEAk%3D";
83-
break;
84-
default:
85-
params = null;
86-
break;
87-
}
75+
76+
final YoutubeFilters.MusicYoutubeContentFilterItem contentFilterItem =
77+
getSelectedContentFilterItem();
78+
// if params be null (which never should happen), JsonWriter.string() can handle it
79+
final String params = contentFilterItem.getParams();
8880

8981
// @formatter:off
9082
final byte[] json = JsonWriter.string()
@@ -300,7 +292,7 @@ private void collectMusicStreamsFrom(final MultiInfoItemsCollector collector,
300292
.getObject("musicResponsiveListItemFlexColumnRenderer");
301293
final JsonArray descriptionElements = flexColumnRenderer.getObject("text")
302294
.getArray("runs");
303-
final String searchType = getLinkHandler().getContentFilters().get(0);
295+
final String searchType = getSearchType();
304296
if (searchType.equals(MUSIC_SONGS) || searchType.equals(MUSIC_VIDEOS)) {
305297
collector.commit(new YoutubeStreamInfoItemExtractor(info, timeAgoParser) {
306298
@Override

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeSearchExtractor.java

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getTextFromObject;
88
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getValidJsonResponseBody;
99
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.prepareDesktopJsonBuilder;
10-
import static org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeSearchQueryHandlerFactory.getSearchParameter;
1110
import static org.schabi.newpipe.extractor.utils.Utils.UTF_8;
1211
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
1312

13+
import org.schabi.newpipe.extractor.services.youtube.search.filter.YoutubeFilters;
1414
import com.grack.nanojson.JsonArray;
1515
import com.grack.nanojson.JsonBuilder;
1616
import com.grack.nanojson.JsonObject;
@@ -29,7 +29,6 @@
2929
import org.schabi.newpipe.extractor.localization.Localization;
3030
import org.schabi.newpipe.extractor.localization.TimeAgoParser;
3131
import org.schabi.newpipe.extractor.MultiInfoItemsCollector;
32-
import org.schabi.newpipe.extractor.search.SearchExtractor;
3332
import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper;
3433
import org.schabi.newpipe.extractor.utils.JsonUtils;
3534

@@ -59,7 +58,7 @@
5958
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
6059
*/
6160

62-
public class YoutubeSearchExtractor extends SearchExtractor {
61+
public class YoutubeSearchExtractor extends YoutubeBaseSearchExtractor {
6362
private JsonObject initialData;
6463

6564
public YoutubeSearchExtractor(final StreamingService service,
@@ -73,15 +72,10 @@ public void onFetchPage(@Nonnull final Downloader downloader) throws IOException
7372
final String query = super.getSearchString();
7473
final Localization localization = getExtractorLocalization();
7574

76-
// Get the search parameter of the request
77-
final List<String> contentFilters = super.getLinkHandler().getContentFilters();
78-
final String params;
79-
if (!isNullOrEmpty(contentFilters)) {
80-
final String searchType = contentFilters.get(0);
81-
params = getSearchParameter(searchType);
82-
} else {
83-
params = "";
84-
}
75+
// Get the search parameter for the request
76+
final YoutubeFilters.YoutubeContentFilterItem contentFilterItem =
77+
getSelectedContentFilterItem();
78+
final String params = contentFilterItem.getParams();
8579

8680
final JsonBuilder<JsonObject> jsonBody = prepareDesktopJsonBuilder(localization,
8781
getExtractorContentCountry())

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java

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

3+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
4+
35
import java.util.regex.Pattern;
46
import org.schabi.newpipe.extractor.exceptions.ParsingException;
57
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
@@ -48,12 +50,13 @@ public static YoutubeChannelLinkHandlerFactory getInstance() {
4850
* Returns URL to channel from an ID
4951
*
5052
* @param id Channel ID including e.g. 'channel/'
53+
* @param searchFilter
5154
* @return URL to channel
5255
*/
5356
@Override
5457
public String getUrl(final String id,
55-
final List<String> contentFilters,
56-
final String searchFilter) {
58+
final List<FilterItem> contentFilters,
59+
final List<FilterItem> searchFilter) {
5760
return "https://www.youtube.com/" + id;
5861
}
5962

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeCommentsLinkHandlerFactory.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.youtube.linkHandler;
22

3+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
4+
35
import org.schabi.newpipe.extractor.exceptions.FoundAdException;
46
import org.schabi.newpipe.extractor.exceptions.ParsingException;
57
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
@@ -43,8 +45,8 @@ public boolean onAcceptUrl(final String url) throws FoundAdException {
4345

4446
@Override
4547
public String getUrl(final String id,
46-
final List<String> contentFilter,
47-
final String sortFilter) throws ParsingException {
48+
final List<FilterItem> contentFilter,
49+
final List<FilterItem> sortFilter) throws ParsingException {
4850
return getUrl(id);
4951
}
5052
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubePlaylistLinkHandlerFactory.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.youtube.linkHandler;
22

3+
import org.schabi.newpipe.extractor.search.filter.FilterItem;
4+
35
import java.net.MalformedURLException;
46
import java.net.URL;
57
import java.util.List;
@@ -24,8 +26,8 @@ public static YoutubePlaylistLinkHandlerFactory getInstance() {
2426
}
2527

2628
@Override
27-
public String getUrl(final String id, final List<String> contentFilters,
28-
final String sortFilter) {
29+
public String getUrl(final String id, final List<FilterItem> contentFilters,
30+
final List<FilterItem> sortFilter) {
2931
return "https://www.youtube.com/playlist?list=" + id;
3032
}
3133

0 commit comments

Comments
 (0)