Skip to content

Commit ef2ce68

Browse files
committed
add soundcloud SearchExtractor
1 parent 5718d5b commit ef2ce68

4 files changed

Lines changed: 127 additions & 11 deletions

File tree

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package org.schabi.newpipe.extractor.services.soundcloud;
2+
3+
import com.grack.nanojson.JsonArray;
4+
import com.grack.nanojson.JsonObject;
5+
import com.grack.nanojson.JsonParser;
6+
import com.grack.nanojson.JsonParserException;
7+
import org.schabi.newpipe.extractor.*;
8+
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
9+
import org.schabi.newpipe.extractor.exceptions.ParsingException;
10+
import org.schabi.newpipe.extractor.search.InfoItemsSearchCollector;
11+
import org.schabi.newpipe.extractor.search.SearchEngine;
12+
import org.schabi.newpipe.extractor.search.SearchExtractor;
13+
import org.schabi.newpipe.extractor.search.SearchQueryUrlHandler;
14+
import org.schabi.newpipe.extractor.utils.Parser;
15+
16+
import javax.annotation.Nonnull;
17+
import java.io.IOException;
18+
import java.io.UnsupportedEncodingException;
19+
import java.net.MalformedURLException;
20+
import java.net.URL;
21+
22+
import static org.schabi.newpipe.extractor.services.soundcloud.SoundcloudSearchQueryUrlHandler.ITEMS_PER_PAGE;
23+
24+
public class SoundcloudSearchExtractor extends SearchExtractor {
25+
26+
private JsonArray searchCollection;
27+
28+
public SoundcloudSearchExtractor(StreamingService service,
29+
SearchQueryUrlHandler urlIdHandler,
30+
String contentCountry) {
31+
super(service, urlIdHandler, contentCountry);
32+
}
33+
34+
@Override
35+
public String getSearchSuggestion() throws ParsingException {
36+
return null;
37+
}
38+
39+
@Nonnull
40+
@Override
41+
public InfoItemsPage<InfoItem> getInitialPage() throws IOException, ExtractionException {
42+
return new InfoItemsPage<>(collectItems(searchCollection), getNextPageUrl());
43+
}
44+
45+
@Override
46+
public String getNextPageUrl() throws IOException, ExtractionException {
47+
return getNextPageUrlFromCurrentUrl(getUrl());
48+
}
49+
50+
@Override
51+
public InfoItemsPage<InfoItem> getPage(String pageUrl) throws IOException, ExtractionException {
52+
final Downloader dl = getDownloader();
53+
try {
54+
searchCollection = JsonParser.object().from(dl.download(pageUrl)).getArray("collection");
55+
} catch (JsonParserException e) {
56+
throw new ParsingException("Could not parse json response", e);
57+
}
58+
59+
return new InfoItemsPage<>(collectItems(searchCollection), getNextPageUrlFromCurrentUrl(pageUrl));
60+
}
61+
62+
@Override
63+
public void onFetchPage(@Nonnull Downloader downloader) throws IOException, ExtractionException {
64+
final Downloader dl = getDownloader();
65+
final String url = getUrl();
66+
try {
67+
searchCollection = JsonParser.object().from(dl.download(url)).getArray("collection");
68+
} catch (JsonParserException e) {
69+
throw new ParsingException("Could not parse json response", e);
70+
}
71+
72+
if (searchCollection.size() == 0) {
73+
throw new SearchEngine.NothingFoundException("Nothing found");
74+
}
75+
}
76+
77+
private InfoItemsCollector<InfoItem, InfoItemExtractor> collectItems(JsonArray searchCollection) {
78+
final InfoItemsSearchCollector collector = getInfoItemSearchCollector();
79+
80+
for (Object result : searchCollection) {
81+
if (!(result instanceof JsonObject)) continue;
82+
//noinspection ConstantConditions
83+
JsonObject searchResult = (JsonObject) result;
84+
String kind = searchResult.getString("kind", "");
85+
switch (kind) {
86+
case "user":
87+
collector.commit(new SoundcloudChannelInfoItemExtractor(searchResult));
88+
break;
89+
case "track":
90+
collector.commit(new SoundcloudStreamInfoItemExtractor(searchResult));
91+
break;
92+
case "playlist":
93+
collector.commit(new SoundcloudPlaylistInfoItemExtractor(searchResult));
94+
break;
95+
}
96+
}
97+
98+
return collector;
99+
}
100+
101+
private String getNextPageUrlFromCurrentUrl(String currentUrl)
102+
throws MalformedURLException, UnsupportedEncodingException {
103+
final int pageOffset = Integer.parseInt(
104+
Parser.compatParseMap(
105+
new URL(currentUrl)
106+
.getQuery())
107+
.get("offset"));
108+
109+
return currentUrl.replace("&offset=" +
110+
Integer.toString(pageOffset),
111+
"&offset=" + Integer.toString(pageOffset + ITEMS_PER_PAGE));
112+
}
113+
}

extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudQueryUrlHandler.java renamed to extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchQueryUrlHandler.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@
88
import java.io.UnsupportedEncodingException;
99
import java.net.URLEncoder;
1010

11-
public class SoundcloudQueryUrlHandler extends SearchQueryUrlHandler {
11+
public class SoundcloudSearchQueryUrlHandler extends SearchQueryUrlHandler {
1212
public static final String CHARSET_UTF_8 = "UTF-8";
1313

1414
public static final String TRACKS = "tracks";
1515
public static final String USERS = "users";
1616
public static final String PLAYLIST = "playlist";
1717
public static final String ANY = "any";
1818

19+
public static final int ITEMS_PER_PAGE = 10;
20+
1921
@Override
2022
public String getUrl() throws ParsingException {
2123
try {
@@ -40,7 +42,8 @@ public String getUrl() throws ParsingException {
4042

4143
return url + "?q=" + URLEncoder.encode(id, CHARSET_UTF_8)
4244
+ "&client_id=" + SoundcloudParsingHelper.clientId()
43-
+ "&limit=10";
45+
+ "&limit=" + ITEMS_PER_PAGE
46+
+ "&offset=0";
4447

4548
} catch (UnsupportedEncodingException e) {
4649
throw new ParsingException("Could not encode query", e);

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ public SearchEngine getSearchEngine() {
3131

3232
@Override
3333
public SearchExtractor getSearchExtractor(SearchQueryUrlHandler queryHandler, String contentCountry) {
34-
return null;
34+
return new SoundcloudSearchExtractor(this, queryHandler, contentCountry);
3535
}
3636

3737
@Override
3838
public SearchQueryUrlHandler getSearchQueryHandler() {
39-
return null;
39+
return new SoundcloudSearchQueryUrlHandler();
4040
}
4141

4242
@Override
@@ -56,17 +56,17 @@ public ListUrlIdHandler getPlaylistUrlIdHandler() {
5656

5757

5858
@Override
59-
public StreamExtractor getStreamExtractor(UrlIdHandler urlIdHandler) throws ExtractionException {
59+
public StreamExtractor getStreamExtractor(UrlIdHandler urlIdHandler) {
6060
return new SoundcloudStreamExtractor(this, urlIdHandler);
6161
}
6262

6363
@Override
64-
public ChannelExtractor getChannelExtractor(ListUrlIdHandler urlIdHandler) throws ExtractionException {
64+
public ChannelExtractor getChannelExtractor(ListUrlIdHandler urlIdHandler) {
6565
return new SoundcloudChannelExtractor(this, urlIdHandler);
6666
}
6767

6868
@Override
69-
public PlaylistExtractor getPlaylistExtractor(ListUrlIdHandler urlIdHandler) throws ExtractionException {
69+
public PlaylistExtractor getPlaylistExtractor(ListUrlIdHandler urlIdHandler) {
7070
return new SoundcloudPlaylistExtractor(this, urlIdHandler);
7171
}
7272

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,14 @@ public InfoItemsPage<InfoItem> getPage(String pageUrl) throws IOException, Extra
8080

8181
private String getNextPageUrlFromCurrentUrl(String currentUrl)
8282
throws MalformedURLException, UnsupportedEncodingException {
83-
int nextPageNr = Integer.parseInt(
83+
final int pageNr = Integer.parseInt(
8484
Parser.compatParseMap(
8585
new URL(currentUrl)
8686
.getQuery())
87-
.get("page")) + 1;
87+
.get("page"));
8888

89-
return currentUrl.replace("&page=" + Integer.toString( nextPageNr-1),
90-
"&page=" + Integer.toString(nextPageNr));
89+
return currentUrl.replace("&page=" + Integer.toString( pageNr),
90+
"&page=" + Integer.toString(pageNr + 1));
9191
}
9292

9393
private InfoItemsSearchCollector collectItems(Document doc) throws NothingFoundException {

0 commit comments

Comments
 (0)