From 1f4ed9dce96b5b18e75776f74741a4483350f585 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Tue, 17 Jan 2023 21:00:21 +0100 Subject: [PATCH] [YouTube] Fix channel ID extraction of YouTube channel RSS feeds The yt:channelId element doesn't provide the channel ID anymore and is empty, like the id element, so we need now to extract it from the channel URL provided in two elements: author -> uri and feed -> link. Also avoid a NullPointerException in getUrl and getName methods. --- .../extractors/YoutubeFeedExtractor.java | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeFeedExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeFeedExtractor.java index e3369d1e..b46530b8 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeFeedExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeFeedExtractor.java @@ -22,6 +22,8 @@ import java.io.IOException; import javax.annotation.Nonnull; public class YoutubeFeedExtractor extends FeedExtractor { + private static final String WEBSITE_CHANNEL_BASE_URL = "https://www.youtube.com/channel/"; + public YoutubeFeedExtractor(final StreamingService service, final ListLinkHandler linkHandler) { super(service, linkHandler); } @@ -57,19 +59,40 @@ public class YoutubeFeedExtractor extends FeedExtractor { @Nonnull @Override public String getId() { - return document.getElementsByTag("yt:channelId").first().text(); + return getUrl().replace(WEBSITE_CHANNEL_BASE_URL, ""); } @Nonnull @Override public String getUrl() { - return document.select("feed > author > uri").first().text(); + final Element authorUriElement = document.select("feed > author > uri") + .first(); + if (authorUriElement != null) { + final String authorUriElementText = authorUriElement.text(); + if (!authorUriElementText.equals("")) { + return authorUriElementText; + } + } + + final Element linkElement = document.select("feed > link[rel*=alternate]") + .first(); + if (linkElement != null) { + return linkElement.attr("href"); + } + + return ""; } @Nonnull @Override public String getName() { - return document.select("feed > author > name").first().text(); + final Element nameElement = document.select("feed > author > name") + .first(); + if (nameElement == null) { + return ""; + } + + return nameElement.text(); } @Override