Add AccountTerminatedException for better error handling of terminated channels
This commit is contained in:
parent
284362fc15
commit
bb3861ddce
|
@ -0,0 +1,31 @@
|
||||||
|
package org.schabi.newpipe.extractor.exceptions;
|
||||||
|
|
||||||
|
public class AccountTerminatedException extends ContentNotAvailableException {
|
||||||
|
|
||||||
|
private Reason reason = Reason.UNKNOWN;
|
||||||
|
|
||||||
|
public AccountTerminatedException(final String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccountTerminatedException(final String message, final Reason reason) {
|
||||||
|
super(message);
|
||||||
|
this.reason = reason;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AccountTerminatedException(final String message, final Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The reason for the violation. There should also be more info in the exception's message.
|
||||||
|
*/
|
||||||
|
public Reason getReason() {
|
||||||
|
return reason;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Reason {
|
||||||
|
UNKNOWN,
|
||||||
|
VIOLATION
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,10 +10,7 @@ import com.grack.nanojson.JsonWriter;
|
||||||
import org.schabi.newpipe.extractor.MetaInfo;
|
import org.schabi.newpipe.extractor.MetaInfo;
|
||||||
import org.schabi.newpipe.extractor.Page;
|
import org.schabi.newpipe.extractor.Page;
|
||||||
import org.schabi.newpipe.extractor.downloader.Response;
|
import org.schabi.newpipe.extractor.downloader.Response;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
|
import org.schabi.newpipe.extractor.exceptions.*;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
|
||||||
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
|
|
||||||
import org.schabi.newpipe.extractor.localization.Localization;
|
import org.schabi.newpipe.extractor.localization.Localization;
|
||||||
import org.schabi.newpipe.extractor.stream.Description;
|
import org.schabi.newpipe.extractor.stream.Description;
|
||||||
import org.schabi.newpipe.extractor.utils.JsonUtils;
|
import org.schabi.newpipe.extractor.utils.JsonUtils;
|
||||||
|
@ -762,6 +759,16 @@ public class YoutubeParsingHelper {
|
||||||
final String alertText = getTextFromObject(alertRenderer.getObject("text"));
|
final String alertText = getTextFromObject(alertRenderer.getObject("text"));
|
||||||
final String alertType = alertRenderer.getString("type", EMPTY_STRING);
|
final String alertType = alertRenderer.getString("type", EMPTY_STRING);
|
||||||
if (alertType.equalsIgnoreCase("ERROR")) {
|
if (alertType.equalsIgnoreCase("ERROR")) {
|
||||||
|
if (alertText != null && alertText.contains("This account has been terminated")) {
|
||||||
|
if (alertText.contains("violation") || alertText.contains("violating")) {
|
||||||
|
// possible error messages:
|
||||||
|
// "This account has been terminated for violating YouTube's Community Guidelines."
|
||||||
|
// "This account has been terminated for a violation of YouTube's Terms of Service."
|
||||||
|
throw new AccountTerminatedException(alertText, AccountTerminatedException.Reason.VIOLATION);
|
||||||
|
} else {
|
||||||
|
throw new AccountTerminatedException(alertText);
|
||||||
|
}
|
||||||
|
}
|
||||||
throw new ContentNotAvailableException("Got error: \"" + alertText + "\"");
|
throw new ContentNotAvailableException("Got error: \"" + alertText + "\"");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ import org.schabi.newpipe.extractor.Page;
|
||||||
import org.schabi.newpipe.extractor.StreamingService;
|
import org.schabi.newpipe.extractor.StreamingService;
|
||||||
import org.schabi.newpipe.extractor.downloader.Downloader;
|
import org.schabi.newpipe.extractor.downloader.Downloader;
|
||||||
import org.schabi.newpipe.extractor.downloader.Response;
|
import org.schabi.newpipe.extractor.downloader.Response;
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
||||||
import org.schabi.newpipe.extractor.feed.FeedExtractor;
|
import org.schabi.newpipe.extractor.feed.FeedExtractor;
|
||||||
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
|
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
|
||||||
|
@ -33,6 +34,9 @@ public class YoutubeFeedExtractor extends FeedExtractor {
|
||||||
final String feedUrl = YoutubeParsingHelper.getFeedUrlFrom(channelIdOrUser);
|
final String feedUrl = YoutubeParsingHelper.getFeedUrlFrom(channelIdOrUser);
|
||||||
|
|
||||||
final Response response = downloader.get(feedUrl);
|
final Response response = downloader.get(feedUrl);
|
||||||
|
if (response.responseCode() == 404) {
|
||||||
|
throw new ContentNotAvailableException("Could not get feed: 404 - not found");
|
||||||
|
}
|
||||||
document = Jsoup.parse(response.responseBody());
|
document = Jsoup.parse(response.responseBody());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ import org.schabi.newpipe.downloader.DownloaderFactory;
|
||||||
import org.schabi.newpipe.downloader.DownloaderTestImpl;
|
import org.schabi.newpipe.downloader.DownloaderTestImpl;
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.extractor.channel.ChannelExtractor;
|
import org.schabi.newpipe.extractor.channel.ChannelExtractor;
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.AccountTerminatedException;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
|
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException;
|
import org.schabi.newpipe.extractor.exceptions.ContentNotSupportedException;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||||
|
@ -50,6 +51,13 @@ public class YoutubeChannelExtractorTest {
|
||||||
YouTube.getChannelExtractor("https://www.youtube.com/channel/DOESNT-EXIST");
|
YouTube.getChannelExtractor("https://www.youtube.com/channel/DOESNT-EXIST");
|
||||||
extractor.fetchPage();
|
extractor.fetchPage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(expected = AccountTerminatedException.class)
|
||||||
|
public void accountTerminatedFetch() throws Exception {
|
||||||
|
final ChannelExtractor extractor =
|
||||||
|
YouTube.getChannelExtractor("https://www.youtube.com/channel/UC0AuOxCr9TZ0TtEgL1zpIgA");
|
||||||
|
extractor.fetchPage();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class NotSupported {
|
public static class NotSupported {
|
||||||
|
|
|
@ -4,10 +4,13 @@ import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.schabi.newpipe.downloader.DownloaderFactory;
|
import org.schabi.newpipe.downloader.DownloaderFactory;
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.AccountTerminatedException;
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.ContentNotAvailableException;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
import org.schabi.newpipe.extractor.exceptions.ParsingException;
|
||||||
import org.schabi.newpipe.extractor.services.BaseListExtractorTest;
|
import org.schabi.newpipe.extractor.services.BaseListExtractorTest;
|
||||||
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeFeedExtractor;
|
import org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeFeedExtractor;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
@ -77,4 +80,20 @@ public class YoutubeFeedExtractorTest {
|
||||||
assertNoMoreItems(extractor);
|
assertNoMoreItems(extractor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class NotAvailable {
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void setUp() throws IOException {
|
||||||
|
NewPipe.init(new DownloaderFactory().getDownloader(RESOURCE_PATH + "notAvailable/"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = ContentNotAvailableException.class)
|
||||||
|
public void AccountTerminatedFetch() throws Exception {
|
||||||
|
YoutubeFeedExtractor extractor = (YoutubeFeedExtractor) YouTube
|
||||||
|
.getFeedExtractor("https://www.youtube.com/channel/UCTGjY2I-ZUGnwVoWAGRd7XQ");
|
||||||
|
extractor.fetchPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue