Skip to content

Commit 365b032

Browse files
committed
Implement getTextFromObject() function
1 parent 0798bdd commit 365b032

11 files changed

Lines changed: 185 additions & 172 deletions

File tree

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

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import javax.annotation.Nonnull;
2727

28+
import static org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeParsingHelper.getTextFromObject;
2829
import static org.schabi.newpipe.extractor.utils.Utils.HTTP;
2930
import static org.schabi.newpipe.extractor.utils.Utils.HTTPS;
3031

@@ -124,8 +125,20 @@ public String getName() throws ParsingException {
124125
@Override
125126
public String getAvatarUrl() throws ParsingException {
126127
try {
127-
return initialData.getObject("header").getObject("c4TabbedHeaderRenderer").getObject("avatar")
128+
String url = initialData.getObject("header").getObject("c4TabbedHeaderRenderer").getObject("avatar")
128129
.getArray("thumbnails").getObject(0).getString("url");
130+
131+
// the first characters of the avatar URLs are different for each channel and some are not even valid URLs
132+
if (url.startsWith("//")) {
133+
url = url.substring(2);
134+
}
135+
if (url.startsWith(HTTP)) {
136+
url = Utils.replaceHttpWithHttps(url);
137+
} else if (!url.startsWith(HTTPS)) {
138+
url = HTTPS + url;
139+
}
140+
141+
return url;
129142
} catch (Exception e) {
130143
throw new ParsingException("Could not get avatar", e);
131144
}
@@ -172,7 +185,7 @@ public long getSubscriberCount() throws ParsingException {
172185
final JsonObject subscriberInfo = initialData.getObject("header").getObject("c4TabbedHeaderRenderer").getObject("subscriberCountText");
173186
if (subscriberInfo != null) {
174187
try {
175-
return Utils.mixedNumberWordToLong(subscriberInfo.getArray("runs").getObject(0).getString("text"));
188+
return Utils.mixedNumberWordToLong(getTextFromObject(subscriberInfo));
176189
} catch (NumberFormatException e) {
177190
throw new ParsingException("Could not get subscriber count", e);
178191
}
@@ -301,10 +314,10 @@ private JsonObject getVideoTab() throws ParsingException {
301314
}
302315

303316
try {
304-
if (videoTab.getObject("content").getObject("sectionListRenderer").getArray("contents")
305-
.getObject(0).getObject("itemSectionRenderer").getArray("contents")
306-
.getObject(0).getObject("messageRenderer").getObject("text").getArray("runs")
307-
.getObject(0).getString("text").equals("This channel has no videos."))
317+
if (getTextFromObject(videoTab.getObject("content").getObject("sectionListRenderer")
318+
.getArray("contents").getObject(0).getObject("itemSectionRenderer")
319+
.getArray("contents").getObject(0).getObject("messageRenderer")
320+
.getObject("text")).equals("This channel has no videos."))
308321
return null;
309322
} catch (Exception ignored) {}
310323

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

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

3-
import com.grack.nanojson.JsonArray;
43
import com.grack.nanojson.JsonObject;
54

65
import org.schabi.newpipe.extractor.channel.ChannelInfoItemExtractor;
76
import org.schabi.newpipe.extractor.exceptions.ParsingException;
87
import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeChannelLinkHandlerFactory;
98
import org.schabi.newpipe.extractor.utils.Utils;
109

10+
import static org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeParsingHelper.getTextFromObject;
1111
import static org.schabi.newpipe.extractor.utils.Utils.HTTP;
1212
import static org.schabi.newpipe.extractor.utils.Utils.HTTPS;
1313

@@ -59,7 +59,7 @@ public String getThumbnailUrl() throws ParsingException {
5959
@Override
6060
public String getName() throws ParsingException {
6161
try {
62-
return channelInfoItem.getObject("title").getString("simpleText");
62+
return getTextFromObject(channelInfoItem.getObject("title"));
6363
} catch (Exception e) {
6464
throw new ParsingException("Could not get name", e);
6565
}
@@ -68,7 +68,7 @@ public String getName() throws ParsingException {
6868
@Override
6969
public String getUrl() throws ParsingException {
7070
try {
71-
String id = "channel/" + channelInfoItem.getString("channelId"); // Does prepending 'channel/' always work?
71+
String id = "channel/" + channelInfoItem.getString("channelId");
7272
return YoutubeChannelLinkHandlerFactory.getInstance().getUrl(id);
7373
} catch (Exception e) {
7474
throw new ParsingException("Could not get url", e);
@@ -78,7 +78,7 @@ public String getUrl() throws ParsingException {
7878
@Override
7979
public long getSubscriberCount() throws ParsingException {
8080
try {
81-
String subscribers = channelInfoItem.getObject("subscriberCountText").getString("simpleText").split(" ")[0];
81+
String subscribers = getTextFromObject(channelInfoItem.getObject("subscriberCountText"));
8282
return Utils.mixedNumberWordToLong(subscribers);
8383
} catch (Exception e) {
8484
throw new ParsingException("Could not get subscriber count", e);
@@ -88,8 +88,7 @@ public long getSubscriberCount() throws ParsingException {
8888
@Override
8989
public long getStreamCount() throws ParsingException {
9090
try {
91-
return Long.parseLong(Utils.removeNonDigitCharacters(channelInfoItem.getObject("videoCountText")
92-
.getArray("runs").getObject(0).getString("text")));
91+
return Long.parseLong(Utils.removeNonDigitCharacters(getTextFromObject(channelInfoItem.getObject("videoCountText"))));
9392
} catch (Exception e) {
9493
throw new ParsingException("Could not get stream count", e);
9594
}
@@ -98,11 +97,7 @@ public long getStreamCount() throws ParsingException {
9897
@Override
9998
public String getDescription() throws ParsingException {
10099
try {
101-
StringBuilder description = new StringBuilder();
102-
JsonArray descriptionArray = channelInfoItem.getObject("descriptionSnippet").getArray("runs");
103-
for (Object descriptionPart : descriptionArray)
104-
description.append(((JsonObject) descriptionPart).getString("text"));
105-
return description.toString();
100+
return getTextFromObject(channelInfoItem.getObject("descriptionSnippet"));
106101
} catch (Exception e) {
107102
throw new ParsingException("Could not get description", e);
108103
}

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

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@
2525

2626
import javax.annotation.Nonnull;
2727

28+
import static org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeParsingHelper.getTextFromObject;
29+
import static org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeParsingHelper.getUrlFromNavigationEndpoint;
30+
import static org.schabi.newpipe.extractor.utils.Utils.HTTP;
31+
import static org.schabi.newpipe.extractor.utils.Utils.HTTPS;
32+
2833
@SuppressWarnings("WeakerAccess")
2934
public class YoutubePlaylistExtractor extends PlaylistExtractor {
3035
private JsonObject initialData;
@@ -104,7 +109,7 @@ public String getNextPageUrl() {
104109
@Override
105110
public String getName() throws ParsingException {
106111
try {
107-
String name = playlistInfo.getObject("title").getArray("runs").getObject(0).getString("text");
112+
String name = getTextFromObject(playlistInfo.getObject("title"));
108113
if (name != null) return name;
109114
} catch (Exception ignored) {}
110115
try {
@@ -137,8 +142,7 @@ public String getBannerUrl() {
137142
@Override
138143
public String getUploaderUrl() throws ParsingException {
139144
try {
140-
return YoutubeChannelExtractor.CHANNEL_URL_BASE +
141-
getUploaderInfo().getObject("navigationEndpoint").getObject("browseEndpoint").getString("browseId");
145+
return getUrlFromNavigationEndpoint(getUploaderInfo().getObject("navigationEndpoint"));
142146
} catch (Exception e) {
143147
throw new ParsingException("Could not get playlist uploader url", e);
144148
}
@@ -147,7 +151,7 @@ public String getUploaderUrl() throws ParsingException {
147151
@Override
148152
public String getUploaderName() throws ParsingException {
149153
try {
150-
return getUploaderInfo().getObject("title").getArray("runs").getObject(0).getString("text");
154+
return getTextFromObject(getUploaderInfo().getObject("title"));
151155
} catch (Exception e) {
152156
throw new ParsingException("Could not get playlist uploader name", e);
153157
}
@@ -156,7 +160,19 @@ public String getUploaderName() throws ParsingException {
156160
@Override
157161
public String getUploaderAvatarUrl() throws ParsingException {
158162
try {
159-
return getUploaderInfo().getObject("thumbnail").getArray("thumbnails").getObject(0).getString("url");
163+
String url = getUploaderInfo().getObject("thumbnail").getArray("thumbnails").getObject(0).getString("url");
164+
165+
// the first characters of the avatar URLs are different for each channel and some are not even valid URLs
166+
if (url.startsWith("//")) {
167+
url = url.substring(2);
168+
}
169+
if (url.startsWith(HTTP)) {
170+
url = Utils.replaceHttpWithHttps(url);
171+
} else if (!url.startsWith(HTTPS)) {
172+
url = HTTPS + url;
173+
}
174+
175+
return url;
160176
} catch (Exception e) {
161177
throw new ParsingException("Could not get playlist uploader avatar", e);
162178
}
@@ -165,7 +181,7 @@ public String getUploaderAvatarUrl() throws ParsingException {
165181
@Override
166182
public long getStreamCount() throws ParsingException {
167183
try {
168-
String viewsText = getPlaylistInfo().getArray("stats").getObject(0).getArray("runs").getObject(0).getString("text");
184+
String viewsText = getTextFromObject(getPlaylistInfo().getArray("stats").getObject(0));
169185
return Long.parseLong(Utils.removeNonDigitCharacters(viewsText));
170186
} catch (Exception e) {
171187
throw new ParsingException("Could not get video count from playlist", e);

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubePlaylistLinkHandlerFactory;
88
import org.schabi.newpipe.extractor.utils.Utils;
99

10+
import static org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeParsingHelper.getTextFromObject;
11+
1012
public class YoutubePlaylistInfoItemExtractor implements PlaylistInfoItemExtractor {
1113
private JsonObject playlistInfoItem;
1214

@@ -27,7 +29,7 @@ public String getThumbnailUrl() throws ParsingException {
2729
@Override
2830
public String getName() throws ParsingException {
2931
try {
30-
return playlistInfoItem.getObject("title").getString("simpleText");
32+
return getTextFromObject(playlistInfoItem.getObject("title"));
3133
} catch (Exception e) {
3234
throw new ParsingException("Could not get name", e);
3335
}
@@ -46,7 +48,7 @@ public String getUrl() throws ParsingException {
4648
@Override
4749
public String getUploaderName() throws ParsingException {
4850
try {
49-
return playlistInfoItem.getObject("longBylineText").getArray("runs").getObject(0).getString("text");
51+
return getTextFromObject(playlistInfoItem.getObject("longBylineText"));
5052
} catch (Exception e) {
5153
throw new ParsingException("Could not get uploader name", e);
5254
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424

2525
import javax.annotation.Nonnull;
2626

27+
import static org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeParsingHelper.getTextFromObject;
28+
2729
/*
2830
* Created by Christian Schabesberger on 22.07.2018
2931
*
@@ -91,8 +93,7 @@ public String getSearchSuggestion() {
9193
if (showingResultsForRenderer == null) {
9294
return "";
9395
} else {
94-
return showingResultsForRenderer.getObject("correctedQuery").getArray("runs")
95-
.getObject(0).getString("text");
96+
return getTextFromObject(showingResultsForRenderer.getObject("correctedQuery"));
9697
}
9798
}
9899

@@ -155,8 +156,8 @@ private void collectStreamsFrom(InfoItemsSearchCollector collector, JsonArray vi
155156

156157
for (Object item : videos) {
157158
if (((JsonObject) item).getObject("backgroundPromoRenderer") != null) {
158-
throw new NothingFoundException(((JsonObject) item).getObject("backgroundPromoRenderer")
159-
.getObject("bodyText").getArray("runs").getObject(0).getString("text"));
159+
throw new NothingFoundException(getTextFromObject(((JsonObject) item)
160+
.getObject("backgroundPromoRenderer").getObject("bodyText")));
160161
} else if (((JsonObject) item).getObject("videoRenderer") != null) {
161162
collector.commit(new YoutubeStreamInfoItemExtractor(((JsonObject) item).getObject("videoRenderer"), timeAgoParser));
162163
} else if (((JsonObject) item).getObject("channelRenderer") != null) {

0 commit comments

Comments
 (0)