|
|
|
@ -45,9 +45,7 @@ class LoadStreams: |
|
|
|
|
st = f'{i + 1}/{n}: {s}... ' |
|
|
|
|
if urlparse(s).hostname in ('www.youtube.com', 'youtube.com', 'youtu.be'): # if source is YouTube video |
|
|
|
|
# YouTube format i.e. 'https://www.youtube.com/watch?v=Zgi9g1ksQHc' or 'https://youtu.be/Zgi9g1ksQHc' |
|
|
|
|
check_requirements(('pafy', 'youtube_dl==2020.12.2')) |
|
|
|
|
import pafy # noqa |
|
|
|
|
s = pafy.new(s).getbest(preftype='mp4').url # YouTube URL |
|
|
|
|
s = get_best_youtube_url(s) |
|
|
|
|
s = eval(s) if s.isnumeric() else s # i.e. s = '0' local webcam |
|
|
|
|
if s == 0 and (is_colab() or is_kaggle()): |
|
|
|
|
raise NotImplementedError("'source=0' webcam not supported in Colab and Kaggle notebooks. " |
|
|
|
@ -337,6 +335,35 @@ def autocast_list(source): |
|
|
|
|
|
|
|
|
|
LOADERS = [LoadStreams, LoadPilAndNumpy, LoadImages, LoadScreenshots] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_best_youtube_url(url, use_pafy=True): |
|
|
|
|
""" |
|
|
|
|
Retrieves the URL of the best quality MP4 video stream from a given YouTube video. |
|
|
|
|
|
|
|
|
|
This function uses the pafy or yt_dlp library to extract the video info from YouTube. It then finds the highest |
|
|
|
|
quality MP4 format that has video codec but no audio codec, and returns the URL of this video stream. |
|
|
|
|
|
|
|
|
|
Args: |
|
|
|
|
url (str): The URL of the YouTube video. |
|
|
|
|
use_pafy (bool): Use the pafy package, default=True, otherwise use yt_dlp package. |
|
|
|
|
|
|
|
|
|
Returns: |
|
|
|
|
str: The URL of the best quality MP4 video stream, or None if no suitable stream is found. |
|
|
|
|
""" |
|
|
|
|
if use_pafy: |
|
|
|
|
check_requirements(('pafy', 'youtube_dl==2020.12.2')) |
|
|
|
|
import pafy # noqa |
|
|
|
|
return pafy.new(url).getbest(preftype='mp4').url |
|
|
|
|
else: |
|
|
|
|
check_requirements('yt-dlp') |
|
|
|
|
import yt_dlp |
|
|
|
|
with yt_dlp.YoutubeDL({'quiet': True}) as ydl: |
|
|
|
|
info_dict = ydl.extract_info(url, download=False) # extract info |
|
|
|
|
for f in info_dict.get('formats', None): |
|
|
|
|
if f['vcodec'] != 'none' and f['acodec'] == 'none' and f['ext'] == 'mp4': |
|
|
|
|
return f.get('url', None) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
|
img = cv2.imread(str(ROOT / 'assets/bus.jpg')) |
|
|
|
|
dataset = LoadPilAndNumpy(im0=img) |
|
|
|
|