From 701666f4982514e06a6afa0ed7eaf6b07251159b Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sat, 4 Aug 2018 14:20:27 +0200 Subject: [PATCH] block yt premium videos fix logig error for block yt premium videos --- .../YoutubeStreamInfoItemExtractor.java | 15 ++- .../youtube/YoutubeChannelExtractorTest.java | 97 +++++++++++++++++++ 2 files changed, 111 insertions(+), 1 deletion(-) diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamInfoItemExtractor.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamInfoItemExtractor.java index a948bfcf..1aca5939 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamInfoItemExtractor.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/extractors/YoutubeStreamInfoItemExtractor.java @@ -45,7 +45,17 @@ public class YoutubeStreamInfoItemExtractor implements StreamInfoItemExtractor { @Override public boolean isAd() throws ParsingException { return !item.select("span[class*=\"icon-not-available\"]").isEmpty() - || !item.select("span[class*=\"yt-badge-ad\"]").isEmpty(); + || !item.select("span[class*=\"yt-badge-ad\"]").isEmpty() + || isPremiumVideo(); + } + + private boolean isPremiumVideo() { + Element premiumSpan = item.select("span[class=\"standalone-collection-badge-renderer-red-text\"]").first(); + if(premiumSpan == null) return false; + + // if this span has text it most likely says ("Free Video") so we can play this + if(premiumSpan.hasText()) return false; + return true; } @Override @@ -119,6 +129,9 @@ public class YoutubeStreamInfoItemExtractor implements StreamInfoItemExtractor { Element meta = item.select("div[class=\"yt-lockup-meta\"]").first(); if (meta == null) return ""; + Element li = meta.select("li").first(); + if(li == null) return ""; + return meta.select("li").first().text(); } catch (Exception e) { throw new ParsingException("Could not get upload date", e); diff --git a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractorTest.java b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractorTest.java index c9ab333f..22ec1dd0 100644 --- a/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractorTest.java +++ b/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractorTest.java @@ -114,6 +114,103 @@ public class YoutubeChannelExtractorTest { } } + // Youtube RED/Premium ad blocking test + public static class VSauce implements BaseChannelExtractorTest { + private static YoutubeChannelExtractor extractor; + + @BeforeClass + public static void setUp() throws Exception { + NewPipe.init(Downloader.getInstance()); + extractor = (YoutubeChannelExtractor) YouTube + .getChannelExtractor("https://www.youtube.com/user/Vsauce"); + extractor.fetchPage(); + } + + /*////////////////////////////////////////////////////////////////////////// + // Extractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testServiceId() { + assertEquals(YouTube.getServiceId(), extractor.getServiceId()); + } + + @Test + public void testName() throws Exception { + assertEquals("Vsauce", extractor.getName()); + } + + @Test + public void testId() throws Exception { + assertEquals("UC6nSFpj9HTCZ5t-N3Rm3-HA", extractor.getId()); + } + + @Test + public void testUrl() throws ParsingException { + assertEquals("https://www.youtube.com/channel/UC6nSFpj9HTCZ5t-N3Rm3-HA", extractor.getUrl()); + } + + @Test + public void testOriginalUrl() throws ParsingException { + assertEquals("https://www.youtube.com/user/Vsauce", extractor.getOriginalUrl()); + } + + /*////////////////////////////////////////////////////////////////////////// + // ListExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testRelatedItems() throws Exception { + defaultTestRelatedItems(extractor, YouTube.getServiceId()); + } + + @Test + public void testMoreRelatedItems() throws Exception { + defaultTestMoreItems(extractor, ServiceList.YouTube.getServiceId()); + } + + /*////////////////////////////////////////////////////////////////////////// + // ChannelExtractor + //////////////////////////////////////////////////////////////////////////*/ + + @Test + public void testDescription() throws Exception { + assertTrue("What it actually was: " + extractor.getDescription(), + extractor.getDescription().contains("Our World is Amazing. Questions? Ideas? Tweet me:")); + } + + @Test + public void testAvatarUrl() throws Exception { + String avatarUrl = extractor.getAvatarUrl(); + assertIsSecureUrl(avatarUrl); + assertTrue(avatarUrl, avatarUrl.contains("yt3")); + } + + @Test + public void testBannerUrl() throws Exception { + String bannerUrl = extractor.getBannerUrl(); + assertIsSecureUrl(bannerUrl); + assertTrue(bannerUrl, bannerUrl.contains("yt3")); + } + + @Test + public void testFeedUrl() throws Exception { + assertEquals("https://www.youtube.com/feeds/videos.xml?channel_id=UC6nSFpj9HTCZ5t-N3Rm3-HA", extractor.getFeedUrl()); + } + + @Test + public void testSubscriberCount() throws Exception { + assertTrue("Wrong subscriber count", extractor.getSubscriberCount() >= 0); + } + + @Test + public void testChannelDonation() throws Exception { + // this needs to be ignored since wed have to upgrade channel extractor to the new yt interface + // in order to make this work + assertTrue(extractor.getDonationLinks().length == 0); + } + } + public static class Kurzgesagt implements BaseChannelExtractorTest { private static YoutubeChannelExtractor extractor;