diff --git a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java index eed04bf41..e95823d36 100644 --- a/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java +++ b/extractor/src/main/java/org/schabi/newpipe/extractor/services/youtube/linkHandler/YoutubeChannelLinkHandlerFactory.java @@ -1,3 +1,23 @@ +/* + * Created by Christian Schabesberger on 25.07.16. + * + * Copyright (C) Christian Schabesberger 2018 + * YoutubeChannelLinkHandlerFactory.java is part of NewPipe Extractor. + * + * NewPipe Extractor is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe Extractor is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe Extractor. If not, see . + */ + package org.schabi.newpipe.extractor.services.youtube.linkHandler; import java.util.regex.Pattern; @@ -6,36 +26,21 @@ import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory; import org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper; import org.schabi.newpipe.extractor.utils.Utils; +import javax.annotation.Nonnull; import java.net.URL; import java.util.List; -/* - * Created by Christian Schabesberger on 25.07.16. - * - * Copyright (C) Christian Schabesberger 2018 - * YoutubeChannelLinkHandlerFactory.java is part of NewPipe. - * - * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - */ +import static org.schabi.newpipe.extractor.utils.Utils.isBlank; public final class YoutubeChannelLinkHandlerFactory extends ListLinkHandlerFactory { private static final YoutubeChannelLinkHandlerFactory INSTANCE = new YoutubeChannelLinkHandlerFactory(); - private static final Pattern EXCLUDED_SEGMENTS = - Pattern.compile("playlist|watch|attribution_link|watch_popup|embed|feed|select_site"); + private static final Pattern EXCLUDED_SEGMENTS = Pattern.compile( + // CHECKSTYLE:OFF + "playlist|watch|attribution_link|watch_popup|embed|feed|select_site|account|reporthistory|redirect"); + // CHECKSTYLE:ON private YoutubeChannelLinkHandlerFactory() { } @@ -45,10 +50,10 @@ public final class YoutubeChannelLinkHandlerFactory extends ListLinkHandlerFacto } /** - * Returns URL to channel from an ID + * Returns the URL to a channel from an ID. * - * @param id Channel ID including e.g. 'channel/' - * @return URL to channel + * @param id the channel ID including e.g. 'channel/' + * @return the URL to the channel */ @Override public String getUrl(final String id, @@ -58,16 +63,26 @@ public final class YoutubeChannelLinkHandlerFactory extends ListLinkHandlerFacto } /** - * Returns true if path conform to - * custom short channel URLs like youtube.com/yourcustomname + * Checks whether the given path conforms to custom short channel URLs like + * {@code youtube.com/yourcustomname}. * - * @param splitPath path segments array - * @return true - if value conform to short channel URL, false - not + * @param splitPath the path segments array + * @return whether the value conform to short channel URLs */ - private boolean isCustomShortChannelUrl(final String[] splitPath) { + private boolean isCustomShortChannelUrl(@Nonnull final String[] splitPath) { return splitPath.length == 1 && !EXCLUDED_SEGMENTS.matcher(splitPath[0]).matches(); } + /** + * Checks whether the given path conforms to handle URLs like {@code youtube.com/@yourhandle}. + * + * @param splitPath the path segments array + * @return whether the value conform to handle URLs + */ + private boolean isHandle(@Nonnull final String[] splitPath) { + return splitPath.length > 0 && splitPath[0].startsWith("@"); + } + @Override public String getId(final String url) throws ParsingException { try { @@ -77,35 +92,38 @@ public final class YoutubeChannelLinkHandlerFactory extends ListLinkHandlerFacto if (!Utils.isHTTP(urlObj) || !(YoutubeParsingHelper.isYoutubeURL(urlObj) || YoutubeParsingHelper.isInvidioURL(urlObj) || YoutubeParsingHelper.isHooktubeURL(urlObj))) { - throw new ParsingException("the URL given is not a Youtube-URL"); + throw new ParsingException("The URL given is not a YouTube URL"); } - // remove leading "/" + // Remove leading "/" path = path.substring(1); + String[] splitPath = path.split("/"); - // Handle custom short channel URLs like youtube.com/yourcustomname - if (isCustomShortChannelUrl(splitPath)) { + if (isHandle(splitPath)) { + // Handle YouTube handle URLs like youtube.com/@yourhandle + return splitPath[0]; + } else if (isCustomShortChannelUrl(splitPath)) { + // Handle custom short channel URLs like youtube.com/yourcustomname path = "c/" + path; splitPath = path.split("/"); } - if (!path.startsWith("user/") - && !path.startsWith("channel/") + if (!path.startsWith("user/") && !path.startsWith("channel/") && !path.startsWith("c/")) { - throw new ParsingException("the URL given is neither a channel nor an user"); + throw new ParsingException( + "The given URL is not a channel, a user or a handle URL"); } final String id = splitPath[1]; - if (id == null || !id.matches("[A-Za-z0-9_-]+")) { - throw new ParsingException("The given id is not a Youtube-Video-ID"); + if (isBlank(id)) { + throw new ParsingException("The given ID is not a YouTube channel or user ID"); } return splitPath[0] + "/" + id; - } catch (final Exception exception) { - throw new ParsingException("Error could not parse url :" + exception.getMessage(), - exception); + } catch (final Exception e) { + throw new ParsingException("Could not parse URL :" + e.getMessage(), e); } }