Skip to content

Commit 9dab638

Browse files
[YouTube] Use Optional chaining in YoutubePlaylistExtractor
1 parent 30ba0c2 commit 9dab638

File tree

2 files changed

+21
-47
lines changed

2 files changed

+21
-47
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -826,7 +826,7 @@ public static Optional<String> getTextFromObject(@Nonnull final JsonObject textO
826826

827827
final String string;
828828
if (html) {
829-
string = text.replaceAll("\\n", "<br>")
829+
string = text.replace("\\n", "<br>")
830830
.replaceAll(" {2}", " &nbsp;");
831831
} else {
832832
string = text;

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

Lines changed: 20 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import java.nio.charset.StandardCharsets;
3838
import java.util.Base64;
3939
import java.util.List;
40+
import java.util.Optional;
4041

4142
import javax.annotation.Nonnull;
4243
import javax.annotation.Nullable;
@@ -266,52 +267,25 @@ public boolean isUploaderVerified() throws ParsingException {
266267

267268
@Override
268269
public long getStreamCount() throws ParsingException {
269-
if (isNewPlaylistInterface) {
270-
final String numVideosText =
271-
getTextFromObject(getPlaylistHeader().getObject("numVideosText"))
272-
.orElse(null);
273-
if (numVideosText != null) {
274-
try {
275-
return Long.parseLong(Utils.removeNonDigitCharacters(numVideosText));
276-
} catch (final NumberFormatException ignored) {
277-
}
278-
}
279-
280-
final String firstByLineRendererText = getTextFromObject(
281-
getPlaylistHeader().getArray("byline")
282-
.getObject(0)
283-
.getObject("text"))
284-
.orElse(null);
285-
286-
if (firstByLineRendererText != null) {
287-
try {
288-
return Long.parseLong(Utils.removeNonDigitCharacters(firstByLineRendererText));
289-
} catch (final NumberFormatException ignored) {
290-
}
291-
}
292-
}
293-
294-
// These data structures are returned in both layouts
295-
final JsonArray briefStats =
296-
(isNewPlaylistInterface ? getPlaylistHeader() : getPlaylistInfo())
297-
.getArray("briefStats");
298-
if (!briefStats.isEmpty()) {
299-
final var briefsStatsText = getTextFromObject(briefStats.getObject(0)).orElse(null);
300-
if (briefsStatsText != null) {
301-
return Long.parseLong(Utils.removeNonDigitCharacters(briefsStatsText));
302-
}
303-
}
304-
305-
final JsonArray stats = (isNewPlaylistInterface ? getPlaylistHeader() : getPlaylistInfo())
306-
.getArray("stats");
307-
if (!stats.isEmpty()) {
308-
final var statsText = getTextFromObject(stats.getObject(0)).orElse(null);
309-
if (statsText != null) {
310-
return Long.parseLong(Utils.removeNonDigitCharacters(statsText));
311-
}
312-
}
313-
314-
return ITEM_COUNT_UNKNOWN;
270+
final var header = getPlaylistHeader();
271+
final Optional<String> count = isNewPlaylistInterface
272+
? getTextFromObject(header.getObject("numVideosText"))
273+
.or(() -> getTextFromObject(header.getArray("byline")
274+
.getObject(0).getObject("text")))
275+
: Optional.empty();
276+
final var playlist = isNewPlaylistInterface ? header : getPlaylistInfo();
277+
278+
// "briefStats" and "stats" are returned in both layouts
279+
return count.or(() -> getTextFromObject(playlist.getArray("briefStats").getObject(0)))
280+
.or(() -> getTextFromObject(playlist.getArray("stats").getObject(0)))
281+
.map(numText -> {
282+
try {
283+
return Long.parseLong(Utils.removeNonDigitCharacters(numText));
284+
} catch (final NumberFormatException e) {
285+
return null;
286+
}
287+
})
288+
.orElse(ITEM_COUNT_UNKNOWN);
315289
}
316290

317291
@Nonnull

0 commit comments

Comments
 (0)