Added tests
This commit is contained in:
parent
b5bb05da18
commit
699b408639
|
@ -1,5 +1,8 @@
|
||||||
package org.schabi.newpipe.extractor.services.youtube.linkHandler;
|
package org.schabi.newpipe.extractor.services.youtube.linkHandler;
|
||||||
|
|
||||||
|
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isInvidioURL;
|
||||||
|
import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isYoutubeURL;
|
||||||
|
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -13,95 +16,28 @@ import org.schabi.newpipe.extractor.utils.Utils;
|
||||||
|
|
||||||
public final class YoutubeMusicTrendingLinkHandlerFactory extends ListLinkHandlerFactory {
|
public final class YoutubeMusicTrendingLinkHandlerFactory extends ListLinkHandlerFactory {
|
||||||
|
|
||||||
private static final YoutubeMusicTrendingLinkHandlerFactory INSTANCE =
|
public String getUrl(final String id,
|
||||||
new YoutubeMusicTrendingLinkHandlerFactory();
|
final List<String> contentFilters,
|
||||||
|
|
||||||
public YoutubeMusicTrendingLinkHandlerFactory() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public static YoutubeMusicTrendingLinkHandlerFactory getInstance() {
|
|
||||||
return INSTANCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getUrl(final String id, final List<String> contentFilters,
|
|
||||||
final String sortFilter) {
|
final String sortFilter) {
|
||||||
return "https://www.youtube.com/feed/trending?bp=4gINGgt5dG1hX2NoYXJ0cw%3D%3D";
|
return "https://www.youtube.com/feed/trending/music";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getId(final String url) throws ParsingException {
|
public String getId(final String url) {
|
||||||
try {
|
return "Trending";
|
||||||
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 path = urlObj.getPath();
|
|
||||||
if (!path.equals("/watch") && !path.equals("/playlist") && !path.equals("/feed/trending")) {
|
|
||||||
throw new ParsingException("the url given is neither a video nor a playlist URL");
|
|
||||||
}
|
|
||||||
|
|
||||||
final String listID = Utils.getQueryValue(urlObj, "list");
|
|
||||||
|
|
||||||
if (listID == null) {
|
|
||||||
throw new ParsingException("the URL given does not include a playlist");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!listID.matches("[a-zA-Z0-9_-]{10,}")) {
|
|
||||||
throw new ParsingException(
|
|
||||||
"the list-ID given in the URL does not match the list pattern");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (YoutubeParsingHelper.isYoutubeChannelMixId(listID)
|
|
||||||
&& Utils.getQueryValue(urlObj, "v") == null) {
|
|
||||||
// Video id can't be determined from the channel mix id.
|
|
||||||
// See YoutubeParsingHelper#extractVideoIdFromMixId
|
|
||||||
throw new ContentNotSupportedException(
|
|
||||||
"Channel Mix without a video id are not supported");
|
|
||||||
}
|
|
||||||
|
|
||||||
return listID;
|
|
||||||
} catch (final Exception exception) {
|
|
||||||
throw new ParsingException("Error could not parse URL: " + exception.getMessage(),
|
|
||||||
exception);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onAcceptUrl(final String url) {
|
public boolean onAcceptUrl(final String url) {
|
||||||
|
final URL urlObj;
|
||||||
try {
|
try {
|
||||||
getId(url);
|
urlObj = Utils.stringToURL(url);
|
||||||
} catch (final ParsingException e) {
|
} catch (final MalformedURLException e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
final String urlPath = urlObj.getPath();
|
||||||
* If it is a mix (auto-generated playlist) URL, return a {@link LinkHandler} where the URL is
|
return Utils.isHTTP(urlObj) && (isYoutubeURL(urlObj) || isInvidioURL(urlObj))
|
||||||
* like {@code https://youtube.com/watch?v=videoId&list=playlistId}
|
&& urlPath.equals("/feed/trending/music");
|
||||||
* <p>Otherwise use super</p>
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public ListLinkHandler fromUrl(final String url) throws ParsingException {
|
|
||||||
try {
|
|
||||||
final URL urlObj = Utils.stringToURL(url);
|
|
||||||
final String listID = Utils.getQueryValue(urlObj, "list");
|
|
||||||
if (listID != null && YoutubeParsingHelper.isYoutubeMixId(listID)) {
|
|
||||||
String videoID = Utils.getQueryValue(urlObj, "v");
|
|
||||||
if (videoID == null) {
|
|
||||||
videoID = YoutubeParsingHelper.extractVideoIdFromMixId(listID);
|
|
||||||
}
|
|
||||||
final String newUrl = "https://www.youtube.com/feed/trending?bp=4gINGgt5dG1hX2NoYXJ0cw%3D%3D";
|
|
||||||
return new ListLinkHandler(new LinkHandler(url, newUrl, listID));
|
|
||||||
}
|
|
||||||
} catch (final MalformedURLException exception) {
|
|
||||||
throw new ParsingException("Error could not parse URL: " + exception.getMessage(),
|
|
||||||
exception);
|
|
||||||
}
|
|
||||||
return super.fromUrl(url);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
package org.schabi.newpipe.extractor.services.youtube;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Created by Christian Schabesberger on 12.08.17.
|
||||||
|
*
|
||||||
|
* Copyright (C) Christian Schabesberger 2017 <chris.schabesberger@mailbox.org>
|
||||||
|
* YoutubeTrendingKioskInfoTest.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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.schabi.newpipe.downloader.DownloaderFactory;
|
||||||
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
|
import org.schabi.newpipe.extractor.StreamingService;
|
||||||
|
import org.schabi.newpipe.extractor.kiosk.KioskInfo;
|
||||||
|
import org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for {@link KioskInfo}
|
||||||
|
*/
|
||||||
|
public class YoutubeMusicTrendingKioskInfoTest {
|
||||||
|
|
||||||
|
private static final String RESOURCE_PATH = DownloaderFactory.RESOURCE_PATH + "kiosk";
|
||||||
|
|
||||||
|
static KioskInfo kioskInfo;
|
||||||
|
|
||||||
|
@BeforeAll
|
||||||
|
public static void setUp()
|
||||||
|
throws Exception {
|
||||||
|
YoutubeTestsUtils.ensureStateless();
|
||||||
|
NewPipe.init(DownloaderFactory.getDownloader(RESOURCE_PATH));
|
||||||
|
LinkHandlerFactory LinkHandlerFactory = ((StreamingService) YouTube).getKioskList().getListLinkHandlerFactoryByType("Trending");
|
||||||
|
|
||||||
|
kioskInfo = KioskInfo.getInfo(YouTube, LinkHandlerFactory.fromId("Trending").getUrl());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getStreams() {
|
||||||
|
assertFalse(kioskInfo.getRelatedItems().isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getId() {
|
||||||
|
assertTrue(kioskInfo.getId().equals("Trending Music")
|
||||||
|
|| kioskInfo.getId().equals("Trends"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getName() {
|
||||||
|
assertFalse(kioskInfo.getName().isEmpty());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,87 @@
|
||||||
|
package org.schabi.newpipe.extractor.services.youtube;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Created by Christian Schabesberger on 12.08.17.
|
||||||
|
*
|
||||||
|
* Copyright (C) Christian Schabesberger 2017 <chris.schabesberger@mailbox.org>
|
||||||
|
* YoutubeTrendingLinkHandlerFactoryTest.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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.schabi.newpipe.downloader.DownloaderTestImpl;
|
||||||
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||||
|
import org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory;
|
||||||
|
import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeTrendingLinkHandlerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for {@link YoutubeTrendingLinkHandlerFactory}
|
||||||
|
*/
|
||||||
|
public class YoutubeMusicTrendingLinkHandlerFactoryTest {
|
||||||
|
private static LinkHandlerFactory LinkHandlerFactory;
|
||||||
|
|
||||||
|
@BeforeAll
|
||||||
|
public static void setUp() throws Exception {
|
||||||
|
LinkHandlerFactory = YouTube.getKioskList().getListLinkHandlerFactoryByType("Trending Music");
|
||||||
|
NewPipe.init(DownloaderTestImpl.getInstance());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getUrl()
|
||||||
|
throws Exception {
|
||||||
|
assertEquals(LinkHandlerFactory.fromId("").getUrl(), "https://www.youtube.com/feed/trending/music");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getId()
|
||||||
|
throws Exception {
|
||||||
|
assertEquals(LinkHandlerFactory.fromUrl("https://www.youtube.com/feed/trending/music").getId(), "Trending");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void acceptUrl() throws ParsingException {
|
||||||
|
assertTrue(LinkHandlerFactory.acceptUrl("https://www.youtube.com/feed/trending/music"));
|
||||||
|
assertTrue(LinkHandlerFactory.acceptUrl("https://www.youtube.com/feed/trending/music/?adsf=fjaj#fhe"));
|
||||||
|
assertTrue(LinkHandlerFactory.acceptUrl("http://www.youtube.com/feed/trending/music/"));
|
||||||
|
assertTrue(LinkHandlerFactory.acceptUrl("www.youtube.com/feed/trending/music"));
|
||||||
|
assertTrue(LinkHandlerFactory.acceptUrl("youtube.com/feed/trending/music"));
|
||||||
|
assertTrue(LinkHandlerFactory.acceptUrl("youtube.com/feed/trending/music/?akdsakjf=dfije&kfj=dkjak"));
|
||||||
|
assertTrue(LinkHandlerFactory.acceptUrl("https://youtube.com/feed/trending/music"));
|
||||||
|
assertTrue(LinkHandlerFactory.acceptUrl("m.youtube.com/feed/trending/music"));
|
||||||
|
|
||||||
|
assertTrue(LinkHandlerFactory.acceptUrl("https://www.invidio.us/feed/trending/music"));
|
||||||
|
assertTrue(LinkHandlerFactory.acceptUrl("https://invidio.us/feed/trending/music"));
|
||||||
|
assertTrue(LinkHandlerFactory.acceptUrl("invidio.us/feed/trending/music"));
|
||||||
|
|
||||||
|
assertFalse(LinkHandlerFactory.acceptUrl("https://youtu.be/feed/trending/music"));
|
||||||
|
assertFalse(LinkHandlerFactory.acceptUrl("kdskjfiiejfia"));
|
||||||
|
assertFalse(LinkHandlerFactory.acceptUrl("https://www.youtube.com/bullshit/feed/trending/music"));
|
||||||
|
assertFalse(LinkHandlerFactory.acceptUrl("https://www.youtube.com/feed/trending/music/bullshit"));
|
||||||
|
assertFalse(LinkHandlerFactory.acceptUrl("https://www.youtube.com/feed/bullshit/trending/music"));
|
||||||
|
assertFalse(LinkHandlerFactory.acceptUrl("peter klaut aepferl youtube.com/feed/trending/music"));
|
||||||
|
assertFalse(LinkHandlerFactory.acceptUrl("youtube.com/feed/trending/music askjkf"));
|
||||||
|
assertFalse(LinkHandlerFactory.acceptUrl("askdjfi youtube.com/feed/trending/music askjkf"));
|
||||||
|
assertFalse(LinkHandlerFactory.acceptUrl(" youtube.com/feed/trending/music"));
|
||||||
|
assertFalse(LinkHandlerFactory.acceptUrl("https://www.youtube.com/feed/trending/music.html"));
|
||||||
|
assertFalse(LinkHandlerFactory.acceptUrl(""));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue