29 lines
933 B
Python
29 lines
933 B
Python
import re
|
|
from .. exceptions import InvalidVideoIdException
|
|
|
|
|
|
PATTERN = re.compile(r"((?<=(v|V)/)|(?<=be/)|(?<=(\?|\&)v=)|(?<=embed/))([\w-]+)")
|
|
YT_VIDEO_ID_LENGTH = 11
|
|
|
|
|
|
def extract_video_id(url_or_id: str) -> str:
|
|
ret = ''
|
|
if '[' in url_or_id:
|
|
url_or_id = url_or_id.replace('[', '').replace(']', '')
|
|
|
|
if type(url_or_id) != str:
|
|
raise TypeError(f"{url_or_id}: URL or VideoID must be str, but {type(url_or_id)} is passed.")
|
|
if len(url_or_id) == YT_VIDEO_ID_LENGTH:
|
|
return url_or_id
|
|
match = re.search(PATTERN, url_or_id)
|
|
if match is None:
|
|
raise InvalidVideoIdException(f"Invalid video id: {url_or_id}")
|
|
try:
|
|
ret = match.group(4)
|
|
except IndexError:
|
|
raise InvalidVideoIdException(f"Invalid video id: {url_or_id}")
|
|
|
|
if ret is None or len(ret) != YT_VIDEO_ID_LENGTH:
|
|
raise InvalidVideoIdException(f"Invalid video id: {url_or_id}")
|
|
return ret
|