Skip to content

Commit 8fc0a75

Browse files
authored
Merge pull request #8 from madeyoga/master
Add YoutubeClient.getRecommendationPlaylist
2 parents 00309bb + 05d050e commit 8fc0a75

File tree

4 files changed

+155
-1
lines changed

4 files changed

+155
-1
lines changed

src/main/java/YouTubeSearchApi/YoutubeClient.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package YouTubeSearchApi;
22

3+
import YouTubeSearchApi.entity.YoutubePlaylist;
34
import YouTubeSearchApi.entity.YoutubeVideo;
45
import YouTubeSearchApi.exception.NoResultFoundException;
56
import YouTubeSearchApi.utility.Utils;
@@ -13,6 +14,8 @@
1314
import java.nio.charset.StandardCharsets;
1415
import java.util.ArrayList;
1516
import java.util.List;
17+
import java.util.regex.Matcher;
18+
import java.util.regex.Pattern;
1619

1720
public class YoutubeClient {
1821

@@ -39,7 +42,7 @@ public List<YoutubeVideo> search(String keywords, int maxResults) throws IOExcep
3942
}
4043

4144
if (!foundFeatureFlag) {
42-
throw new NoResultFoundException("what you searched was unfortunately not found or doesn't exist. keywords: " + keywords);
45+
throw new NoResultFoundException("What you searched was unfortunately not found or doesn't exist. keywords: " + keywords);
4346
}
4447

4548

@@ -112,4 +115,36 @@ public YoutubeVideo getInfoByVideoUrl(String videoUrl) throws IOException {
112115

113116
return YoutubeVideo.getParsedOEmbedObject(videoObject);
114117
}
118+
119+
public YoutubePlaylist getRecommendation(String videoId) throws IOException, NoResultFoundException {
120+
String requestUrl = this.YOUTUBE_BASE_URL + "watch?v=" + videoId;
121+
122+
String pageContent = Utils.httpRequest(requestUrl);
123+
124+
Pattern pattern = Pattern.compile(
125+
"\"compactRadioRenderer\"(.+?)\"compactVideoRenderer\"",
126+
Pattern.CASE_INSENSITIVE
127+
);
128+
Matcher matcher = pattern.matcher(pageContent);
129+
130+
if (matcher.find()) {
131+
String compactRadioRenderer = matcher.group();
132+
compactRadioRenderer = "{" + compactRadioRenderer.substring(0,
133+
compactRadioRenderer.length() - ",{\"compactVideoRenderer\"".length());
134+
135+
System.out.println(compactRadioRenderer);
136+
137+
Gson gson = new Gson();
138+
139+
JsonObject compactRadioRendererObject = gson.fromJson(compactRadioRenderer, JsonObject.class)
140+
.get("compactRadioRenderer")
141+
.getAsJsonObject();
142+
YoutubePlaylist youtubePlaylist = YoutubePlaylist.parseCompactRadioRenderer(compactRadioRendererObject);
143+
144+
return youtubePlaylist;
145+
}
146+
else {
147+
throw new NoResultFoundException("Cannot find any recommendation for videoId: " + videoId);
148+
}
149+
}
115150
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package YouTubeSearchApi.entity;
2+
3+
import com.google.gson.JsonObject;
4+
5+
public class YoutubePlaylist {
6+
7+
private String id;
8+
private String url;
9+
private String title;
10+
private String thumbnailUrl;
11+
private String metadataUrl;
12+
13+
public YoutubePlaylist(String id, String url, String title, String thumbnailUrl, String metaDataUrl) {
14+
this.id = id;
15+
this.url = url;
16+
this.title = title;
17+
this.thumbnailUrl = thumbnailUrl;
18+
this.metadataUrl = metaDataUrl;
19+
}
20+
21+
public static YoutubePlaylist parseCompactRadioRenderer(JsonObject compactRadioRendererObject) {
22+
String playlistId = compactRadioRendererObject.get("playlistId").getAsString();
23+
24+
String thumbnailUrl = compactRadioRendererObject.get("thumbnail").getAsJsonObject()
25+
.get("thumbnails").getAsJsonArray()
26+
.get(0).getAsJsonObject()
27+
.get("url").getAsString();
28+
29+
String title = compactRadioRendererObject.get("title").getAsJsonObject()
30+
.get("simpleText").getAsString();
31+
32+
String playlistUrl = compactRadioRendererObject.get("shareUrl").getAsString()
33+
.replace("\\u0026", "&");
34+
35+
String metaDataUrl = compactRadioRendererObject.get("navigationEndpoint").getAsJsonObject()
36+
.get("commandMetadata").getAsJsonObject()
37+
.get("webCommandMetadata").getAsJsonObject()
38+
.get("url").getAsString()
39+
.replace("\\u0026", "&");
40+
41+
return new YoutubePlaylist(playlistId, playlistUrl, title, thumbnailUrl, metaDataUrl);
42+
}
43+
44+
public String getId() {
45+
return id;
46+
}
47+
48+
public void setId(String id) {
49+
this.id = id;
50+
}
51+
52+
public String getUrl() {
53+
return url;
54+
}
55+
56+
public void setUrl(String url) {
57+
this.url = url;
58+
}
59+
60+
public String getTitle() {
61+
return title;
62+
}
63+
64+
public void setTitle(String title) {
65+
this.title = title;
66+
}
67+
68+
public String getThumbnailUrl() {
69+
return thumbnailUrl;
70+
}
71+
72+
public void setThumbnailUrl(String thumbnailUrl) {
73+
this.thumbnailUrl = thumbnailUrl;
74+
}
75+
76+
public String getMetadataUrl() {
77+
return metadataUrl;
78+
}
79+
80+
public void setMetadataUrl(String metadataUrl) {
81+
this.metadataUrl = metadataUrl;
82+
}
83+
84+
@Override
85+
public String toString() {
86+
return "YoutubePlaylist{" +
87+
"id='" + id + '\'' +
88+
", url='" + url + '\'' +
89+
", title='" + title + '\'' +
90+
", thumbnailUrl='" + thumbnailUrl + '\'' +
91+
", metadataUrl='" + metadataUrl + '\'' +
92+
'}';
93+
}
94+
}

src/main/java/YouTubeSearchApi/utility/Utils.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import java.net.URL;
77
import java.net.URLConnection;
88
import java.nio.charset.Charset;
9+
import java.nio.file.Files;
10+
import java.nio.file.Paths;
911

1012
public class Utils {
1113

@@ -42,4 +44,9 @@ public static String httpRequest(String url) throws IOException {
4244

4345
return stringBuilder.toString();
4446
}
47+
48+
public static String readFile(String path, Charset encoding) throws IOException {
49+
byte[] encoded = Files.readAllBytes(Paths.get(path));
50+
return new String(encoded, encoding);
51+
}
4552
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package YouTubeSearchApi;
2+
3+
import YouTubeSearchApi.entity.YoutubePlaylist;
4+
import YouTubeSearchApi.exception.NoResultFoundException;
5+
6+
import java.io.IOException;
7+
8+
public class TestYoutubeClientGetRecommendation {
9+
public static void main(String[] args) {
10+
YoutubeClient client = new YoutubeClient();
11+
try {
12+
YoutubePlaylist youtubePlaylist = client.getRecommendation("oCrwzN6eb4Q");
13+
System.out.println(youtubePlaylist);
14+
} catch (IOException | NoResultFoundException e) {
15+
e.printStackTrace();
16+
}
17+
}
18+
}

0 commit comments

Comments
 (0)