From dc109d78f8df25bda6a0d978728b226888aa2136 Mon Sep 17 00:00:00 2001 From: Coffeemakr Date: Sat, 25 Nov 2017 01:10:04 +0100 Subject: [PATCH] Fix bugs and present some in the future --- build.gradle | 2 +- .../schabi/newpipe/extractor/Extractor.java | 15 +++ .../extractor/channel/ChannelExtractor.java | 2 + .../extractor/channel/ChannelInfo.java | 2 - .../extractor/kiosk/KioskExtractor.java | 3 + .../newpipe/extractor/kiosk/KioskList.java | 3 - .../extractor/playlist/PlaylistExtractor.java | 2 + .../extractor/playlist/PlaylistInfo.java | 1 - .../extractor/search/SearchResult.java | 6 +- .../SoundcloudChannelExtractor.java | 4 + .../soundcloud/SoundcloudChartsExtractor.java | 4 + .../SoundcloudPlaylistExtractor.java | 4 + .../soundcloud/SoundcloudStreamExtractor.java | 11 ++ .../youtube/YoutubeChannelExtractor.java | 4 + .../youtube/YoutubePlaylistExtractor.java | 3 + .../youtube/YoutubeStreamExtractor.java | 121 +++++++++++------- .../youtube/YoutubeTrendingExtractor.java | 3 + .../extractor/stream/StreamExtractor.java | 14 +- .../newpipe/extractor/stream/StreamInfo.java | 1 - .../java/org/schabi/newpipe/Downloader.java | 6 +- .../SoundcloudChartsExtractorTest.java | 3 - .../SoundcloudSearchEngineAllTest.java | 4 +- .../SoundcloudSearchEngineChannelTest.java | 3 +- .../SoundcloudSearchEnginePlaylistTest.java | 3 +- .../SoundcloudSearchEngineStreamTest.java | 3 +- .../youtube/YoutubeSearchEngineAllTest.java | 2 - .../YoutubeSearchEngineChannelTest.java | 3 +- .../YoutubeSearchEnginePlaylistTest.java | 3 +- .../YoutubeSearchEngineStreamTest.java | 3 +- .../services/youtube/YoutubeServiceTest.java | 1 - .../YoutubeStreamExtractorDefaultTest.java | 7 +- .../YoutubeStreamExtractorRestrictedTest.java | 23 ++-- .../youtube/YoutubeTrendingExtractorTest.java | 1 - 33 files changed, 182 insertions(+), 88 deletions(-) diff --git a/build.gradle b/build.gradle index 8c9923265..f8b8b0a6d 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ dependencies { implementation 'com.grack:nanojson:1.1' implementation 'org.jsoup:jsoup:1.9.2' implementation 'org.mozilla:rhino:1.7.7.1' - + implementation 'com.github.spotbugs:spotbugs:3.1.0' testImplementation 'junit:junit:4.12' } diff --git a/src/main/java/org/schabi/newpipe/extractor/Extractor.java b/src/main/java/org/schabi/newpipe/extractor/Extractor.java index 6cfd5f723..3e0456a94 100644 --- a/src/main/java/org/schabi/newpipe/extractor/Extractor.java +++ b/src/main/java/org/schabi/newpipe/extractor/Extractor.java @@ -3,6 +3,8 @@ package org.schabi.newpipe.extractor; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.io.IOException; public abstract class Extractor { @@ -29,6 +31,7 @@ public abstract class Extractor { *

* Is lazily-cleaned by calling {@link #getCleanUrl()} */ + @Nullable private String cleanUrl; public Extractor(StreamingService service, String url) throws ExtractionException { @@ -41,6 +44,7 @@ public abstract class Extractor { /** * @return a {@link UrlIdHandler} of the current extractor type (e.g. a ChannelExtractor should return a channel url handler). */ + @Nonnull protected abstract UrlIdHandler getUrlIdHandler() throws ParsingException; /** @@ -48,9 +52,18 @@ public abstract class Extractor { */ public abstract void fetchPage() throws IOException, ExtractionException; + @Nonnull public abstract String getId() throws ParsingException; + + /** + * Get the name + * @return the name + * @throws ParsingException if the name cannot be extracted + */ + @Nonnull public abstract String getName() throws ParsingException; + @Nonnull public String getOriginalUrl() { return originalUrl; } @@ -59,6 +72,7 @@ public abstract class Extractor { * Get a clean url and as a fallback the original url. * @return the clean url or the original url */ + @Nonnull public String getCleanUrl() { if (cleanUrl != null && !cleanUrl.isEmpty()) return cleanUrl; @@ -72,6 +86,7 @@ public abstract class Extractor { return cleanUrl; } + @Nonnull public StreamingService getService() { return service; } diff --git a/src/main/java/org/schabi/newpipe/extractor/channel/ChannelExtractor.java b/src/main/java/org/schabi/newpipe/extractor/channel/ChannelExtractor.java index cb44ffd64..db909fb9b 100644 --- a/src/main/java/org/schabi/newpipe/extractor/channel/ChannelExtractor.java +++ b/src/main/java/org/schabi/newpipe/extractor/channel/ChannelExtractor.java @@ -6,6 +6,7 @@ import org.schabi.newpipe.extractor.UrlIdHandler; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; +import javax.annotation.Nonnull; import java.io.IOException; /* @@ -34,6 +35,7 @@ public abstract class ChannelExtractor extends ListExtractor { super(service, url, nextStreamsUrl); } + @Nonnull @Override protected UrlIdHandler getUrlIdHandler() throws ParsingException { return getService().getChannelUrlIdHandler(); diff --git a/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java b/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java index 9d30c9829..f402a6a7f 100644 --- a/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java +++ b/src/main/java/org/schabi/newpipe/extractor/channel/ChannelInfo.java @@ -7,11 +7,9 @@ import org.schabi.newpipe.extractor.ServiceList; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; -import org.schabi.newpipe.extractor.stream.StreamInfoItemCollector; import org.schabi.newpipe.extractor.utils.ExtractorHelper; import java.io.IOException; -import java.util.ArrayList; /* * Created by Christian Schabesberger on 31.07.16. diff --git a/src/main/java/org/schabi/newpipe/extractor/kiosk/KioskExtractor.java b/src/main/java/org/schabi/newpipe/extractor/kiosk/KioskExtractor.java index e11e89b0c..5df579e7a 100644 --- a/src/main/java/org/schabi/newpipe/extractor/kiosk/KioskExtractor.java +++ b/src/main/java/org/schabi/newpipe/extractor/kiosk/KioskExtractor.java @@ -25,6 +25,7 @@ import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; +import javax.annotation.Nonnull; import java.io.IOException; public abstract class KioskExtractor extends ListExtractor { @@ -51,6 +52,7 @@ public abstract class KioskExtractor extends ListExtractor { } + @Nonnull @Override public String getId() throws ParsingException { return id; @@ -64,6 +66,7 @@ public abstract class KioskExtractor extends ListExtractor { * @return the tranlsated version of id * @throws ParsingException */ + @Nonnull @Override public abstract String getName() throws ParsingException; diff --git a/src/main/java/org/schabi/newpipe/extractor/kiosk/KioskList.java b/src/main/java/org/schabi/newpipe/extractor/kiosk/KioskList.java index da81af04d..bbaab0092 100644 --- a/src/main/java/org/schabi/newpipe/extractor/kiosk/KioskList.java +++ b/src/main/java/org/schabi/newpipe/extractor/kiosk/KioskList.java @@ -1,16 +1,13 @@ package org.schabi.newpipe.extractor.kiosk; import org.schabi.newpipe.extractor.NewPipe; -import org.schabi.newpipe.extractor.ServiceList; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.UrlIdHandler; import org.schabi.newpipe.extractor.exceptions.ExtractionException; -import java.io.IOError; import java.io.IOException; import java.util.HashMap; import java.util.Map; -import java.util.Random; import java.util.Set; public class KioskList { diff --git a/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistExtractor.java b/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistExtractor.java index 41844bb88..2223c6a09 100644 --- a/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistExtractor.java +++ b/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistExtractor.java @@ -6,6 +6,7 @@ import org.schabi.newpipe.extractor.UrlIdHandler; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; +import javax.annotation.Nonnull; import java.io.IOException; public abstract class PlaylistExtractor extends ListExtractor { @@ -14,6 +15,7 @@ public abstract class PlaylistExtractor extends ListExtractor { super(service, url, nextStreamsUrl); } + @Nonnull @Override protected UrlIdHandler getUrlIdHandler() throws ParsingException { return getService().getPlaylistUrlIdHandler(); diff --git a/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistInfo.java b/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistInfo.java index f8f2a2114..9a766fdea 100644 --- a/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistInfo.java +++ b/src/main/java/org/schabi/newpipe/extractor/playlist/PlaylistInfo.java @@ -4,7 +4,6 @@ import org.schabi.newpipe.extractor.*; import org.schabi.newpipe.extractor.ListExtractor.NextItemsResult; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; -import org.schabi.newpipe.extractor.utils.ExtractorHelper; import java.io.IOException; diff --git a/src/main/java/org/schabi/newpipe/extractor/search/SearchResult.java b/src/main/java/org/schabi/newpipe/extractor/search/SearchResult.java index 14bb8fcff..2b2618e35 100644 --- a/src/main/java/org/schabi/newpipe/extractor/search/SearchResult.java +++ b/src/main/java/org/schabi/newpipe/extractor/search/SearchResult.java @@ -3,9 +3,9 @@ package org.schabi.newpipe.extractor.search; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import javax.annotation.Nonnull; import java.io.IOException; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; @@ -32,7 +32,9 @@ import java.util.List; public class SearchResult { private final int serviceId; public final String suggestion; + @Nonnull public final List resultList; + @Nonnull public final List errors; public SearchResult(int serviceId, String suggestion, List results, List errors) { @@ -66,10 +68,12 @@ public class SearchResult { } + @Nonnull public List getResults() { return Collections.unmodifiableList(resultList); } + @Nonnull public List getErrors() { return errors; } diff --git a/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelExtractor.java index 3cab5dd8b..b54febae8 100644 --- a/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelExtractor.java +++ b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChannelExtractor.java @@ -11,6 +11,7 @@ import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.stream.StreamInfoItemCollector; +import javax.annotation.Nonnull; import java.io.IOException; @SuppressWarnings("WeakerAccess") @@ -38,16 +39,19 @@ public class SoundcloudChannelExtractor extends ChannelExtractor { } } + @Nonnull @Override public String getCleanUrl() { return user.isString("permalink_url") ? user.getString("permalink_url") : getOriginalUrl(); } + @Nonnull @Override public String getId() { return userId; } + @Nonnull @Override public String getName() { return user.getString("username"); diff --git a/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChartsExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChartsExtractor.java index b1466e8f5..c7a1e6ff2 100644 --- a/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChartsExtractor.java +++ b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChartsExtractor.java @@ -11,6 +11,8 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.kiosk.KioskExtractor; import org.schabi.newpipe.extractor.stream.StreamInfoItemCollector; +import javax.annotation.Nonnull; + public class SoundcloudChartsExtractor extends KioskExtractor { private String url; @@ -24,11 +26,13 @@ public class SoundcloudChartsExtractor extends KioskExtractor { public void fetchPage() { } + @Nonnull @Override public String getName() throws ParsingException { return "< Implement me (♥_♥) >"; } + @Nonnull @Override public UrlIdHandler getUrlIdHandler() { return new SoundcloudChartsUrlIdHandler(); diff --git a/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudPlaylistExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudPlaylistExtractor.java index b21e585be..df2b5bd51 100644 --- a/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudPlaylistExtractor.java +++ b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudPlaylistExtractor.java @@ -11,6 +11,7 @@ import org.schabi.newpipe.extractor.exceptions.ParsingException; import org.schabi.newpipe.extractor.playlist.PlaylistExtractor; import org.schabi.newpipe.extractor.stream.StreamInfoItemCollector; +import javax.annotation.Nonnull; import java.io.IOException; @SuppressWarnings("WeakerAccess") @@ -39,16 +40,19 @@ public class SoundcloudPlaylistExtractor extends PlaylistExtractor { } } + @Nonnull @Override public String getCleanUrl() { return playlist.isString("permalink_url") ? playlist.getString("permalink_url") : getOriginalUrl(); } + @Nonnull @Override public String getId() { return playlistId; } + @Nonnull @Override public String getName() { return playlist.getString("title"); diff --git a/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamExtractor.java index 5e790bcbf..a01ec1792 100644 --- a/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamExtractor.java +++ b/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudStreamExtractor.java @@ -11,6 +11,7 @@ import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; import org.schabi.newpipe.extractor.stream.*; import org.schabi.newpipe.extractor.utils.Parser; +import javax.annotation.Nonnull; import java.io.IOException; import java.util.*; @@ -19,6 +20,7 @@ public class SoundcloudStreamExtractor extends StreamExtractor { public SoundcloudStreamExtractor(StreamingService service, String url) throws IOException, ExtractionException { super(service, url); + fetchPage(); } @Override @@ -31,31 +33,37 @@ public class SoundcloudStreamExtractor extends StreamExtractor { } } + @Nonnull @Override public String getCleanUrl() { return track.isString("permalink_url") ? track.getString("permalink_url") : getOriginalUrl(); } + @Nonnull @Override public String getId() { return track.getInt("id") + ""; } + @Nonnull @Override public String getName() { return track.getString("title"); } + @Nonnull @Override public String getUploadDate() throws ParsingException { return SoundcloudParsingHelper.toDateString(track.getString("created_at")); } + @Nonnull @Override public String getThumbnailUrl() { return track.getString("artwork_url", ""); } + @Nonnull @Override public String getDescription() { return track.getString("description"); @@ -91,16 +99,19 @@ public class SoundcloudStreamExtractor extends StreamExtractor { return -1; } + @Nonnull @Override public String getUploaderUrl() { return track.getObject("user").getString("permalink_url", ""); } + @Nonnull @Override public String getUploaderName() { return track.getObject("user").getString("username", ""); } + @Nonnull @Override public String getUploaderAvatarUrl() { return track.getObject("user", new JsonObject()).getString("avatar_url", ""); diff --git a/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractor.java index f8a460643..b2178baac 100644 --- a/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractor.java +++ b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeChannelExtractor.java @@ -18,6 +18,7 @@ import org.schabi.newpipe.extractor.stream.StreamInfoItemCollector; import org.schabi.newpipe.extractor.utils.Parser; import org.schabi.newpipe.extractor.utils.Utils; +import javax.annotation.Nonnull; import java.io.IOException; /* @@ -79,6 +80,7 @@ public class YoutubeChannelExtractor extends ChannelExtractor { return true; } + @Nonnull @Override public String getCleanUrl() { try { @@ -88,6 +90,7 @@ public class YoutubeChannelExtractor extends ChannelExtractor { } } + @Nonnull @Override public String getId() throws ParsingException { try { @@ -100,6 +103,7 @@ public class YoutubeChannelExtractor extends ChannelExtractor { } } + @Nonnull @Override public String getName() throws ParsingException { try { diff --git a/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubePlaylistExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubePlaylistExtractor.java index feae173f3..de3b485b9 100644 --- a/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubePlaylistExtractor.java +++ b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubePlaylistExtractor.java @@ -19,6 +19,7 @@ import org.schabi.newpipe.extractor.stream.StreamType; import org.schabi.newpipe.extractor.utils.Parser; import org.schabi.newpipe.extractor.utils.Utils; +import javax.annotation.Nonnull; import java.io.IOException; @SuppressWarnings("WeakerAccess") @@ -45,6 +46,7 @@ public class YoutubePlaylistExtractor extends PlaylistExtractor { nextStreamsAjax = null; } + @Nonnull @Override public String getId() throws ParsingException { try { @@ -54,6 +56,7 @@ public class YoutubePlaylistExtractor extends PlaylistExtractor { } } + @Nonnull @Override public String getName() throws ParsingException { try { diff --git a/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractor.java b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractor.java index 84eb1c1e3..cefd7e783 100644 --- a/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractor.java +++ b/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractor.java @@ -22,6 +22,8 @@ import org.schabi.newpipe.extractor.stream.*; import org.schabi.newpipe.extractor.utils.Parser; import org.schabi.newpipe.extractor.utils.Utils; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.io.IOException; import java.util.*; import java.util.regex.Matcher; @@ -75,19 +77,23 @@ public class YoutubeStreamExtractor extends StreamExtractor { /*//////////////////////////////////////////////////////////////////////////*/ private Document doc; + @Nullable private JsonObject playerArgs; - private Map videoInfoPage; + @Nonnull + private final Map videoInfoPage = new HashMap<>(); private boolean isAgeRestricted; public YoutubeStreamExtractor(StreamingService service, String url) throws IOException, ExtractionException { super(service, url); + fetchPage(); } /*////////////////////////////////////////////////////////////////////////// // Impl //////////////////////////////////////////////////////////////////////////*/ + @Nonnull @Override public String getId() throws ParsingException { try { @@ -97,28 +103,25 @@ public class YoutubeStreamExtractor extends StreamExtractor { } } + @Nonnull @Override public String getName() throws ParsingException { - try { - return playerArgs.getString("title"); - } catch (Exception ignored) { - // Try other method... - } - - try { - return videoInfoPage.get("title"); - } catch (Exception ignored) { - // Try other method... - } - - try { + String name = getStringFromMetaData("title"); + if(name == null) { // Fallback to HTML method - return doc.select("meta[name=title]").attr(CONTENT); - } catch (Exception e) { - throw new ParsingException("Could not get the title", e); + try { + name = doc.select("meta[name=title]").attr(CONTENT); + } catch (Exception e) { + throw new ParsingException("Could not get the title", e); + } } + if(name == null || name.isEmpty()) { + throw new ParsingException("Could not get the title"); + } + return name; } + @Nonnull @Override public String getUploadDate() throws ParsingException { try { @@ -128,6 +131,7 @@ public class YoutubeStreamExtractor extends StreamExtractor { } } + @Nonnull @Override public String getThumbnailUrl() throws ParsingException { // Try to get high resolution thumbnail first, if it fails, use low res from the player instead @@ -138,7 +142,7 @@ public class YoutubeStreamExtractor extends StreamExtractor { } try { - if (playerArgs.isString("thumbnail_url")) return playerArgs.getString("thumbnail_url"); + if (playerArgs != null && playerArgs.isString("thumbnail_url")) return playerArgs.getString("thumbnail_url"); } catch (Exception ignored) { // Try other method... } @@ -150,6 +154,7 @@ public class YoutubeStreamExtractor extends StreamExtractor { } } + @Nonnull @Override public String getDescription() throws ParsingException { try { @@ -174,23 +179,27 @@ public class YoutubeStreamExtractor extends StreamExtractor { @Override public long getLength() throws ParsingException { + if(playerArgs != null) { + try { + long returnValue = Long.parseLong(playerArgs.get("length_seconds") + ""); + if (returnValue >= 0) return returnValue; + } catch (Exception ignored) { + // Try other method... + } + } + + String lengthString = videoInfoPage.get("length_seconds"); try { - long returnValue = Long.parseLong(playerArgs.get("length_seconds") + ""); - if (returnValue >= 0) return returnValue; - } catch (Exception ignored) { - // Try other method... - } - - try { - return Long.parseLong(videoInfoPage.get("length_seconds")); + return Long.parseLong(lengthString); } catch (Exception ignored) { // Try other method... } + // TODO: 25.11.17 Implement a way to get the length for age restricted videos #44 try { // Fallback to HTML method - return Long.parseLong(doc.select("div[class~=\"ytp-progress-bar\"][role=\"slider\"]") - .first().attr("aria-valuemax")); + return Long.parseLong(doc.select("div[class~=\"ytp-progress-bar\"][role=\"slider\"]").first() + .attr("aria-valuemax")); } catch (Exception e) { throw new ParsingException("Could not get video length", e); } @@ -253,6 +262,7 @@ public class YoutubeStreamExtractor extends StreamExtractor { } } + @Nonnull @Override public String getUploaderUrl() throws ParsingException { try { @@ -263,28 +273,41 @@ public class YoutubeStreamExtractor extends StreamExtractor { } } - @Override - public String getUploaderName() throws ParsingException { - try { - return playerArgs.getString("author"); - } catch (Exception ignored) { - // Try other method... - } - try { - return videoInfoPage.get("author"); - } catch (Exception ignored) { - // Try other method... + @Nullable + private String getStringFromMetaData(String field) { + String value = null; + if(playerArgs != null) { + // This can not fail + value = playerArgs.getString(field); } - - try { - // Fallback to HTML method - return doc.select("div.yt-user-info").first().text(); - } catch (Exception e) { - throw new ParsingException("Could not get uploader name", e); + if(value == null) { + // This can not fail too + value = videoInfoPage.get(field); } + return value; } + @Nonnull + @Override + public String getUploaderName() throws ParsingException { + String name = getStringFromMetaData("author"); + + if(name == null) { + try { + // Fallback to HTML method + name = doc.select("div.yt-user-info").first().text(); + } catch (Exception e) { + throw new ParsingException("Could not get uploader name", e); + } + } + if(name == null || name.isEmpty()) { + throw new ParsingException("Could not get uploader name"); + } + return name; + } + + @Nonnull @Override public String getUploaderAvatarUrl() throws ParsingException { try { @@ -300,9 +323,9 @@ public class YoutubeStreamExtractor extends StreamExtractor { public String getDashMpdUrl() throws ParsingException { try { String dashManifestUrl; - if (videoInfoPage != null && videoInfoPage.containsKey("dashmpd")) { + if (videoInfoPage.containsKey("dashmpd")) { dashManifestUrl = videoInfoPage.get("dashmpd"); - } else if (playerArgs.isString("dashmpd")) { + } else if (playerArgs != null && playerArgs.isString("dashmpd")) { dashManifestUrl = playerArgs.getString("dashmpd", ""); } else { return ""; @@ -521,7 +544,7 @@ public class YoutubeStreamExtractor extends StreamExtractor { // Check if the video is age restricted if (pageContent.contains(" getAudioStreams() throws IOException, ExtractionException; public abstract List getVideoStreams() throws IOException, ExtractionException; diff --git a/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfo.java b/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfo.java index 1ede39cfe..871720cc5 100644 --- a/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfo.java +++ b/src/main/java/org/schabi/newpipe/extractor/stream/StreamInfo.java @@ -7,7 +7,6 @@ import org.schabi.newpipe.extractor.utils.DashMpdParser; import org.schabi.newpipe.extractor.utils.ExtractorHelper; import java.io.IOException; -import java.util.ArrayList; import java.util.Collections; import java.util.List; diff --git a/src/test/java/org/schabi/newpipe/Downloader.java b/src/test/java/org/schabi/newpipe/Downloader.java index 6a3554e50..542c853bf 100644 --- a/src/test/java/org/schabi/newpipe/Downloader.java +++ b/src/test/java/org/schabi/newpipe/Downloader.java @@ -89,10 +89,8 @@ public class Downloader implements org.schabi.newpipe.extractor.Downloader { public String download(String siteUrl, Map customProperties) throws IOException, ReCaptchaException { URL url = new URL(siteUrl); HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); - Iterator it = customProperties.entrySet().iterator(); - while (it.hasNext()) { - Map.Entry pair = (Map.Entry) it.next(); - con.setRequestProperty((String) pair.getKey(), (String) pair.getValue()); + for (Map.Entry pair: customProperties.entrySet()) { + con.setRequestProperty(pair.getKey(), pair.getValue()); } return dl(con); } diff --git a/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChartsExtractorTest.java b/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChartsExtractorTest.java index 79636c8c8..ffb3c31f8 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChartsExtractorTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudChartsExtractorTest.java @@ -10,13 +10,10 @@ import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.schabi.newpipe.Downloader; -import org.schabi.newpipe.extractor.InfoItemCollector; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.kiosk.KioskExtractor; import org.schabi.newpipe.extractor.stream.StreamInfoItemCollector; -import java.util.List; - /** * Test for {@link SoundcloudChartsUrlIdHandler} */ diff --git a/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEngineAllTest.java b/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEngineAllTest.java index 890c2fd38..1954b8c67 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEngineAllTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEngineAllTest.java @@ -9,6 +9,7 @@ import org.schabi.newpipe.extractor.search.SearchEngine; import org.schabi.newpipe.extractor.search.SearchResult; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.schabi.newpipe.extractor.ServiceList.SoundCloud; @@ -36,8 +37,9 @@ public class SoundcloudSearchEngineAllTest { @Test public void testResultErrors() { + assertNotNull(result.errors); if (!result.errors.isEmpty()) for (Throwable error : result.errors) error.printStackTrace(); - assertTrue(result.errors == null || result.errors.isEmpty()); + assertTrue(result.errors.isEmpty()); } @Ignore diff --git a/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEngineChannelTest.java b/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEngineChannelTest.java index e4ccee6e2..15c0a4e6a 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEngineChannelTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEngineChannelTest.java @@ -43,8 +43,9 @@ public class SoundcloudSearchEngineChannelTest { @Test public void testResultErrors() { + assertNotNull(result.errors); if (!result.errors.isEmpty()) for (Throwable error : result.errors) error.printStackTrace(); - assertTrue(result.errors == null || result.errors.isEmpty()); + assertTrue(result.errors.isEmpty()); } @Ignore diff --git a/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEnginePlaylistTest.java b/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEnginePlaylistTest.java index 89c5dac35..6a24d4f21 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEnginePlaylistTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEnginePlaylistTest.java @@ -63,8 +63,9 @@ public class SoundcloudSearchEnginePlaylistTest { @Test public void testResultErrors() { + assertNotNull(result.errors); if (!result.errors.isEmpty()) for (Throwable error : result.errors) error.printStackTrace(); - assertTrue(result.errors == null || result.errors.isEmpty()); + assertTrue(result.errors.isEmpty()); } @Ignore diff --git a/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEngineStreamTest.java b/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEngineStreamTest.java index b0b554ebc..14f0c6c60 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEngineStreamTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudSearchEngineStreamTest.java @@ -43,8 +43,9 @@ public class SoundcloudSearchEngineStreamTest { @Test public void testResultErrors() { + assertNotNull(result.errors); if (!result.errors.isEmpty()) for (Throwable error : result.errors) error.printStackTrace(); - assertTrue(result.errors == null || result.errors.isEmpty()); + assertTrue(result.errors.isEmpty()); } @Ignore diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngineAllTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngineAllTest.java index 5cf1bda5a..273fedd1a 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngineAllTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngineAllTest.java @@ -1,6 +1,5 @@ package org.schabi.newpipe.extractor.services.youtube; -import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; @@ -11,7 +10,6 @@ import org.schabi.newpipe.extractor.search.SearchResult; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.schabi.newpipe.extractor.ServiceList.YouTube; /* * Created by Christian Schabesberger on 29.12.15. diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngineChannelTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngineChannelTest.java index 9f10c3bbd..48c476263 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngineChannelTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngineChannelTest.java @@ -64,8 +64,9 @@ public class YoutubeSearchEngineChannelTest { @Test public void testResultErrors() { + assertNotNull(result.errors); if (!result.errors.isEmpty()) for (Throwable error : result.errors) error.printStackTrace(); - assertTrue(result.errors == null || result.errors.isEmpty()); + assertTrue(result.errors.isEmpty()); } @Ignore diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEnginePlaylistTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEnginePlaylistTest.java index 29c6ed441..bc9096146 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEnginePlaylistTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEnginePlaylistTest.java @@ -64,8 +64,9 @@ public class YoutubeSearchEnginePlaylistTest { @Test public void testResultErrors() { + assertNotNull(result.errors); if (!result.errors.isEmpty()) for (Throwable error : result.errors) error.printStackTrace(); - assertTrue(result.errors == null || result.errors.isEmpty()); + assertTrue(result.errors.isEmpty()); } @Ignore diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngineStreamTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngineStreamTest.java index f2b06a0be..c0a8de516 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngineStreamTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeSearchEngineStreamTest.java @@ -64,8 +64,9 @@ public class YoutubeSearchEngineStreamTest { @Test public void testResultErrors() { + assertNotNull(result.errors); if (!result.errors.isEmpty()) for (Throwable error : result.errors) error.printStackTrace(); - assertTrue(result.errors == null || result.errors.isEmpty()); + assertTrue(result.errors.isEmpty()); } @Ignore diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeServiceTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeServiceTest.java index 64b7538b7..4bb396396 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeServiceTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeServiceTest.java @@ -26,7 +26,6 @@ import org.schabi.newpipe.Downloader; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.kiosk.KioskList; -import org.schabi.newpipe.extractor.search.SearchEngine; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractorDefaultTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractorDefaultTest.java index 74342d162..c5d66f4bc 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractorDefaultTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractorDefaultTest.java @@ -67,14 +67,17 @@ public class YoutubeStreamExtractorDefaultTest { @Test public void testGetDescription() throws ParsingException { - assertTrue(extractor.getDescription() != null); + assertNotNull(extractor.getDescription()); + assertFalse(extractor.getDescription().isEmpty()); } @Test public void testGetUploaderName() throws ParsingException { - assertTrue(!extractor.getUploaderName().isEmpty()); + assertNotNull(extractor.getUploaderName()); + assertFalse(extractor.getUploaderName().isEmpty()); } + @Test public void testGetLength() throws ParsingException { assertTrue(extractor.getLength() > 0); diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractorRestrictedTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractorRestrictedTest.java index da3d9aa86..e051e2baf 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractorRestrictedTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractorRestrictedTest.java @@ -2,6 +2,7 @@ package org.schabi.newpipe.extractor.services.youtube; import com.grack.nanojson.JsonParserException; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.schabi.newpipe.Downloader; import org.schabi.newpipe.extractor.NewPipe; @@ -13,8 +14,7 @@ import org.schabi.newpipe.extractor.stream.VideoStream; import java.io.IOException; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import static org.schabi.newpipe.extractor.ServiceList.YouTube; /** @@ -22,12 +22,12 @@ import static org.schabi.newpipe.extractor.ServiceList.YouTube; */ public class YoutubeStreamExtractorRestrictedTest { public static final String HTTPS = "https://"; - private StreamExtractor extractor; + private YoutubeStreamExtractor extractor; @Before public void setUp() throws Exception { NewPipe.init(Downloader.getInstance()); - extractor = YouTube.getService() + extractor = (YoutubeStreamExtractor) YouTube.getService() .getStreamExtractor("https://www.youtube.com/watch?v=i6JTvzrpBy0"); } @@ -48,20 +48,24 @@ public class YoutubeStreamExtractorRestrictedTest { } @Test - public void testGetTitle() throws ParsingException { - assertTrue(!extractor.getName().isEmpty()); + public void testGetName() throws ParsingException { + assertNotNull("name is null", extractor.getName()); + assertFalse("name is empty", extractor.getName().isEmpty()); } @Test public void testGetDescription() throws ParsingException { - assertTrue(extractor.getDescription() != null); + assertNotNull(extractor.getDescription()); + assertFalse(extractor.getDescription().isEmpty()); } @Test public void testGetUploaderName() throws ParsingException { - assertTrue(!extractor.getUploaderName().isEmpty()); + assertNotNull(extractor.getUploaderName()); + assertFalse(extractor.getUploaderName().isEmpty()); } + @Ignore // Currently there is no way get the length from restricted videos @Test public void testGetLength() throws ParsingException { assertTrue(extractor.getLength() > 0); @@ -89,9 +93,10 @@ public class YoutubeStreamExtractorRestrictedTest { extractor.getUploaderAvatarUrl().contains(HTTPS)); } + // FIXME: 25.11.17 Are there no streams or are they not listed? @Test public void testGetAudioStreams() throws IOException, ExtractionException { - // audiostream not always necessary + // audio streams are not always necessary assertTrue(!extractor.getAudioStreams().isEmpty()); } diff --git a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeTrendingExtractorTest.java b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeTrendingExtractorTest.java index 9841ef5d6..cabeb0c6b 100644 --- a/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeTrendingExtractorTest.java +++ b/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeTrendingExtractorTest.java @@ -23,7 +23,6 @@ package org.schabi.newpipe.extractor.services.youtube; import org.junit.Before; import org.junit.Test; import org.schabi.newpipe.Downloader; -import org.schabi.newpipe.extractor.InfoItemCollector; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.kiosk.KioskExtractor; import org.schabi.newpipe.extractor.stream.StreamInfoItemCollector;