diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java index f43fdb43..3bff97e7 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeParsingHelper.java @@ -429,10 +429,16 @@ public class YoutubeParsingHelper { return youtubeMusicKeys = new String[]{key, clientName, clientVersion}; } + + @Nullable public static String getUrlFromNavigationEndpoint(JsonObject navigationEndpoint) throws ParsingException { if (navigationEndpoint.has("urlEndpoint")) { String internUrl = navigationEndpoint.getObject("urlEndpoint").getString("url"); + if (internUrl.startsWith("https://www.youtube.com/redirect?")) { + internUrl = internUrl.substring(23); + } + if (internUrl.startsWith("/redirect?")) { // q parameter can be the first parameter internUrl = internUrl.substring(10); @@ -450,6 +456,8 @@ public class YoutubeParsingHelper { } } else if (internUrl.startsWith("http")) { return internUrl; + } else if (internUrl.startsWith("/channel") || internUrl.startsWith("/user") || internUrl.startsWith("/watch")) { + return "https://www.youtube.com" + internUrl; } } else if (navigationEndpoint.has("browseEndpoint")) { final JsonObject browseEndpoint = navigationEndpoint.getObject("browseEndpoint"); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java index 0551fc5d..3e222552 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamExtractor.java @@ -224,7 +224,7 @@ public class YoutubeStreamExtractor extends StreamExtractor { @Nonnull @Override - public Description getDescription() { + public Description getDescription() throws ParsingException { assertPageFetched(); // description with more info on links try { @@ -234,8 +234,15 @@ public class YoutubeStreamExtractor extends StreamExtractor { // age-restricted videos cause a ParsingException here } + String description = playerResponse.getObject("videoDetails").getString("shortDescription"); + if (description == null) { + final JsonObject descriptionObject = playerResponse.getObject("microformat") + .getObject("playerMicroformatRenderer").getObject("description"); + description = getTextFromObject(descriptionObject); + } + // raw non-html description - return new Description(playerResponse.getObject("videoDetails").getString("shortDescription"), Description.PLAIN_TEXT); + return new Description(description, Description.PLAIN_TEXT); } @Override diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeTrendingExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeTrendingExtractor.java index ac686e72..613169c7 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeTrendingExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeTrendingExtractor.java @@ -69,7 +69,15 @@ public class YoutubeTrendingExtractor extends KioskExtractor { @Nonnull @Override public String getName() throws ParsingException { - String name = getTextFromObject(initialData.getObject("header").getObject("feedTabbedHeaderRenderer").getObject("title")); + final JsonObject header = initialData.getObject("header"); + JsonObject title = null; + if (header.has("feedTabbedHeaderRenderer")) { + title = header.getObject("feedTabbedHeaderRenderer").getObject("title"); + } else if (header.has("c4TabbedHeaderRenderer")) { + title = header.getObject("c4TabbedHeaderRenderer").getObject("title"); + } + + String name = getTextFromObject(title); if (!isNullOrEmpty(name)) { return name; }