From 64f6b765cbd3b069116818746822c000710edd5e Mon Sep 17 00:00:00 2001 From: Jon Nordby Date: Fri, 16 Apr 2021 23:36:46 +0200 Subject: [PATCH] Remove pafy dependency The pafy has not had any release since 2019 Should fix download errors like KeyError 'like_count', ref https://github.com/mps-youtube/pafy/issues/287 --- download_audioset.py | 128 +++++++++++++++++++++++++++---- requirements.txt | 1 - tests/data/69kudlOXwMs.info.json | 1 + tests/test_download.py | 53 +++++++++++++ utils.py | 2 +- 5 files changed, 169 insertions(+), 16 deletions(-) create mode 100644 tests/data/69kudlOXwMs.info.json create mode 100644 tests/test_download.py diff --git a/download_audioset.py b/download_audioset.py index 323cb27..3d00372 100644 --- a/download_audioset.py +++ b/download_audioset.py @@ -17,7 +17,6 @@ from functools import partial import multiprocessing_logging -import pafy from errors import SubprocessError, FfmpegValidationError, \ FfmpegIncorrectDurationError, FfmpegUnopenableFileError @@ -317,6 +316,110 @@ def ffmpeg(ffmpeg_path, input_path, output_path, input_args=None, LOGGER.error(error_msg.format(num_retries, input_path, str(last_err))) + +def get_video_info(url): + + import youtube_dl + #print(youtube_dl.__version__) + + ydl_opts = { + 'format': 'bestaudio/best', + 'verbose': True, + 'cookies': 'cookies.txt', + 'print-traffic': True, + } + print(url) + with youtube_dl.YoutubeDL(ydl_opts) as ydl: + result = ydl.extract_info(url, download=False) + + if 'entries' in result: + # Can be a playlist or a list of videos + video = result['entries'][0] + else: + # Just a video + video = result + + return video + + +def get_video_info(url): + + import youtube_dl + + ydl_opts = { + #'format': 'bestaudio/best', + #'verbose': True, + #'cookies': 'cookies.txt', + #'print-traffic': True, + } + with youtube_dl.YoutubeDL(ydl_opts) as ydl: + result = ydl.extract_info(url, download=False) + + if 'entries' in result: + # Can be a playlist or a list of videos + video = result['entries'][0] + else: + # Just a video + video = result + + return video + +def format_is_audio_only(format): + t = format['acodec'] != 'none' \ + and format['vcodec'] == 'none' # no video present, audio only + return t + +def format_is_video_only(format): + t = format['acodec'] == 'none' \ + and format['vcodec'] != 'none' + return t + +def format_is_video_with_audio(format): + t = format['acodec'] != 'none' \ + and format['vcodec'] != 'none' + return t + +def sort_audio_formats(formats, by='abr'): + f = filter(format_is_audio_only, formats) + s = sorted(f, key=lambda f: f[by], reverse=True) + return s + +def get_best_audio_format(formats): + s = sort_audio_formats(formats) + return s[0] + + +# note: Not all formats have vbr? +def sort_video_formats(formats, with_audio=True, by=('width', 'tbr')): + pred = format_is_video_with_audio if with_audio else format_is_video_only + f = filter(pred, formats) + + def get_key(f): + key = tuple(f[k] for k in by) + return key + + s = sorted(f, key=get_key, reverse=True) + return s + + +def get_best_video_format(formats, video_mode, sort_by=('width', 'tbr')): + video_noaudio_formats = sort_video_formats(formats, with_audio=False, by=sort_by) + video_audio_formats = sort_video_formats(formats, with_audio=True, by=sort_by) + + if video_mode == '': + return None + + if video_mode in ('bestvideo', 'bestvideowithaudio'): + # If there isn't a video only option, go with best video with audio + if len(video_noaudio_formats): + return video_noaudio_formats[0] + else: + return video_audio_formats[0] + elif video_mode in ('bestvideoaudio', 'bestvideoaudionoaudio'): + return video_audio_formats[0] + else: + raise ValueError('Invalid video mode: {}'.format(video_mode)) + def download_yt_video(ytid, ts_start, ts_end, output_dir, ffmpeg_path, ffprobe_path, audio_codec='flac', audio_format='flac', audio_sample_rate=48000, audio_bit_depth=16, @@ -408,8 +511,13 @@ def download_yt_video(ytid, ts_start, ts_end, output_dir, ffmpeg_path, ffprobe_p # Get the direct URLs to the videos with best audio and with best video (with audio) - video = pafy.new(video_page_url) - video_duration = video.length + url = f'https://www.youtube.com/watch?v={ytid}' + video = get_video_info(url) + + video_url = video['url'] + video_duration = video['duration'] + print(video['id'], video_duration, video_url) + end_past_video_end = False if ts_end > video_duration: warn_msg = "End time for segment ({} - {}) of video {} extends past end of video (length {} sec)" @@ -418,17 +526,9 @@ def download_yt_video(ytid, ts_start, ts_end, output_dir, ffmpeg_path, ffprobe_p ts_end = ts_start + duration end_past_video_end = True - if video_mode in ('bestvideo', 'bestvideowithaudio', ''): - best_video = video.getbestvideo() - # If there isn't a video only option, go with best video with audio - if best_video is None: - best_video = video.getbest() - elif video_mode in ('bestvideoaudio', 'bestvideoaudionoaudio'): - best_video = video.getbest() - else: - raise ValueError('Invalid video mode: {}'.format(video_mode)) - best_audio = video.getbestaudio() - best_video_url = best_video.url + best_video = get_best_video_format(video['formats'], video_mode=video_mode) + best_audio = get_best_audio_format(video['formats']) + best_video_url = best_video['url'] best_audio_url = best_audio.url audio_info = { diff --git a/requirements.txt b/requirements.txt index 8a99a63..0d1c53e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ youtube-dl==2017.9.15 -pafy==0.5.3.1 multiprocessing-logging==0.2.4 sox==1.3.3 sk-video==1.1.8 diff --git a/tests/data/69kudlOXwMs.info.json b/tests/data/69kudlOXwMs.info.json new file mode 100644 index 0000000..1b3ffb9 --- /dev/null +++ b/tests/data/69kudlOXwMs.info.json @@ -0,0 +1 @@ +{"id": "69kudlOXwMs", "title": "The monorail Tripteron - After some modification, not eliminated bouncing completely", "formats": [{"asr": 48000, "filesize": 1209122, "format_id": "249", "format_note": "tiny", "fps": null, "height": null, "quality": 0, "tbr": 51.887, "url": "https://r5---sn-ab5szn7y.googlevideo.com/videoplayback?expire=1618625861&ei=5fB5YMToLv25mLAPhuqo6AM&ip=2a01%3A7e01%3A%3Af03c%3A92ff%3Afe9b%3Aeeb5&id=o-APDNrdAOlNLTIvanHx63hNc1-WfhwXQ9PHjqPHXekknS&itag=249&source=youtube&requiressl=yes&mh=nb&mm=31%2C29&mn=sn-ab5szn7y%2Csn-ab5l6ndr&ms=au%2Crdu&mv=m&mvi=5&pl=64&initcwndbps=2116250&vprv=1&mime=audio%2Fwebm&ns=Sk5CotPVxIYwFNWPIYRv1zMF&gir=yes&clen=1209122&dur=186.421&lmt=1618570050217116&mt=1618603958&fvip=5&keepalive=yes&fexp=24001373%2C24007246&c=WEB&txp=5311224&n=gyTaoSzC_X6pu545cOW&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRQIgDoMEPbuR_L72-Dpt2vRG1GR-5lFxuinrFbxoWRhZ-2gCIQC0Mz3m4A3gr6YPvjuO3ug6UxHeFYavapHZlbOvpDZYew%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANQTZvK79vcAr1n2fzrH__MiAqapv-YrDbaYvIp9s35eAiB2U0cAwCEvIXp1y3YEOvi9laHWwbLbtp-87hHVGRu_Tg%3D%3D", "width": null, "ext": "webm", "vcodec": "none", "acodec": "opus", "abr": 51.887, "downloader_options": {"http_chunk_size": 10485760}, "container": "webm_dash", "format": "249 - audio only (tiny)", "protocol": "https", "http_headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3749.0 Safari/537.36", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-us,en;q=0.5"}}, {"asr": 48000, "filesize": 1574150, "format_id": "250", "format_note": "tiny", "fps": null, "height": null, "quality": 0, "tbr": 67.552, "url": "https://r5---sn-ab5szn7y.googlevideo.com/videoplayback?expire=1618625861&ei=5fB5YMToLv25mLAPhuqo6AM&ip=2a01%3A7e01%3A%3Af03c%3A92ff%3Afe9b%3Aeeb5&id=o-APDNrdAOlNLTIvanHx63hNc1-WfhwXQ9PHjqPHXekknS&itag=250&source=youtube&requiressl=yes&mh=nb&mm=31%2C29&mn=sn-ab5szn7y%2Csn-ab5l6ndr&ms=au%2Crdu&mv=m&mvi=5&pl=64&initcwndbps=2116250&vprv=1&mime=audio%2Fwebm&ns=Sk5CotPVxIYwFNWPIYRv1zMF&gir=yes&clen=1574150&dur=186.421&lmt=1618570050238473&mt=1618603958&fvip=5&keepalive=yes&fexp=24001373%2C24007246&c=WEB&txp=5311224&n=gyTaoSzC_X6pu545cOW&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRgIhAMsha-xBSA07v-2-TPAOkqoqzF4TQU-WEPMBv_HxqpoaAiEA_c6LyCdQV9GLieVUekmDKd9ggc-JT9MNVJ1ow8D2a3g%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANQTZvK79vcAr1n2fzrH__MiAqapv-YrDbaYvIp9s35eAiB2U0cAwCEvIXp1y3YEOvi9laHWwbLbtp-87hHVGRu_Tg%3D%3D", "width": null, "ext": "webm", "vcodec": "none", "acodec": "opus", "abr": 67.552, "downloader_options": {"http_chunk_size": 10485760}, "container": "webm_dash", "format": "250 - audio only (tiny)", "protocol": "https", "http_headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3749.0 Safari/537.36", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-us,en;q=0.5"}}, {"asr": 44100, "filesize": 3018287, "format_id": "140", "format_note": "tiny", "fps": null, "height": null, "quality": 0, "tbr": 129.501, "url": "https://r5---sn-ab5szn7y.googlevideo.com/videoplayback?expire=1618625861&ei=5fB5YMToLv25mLAPhuqo6AM&ip=2a01%3A7e01%3A%3Af03c%3A92ff%3Afe9b%3Aeeb5&id=o-APDNrdAOlNLTIvanHx63hNc1-WfhwXQ9PHjqPHXekknS&itag=140&source=youtube&requiressl=yes&mh=nb&mm=31%2C29&mn=sn-ab5szn7y%2Csn-ab5l6ndr&ms=au%2Crdu&mv=m&mvi=5&pl=64&initcwndbps=2116250&vprv=1&mime=audio%2Fmp4&ns=Sk5CotPVxIYwFNWPIYRv1zMF&gir=yes&clen=3018287&dur=186.456&lmt=1618570033186695&mt=1618603958&fvip=5&keepalive=yes&fexp=24001373%2C24007246&c=WEB&txp=5311224&n=gyTaoSzC_X6pu545cOW&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRQIgEOSe7qA8tqIawwCipZSEQC5ZRaAk3GC3EgiASx-w2zgCIQCwDa1EXdAzumNi-0voE3YdrzOqFrqsSPE-MNsAjtn_Kw%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANQTZvK79vcAr1n2fzrH__MiAqapv-YrDbaYvIp9s35eAiB2U0cAwCEvIXp1y3YEOvi9laHWwbLbtp-87hHVGRu_Tg%3D%3D", "width": null, "ext": "m4a", "vcodec": "none", "acodec": "mp4a.40.2", "abr": 129.501, "downloader_options": {"http_chunk_size": 10485760}, "container": "m4a_dash", "format": "140 - audio only (tiny)", "protocol": "https", "http_headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3749.0 Safari/537.36", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-us,en;q=0.5"}}, {"asr": 48000, "filesize": 3051615, "format_id": "251", "format_note": "tiny", "fps": null, "height": null, "quality": 0, "tbr": 130.955, "url": "https://r5---sn-ab5szn7y.googlevideo.com/videoplayback?expire=1618625861&ei=5fB5YMToLv25mLAPhuqo6AM&ip=2a01%3A7e01%3A%3Af03c%3A92ff%3Afe9b%3Aeeb5&id=o-APDNrdAOlNLTIvanHx63hNc1-WfhwXQ9PHjqPHXekknS&itag=251&source=youtube&requiressl=yes&mh=nb&mm=31%2C29&mn=sn-ab5szn7y%2Csn-ab5l6ndr&ms=au%2Crdu&mv=m&mvi=5&pl=64&initcwndbps=2116250&vprv=1&mime=audio%2Fwebm&ns=Sk5CotPVxIYwFNWPIYRv1zMF&gir=yes&clen=3051615&dur=186.421&lmt=1618570050225896&mt=1618603958&fvip=5&keepalive=yes&fexp=24001373%2C24007246&c=WEB&txp=5311224&n=gyTaoSzC_X6pu545cOW&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRQIhALXlb-c8IZ-PlT8rTMfg9NtPx6sWvA3-3kH2kqyBoV_MAiBlyuMsrWdnqU5b1QOxn2_Ka1QFINY1Dvrn1qcLxsbbVw%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANQTZvK79vcAr1n2fzrH__MiAqapv-YrDbaYvIp9s35eAiB2U0cAwCEvIXp1y3YEOvi9laHWwbLbtp-87hHVGRu_Tg%3D%3D", "width": null, "ext": "webm", "vcodec": "none", "acodec": "opus", "abr": 130.955, "downloader_options": {"http_chunk_size": 10485760}, "container": "webm_dash", "format": "251 - audio only (tiny)", "protocol": "https", "http_headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3749.0 Safari/537.36", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-us,en;q=0.5"}}, {"asr": null, "filesize": 2170483, "format_id": "278", "format_note": "144p", "fps": 30, "height": 144, "quality": 0, "tbr": 93.154, "url": "https://r5---sn-ab5szn7y.googlevideo.com/videoplayback?expire=1618625861&ei=5fB5YMToLv25mLAPhuqo6AM&ip=2a01%3A7e01%3A%3Af03c%3A92ff%3Afe9b%3Aeeb5&id=o-APDNrdAOlNLTIvanHx63hNc1-WfhwXQ9PHjqPHXekknS&itag=278&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278&source=youtube&requiressl=yes&mh=nb&mm=31%2C29&mn=sn-ab5szn7y%2Csn-ab5l6ndr&ms=au%2Crdu&mv=m&mvi=5&pl=64&initcwndbps=2116250&vprv=1&mime=video%2Fwebm&ns=Sk5CotPVxIYwFNWPIYRv1zMF&gir=yes&clen=2170483&dur=186.399&lmt=1618570030058064&mt=1618603958&fvip=5&keepalive=yes&fexp=24001373%2C24007246&c=WEB&txp=5316224&n=gyTaoSzC_X6pu545cOW&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRAIgNVvYBnwHD60TpjH1Oh3Gq6S_vkU3OFF3BqXxjLX8cXMCIDYG4IXA3_b0qXzNwUNhEQ5rclm8rY98adRtwpfO3MmL&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANQTZvK79vcAr1n2fzrH__MiAqapv-YrDbaYvIp9s35eAiB2U0cAwCEvIXp1y3YEOvi9laHWwbLbtp-87hHVGRu_Tg%3D%3D", "width": 256, "ext": "webm", "vcodec": "vp9", "acodec": "none", "vbr": 93.154, "downloader_options": {"http_chunk_size": 10485760}, "container": "webm_dash", "format": "278 - 256x144 (144p)", "protocol": "https", "http_headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3749.0 Safari/537.36", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-us,en;q=0.5"}}, {"asr": null, "filesize": 2567628, "format_id": "160", "format_note": "144p", "fps": 30, "height": 144, "quality": 0, "tbr": 110.199, "url": "https://r5---sn-ab5szn7y.googlevideo.com/videoplayback?expire=1618625861&ei=5fB5YMToLv25mLAPhuqo6AM&ip=2a01%3A7e01%3A%3Af03c%3A92ff%3Afe9b%3Aeeb5&id=o-APDNrdAOlNLTIvanHx63hNc1-WfhwXQ9PHjqPHXekknS&itag=160&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278&source=youtube&requiressl=yes&mh=nb&mm=31%2C29&mn=sn-ab5szn7y%2Csn-ab5l6ndr&ms=au%2Crdu&mv=m&mvi=5&pl=64&initcwndbps=2116250&vprv=1&mime=video%2Fmp4&ns=Sk5CotPVxIYwFNWPIYRv1zMF&gir=yes&clen=2567628&dur=186.399&lmt=1618570027742394&mt=1618603958&fvip=5&keepalive=yes&fexp=24001373%2C24007246&c=WEB&txp=5316224&n=gyTaoSzC_X6pu545cOW&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRQIhAKI2vx0Wv16FMJt9CjI9S8ApnNcZRQeNFPG4Wug2ThxjAiA6UTS6XvWtIWNhsB9ZE27li92rThyutHt2pIrK5rxd6w%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANQTZvK79vcAr1n2fzrH__MiAqapv-YrDbaYvIp9s35eAiB2U0cAwCEvIXp1y3YEOvi9laHWwbLbtp-87hHVGRu_Tg%3D%3D", "width": 256, "ext": "mp4", "vcodec": "avc1.4d400c", "acodec": "none", "vbr": 110.199, "downloader_options": {"http_chunk_size": 10485760}, "container": "mp4_dash", "format": "160 - 256x144 (144p)", "protocol": "https", "http_headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3749.0 Safari/537.36", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-us,en;q=0.5"}}, {"asr": null, "filesize": 4540100, "format_id": "242", "format_note": "240p", "fps": 30, "height": 240, "quality": 1, "tbr": 194.855, "url": "https://r5---sn-ab5szn7y.googlevideo.com/videoplayback?expire=1618625861&ei=5fB5YMToLv25mLAPhuqo6AM&ip=2a01%3A7e01%3A%3Af03c%3A92ff%3Afe9b%3Aeeb5&id=o-APDNrdAOlNLTIvanHx63hNc1-WfhwXQ9PHjqPHXekknS&itag=242&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278&source=youtube&requiressl=yes&mh=nb&mm=31%2C29&mn=sn-ab5szn7y%2Csn-ab5l6ndr&ms=au%2Crdu&mv=m&mvi=5&pl=64&initcwndbps=2116250&vprv=1&mime=video%2Fwebm&ns=Sk5CotPVxIYwFNWPIYRv1zMF&gir=yes&clen=4540100&dur=186.399&lmt=1618570029372859&mt=1618603958&fvip=5&keepalive=yes&fexp=24001373%2C24007246&c=WEB&txp=5316224&n=gyTaoSzC_X6pu545cOW&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRQIgCJvXdRVxkXTEEbnPFiuhNvXw8z8lFu3QVv616U4es6gCIQDBn3lCgNh4tvSoFJgqRzRp00R99kUeVOvsNGjJflggqA%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANQTZvK79vcAr1n2fzrH__MiAqapv-YrDbaYvIp9s35eAiB2U0cAwCEvIXp1y3YEOvi9laHWwbLbtp-87hHVGRu_Tg%3D%3D", "width": 426, "ext": "webm", "vcodec": "vp9", "acodec": "none", "vbr": 194.855, "downloader_options": {"http_chunk_size": 10485760}, "container": "webm_dash", "format": "242 - 426x240 (240p)", "protocol": "https", "http_headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3749.0 Safari/537.36", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-us,en;q=0.5"}}, {"asr": null, "filesize": 5528913, "format_id": "133", "format_note": "240p", "fps": 30, "height": 240, "quality": 1, "tbr": 237.293, "url": "https://r5---sn-ab5szn7y.googlevideo.com/videoplayback?expire=1618625861&ei=5fB5YMToLv25mLAPhuqo6AM&ip=2a01%3A7e01%3A%3Af03c%3A92ff%3Afe9b%3Aeeb5&id=o-APDNrdAOlNLTIvanHx63hNc1-WfhwXQ9PHjqPHXekknS&itag=133&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278&source=youtube&requiressl=yes&mh=nb&mm=31%2C29&mn=sn-ab5szn7y%2Csn-ab5l6ndr&ms=au%2Crdu&mv=m&mvi=5&pl=64&initcwndbps=2116250&vprv=1&mime=video%2Fmp4&ns=Sk5CotPVxIYwFNWPIYRv1zMF&gir=yes&clen=5528913&dur=186.399&lmt=1618570027216143&mt=1618603958&fvip=5&keepalive=yes&fexp=24001373%2C24007246&c=WEB&txp=5316224&n=gyTaoSzC_X6pu545cOW&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRQIhAPLCOBmIwRx9DG8JXjnSdd5dp04aNTcX-n78CCEdOyQUAiBwuzqMkIqCmYESJ_SkfyWTmwpNAEraj_0Y1MKotT-zig%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANQTZvK79vcAr1n2fzrH__MiAqapv-YrDbaYvIp9s35eAiB2U0cAwCEvIXp1y3YEOvi9laHWwbLbtp-87hHVGRu_Tg%3D%3D", "width": 426, "ext": "mp4", "vcodec": "avc1.4d4015", "acodec": "none", "vbr": 237.293, "downloader_options": {"http_chunk_size": 10485760}, "container": "mp4_dash", "format": "133 - 426x240 (240p)", "protocol": "https", "http_headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3749.0 Safari/537.36", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-us,en;q=0.5"}}, {"asr": null, "filesize": 7419350, "format_id": "243", "format_note": "360p", "fps": 30, "height": 360, "quality": 2, "tbr": 318.428, "url": "https://r5---sn-ab5szn7y.googlevideo.com/videoplayback?expire=1618625861&ei=5fB5YMToLv25mLAPhuqo6AM&ip=2a01%3A7e01%3A%3Af03c%3A92ff%3Afe9b%3Aeeb5&id=o-APDNrdAOlNLTIvanHx63hNc1-WfhwXQ9PHjqPHXekknS&itag=243&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278&source=youtube&requiressl=yes&mh=nb&mm=31%2C29&mn=sn-ab5szn7y%2Csn-ab5l6ndr&ms=au%2Crdu&mv=m&mvi=5&pl=64&initcwndbps=2116250&vprv=1&mime=video%2Fwebm&ns=Sk5CotPVxIYwFNWPIYRv1zMF&gir=yes&clen=7419350&dur=186.399&lmt=1618570027036808&mt=1618603958&fvip=5&keepalive=yes&fexp=24001373%2C24007246&c=WEB&txp=5316224&n=gyTaoSzC_X6pu545cOW&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRAIgEmaiZi9Im1QYob7pELp6zP_t_qx22ARcgeLvc74_sjACIAN0cb-QI7teC0dykzRyO20KH7T69EhFzAz_kWkfVJcX&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANQTZvK79vcAr1n2fzrH__MiAqapv-YrDbaYvIp9s35eAiB2U0cAwCEvIXp1y3YEOvi9laHWwbLbtp-87hHVGRu_Tg%3D%3D", "width": 640, "ext": "webm", "vcodec": "vp9", "acodec": "none", "vbr": 318.428, "downloader_options": {"http_chunk_size": 10485760}, "container": "webm_dash", "format": "243 - 640x360 (360p)", "protocol": "https", "http_headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3749.0 Safari/537.36", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-us,en;q=0.5"}}, {"asr": null, "filesize": 10052495, "format_id": "134", "format_note": "360p", "fps": 30, "height": 360, "quality": 2, "tbr": 431.439, "url": "https://r5---sn-ab5szn7y.googlevideo.com/videoplayback?expire=1618625861&ei=5fB5YMToLv25mLAPhuqo6AM&ip=2a01%3A7e01%3A%3Af03c%3A92ff%3Afe9b%3Aeeb5&id=o-APDNrdAOlNLTIvanHx63hNc1-WfhwXQ9PHjqPHXekknS&itag=134&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278&source=youtube&requiressl=yes&mh=nb&mm=31%2C29&mn=sn-ab5szn7y%2Csn-ab5l6ndr&ms=au%2Crdu&mv=m&mvi=5&pl=64&initcwndbps=2116250&vprv=1&mime=video%2Fmp4&ns=Sk5CotPVxIYwFNWPIYRv1zMF&gir=yes&clen=10052495&dur=186.399&lmt=1618570028243045&mt=1618603958&fvip=5&keepalive=yes&fexp=24001373%2C24007246&c=WEB&txp=5316224&n=gyTaoSzC_X6pu545cOW&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRQIgHhZKgOZ7qXbZC7sx0-NEH8NiB10c_5NLDCzkLthgkc8CIQCPJZkKbALIRzoa47F_kufkHRJfkohDMePdzRt6OGpTuw%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANQTZvK79vcAr1n2fzrH__MiAqapv-YrDbaYvIp9s35eAiB2U0cAwCEvIXp1y3YEOvi9laHWwbLbtp-87hHVGRu_Tg%3D%3D", "width": 640, "ext": "mp4", "vcodec": "avc1.4d401e", "acodec": "none", "vbr": 431.439, "downloader_options": {"http_chunk_size": 10485760}, "container": "mp4_dash", "format": "134 - 640x360 (360p)", "protocol": "https", "http_headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3749.0 Safari/537.36", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-us,en;q=0.5"}}, {"asr": null, "filesize": 11665157, "format_id": "244", "format_note": "480p", "fps": 30, "height": 480, "quality": 3, "tbr": 500.653, "url": "https://r5---sn-ab5szn7y.googlevideo.com/videoplayback?expire=1618625861&ei=5fB5YMToLv25mLAPhuqo6AM&ip=2a01%3A7e01%3A%3Af03c%3A92ff%3Afe9b%3Aeeb5&id=o-APDNrdAOlNLTIvanHx63hNc1-WfhwXQ9PHjqPHXekknS&itag=244&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278&source=youtube&requiressl=yes&mh=nb&mm=31%2C29&mn=sn-ab5szn7y%2Csn-ab5l6ndr&ms=au%2Crdu&mv=m&mvi=5&pl=64&initcwndbps=2116250&vprv=1&mime=video%2Fwebm&ns=Sk5CotPVxIYwFNWPIYRv1zMF&gir=yes&clen=11665157&dur=186.399&lmt=1618570027384683&mt=1618603958&fvip=5&keepalive=yes&fexp=24001373%2C24007246&c=WEB&txp=5316224&n=gyTaoSzC_X6pu545cOW&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRQIhAKYDl581fF4_8G6PMqqFxc4_Oq099YqRWmOsUsx3GQ-9AiAGl673aPzfRSfZuWlI_WYLy4qMi3M24LjCvZ5pZzYODg%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANQTZvK79vcAr1n2fzrH__MiAqapv-YrDbaYvIp9s35eAiB2U0cAwCEvIXp1y3YEOvi9laHWwbLbtp-87hHVGRu_Tg%3D%3D", "width": 854, "ext": "webm", "vcodec": "vp9", "acodec": "none", "vbr": 500.653, "downloader_options": {"http_chunk_size": 10485760}, "container": "webm_dash", "format": "244 - 854x480 (480p)", "protocol": "https", "http_headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3749.0 Safari/537.36", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-us,en;q=0.5"}}, {"asr": null, "filesize": 17743648, "format_id": "135", "format_note": "480p", "fps": 30, "height": 480, "quality": 3, "tbr": 761.534, "url": "https://r5---sn-ab5szn7y.googlevideo.com/videoplayback?expire=1618625861&ei=5fB5YMToLv25mLAPhuqo6AM&ip=2a01%3A7e01%3A%3Af03c%3A92ff%3Afe9b%3Aeeb5&id=o-APDNrdAOlNLTIvanHx63hNc1-WfhwXQ9PHjqPHXekknS&itag=135&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278&source=youtube&requiressl=yes&mh=nb&mm=31%2C29&mn=sn-ab5szn7y%2Csn-ab5l6ndr&ms=au%2Crdu&mv=m&mvi=5&pl=64&initcwndbps=2116250&vprv=1&mime=video%2Fmp4&ns=Sk5CotPVxIYwFNWPIYRv1zMF&gir=yes&clen=17743648&dur=186.399&lmt=1618570027335217&mt=1618603958&fvip=5&keepalive=yes&fexp=24001373%2C24007246&c=WEB&txp=5316224&n=gyTaoSzC_X6pu545cOW&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRgIhAJ9n3vgnWK8BfA8zixGciPruYzDCTkhM4Zla4_Cz6dQAAiEA0XX1uQ0SOvlV9OXnz6P6JxBXzgP_2SSA5rgoj7POmUU%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANQTZvK79vcAr1n2fzrH__MiAqapv-YrDbaYvIp9s35eAiB2U0cAwCEvIXp1y3YEOvi9laHWwbLbtp-87hHVGRu_Tg%3D%3D", "width": 854, "ext": "mp4", "vcodec": "avc1.4d401f", "acodec": "none", "vbr": 761.534, "downloader_options": {"http_chunk_size": 10485760}, "container": "mp4_dash", "format": "135 - 854x480 (480p)", "protocol": "https", "http_headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3749.0 Safari/537.36", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-us,en;q=0.5"}}, {"asr": null, "filesize": 20817286, "format_id": "247", "format_note": "720p", "fps": 30, "height": 720, "quality": 4, "tbr": 893.45, "url": "https://r5---sn-ab5szn7y.googlevideo.com/videoplayback?expire=1618625861&ei=5fB5YMToLv25mLAPhuqo6AM&ip=2a01%3A7e01%3A%3Af03c%3A92ff%3Afe9b%3Aeeb5&id=o-APDNrdAOlNLTIvanHx63hNc1-WfhwXQ9PHjqPHXekknS&itag=247&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278&source=youtube&requiressl=yes&mh=nb&mm=31%2C29&mn=sn-ab5szn7y%2Csn-ab5l6ndr&ms=au%2Crdu&mv=m&mvi=5&pl=64&initcwndbps=2116250&vprv=1&mime=video%2Fwebm&ns=Sk5CotPVxIYwFNWPIYRv1zMF&gir=yes&clen=20817286&dur=186.399&lmt=1618570027613547&mt=1618603958&fvip=5&keepalive=yes&fexp=24001373%2C24007246&c=WEB&txp=5316224&n=gyTaoSzC_X6pu545cOW&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRQIgcFAEFZG6PVuObHtA7xN-JFCyC9HYV-sTQY1DDBO8sakCIQDlAc5pXV-NWNs_miksTgb1BfQJXlmIXA7Y65sRuPdgRw%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANQTZvK79vcAr1n2fzrH__MiAqapv-YrDbaYvIp9s35eAiB2U0cAwCEvIXp1y3YEOvi9laHWwbLbtp-87hHVGRu_Tg%3D%3D", "width": 1280, "ext": "webm", "vcodec": "vp9", "acodec": "none", "vbr": 893.45, "downloader_options": {"http_chunk_size": 10485760}, "container": "webm_dash", "format": "247 - 1280x720 (720p)", "protocol": "https", "http_headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3749.0 Safari/537.36", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-us,en;q=0.5"}}, {"asr": null, "filesize": 35656037, "format_id": "136", "format_note": "720p", "fps": 30, "height": 720, "quality": 4, "tbr": 1530.31, "url": "https://r5---sn-ab5szn7y.googlevideo.com/videoplayback?expire=1618625861&ei=5fB5YMToLv25mLAPhuqo6AM&ip=2a01%3A7e01%3A%3Af03c%3A92ff%3Afe9b%3Aeeb5&id=o-APDNrdAOlNLTIvanHx63hNc1-WfhwXQ9PHjqPHXekknS&itag=136&aitags=133%2C134%2C135%2C136%2C160%2C242%2C243%2C244%2C247%2C278&source=youtube&requiressl=yes&mh=nb&mm=31%2C29&mn=sn-ab5szn7y%2Csn-ab5l6ndr&ms=au%2Crdu&mv=m&mvi=5&pl=64&initcwndbps=2116250&vprv=1&mime=video%2Fmp4&ns=Sk5CotPVxIYwFNWPIYRv1zMF&gir=yes&clen=35656037&dur=186.399&lmt=1618570028345409&mt=1618603958&fvip=5&keepalive=yes&fexp=24001373%2C24007246&c=WEB&txp=5316224&n=gyTaoSzC_X6pu545cOW&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&sig=AOq0QJ8wRQIgCuAMCM5ABKCexrjkyEro0aUXt1KmAWVclhvd3t_uLvoCIQCRPAoUTw07gV72RnXf-VGcH7DwmeODIBqRhKMRav7TAQ%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANQTZvK79vcAr1n2fzrH__MiAqapv-YrDbaYvIp9s35eAiB2U0cAwCEvIXp1y3YEOvi9laHWwbLbtp-87hHVGRu_Tg%3D%3D", "width": 1280, "ext": "mp4", "vcodec": "avc1.64001f", "acodec": "none", "vbr": 1530.31, "downloader_options": {"http_chunk_size": 10485760}, "container": "mp4_dash", "format": "136 - 1280x720 (720p)", "protocol": "https", "http_headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3749.0 Safari/537.36", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-us,en;q=0.5"}}, {"asr": 44100, "filesize": 12263549, "format_id": "18", "format_note": "360p", "fps": 30, "height": 360, "quality": 2, "tbr": 526.174, "url": "https://r5---sn-ab5szn7y.googlevideo.com/videoplayback?expire=1618625861&ei=5fB5YMToLv25mLAPhuqo6AM&ip=2a01%3A7e01%3A%3Af03c%3A92ff%3Afe9b%3Aeeb5&id=o-APDNrdAOlNLTIvanHx63hNc1-WfhwXQ9PHjqPHXekknS&itag=18&source=youtube&requiressl=yes&mh=nb&mm=31%2C29&mn=sn-ab5szn7y%2Csn-ab5l6ndr&ms=au%2Crdu&mv=m&mvi=5&pl=64&initcwndbps=2116250&vprv=1&mime=video%2Fmp4&ns=se4MvqyMqfcdw-Nipy5hSaEF&gir=yes&clen=12263549&ratebypass=yes&dur=186.456&lmt=1618570001678898&mt=1618603958&fvip=5&fexp=24001373%2C24007246&c=WEB&txp=5310224&n=MXFaAmECCrpUBYFJbVD&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&sig=AOq0QJ8wRQIhAIzNW4EvNxQjFAEyoh0Dio1KSPuRCOthhdqGf0ez_bAeAiB-bHH0koBtPWJT5ADC_ypt1FGWl6fSYTfGpbDHCtajcw%3D%3D&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANQTZvK79vcAr1n2fzrH__MiAqapv-YrDbaYvIp9s35eAiB2U0cAwCEvIXp1y3YEOvi9laHWwbLbtp-87hHVGRu_Tg%3D%3D", "width": 640, "ext": "mp4", "vcodec": "avc1.42001E", "acodec": "mp4a.40.2", "format": "18 - 640x360 (360p)", "protocol": "https", "http_headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3749.0 Safari/537.36", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-us,en;q=0.5"}}, {"asr": 44100, "filesize": null, "format_id": "22", "format_note": "720p", "fps": 30, "height": 720, "quality": 4, "tbr": 1662.976, "url": "https://r5---sn-ab5szn7y.googlevideo.com/videoplayback?expire=1618625861&ei=5fB5YMToLv25mLAPhuqo6AM&ip=2a01%3A7e01%3A%3Af03c%3A92ff%3Afe9b%3Aeeb5&id=o-APDNrdAOlNLTIvanHx63hNc1-WfhwXQ9PHjqPHXekknS&itag=22&source=youtube&requiressl=yes&mh=nb&mm=31%2C29&mn=sn-ab5szn7y%2Csn-ab5l6ndr&ms=au%2Crdu&mv=m&mvi=5&pl=64&initcwndbps=2116250&vprv=1&mime=video%2Fmp4&ns=se4MvqyMqfcdw-Nipy5hSaEF&cnr=14&ratebypass=yes&dur=186.456&lmt=1618570035107642&mt=1618603958&fvip=5&fexp=24001373%2C24007246&c=WEB&txp=5311224&n=MXFaAmECCrpUBYFJbVD&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Ccnr%2Cratebypass%2Cdur%2Clmt&sig=AOq0QJ8wRAIgRdYTQfC9SzKHF6Eu5FYiHTSqHdgPiXW1SgALhPiyESMCIF0tm5s1DQ4xRunbwkyRDbZoM08-Ibrk3ZlCnJl3saJo&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANQTZvK79vcAr1n2fzrH__MiAqapv-YrDbaYvIp9s35eAiB2U0cAwCEvIXp1y3YEOvi9laHWwbLbtp-87hHVGRu_Tg%3D%3D", "width": 1280, "ext": "mp4", "vcodec": "avc1.64001F", "acodec": "mp4a.40.2", "format": "22 - 1280x720 (720p)", "protocol": "https", "http_headers": {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3749.0 Safari/537.36", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "en-us,en;q=0.5"}}], "thumbnails": [{"height": 94, "url": "https://i.ytimg.com/vi/69kudlOXwMs/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLB3M1TrHRF4BrodY8m1Q6LUtyrM8g", "width": 168, "resolution": "168x94", "id": "0"}, {"height": 110, "url": "https://i.ytimg.com/vi/69kudlOXwMs/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLD-gb-k5w7rcTLBscrRlEhFv0KcZw", "width": 196, "resolution": "196x110", "id": "1"}, {"height": 138, "url": "https://i.ytimg.com/vi/69kudlOXwMs/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLCL46P-ZclOrGUzH_Fr-cgDKVKWGA", "width": 246, "resolution": "246x138", "id": "2"}, {"height": 188, "url": "https://i.ytimg.com/vi/69kudlOXwMs/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBuelEhbdvDWpIXxBXsKNInPPOIRA", "width": 336, "resolution": "336x188", "id": "3"}, {"height": 1080, "url": "https://i.ytimg.com/vi_webp/69kudlOXwMs/maxresdefault.webp", "width": 1920, "resolution": "1920x1080", "id": "4"}], "description": "Put new printed parts to remove the gap between the arm bore and bearings.\nBetter than before - not completely removed the bouncing yet.\n\nAll joint will be changed with new design as geared joint of Mr. Nicholas.\nhttps://www.youtube.com/watch?v=bQLYSuHZ0NE\nLooks good idea and help the arm motion. \nBut, it's new design concept and new variable (uncertain) point for me.\n\nSo, I can't sure that the new geared design and new printed parts will not lead to new issue. \n\nSo, now I couldn't decide to go between two option. \n 1) Try to remove the bouncing without new geared design.\n First implement others comments\n - counter mass, increase the rigidity of arm and assemblies.\n 2) Try to remove the bouncing with new geared design.\n First implement geared joint.", "upload_date": "20210411", "uploader": "JK Lee", "uploader_id": "UCxjciMQZUaAkleRaxgz7w2w", "uploader_url": "http://www.youtube.com/channel/UCxjciMQZUaAkleRaxgz7w2w", "channel_id": "UCxjciMQZUaAkleRaxgz7w2w", "channel_url": "https://www.youtube.com/channel/UCxjciMQZUaAkleRaxgz7w2w", "duration": 186, "view_count": 2254, "average_rating": 5.0, "age_limit": 0, "webpage_url": "https://www.youtube.com/watch?v=69kudlOXwMs", "categories": ["People & Blogs"], "tags": [], "is_live": null, "like_count": 111, "dislike_count": 0, "channel": "JK Lee", "extractor": "youtube", "webpage_url_basename": "watch", "extractor_key": "Youtube", "playlist": null, "playlist_index": null, "thumbnail": "https://i.ytimg.com/vi_webp/69kudlOXwMs/maxresdefault.webp", "display_id": "69kudlOXwMs", "format": "136 - 1280x720 (720p)+251 - audio only (tiny)", "format_id": "136+251", "width": 1280, "height": 720, "resolution": null, "fps": 30, "vcodec": "avc1.64001f", "vbr": 1530.31, "stretched_ratio": null, "acodec": "opus", "abr": 130.955, "ext": "mp4", "fulltitle": "The monorail Tripteron - After some modification, not eliminated bouncing completely", "_filename": "The monorail Tripteron - After some modification, not eliminated bouncing completely-69kudlOXwMs.mp4"} \ No newline at end of file diff --git a/tests/test_download.py b/tests/test_download.py new file mode 100644 index 0000000..ba88536 --- /dev/null +++ b/tests/test_download.py @@ -0,0 +1,53 @@ + +import sys +import os.path +import json + +here = os.path.dirname(__file__) + +sys.path.insert(0, os.path.join(here, '..')) +import download_audioset as audiosetdl + + + +def read_json_file(path): + with open(path, 'r') as f: + contents = f.read() + data = json.loads(contents) + return data + +def test_get_best_audio(): + + p = os.path.join(here, 'data/69kudlOXwMs.info.json') + info = read_json_file(p) + expected_best_bitrate = 130.955 + + s = audiosetdl.sort_audio_formats(info["formats"]) + print(list(f['abr'] for f in s)) + + assert s[0]['abr'] == expected_best_bitrate + + best = audiosetdl.get_best_audio_format(info["formats"]) + print(best['abr']) + +def test_get_best_video(): + p = os.path.join(here, 'data/69kudlOXwMs.info.json') + info = read_json_file(p) + + for f in info['formats']: + print(f.get('width'), f.get('vbr'), f.get('tbr')) + + expected_best_width = 1280 + expected_best_bitrate_videoaudio = 1662.976 + expected_best_bitrate_video_only = 1530.31 + + # with audio + best = audiosetdl.get_best_video_format(info["formats"], video_mode='bestvideoaudio') + assert best['width'] == expected_best_width + assert best['tbr'] == expected_best_bitrate_videoaudio + + # without audio + best = audiosetdl.get_best_video_format(info["formats"], video_mode='bestvideo') + assert best['width'] == expected_best_width + assert best['tbr'] == expected_best_bitrate_video_only + diff --git a/utils.py b/utils.py index 44bc4ca..e709af5 100644 --- a/utils.py +++ b/utils.py @@ -112,4 +112,4 @@ def get_subset_name(subset_path): if ext[1:].isdigit(): subset_name, file_num = os.path.splitext(subset_name) - return subset_name \ No newline at end of file + return subset_name