diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/StreamingService.java b/extractor/src/main/java/org/schabi/newpipe/extractor/StreamingService.java index 94b8ba2d91..db0da257e9 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/StreamingService.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/StreamingService.java @@ -86,7 +86,8 @@ public enum LinkType { NONE, STREAM, CHANNEL, - PLAYLIST + PLAYLIST, + SEARCH, } private final int serviceId; @@ -140,6 +141,13 @@ public String toString() { */ public abstract ListLinkHandlerFactory getChannelLHFactory(); + /** + * Must return a new instance of an implementation of ListLinkHandlerFactory for channels. + * If support for channels is not given null must be returned. + * @return an instance of a ListLinkHandlerFactory for search link or null + */ + public abstract ListLinkHandlerFactory getSearchLHFactory(); + /** * Must return a new instance of an implementation of ListLinkHandlerFactory for playlists. * If support for playlists is not given null must be returned. @@ -282,6 +290,27 @@ public CommentsExtractor getCommentsExtractor(final String url) throws Extractio // Utils //////////////////////////////////////////////////////////////////////////*/ + public final String getIdByUrl(final String url) throws ParsingException{ + final String polishedUrl = Utils.followGoogleRedirectIfNeeded(url); + + final LinkHandlerFactory sH = getStreamLHFactory(); + final LinkHandlerFactory cH = getChannelLHFactory(); + final LinkHandlerFactory pH = getPlaylistLHFactory(); + final LinkHandlerFactory searchH = getSearchLHFactory(); + + if (sH != null && sH.acceptUrl(polishedUrl)) { + return sH.getId(url); + } else if (searchH != null && searchH.acceptUrl(polishedUrl)) { + return searchH.getId(url); + } else if (cH != null && cH.acceptUrl(polishedUrl)) { + return cH.getId(url); + } else if (pH != null && pH.acceptUrl(polishedUrl)) { + return pH.getId(url); + } else { + return ""; + } + } + /** * Figures out where the link is pointing to (a channel, a video, a playlist, etc.) * @param url the url on which it should be decided of which link type it is @@ -293,9 +322,12 @@ public final LinkType getLinkTypeByUrl(final String url) throws ParsingException final LinkHandlerFactory sH = getStreamLHFactory(); final LinkHandlerFactory cH = getChannelLHFactory(); final LinkHandlerFactory pH = getPlaylistLHFactory(); + final LinkHandlerFactory searchH = getSearchLHFactory(); if (sH != null && sH.acceptUrl(polishedUrl)) { return LinkType.STREAM; + } else if (searchH != null && searchH.acceptUrl(polishedUrl)) { + return LinkType.SEARCH; } else if (cH != null && cH.acceptUrl(polishedUrl)) { return LinkType.CHANNEL; } else if (pH != null && pH.acceptUrl(polishedUrl)) { diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampService.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampService.java index 8b2758796e..d1d243574f 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampService.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/bandcamp/BandcampService.java @@ -66,6 +66,11 @@ public ListLinkHandlerFactory getChannelLHFactory() { return new BandcampChannelLinkHandlerFactory(); } + @Override + public ListLinkHandlerFactory getSearchLHFactory() { + return null; + } + @Override public ListLinkHandlerFactory getPlaylistLHFactory() { return new BandcampPlaylistLinkHandlerFactory(); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCService.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCService.java index 54bfb95304..f1b1cc9083 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCService.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/media_ccc/MediaCCCService.java @@ -55,6 +55,11 @@ public ListLinkHandlerFactory getChannelLHFactory() { return new MediaCCCConferenceLinkHandlerFactory(); } + @Override + public ListLinkHandlerFactory getSearchLHFactory() { + return null; + } + @Override public ListLinkHandlerFactory getPlaylistLHFactory() { return null; diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/PeertubeService.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/PeertubeService.java index de25e2799f..3dab842594 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/PeertubeService.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/peertube/PeertubeService.java @@ -60,6 +60,11 @@ public ListLinkHandlerFactory getChannelLHFactory() { return PeertubeChannelLinkHandlerFactory.getInstance(); } + @Override + public ListLinkHandlerFactory getSearchLHFactory() { + return null; + } + @Override public ListLinkHandlerFactory getPlaylistLHFactory() { return PeertubePlaylistLinkHandlerFactory.getInstance(); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudService.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudService.java index cc4977e42d..1a36c410cc 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudService.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/soundcloud/SoundcloudService.java @@ -63,6 +63,11 @@ public ListLinkHandlerFactory getChannelLHFactory() { return SoundcloudChannelLinkHandlerFactory.getInstance(); } + @Override + public ListLinkHandlerFactory getSearchLHFactory() { + return null; + } + @Override public ListLinkHandlerFactory getPlaylistLHFactory() { return SoundcloudPlaylistLinkHandlerFactory.getInstance(); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeService.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeService.java index a15d3ed012..cb99ee847b 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeService.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/YoutubeService.java @@ -36,6 +36,7 @@ import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeChannelLinkHandlerFactory; import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeCommentsLinkHandlerFactory; import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubePlaylistLinkHandlerFactory; +import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeSearchLinkHandlerFactory; import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeSearchQueryHandlerFactory; import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeStreamLinkHandlerFactory; import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeTrendingLinkHandlerFactory; @@ -88,6 +89,11 @@ public ListLinkHandlerFactory getChannelLHFactory() { return YoutubeChannelLinkHandlerFactory.getInstance(); } + @Override + public ListLinkHandlerFactory getSearchLHFactory() { + return YoutubeSearchLinkHandlerFactory.getInstance(); + } + @Override public ListLinkHandlerFactory getPlaylistLHFactory() { return YoutubePlaylistLinkHandlerFactory.getInstance(); diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeSearchLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeSearchLinkHandlerFactory.java new file mode 100644 index 0000000000..9888eaa98e --- /dev/null +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeSearchLinkHandlerFactory.java @@ -0,0 +1,63 @@ +package org.schabi.newpipe.extractor.services.youtube.linkHandler; + +import org.schabi.newpipe.extractor.exceptions.ParsingException; +import org.schabi.newpipe.extractor.linkhandler.LinkHandler; +import org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory; +import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory; +import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper; +import org.schabi.newpipe.extractor.utils.Utils; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.List; + +public class YoutubeSearchLinkHandlerFactory extends ListLinkHandlerFactory { + private static final YoutubeSearchLinkHandlerFactory INSTANCE + = new YoutubeSearchLinkHandlerFactory(); + + private YoutubeSearchLinkHandlerFactory() {} + + public static YoutubeSearchLinkHandlerFactory getInstance() { + return INSTANCE; + } + + @Override + public String getUrl(final String id, final List contentFilters, + final String sortFilter) { + return "https://www.youtube.com/results?search_query=" + id; + } + + @Override + public String getId(String url) throws ParsingException { + try { + final URL urlObj = Utils.stringToURL(url); + + if (!Utils.isHTTP(urlObj) || !(YoutubeParsingHelper.isYoutubeURL(urlObj) + || YoutubeParsingHelper.isInvidioURL(urlObj))) { + throw new ParsingException("the url given is not a YouTube-URL"); + } + + final String listID = Utils.getQueryValue(urlObj, "search_query"); + + if (listID == null) { + throw new ParsingException("the URL given does not include a playlist"); + } + + return listID; + + } catch (final Exception exception) { + throw new ParsingException("Error could not parse URL: " + exception.getMessage(), + exception); + } + } + + @Override + public boolean onAcceptUrl(String url) throws ParsingException { + try { + getId(url); + } catch (final ParsingException e) { + return false; + } + return true; + } +}