|
"""Library specific exception definitions.""" |
|
from typing import Pattern, Union |
|
|
|
|
|
class PytubeError(Exception): |
|
"""Base pytube exception that all others inherit. |
|
|
|
This is done to not pollute the built-in exceptions, which *could* result |
|
in unintended errors being unexpectedly and incorrectly handled within |
|
implementers code. |
|
""" |
|
|
|
|
|
class MaxRetriesExceeded(PytubeError): |
|
"""Maximum number of retries exceeded.""" |
|
|
|
|
|
class HTMLParseError(PytubeError): |
|
"""HTML could not be parsed""" |
|
|
|
|
|
class ExtractError(PytubeError): |
|
"""Data extraction based exception.""" |
|
|
|
|
|
class RegexMatchError(ExtractError): |
|
"""Regex pattern did not return any matches.""" |
|
|
|
def __init__(self, caller: str, pattern: Union[str, Pattern]): |
|
""" |
|
:param str caller: |
|
Calling function |
|
:param str pattern: |
|
Pattern that failed to match |
|
""" |
|
super().__init__(f"{caller}: could not find match for {pattern}") |
|
self.caller = caller |
|
self.pattern = pattern |
|
|
|
|
|
class VideoUnavailable(PytubeError): |
|
"""Base video unavailable error.""" |
|
def __init__(self, video_id: str): |
|
""" |
|
:param str video_id: |
|
A YouTube video identifier. |
|
""" |
|
self.video_id = video_id |
|
super().__init__(self.error_string) |
|
|
|
@property |
|
def error_string(self): |
|
return f'{self.video_id} is unavailable' |
|
|
|
|
|
class LiveStreamError(VideoUnavailable): |
|
"""Video is a live stream.""" |
|
|
|
def __init__(self, video_id: str): |
|
""" |
|
:param str video_id: |
|
A YouTube video identifier. |
|
""" |
|
self.video_id = video_id |
|
super().__init__(self.video_id) |
|
|
|
@property |
|
def error_string(self): |
|
return f'{self.video_id} is streaming live and cannot be loaded' |
|
|
|
|
|
class VideoPrivate(VideoUnavailable): |
|
def __init__(self, video_id: str): |
|
""" |
|
:param str video_id: |
|
A YouTube video identifier. |
|
""" |
|
self.video_id = video_id |
|
super().__init__(self.video_id) |
|
|
|
@property |
|
def error_string(self): |
|
return f'{self.video_id} is a private video' |
|
|
|
|
|
class RecordingUnavailable(VideoUnavailable): |
|
def __init__(self, video_id: str): |
|
""" |
|
:param str video_id: |
|
A YouTube video identifier. |
|
""" |
|
self.video_id = video_id |
|
super().__init__(self.video_id) |
|
|
|
@property |
|
def error_string(self): |
|
return f'{self.video_id} does not have a live stream recording available' |
|
|
|
|
|
class MembersOnly(VideoUnavailable): |
|
"""Video is members-only. |
|
|
|
YouTube has special videos that are only viewable to users who have |
|
subscribed to a content creator. |
|
ref: https://support.google.com/youtube/answer/7544492?hl=en |
|
""" |
|
def __init__(self, video_id: str): |
|
""" |
|
:param str video_id: |
|
A YouTube video identifier. |
|
""" |
|
self.video_id = video_id |
|
super().__init__(self.video_id) |
|
|
|
@property |
|
def error_string(self): |
|
return f'{self.video_id} is a members-only video' |
|
|
|
|
|
class VideoRegionBlocked(VideoUnavailable): |
|
def __init__(self, video_id: str): |
|
""" |
|
:param str video_id: |
|
A YouTube video identifier. |
|
""" |
|
self.video_id = video_id |
|
super().__init__(self.video_id) |
|
|
|
@property |
|
def error_string(self): |
|
return f'{self.video_id} is not available in your region' |
|
|