added error message if YouTube requests fail
This commit is contained in:
parent
c5bf0132ff
commit
c3f8dc0772
|
@ -12,4 +12,5 @@ from ._errors import (
|
||||||
CookiePathInvalid,
|
CookiePathInvalid,
|
||||||
CookiesInvalid,
|
CookiesInvalid,
|
||||||
FailedToCreateConsentCookie,
|
FailedToCreateConsentCookie,
|
||||||
|
YouTubeRequestFailed,
|
||||||
)
|
)
|
||||||
|
|
|
@ -35,6 +35,20 @@ class CouldNotRetrieveTranscript(Exception):
|
||||||
return self.CAUSE_MESSAGE
|
return self.CAUSE_MESSAGE
|
||||||
|
|
||||||
|
|
||||||
|
class YouTubeRequestFailed(CouldNotRetrieveTranscript):
|
||||||
|
CAUSE_MESSAGE = 'Request to YouTube failed: {reason}'
|
||||||
|
|
||||||
|
def __init__(self, video_id, http_error):
|
||||||
|
self.reason = str(http_error)
|
||||||
|
super(YouTubeRequestFailed, self).__init__(video_id)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def cause(self):
|
||||||
|
return self.CAUSE_MESSAGE.format(
|
||||||
|
reason=self.reason,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class VideoUnavailable(CouldNotRetrieveTranscript):
|
class VideoUnavailable(CouldNotRetrieveTranscript):
|
||||||
CAUSE_MESSAGE = 'The video is no longer available'
|
CAUSE_MESSAGE = 'The video is no longer available'
|
||||||
|
|
||||||
|
|
|
@ -11,10 +11,13 @@ from xml.etree import ElementTree
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
from requests import HTTPError
|
||||||
|
|
||||||
from ._html_unescaping import unescape
|
from ._html_unescaping import unescape
|
||||||
from ._errors import (
|
from ._errors import (
|
||||||
VideoUnavailable,
|
VideoUnavailable,
|
||||||
TooManyRequests,
|
TooManyRequests,
|
||||||
|
YouTubeRequestFailed,
|
||||||
NoTranscriptFound,
|
NoTranscriptFound,
|
||||||
TranscriptsDisabled,
|
TranscriptsDisabled,
|
||||||
NotTranslatable,
|
NotTranslatable,
|
||||||
|
@ -25,6 +28,14 @@ from ._errors import (
|
||||||
from ._settings import WATCH_URL
|
from ._settings import WATCH_URL
|
||||||
|
|
||||||
|
|
||||||
|
def _raise_http_errors(response, video_id):
|
||||||
|
try:
|
||||||
|
response.raise_for_status()
|
||||||
|
return response
|
||||||
|
except HTTPError as error:
|
||||||
|
raise YouTubeRequestFailed(error, video_id)
|
||||||
|
|
||||||
|
|
||||||
class TranscriptListFetcher(object):
|
class TranscriptListFetcher(object):
|
||||||
def __init__(self, http_client):
|
def __init__(self, http_client):
|
||||||
self._http_client = http_client
|
self._http_client = http_client
|
||||||
|
@ -72,7 +83,8 @@ class TranscriptListFetcher(object):
|
||||||
return html
|
return html
|
||||||
|
|
||||||
def _fetch_html(self, video_id):
|
def _fetch_html(self, video_id):
|
||||||
return self._http_client.get(WATCH_URL.format(video_id=video_id)).text.replace(
|
response = self._http_client.get(WATCH_URL.format(video_id=video_id))
|
||||||
|
return _raise_http_errors(response, video_id).text.replace(
|
||||||
'\\u0026', '&'
|
'\\u0026', '&'
|
||||||
).replace(
|
).replace(
|
||||||
'\\', ''
|
'\\', ''
|
||||||
|
@ -273,8 +285,9 @@ class Transcript(object):
|
||||||
:return: a list of dictionaries containing the 'text', 'start' and 'duration' keys
|
:return: a list of dictionaries containing the 'text', 'start' and 'duration' keys
|
||||||
:rtype [{'text': str, 'start': float, 'end': float}]:
|
:rtype [{'text': str, 'start': float, 'end': float}]:
|
||||||
"""
|
"""
|
||||||
|
response = self._http_client.get(self._url)
|
||||||
return _TranscriptParser().parse(
|
return _TranscriptParser().parse(
|
||||||
self._http_client.get(self._url).text
|
_raise_http_errors(response, self.video_id).text,
|
||||||
)
|
)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
|
|
@ -19,6 +19,7 @@ from youtube_transcript_api import (
|
||||||
CookiePathInvalid,
|
CookiePathInvalid,
|
||||||
CookiesInvalid,
|
CookiesInvalid,
|
||||||
FailedToCreateConsentCookie,
|
FailedToCreateConsentCookie,
|
||||||
|
YouTubeRequestFailed,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -174,6 +175,16 @@ class TestYouTubeTranscriptApi(TestCase):
|
||||||
with self.assertRaises(VideoUnavailable):
|
with self.assertRaises(VideoUnavailable):
|
||||||
YouTubeTranscriptApi.get_transcript('abc')
|
YouTubeTranscriptApi.get_transcript('abc')
|
||||||
|
|
||||||
|
def test_get_transcript__exception_if_youtube_request_fails(self):
|
||||||
|
httpretty.register_uri(
|
||||||
|
httpretty.GET,
|
||||||
|
'https://www.youtube.com/watch',
|
||||||
|
status=500
|
||||||
|
)
|
||||||
|
|
||||||
|
with self.assertRaises(YouTubeRequestFailed):
|
||||||
|
YouTubeTranscriptApi.get_transcript('abc')
|
||||||
|
|
||||||
def test_get_transcript__exception_if_youtube_request_limit_reached(self):
|
def test_get_transcript__exception_if_youtube_request_limit_reached(self):
|
||||||
httpretty.register_uri(
|
httpretty.register_uri(
|
||||||
httpretty.GET,
|
httpretty.GET,
|
||||||
|
|
Loading…
Reference in New Issue