diff --git a/.github/workflows/mocha.yml b/.github/workflows/mocha.yml new file mode 100644 index 0000000..72696ba --- /dev/null +++ b/.github/workflows/mocha.yml @@ -0,0 +1,40 @@ +name: Tests +'on': + push: + branches: + - master + pull_request: + types: + - opened + - synchronize + - reopened + +jobs: + test: + name: 'Backend - mocha' + runs-on: ubuntu-latest + strategy: + matrix: + node: + - 16 + steps: + - uses: actions/setup-node@v3 + with: + node-version: '${{ matrix.node }}' + - uses: actions/checkout@v2 + - name: 'Cache node_modules' + uses: actions/cache@v2 + with: + path: ~/.npm + key: ${{ runner.os }}-node-v${{ matrix.node }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node-v${{ matrix.node }}- + working-directory: ./backend + - uses: FedericoCarboni/setup-ffmpeg@v2 + id: setup-ffmpeg + - name: Install Dependencies + run: npm install + working-directory: ./backend + - name: Run All Node.js Tests + run: npm run test + working-directory: ./backend \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index aa1390b..0c4ba4a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,6 +3,6 @@ "mochaExplorer.cwd": "backend", "mochaExplorer.globImplementation": "vscode", "mochaExplorer.env": { - "YTDL_MODE": "debug" + // "YTDL_MODE": "debug" } } \ No newline at end of file diff --git a/backend/db.js b/backend/db.js index c79debb..0013c5f 100644 --- a/backend/db.js +++ b/backend/db.js @@ -11,9 +11,8 @@ const logger = require('./logger'); const low = require('lowdb') const FileSync = require('lowdb/adapters/FileSync'); const { BehaviorSubject } = require('rxjs'); -const local_adapter = new FileSync('./appdata/local_db.json'); -const local_db = low(local_adapter); +let local_db = null; let database = null; exports.database_initialized = false; exports.database_initialized_bs = new BehaviorSubject(false); @@ -73,10 +72,6 @@ const tables = { const tables_list = Object.keys(tables); -const local_db_defaults = {} -tables_list.forEach(table => {local_db_defaults[table] = []}); -local_db.defaults(local_db_defaults).write(); - let using_local_db = null; function setDB(input_db, input_users_db) { @@ -85,11 +80,18 @@ function setDB(input_db, input_users_db) { exports.users_db = input_users_db } -exports.initialize = (input_db, input_users_db) => { +exports.initialize = (input_db, input_users_db, db_name = 'local_db.json') => { setDB(input_db, input_users_db); // must be done here to prevent getConfigItem from being called before init using_local_db = config_api.getConfigItem('ytdl_use_local_db'); + + const local_adapter = new FileSync(`./appdata/${db_name}`); + local_db = low(local_adapter); + + const local_db_defaults = {} + tables_list.forEach(table => {local_db_defaults[table] = []}); + local_db.defaults(local_db_defaults).write(); } exports.connectToDB = async (retries = 5, no_fallback = false, custom_connection_string = null) => { diff --git a/backend/downloader.js b/backend/downloader.js index 8658502..d37a275 100644 --- a/backend/downloader.js +++ b/backend/downloader.js @@ -7,6 +7,7 @@ const Mutex = require('async-mutex').Mutex; const youtubedl = require('youtube-dl'); const logger = require('./logger'); +const youtubedl_api = require('./youtube-dl'); const config_api = require('./config'); const twitch_api = require('./twitch'); const { create } = require('xmlbuilder2'); @@ -21,10 +22,10 @@ const mutex = new Mutex(); let should_check_downloads = true; if (db_api.database_initialized) { - setupDownloads(); + exports.setupDownloads(); } else { db_api.database_initialized_bs.subscribe(init => { - if (init) setupDownloads(); + if (init) exports.setupDownloads(); }); } @@ -47,7 +48,7 @@ We use checkDownloads() to move downloads through the steps and call their respe */ -exports.createDownload = async (url, type, options, user_uid = null, sub_id = null, sub_name = null, prefetched_info = null) => { +exports.createDownload = async (url, type, options, user_uid = null, sub_id = null, sub_name = null, prefetched_info = null, paused = false) => { return await mutex.runExclusive(async () => { const download = { url: url, @@ -60,7 +61,7 @@ exports.createDownload = async (url, type, options, user_uid = null, sub_id = nu options: options, uid: uuid(), step_index: 0, - paused: false, + paused: paused, running: false, finished_step: true, error: null, @@ -133,7 +134,7 @@ async function handleDownloadError(download, error_message, error_type = null) { await db_api.updateRecord('download_queue', {uid: download['uid']}, {error: error_message, finished: true, running: false, error_type: error_type}); } -async function setupDownloads() { +exports.setupDownloads = async () => { await fixDownloadState(); setInterval(checkDownloads, 1000); } @@ -188,7 +189,7 @@ async function checkDownloads() { if (waiting_download['step_index'] === 0) { collectInfo(waiting_download['uid']); } else if (waiting_download['step_index'] === 1) { - downloadQueuedFile(waiting_download['uid']); + exports.downloadQueuedFile(waiting_download['uid']); } } } @@ -240,7 +241,7 @@ async function collectInfo(download_uid) { let category = null; // check if it fits into a category. If so, then get info again using new args - if (!Array.isArray(info) || config_api.getConfigItem('ytdl_allow_playlist_categorization')) category = await categories_api.categorize(info); + if (info.length === 0 || config_api.getConfigItem('ytdl_allow_playlist_categorization')) category = await categories_api.categorize(info); // set custom output if the category has one and re-retrieve info so the download manager has the right file name if (category && category['custom_output']) { @@ -259,13 +260,9 @@ async function collectInfo(download_uid) { const files_to_check_for_progress = []; // store info in download for future use - if (Array.isArray(info)) { - for (let info_obj of info) files_to_check_for_progress.push(utils.removeFileExtension(info_obj['_filename'])); - } else { - files_to_check_for_progress.push(utils.removeFileExtension(info['_filename'])); - } + for (let info_obj of info) files_to_check_for_progress.push(utils.removeFileExtension(info_obj['_filename'])); - const playlist_title = Array.isArray(info) ? info[0]['playlist_title'] || info[0]['playlist'] : null; + const playlist_title = info.length > 0 ? info[0]['playlist_title'] || info[0]['playlist'] : null; await db_api.updateRecord('download_queue', {uid: download_uid}, {args: args, finished_step: true, running: false, @@ -278,7 +275,7 @@ async function collectInfo(download_uid) { }); } -async function downloadQueuedFile(download_uid) { +exports.downloadQueuedFile = async(download_uid, downloadMethod = youtubedl.exec) => { const download = await db_api.getRecord('download_queue', {uid: download_uid}); if (download['paused']) { return; @@ -306,114 +303,102 @@ async function downloadQueuedFile(download_uid) { const start_time = Date.now(); const download_checker = setInterval(() => checkDownloadPercent(download['uid']), 1000); - + const file_objs = []; // download file - youtubedl.exec(url, args, {maxBuffer: Infinity}, async function(err, output) { - const file_objs = []; - let end_time = Date.now(); - let difference = (end_time - start_time)/1000; - logger.debug(`${type === 'audio' ? 'Audio' : 'Video'} download delay: ${difference} seconds.`); - clearInterval(download_checker); - if (err) { - logger.error(err.stderr); - await handleDownloadError(download, err.stderr, 'unknown_error'); + const {parsed_output, err} = await youtubedl_api.runYoutubeDL(url, args, downloadMethod); + clearInterval(download_checker); + let end_time = Date.now(); + let difference = (end_time - start_time)/1000; + logger.debug(`${type === 'audio' ? 'Audio' : 'Video'} download delay: ${difference} seconds.`); + if (!parsed_output) { + logger.error(err.stderr); + await handleDownloadError(download, err.stderr, 'unknown_error'); + resolve(false); + return; + } else if (parsed_output) { + if (parsed_output.length === 0 || parsed_output[0].length === 0) { + // ERROR! + const error_message = `No output received for video download, check if it exists in your archive.`; + await handleDownloadError(download, error_message, 'no_output'); + logger.warn(error_message); resolve(false); return; - } else if (output) { - if (output.length === 0 || output[0].length === 0) { - // ERROR! - const error_message = `No output received for video download, check if it exists in your archive.`; - await handleDownloadError(download, error_message, 'no_output'); - logger.warn(error_message); - resolve(false); - return; - } - - for (let i = 0; i < output.length; i++) { - let output_json = null; - try { - // we have to do this because sometimes there will be leading characters before the actual json - const start_idx = output[i].indexOf('{"'); - const clean_output = output[i].slice(start_idx, output[i].length); - output_json = JSON.parse(clean_output); - } catch(e) { - output_json = null; - } + } - if (!output_json) { - continue; - } + for (const output_json of parsed_output) { + if (!output_json) { + continue; + } - // get filepath with no extension - const filepath_no_extension = utils.removeFileExtension(output_json['_filename']); + // get filepath with no extension + const filepath_no_extension = utils.removeFileExtension(output_json['_filename']); - const ext = type === 'audio' ? '.mp3' : '.mp4'; - var full_file_path = filepath_no_extension + ext; - var file_name = filepath_no_extension.substring(fileFolderPath.length, filepath_no_extension.length); + const ext = type === 'audio' ? '.mp3' : '.mp4'; + var full_file_path = filepath_no_extension + ext; + var file_name = filepath_no_extension.substring(fileFolderPath.length, filepath_no_extension.length); - if (type === 'video' && url.includes('twitch.tv/videos/') && url.split('twitch.tv/videos/').length > 1 - && config_api.getConfigItem('ytdl_twitch_auto_download_chat')) { - let vodId = url.split('twitch.tv/videos/')[1]; - vodId = vodId.split('?')[0]; - twitch_api.downloadTwitchChatByVODID(vodId, file_name, type, download['user_uid']); - } + if (type === 'video' && url.includes('twitch.tv/videos/') && url.split('twitch.tv/videos/').length > 1 + && config_api.getConfigItem('ytdl_twitch_auto_download_chat')) { + let vodId = url.split('twitch.tv/videos/')[1]; + vodId = vodId.split('?')[0]; + twitch_api.downloadTwitchChatByVODID(vodId, file_name, type, download['user_uid']); + } - // renames file if necessary due to bug - if (!fs.existsSync(output_json['_filename']) && fs.existsSync(output_json['_filename'] + '.webm')) { - try { - fs.renameSync(output_json['_filename'] + '.webm', output_json['_filename']); - logger.info('Renamed ' + file_name + '.webm to ' + file_name); - } catch(e) { - logger.error(`Failed to rename file ${output_json['_filename']} to its appropriate extension.`); - } + // renames file if necessary due to bug + if (!fs.existsSync(output_json['_filename']) && fs.existsSync(output_json['_filename'] + '.webm')) { + try { + fs.renameSync(output_json['_filename'] + '.webm', output_json['_filename']); + logger.info('Renamed ' + file_name + '.webm to ' + file_name); + } catch(e) { + logger.error(`Failed to rename file ${output_json['_filename']} to its appropriate extension.`); } + } - if (type === 'audio') { - let tags = { - title: output_json['title'], - artist: output_json['artist'] ? output_json['artist'] : output_json['uploader'] - } - let success = NodeID3.write(tags, utils.removeFileExtension(output_json['_filename']) + '.mp3'); - if (!success) logger.error('Failed to apply ID3 tag to audio file ' + output_json['_filename']); + if (type === 'audio') { + let tags = { + title: output_json['title'], + artist: output_json['artist'] ? output_json['artist'] : output_json['uploader'] } + let success = NodeID3.write(tags, utils.removeFileExtension(output_json['_filename']) + '.mp3'); + if (!success) logger.error('Failed to apply ID3 tag to audio file ' + output_json['_filename']); + } - if (config_api.getConfigItem('ytdl_generate_nfo_files')) { - exports.generateNFOFile(output_json, `${filepath_no_extension}.nfo`); - } + if (config_api.getConfigItem('ytdl_generate_nfo_files')) { + exports.generateNFOFile(output_json, `${filepath_no_extension}.nfo`); + } - if (options.cropFileSettings) { - await utils.cropFile(full_file_path, options.cropFileSettings.cropFileStart, options.cropFileSettings.cropFileEnd, ext); - } + if (options.cropFileSettings) { + await utils.cropFile(full_file_path, options.cropFileSettings.cropFileStart, options.cropFileSettings.cropFileEnd, ext); + } - // registers file in DB - const file_obj = await files_api.registerFileDB(full_file_path, type, download['user_uid'], category, download['sub_id'] ? download['sub_id'] : null, options.cropFileSettings); + // registers file in DB + const file_obj = await files_api.registerFileDB(full_file_path, type, download['user_uid'], category, download['sub_id'] ? download['sub_id'] : null, options.cropFileSettings); - await archive_api.addToArchive(output_json['extractor'], output_json['id'], type, output_json['title'], download['user_uid'], download['sub_id']); + await archive_api.addToArchive(output_json['extractor'], output_json['id'], type, output_json['title'], download['user_uid'], download['sub_id']); - notifications_api.sendDownloadNotification(file_obj, download['user_uid']); + notifications_api.sendDownloadNotification(file_obj, download['user_uid']); - file_objs.push(file_obj); - } + file_objs.push(file_obj); + } - let container = null; - - if (file_objs.length > 1) { - // create playlist - const playlist_name = file_objs.map(file_obj => file_obj.title).join(', '); - container = await files_api.createPlaylist(playlist_name, file_objs.map(file_obj => file_obj.uid), download['user_uid']); - } else if (file_objs.length === 1) { - container = file_objs[0]; - } else { - const error_message = 'Downloaded file failed to result in metadata object.'; - logger.error(error_message); - await handleDownloadError(download, error_message, 'no_metadata'); - } + let container = null; - const file_uids = file_objs.map(file_obj => file_obj.uid); - await db_api.updateRecord('download_queue', {uid: download_uid}, {finished_step: true, finished: true, running: false, step_index: 3, percent_complete: 100, file_uids: file_uids, container: container}); - resolve(); + if (file_objs.length > 1) { + // create playlist + const playlist_name = file_objs.map(file_obj => file_obj.title).join(', '); + container = await files_api.createPlaylist(playlist_name, file_objs.map(file_obj => file_obj.uid), download['user_uid']); + } else if (file_objs.length === 1) { + container = file_objs[0]; + } else { + const error_message = 'Downloaded file failed to result in metadata object.'; + logger.error(error_message); + await handleDownloadError(download, error_message, 'no_metadata'); } - }); + + const file_uids = file_objs.map(file_obj => file_obj.uid); + await db_api.updateRecord('download_queue', {uid: download_uid}, {finished_step: true, finished: true, running: false, step_index: 3, percent_complete: 100, file_uids: file_uids, container: container}); + resolve(file_uids); + } }); } @@ -564,33 +549,9 @@ exports.getVideoInfoByURL = async (url, args = [], download_uid = null) => { new_args.push('--dump-json'); youtubedl.exec(url, new_args, {maxBuffer: Infinity}, async (err, output) => { - if (output) { - let outputs = []; - try { - for (let i = 0; i < output.length; i++) { - let output_json = null; - try { - output_json = JSON.parse(output[i]); - } catch(e) { - output_json = null; - } - - if (!output_json) { - continue; - } - - outputs.push(output_json); - } - resolve(outputs.length === 1 ? outputs[0] : outputs); - } catch(e) { - const error = `Error while retrieving info on video with URL ${url} with the following message: output JSON could not be parsed. Output JSON: ${output}`; - logger.error(error); - if (download_uid) { - const download = await db_api.getRecord('download_queue', {uid: download_uid}); - await handleDownloadError(download, error, 'parse_failed'); - } - resolve(null); - } + const parsed_output = utils.parseOutputJSON(output, err); + if (parsed_output) { + resolve(parsed_output); } else { let error_message = `Error while retrieving info on video with URL ${url} with the following message: ${err}`; if (err.stderr) error_message += `\n\n${err.stderr}`; diff --git a/backend/package.json b/backend/package.json index 3038d49..11f0e92 100644 --- a/backend/package.json +++ b/backend/package.json @@ -4,7 +4,7 @@ "description": "backend for YoutubeDL-Material", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", + "test": "mocha test --exit -s 1000", "start": "pm2-runtime --raw pm2.config.js", "debug": "set YTDL_MODE=debug && node app.js" }, diff --git a/backend/subscriptions.js b/backend/subscriptions.js index c79da14..547ac80 100644 --- a/backend/subscriptions.js +++ b/backend/subscriptions.js @@ -254,26 +254,15 @@ exports.getVideosForSub = async (sub, user_uid = null) => { } logger.verbose('Subscription: finished check for ' + sub.name); - if (err && !output) { - logger.error(err.stderr ? err.stderr : err.message); - if (err.stderr.includes('This video is unavailable') || err.stderr.includes('Private video')) { - logger.info('An error was encountered with at least one video, backup method will be used.') - try { - const outputs = err.stdout.split(/\r\n|\r|\n/); - const files_to_download = await handleOutputJSON(outputs, sub, user_uid); - resolve(files_to_download); - } catch(e) { - logger.error('Backup method failed. See error below:'); - logger.error(e); - } - } else { - logger.error('Subscription check failed!'); - } - resolve(false); - } else if (output) { - const files_to_download = await handleOutputJSON(output, sub, user_uid); - resolve(files_to_download); - } + const parsed_output = utils.parseOutputJSON(output, err); + if (!parsed_output) { + logger.error('Subscription check failed!'); + resolve(null); + return; + } + const files_to_download = await handleOutputJSON(parsed_output, sub, user_uid); + resolve(files_to_download); + return; }); }, err => { logger.error(err); @@ -281,38 +270,24 @@ exports.getVideosForSub = async (sub, user_uid = null) => { }); } -async function handleOutputJSON(output, sub, user_uid) { +async function handleOutputJSON(output_jsons, sub, user_uid) { if (config_api.getConfigItem('ytdl_subscriptions_redownload_fresh_uploads')) { await setFreshUploads(sub, user_uid); checkVideosForFreshUploads(sub, user_uid); } - if (output.length === 0 || (output.length === 1 && output[0] === '')) { + if (output_jsons.length === 0 || (output_jsons.length === 1 && output_jsons[0] === '')) { logger.verbose('No additional videos to download for ' + sub.name); return []; } - const output_jsons = []; - for (let i = 0; i < output.length; i++) { - let output_json = null; - try { - output_json = JSON.parse(output[i]); - output_jsons.push(output_json); - } catch(e) { - output_json = null; - } - if (!output_json) { - continue; - } - } - const files_to_download = await getFilesToDownload(sub, output_jsons); const base_download_options = exports.generateOptionsForSubscriptionDownload(sub, user_uid); for (let j = 0; j < files_to_download.length; j++) { const file_to_download = files_to_download[j]; file_to_download['formats'] = utils.stripPropertiesFromObject(file_to_download['formats'], ['format_id', 'filesize', 'filesize_approx']); // prevent download object from blowing up in size - await downloader_api.createDownload(file_to_download['webpage_url'], sub.type || 'video', base_download_options, user_uid, sub.id, sub.name, file_to_download); + await downloader_api.createDownload(file_to_download['webpage_url'], sub.type || 'video', base_download_options, user_uid, sub.id, sub.name, [file_to_download]); } return files_to_download; diff --git a/backend/test/sample.info.json b/backend/test/sample.info.json deleted file mode 100644 index 8d65c5b..0000000 --- a/backend/test/sample.info.json +++ /dev/null @@ -1 +0,0 @@ -{"fps": 25, "webpage_url_basename": "watch", "vbr": 3546.159, "age_limit": 0, "_filename": "video\\20091024 - Rick Astley - Never Gonna Give You Up (Official Music Video).mp4", "height": 1080, "description": "Rick Astley's official music video for \u201cNever Gonna Give You Up", "thumbnail": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/maxresdefault.webp", "resolution": null, "webpage_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "average_rating": 4.894496, "ext": "mp4", "formats": [{"fps": null, "abr": 46.492, "height": null, "format_id": "249", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=249&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1232413&dur=212.061&lmt=1624945854503369&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5511222&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAOQPPrlgzOqNtORq4sWu11c9B7xu7oDsAw2tubKwfknwAiBqNjjMPHEVKlGNnOplfYZ_zuITnJ0PQAicXP1qyYRDWA%3D%3D&sig=AOq0QJ8wRgIhAOBiYeG7Pq0puYb5QjUVfMdTQStw09143tjience7YyJAiEAyK77-fXJ55w7RP2_ML9Gysg9ZrqhjcBzsolQIVHx6I4=", "format": "249 - audio only (tiny)", "filesize": 1232413, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 48000, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "opus", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "none", "tbr": 46.492, "width": null}, {"fps": null, "abr": 61.494, "height": null, "format_id": "250", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=250&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1630086&dur=212.061&lmt=1624945852595198&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5511222&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgGn2dRpsfP4xqu8rwvbRoH6SV9eCoQNr9KhOHIzWHcfwCIQCNXPD8U5zRz8nOD86M7E79GYNf9sR1QYI8Q0vRwh90zQ%3D%3D&sig=AOq0QJ8wRAIgMX4-9T8B0Rk8YxA7umuAzrb7Cf81aYG4PiV3uKTP4zQCIDw876bIcVsfWIO4Lx4qS7txMIkqDsnofhAfcIrAc9-T", "format": "250 - audio only (tiny)", "filesize": 1630086, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 48000, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "opus", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "none", "tbr": 61.494, "width": null}, {"fps": null, "abr": 129.51, "height": null, "format_id": "140", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=140&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3433514&dur=212.091&lmt=1628122153868652&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5532434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAIb6WyFCUS1IO9DY2BvkCDbeQpYU54NUMD8wHVUv-CgoAiBBk9HxGnh0qQAJqGRNFHGTtqiNhjBxPQCfHWqDOmzMbg%3D%3D&sig=AOq0QJ8wRAIgUstXqxWkdk_oRE6snyI1OaunA8jmDtA5gFsO__xRSWgCIDN6rrueyDicOohCGgyy-VOLBEHuwtjxpTpEdFrdzLtd", "format": "140 - audio only (tiny)", "filesize": 3433514, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 44100, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "mp4a.40.2", "quality": 0, "container": "m4a_dash", "ext": "m4a", "protocol": "https", "vcodec": "none", "tbr": 129.51, "width": null}, {"fps": null, "abr": 129.689, "height": null, "format_id": "251", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=251&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3437753&dur=212.061&lmt=1624945852795821&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5511222&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAO1WGRPqP3fz7DeczBl9uDNWvypP_xmoQapWlTCG66d9AiEAvZrhvA9jWZGnwCDEhntzc9utiYJZq-_PdXBpKlfUKAY%3D&sig=AOq0QJ8wRQIgPP7v5vRzBQVhBUFexSLhOsqNNfttu2TFH4qIctUxqAsCIQDixqdmBoxi72zvNSXdw-VyXAKd6mQfO_GmsvapdAutvA==", "format": "251 - audio only (tiny)", "filesize": 3437753, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 48000, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "opus", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "none", "tbr": 129.689, "width": null}, {"fps": 25, "format": "394 - 256x144 (144p)", "height": 144, "format_id": "394", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=394&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1806317&dur=212.040&lmt=1624947805339431&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgMcmJsqnRfEbWlqbPt1EPKCpOF5UzkyaABbAi0SXEwHICIHVGwJ69zGvjLE7SfFLy7c-1L-psZ1M4cHbx0s_FlJEu&sig=AOq0QJ8wRQIgXnlbLnaTYCnHNGSv3NHchQ_uPCQKO-EuJ8le0QekHdsCIQDsHRE_83b11n_QLvDF0qhNgOtpfYgkhKU05RNt_DiwYg==", "vbr": 68.15, "filesize": 1806317, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "144p", "acodec": "none", "quality": 0, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.00M.08", "tbr": 68.15, "width": 256}, {"fps": 25, "format": "160 - 256x144 (144p)", "height": 144, "format_id": "160", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=160&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1902470&dur=212.040&lmt=1628130952822277&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhANAbvnZihueHQl6DlS0KDCcmD612v91WicDPh0MMooE3AiEApFWRu4aPyDGym8F6QMLxc8yrVTWSSFBaUxjDWrx59FA%3D&sig=AOq0QJ8wRgIhAIKLvUYN8RN1LzNPHRN4Rb3fC0zDev9KlSdeCExTXPosAiEA_yY2AJ69va_G3eTdbkifrdePATiSrgb8PVDdMk-6hYw=", "vbr": 71.777, "filesize": 1902470, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "144p", "acodec": "none", "quality": 0, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d400c", "tbr": 71.777, "width": 256}, {"fps": 25, "format": "278 - 256x144 (144p)", "height": 144, "format_id": "278", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=278&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=2377337&dur=212.040&lmt=1628133100068252&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgYxpgVafit-zpha31Q8EtJBdHaBpRj1y65ew-cOr0644CIQD8SJ7dYuyflAm0T7T6ny03WB5jOjmHO87TDSwLeAPwZA%3D%3D&sig=AOq0QJ8wRQIgZP8HNivYFUpLZC2a5UHDX26raL9ekwrCP3fNwgST874CIQDuD4D2kg8lxP-4BC8J_x9cP8vGKfwD1w9HVad9TXIbjg==", "vbr": 89.693, "filesize": 2377337, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "144p", "acodec": "none", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 89.693, "width": 256}, {"fps": 25, "format": "133 - 426x240 (240p)", "height": 240, "format_id": "133", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=133&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3107257&dur=212.040&lmt=1628130952261127&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgNlYpzWhXOUhMEpm6bv_NUP8flw8_gbDOPuh_BpF1NWkCIA7dMuvigM6xlyoiJa8HxjDx-zeZODadHPUQ7DSxuy-u&sig=AOq0QJ8wRQIgfZ33AlJlf8H6DyxSVCHeZvA7i3QC9giEfW2FL6iXqTACIQCYEK8Rqbt9EgjKbGEks_iWoxXtm6TFLPM1vmx7722hrg==", "vbr": 117.232, "filesize": 3107257, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "240p", "acodec": "none", "quality": 1, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d4015", "tbr": 117.232, "width": 426}, {"fps": 25, "format": "395 - 426x240 (240p)", "height": 240, "format_id": "395", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=395&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3563582&dur=212.040&lmt=1624947923168885&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhALb3kDbV5djjgibZrxg1kD6hfnxNHcgVWv0snt354vKHAiEA5UJIuEWmRqTsPtKGbHwcWducF6aUoEaFxKx1Tz5L008%3D&sig=AOq0QJ8wRQIgKib1QlEvGVYibzu3l1BDT63OFgt9Ttv4HCcqpCKebncCIQCGk-H3AdMNUzWU5I7015YbmU_X4g2Es44BBWCzLYUM6w==", "vbr": 134.449, "filesize": 3563582, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "240p", "acodec": "none", "quality": 1, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.00M.08", "tbr": 134.449, "width": 426}, {"fps": 25, "format": "242 - 426x240 (240p)", "height": 240, "format_id": "242", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=242&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=4215000&dur=212.040&lmt=1628133101514133&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAPDAPJegoPAAF6kQgTebJ5-GdTQHu-dnudbQ9wUfaIWKAiEA4kNlwtfnb1zuhOb7OlIlBInYYdOTFyoI9mE7-yxxbxM%3D&sig=AOq0QJ8wRgIhALxu_H89hpmniExLrH6A073CxYUCJVhiVe0KFK3Skz7gAiEAlnZsUIv_GSPJYDafWKjskYOJkbRY2tTqSVZO3tHiVPg=", "vbr": 159.026, "filesize": 4215000, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "240p", "acodec": "none", "quality": 1, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 159.026, "width": 426}, {"fps": 25, "format": "134 - 640x360 (360p)", "height": 360, "format_id": "134", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=134&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=5820414&dur=212.040&lmt=1628130952382425&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAOtn2CoLBwcHCnbLpyhRugJMSvb5A3Mt7q0oc2GewlP5AiBSL9UpjE1pdqmlim_prX4T9hURk5K8YDHf24Gvlo29Sw%3D%3D&sig=AOq0QJ8wRAIgGt5L323eYDn6EDy6r2IYX0xGkzGzVMeH7NruficAzMECIGrivYII2PAGKL5Rv6lDc-l53z6PVid6W_8Jco5BYmFB", "vbr": 219.596, "filesize": 5820414, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "360p", "acodec": "none", "quality": 2, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d401e", "tbr": 219.596, "width": 640}, {"fps": 25, "format": "396 - 640x360 (360p)", "height": 360, "format_id": "396", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=396&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=6957752&dur=212.040&lmt=1624947999257981&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgHlGjZ2Fo06YkUp_59h9RpX89UUj7yF86OMbElBaaDRQCIBIJuyfWeNSKFP3s6BkXIk8Cy3F2mHRO3PRoR5CuacA3&sig=AOq0QJ8wRQIhANp7jIO5PM8sEwGd4-EmADAfLNsIw-mWhZDI0XAmQ666AiAfEAjcDgczL2TMBWQm9xobP6cbCrDVxfVxR_3IbYIYXg==", "vbr": 262.507, "filesize": 6957752, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "360p", "acodec": "none", "quality": 2, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.01M.08", "tbr": 262.507, "width": 640}, {"fps": 25, "format": "243 - 640x360 (360p)", "height": 360, "format_id": "243", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=243&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=7257207&dur=212.040&lmt=1628133101141872&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgdk8qX0zqkEIlabAum60ghDNmMy2W1zWAsnvKpoef1igCIQCWvArsFhNndiLBBq7UEdk2qX9FvYej4tCuDFknrNyyDA%3D%3D&sig=AOq0QJ8wRgIhAN3hiLrHN-nYrc4xRIFk0mcVYxqR5FNRhzcEz8DJyLAuAiEAiIsaYG5R6ZcaTuWfwV4qp3iJqAYPBLX0QkDgNbXhGl4=", "vbr": 273.805, "filesize": 7257207, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "360p", "acodec": "none", "quality": 2, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 273.805, "width": 640}, {"fps": 25, "format": "135 - 854x480 (480p)", "height": 480, "format_id": "135", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=135&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=8935471&dur=212.040&lmt=1628130953383927&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgGK75aA2fI4WwFkPZV42bMbNbkOG6OtuIXjuFNqezr4MCIGst4mxew5OX2AYcbwTj9f0e3PBAS8QGTYs3yDeVbNdT&sig=AOq0QJ8wRgIhALIazj23a4uqcFohSavkQCmmByUR_7DxHo6ohKjOc5yiAiEAoleQpPWYZ8tO0O7gZsT_H4aUuGh_p9F2oNjrx5eLKqQ=", "vbr": 337.123, "filesize": 8935471, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "480p", "acodec": "none", "quality": 3, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d401e", "tbr": 337.123, "width": 854}, {"fps": 25, "format": "244 - 854x480 (480p)", "height": 480, "format_id": "244", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=244&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=10532052&dur=212.040&lmt=1628133102160132&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAJKhoFYw7Q-a6k4sgJZO69oCR8yu-_86cfVvZDVnlxcrAiEA6ghEBhCbESj7wH3LcFmHp4dNFEVI_H3dazQKTWPxMnk%3D&sig=AOq0QJ8wRgIhAN3WW-w6rLDTOWF4r6kqvmbOlsgkp0wgxnvHeMJOPa8oAiEA4s9L5_hPFQ9pjUD9VWVjJrYKTT5pzeFfXCD2Cd7tR6s=", "vbr": 397.36, "filesize": 10532052, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "480p", "acodec": "none", "quality": 3, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 397.36, "width": 854}, {"fps": 25, "format": "397 - 854x480 (480p)", "height": 480, "format_id": "397", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=397&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=11930795&dur=212.040&lmt=1624948131494790&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgcoFDjq9zIiJ_ofRzFyQjv_6wRL4EV6mbVDCkwBYN8t0CIFvyQbtU537nm7Iw9-t_e9Scxlcyt5SwbrhtWIiA4zt5&sig=AOq0QJ8wRgIhAPf62Xh3p8Sk1zf3iZTK1zaEoSJz6eft26JJ9VR8N2CPAiEAtZtW4sdAYDDmAqS524Qxy6ZD9BZgvdFZWkTyZwrbkyo=", "vbr": 450.133, "filesize": 11930795, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "480p", "acodec": "none", "quality": 3, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.04M.08", "tbr": 450.133, "width": 854}, {"fps": 25, "format": "136 - 1280x720 (720p)", "height": 720, "format_id": "136", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=136&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=17375531&dur=212.040&lmt=1628130952538181&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAN1ZFXb_ZOXOofsWiuyAlB_PEmFOXLMiMWlLzcrb33zgAiARNS1RT8FOIEst33KIGloOKR9Y6_fSg0o1s_cr8PrDTQ%3D%3D&sig=AOq0QJ8wRAIgeCl2ZWgWyfopoNoWUVV4Lijvm2aYyFZhH4KZsPLOWb8CICgDOyLogiCIwOIiNz4zamJTtkakt8VDaLhV__Z4b9An", "vbr": 655.556, "filesize": 17375531, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "720p", "acodec": "none", "quality": 4, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d401f", "tbr": 655.556, "width": 1280}, {"fps": 25, "format": "247 - 1280x720 (720p)", "height": 720, "format_id": "247", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=247&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=18530394&dur=212.040&lmt=1628133100666546&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAIEWZfOAPFeUw2-xI2l_IvQ2XJG92s_5Yd77n9pgCvISAiByI9uxsyN5xk_PtxDSFF4UG1Q-7OpXrYr3i6jBz880JQ%3D%3D&sig=AOq0QJ8wRgIhAL3l9xAE1mvJmZ5wEGtRO-f_vhHCRtts8Cj-jD1ZpcUqAiEAsKbVkjHRYLtXGbmwUT1qe6medMxHmIYGsLrPTftbuYI=", "vbr": 699.128, "filesize": 18530394, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "720p", "acodec": "none", "quality": 4, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 699.128, "width": 1280}, {"fps": 25, "format": "398 - 1280x720 (720p)", "height": 720, "format_id": "398", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=398&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=22755091&dur=212.040&lmt=1624947952304594&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAPYMgegprlBtjtqtXJkbsbAeeXS6XNWySYoxae2IvrLKAiEApXXh7mr2C8UMrfXNGaIB--m-4kkSy91IN3muC3Z4t18%3D&sig=AOq0QJ8wRgIhAPm3dPdmeLw7e6muiJwhSDKe1nlkHoQ1WkXcmz6ngRkVAiEAqShfUbwRICZ7TI3pggP-3rWlFlpExlV1ebinn5JLc4k=", "vbr": 858.52, "filesize": 22755091, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "720p", "acodec": "none", "quality": 4, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.05M.08", "tbr": 858.52, "width": 1280}, {"fps": 25, "format": "399 - 1920x1080 (1080p)", "height": 1080, "format_id": "399", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=399&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=41772768&dur=212.040&lmt=1624948154710174&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgcCja1-Lsriw-hfwc2KwX9G4VBYJ1a9p3OGBQYwa3pywCIFMEO6QGSXUQoQomqSYxqUu4HOZHqHnhVUFlaroP-l2h&sig=AOq0QJ8wRQIgIPISNyI_OU4-cpSkzZjvP6oF2w0izlJKe8DCwl9bH5QCIQDHydWqPWx7k9ctYkmtelvOV6Ao_hUwUzeJuMaaXqllkw==", "vbr": 1576.033, "filesize": 41772768, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "1080p", "acodec": "none", "quality": 5, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.08M.08", "tbr": 1576.033, "width": 1920}, {"fps": 25, "format": "137 - 1920x1080 (1080p)", "height": 1080, "format_id": "137", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=137&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=93990963&dur=212.040&lmt=1628130818054956&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgfImvk-1wtFA9tIjgPP0B-zd95cwOlEHMhBvV3aE7zl0CIQCEf3d3oZfoThLk__WJL1AOe1URRgkj_SIcftgH8HG_jg%3D%3D&sig=AOq0QJ8wRgIhAJItHQu2MeVv3to1Z0luBDsircwDXjWzWeBmYRAKDW9rAiEA1iafsfDk5Yp-9zACBxgmxyL_pidNC3mqYV_TKjHcklY=", "vbr": 3546.159, "filesize": 93990963, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "1080p", "acodec": "none", "quality": 5, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.640028", "tbr": 3546.159, "width": 1920}, {"fps": 25, "format": "18 - 640x360 (360p)", "height": 360, "format_id": "18", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=18&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=zMV9mnhHv3UnwW1w1ilGGmgG&gir=yes&clen=16724503&ratebypass=yes&dur=212.091&lmt=1624987724234745&mt=1631594013&fvip=4&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5530322&n=EFswOlbBGAoK1nv1&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANvKM6JozEQa97eFLe2GBuj7K6UqHz8r0ilGwRnrl5OBAiAHdOlZ3a0nr2sKPzU2cfBNdSgdtRYyYem2sOJCFRRdkg%3D%3D&sig=AOq0QJ8wRQIhAO27Mc8XHMtx364tjalsNLXk8X5zzE11s4ovWD-0cVMwAiB4giGZbFxOvmRb0Eo1OTuExAAWvFfl_IB8vrJXPHMAsQ==", "filesize": 16724503, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 44100, "format_note": "360p", "acodec": "mp4a.40.2", "quality": 2, "ext": "mp4", "protocol": "https", "vcodec": "avc1.42001E", "tbr": 630.842, "width": 640}], "id": "dQw4w9WgXcQ", "format_id": "137+251", "uploader": "Rick Astley", "channel_id": "UCuAXFkgsw1L7xaCfnd5JJOw", "acodec": "opus", "thumbnails": [{"height": 94, "resolution": "168x94", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDd2KtelLHaNSXrI9_5K-NvTscKNw", "width": 168, "id": "0"}, {"height": 110, "resolution": "196x110", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBUpEOOWUXWkNyijQuZ4UPzp2BE-w", "width": 196, "id": "1"}, {"height": 138, "resolution": "246x138", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBCyhr8AqpJ1SxKVU6SyK5ODJ_IpA", "width": 246, "id": "2"}, {"height": 188, "resolution": "336x188", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB_p0PncTtkrhaNDZtntrE3gKkoYw", "width": 336, "id": "3"}, {"height": 1080, "resolution": "1920x1080", "url": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/maxresdefault.webp", "width": 1920, "id": "4"}], "extractor_key": "Youtube", "fulltitle": "Rick Astley - Never Gonna Give You Up (Official Music Video)", "categories": ["Music"], "view_count": 1046140382, "format": "137 - 1920x1080 (1080p)+251 - audio only (tiny)", "is_live": null, "upload_date": "20091024", "track": "Never Gonna Give You Up (7\" Mix)", "extractor": "youtube", "artist": "Rick Astley", "abr": 129.689, "creator": "Rick Astley", "channel": "Rick Astley", "title": "Rick Astley - Never Gonna Give You Up (Official Music Video)", "vcodec": "avc1.640028", "display_id": "dQw4w9WgXcQ", "width": 1920, "alt_title": "Never Gonna Give You Up (7\" Mix)", "channel_url": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw", "stretched_ratio": null, "uploader_id": "UCuAXFkgsw1L7xaCfnd5JJOw", "like_count": 11756010, "playlist": null, "tags": ["rick astley", "Never Gonna Give You Up", "nggyu", "never gonna give you up lyrics", "rick rolled", "the boys soundtrack", "the boys amazon prime", "Never gonna give you up the boys", "official", "Rick Roll", "music video", "Rick Astley album", "rick astley official", "together forever", "Whenever You Need Somebody", "rickrolled", "WRECK-IT RALPH 2", "Fortnite song", "Fortnite event", "Fortnite dance", "fortnite never gonna give you up", "rick astley never gonna give you up", "rick astley never gonna give you up lyrics"], "duration": 212, "uploader_url": "http://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw", "dislike_count": 318477, "playlist_index": null} \ No newline at end of file diff --git a/backend/test/sample_mp3.info.json b/backend/test/sample_mp3.info.json new file mode 100644 index 0000000..7abd517 --- /dev/null +++ b/backend/test/sample_mp3.info.json @@ -0,0 +1 @@ +{"fps": 25, "webpage_url_basename": "watch", "vbr": 3546.159, "age_limit": 0, "_filename": "video/sample_mp3.mp3", "height": 1080, "description": "Rick Astley's official music video for \u201cNever Gonna Give You Up", "thumbnail": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/maxresdefault.webp", "resolution": null, "webpage_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "average_rating": 4.894496, "ext": "mp4", "formats": [{"fps": null, "abr": 46.492, "height": null, "format_id": "249", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=249&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1232413&dur=212.061&lmt=1624945854503369&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5511222&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAOQPPrlgzOqNtORq4sWu11c9B7xu7oDsAw2tubKwfknwAiBqNjjMPHEVKlGNnOplfYZ_zuITnJ0PQAicXP1qyYRDWA%3D%3D&sig=AOq0QJ8wRgIhAOBiYeG7Pq0puYb5QjUVfMdTQStw09143tjience7YyJAiEAyK77-fXJ55w7RP2_ML9Gysg9ZrqhjcBzsolQIVHx6I4=", "format": "249 - audio only (tiny)", "filesize": 1232413, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 48000, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "opus", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "none", "tbr": 46.492, "width": null}, {"fps": null, "abr": 61.494, "height": null, "format_id": "250", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=250&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1630086&dur=212.061&lmt=1624945852595198&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5511222&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgGn2dRpsfP4xqu8rwvbRoH6SV9eCoQNr9KhOHIzWHcfwCIQCNXPD8U5zRz8nOD86M7E79GYNf9sR1QYI8Q0vRwh90zQ%3D%3D&sig=AOq0QJ8wRAIgMX4-9T8B0Rk8YxA7umuAzrb7Cf81aYG4PiV3uKTP4zQCIDw876bIcVsfWIO4Lx4qS7txMIkqDsnofhAfcIrAc9-T", "format": "250 - audio only (tiny)", "filesize": 1630086, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 48000, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "opus", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "none", "tbr": 61.494, "width": null}, {"fps": null, "abr": 129.51, "height": null, "format_id": "140", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=140&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3433514&dur=212.091&lmt=1628122153868652&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5532434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAIb6WyFCUS1IO9DY2BvkCDbeQpYU54NUMD8wHVUv-CgoAiBBk9HxGnh0qQAJqGRNFHGTtqiNhjBxPQCfHWqDOmzMbg%3D%3D&sig=AOq0QJ8wRAIgUstXqxWkdk_oRE6snyI1OaunA8jmDtA5gFsO__xRSWgCIDN6rrueyDicOohCGgyy-VOLBEHuwtjxpTpEdFrdzLtd", "format": "140 - audio only (tiny)", "filesize": 3433514, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 44100, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "mp4a.40.2", "quality": 0, "container": "m4a_dash", "ext": "m4a", "protocol": "https", "vcodec": "none", "tbr": 129.51, "width": null}, {"fps": null, "abr": 129.689, "height": null, "format_id": "251", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=251&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3437753&dur=212.061&lmt=1624945852795821&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5511222&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAO1WGRPqP3fz7DeczBl9uDNWvypP_xmoQapWlTCG66d9AiEAvZrhvA9jWZGnwCDEhntzc9utiYJZq-_PdXBpKlfUKAY%3D&sig=AOq0QJ8wRQIgPP7v5vRzBQVhBUFexSLhOsqNNfttu2TFH4qIctUxqAsCIQDixqdmBoxi72zvNSXdw-VyXAKd6mQfO_GmsvapdAutvA==", "format": "251 - audio only (tiny)", "filesize": 3437753, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 48000, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "opus", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "none", "tbr": 129.689, "width": null}, {"fps": 25, "format": "394 - 256x144 (144p)", "height": 144, "format_id": "394", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=394&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1806317&dur=212.040&lmt=1624947805339431&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgMcmJsqnRfEbWlqbPt1EPKCpOF5UzkyaABbAi0SXEwHICIHVGwJ69zGvjLE7SfFLy7c-1L-psZ1M4cHbx0s_FlJEu&sig=AOq0QJ8wRQIgXnlbLnaTYCnHNGSv3NHchQ_uPCQKO-EuJ8le0QekHdsCIQDsHRE_83b11n_QLvDF0qhNgOtpfYgkhKU05RNt_DiwYg==", "vbr": 68.15, "filesize": 1806317, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "144p", "acodec": "none", "quality": 0, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.00M.08", "tbr": 68.15, "width": 256}, {"fps": 25, "format": "160 - 256x144 (144p)", "height": 144, "format_id": "160", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=160&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1902470&dur=212.040&lmt=1628130952822277&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhANAbvnZihueHQl6DlS0KDCcmD612v91WicDPh0MMooE3AiEApFWRu4aPyDGym8F6QMLxc8yrVTWSSFBaUxjDWrx59FA%3D&sig=AOq0QJ8wRgIhAIKLvUYN8RN1LzNPHRN4Rb3fC0zDev9KlSdeCExTXPosAiEA_yY2AJ69va_G3eTdbkifrdePATiSrgb8PVDdMk-6hYw=", "vbr": 71.777, "filesize": 1902470, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "144p", "acodec": "none", "quality": 0, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d400c", "tbr": 71.777, "width": 256}, {"fps": 25, "format": "278 - 256x144 (144p)", "height": 144, "format_id": "278", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=278&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=2377337&dur=212.040&lmt=1628133100068252&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgYxpgVafit-zpha31Q8EtJBdHaBpRj1y65ew-cOr0644CIQD8SJ7dYuyflAm0T7T6ny03WB5jOjmHO87TDSwLeAPwZA%3D%3D&sig=AOq0QJ8wRQIgZP8HNivYFUpLZC2a5UHDX26raL9ekwrCP3fNwgST874CIQDuD4D2kg8lxP-4BC8J_x9cP8vGKfwD1w9HVad9TXIbjg==", "vbr": 89.693, "filesize": 2377337, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "144p", "acodec": "none", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 89.693, "width": 256}, {"fps": 25, "format": "133 - 426x240 (240p)", "height": 240, "format_id": "133", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=133&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3107257&dur=212.040&lmt=1628130952261127&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgNlYpzWhXOUhMEpm6bv_NUP8flw8_gbDOPuh_BpF1NWkCIA7dMuvigM6xlyoiJa8HxjDx-zeZODadHPUQ7DSxuy-u&sig=AOq0QJ8wRQIgfZ33AlJlf8H6DyxSVCHeZvA7i3QC9giEfW2FL6iXqTACIQCYEK8Rqbt9EgjKbGEks_iWoxXtm6TFLPM1vmx7722hrg==", "vbr": 117.232, "filesize": 3107257, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "240p", "acodec": "none", "quality": 1, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d4015", "tbr": 117.232, "width": 426}, {"fps": 25, "format": "395 - 426x240 (240p)", "height": 240, "format_id": "395", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=395&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3563582&dur=212.040&lmt=1624947923168885&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhALb3kDbV5djjgibZrxg1kD6hfnxNHcgVWv0snt354vKHAiEA5UJIuEWmRqTsPtKGbHwcWducF6aUoEaFxKx1Tz5L008%3D&sig=AOq0QJ8wRQIgKib1QlEvGVYibzu3l1BDT63OFgt9Ttv4HCcqpCKebncCIQCGk-H3AdMNUzWU5I7015YbmU_X4g2Es44BBWCzLYUM6w==", "vbr": 134.449, "filesize": 3563582, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "240p", "acodec": "none", "quality": 1, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.00M.08", "tbr": 134.449, "width": 426}, {"fps": 25, "format": "242 - 426x240 (240p)", "height": 240, "format_id": "242", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=242&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=4215000&dur=212.040&lmt=1628133101514133&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAPDAPJegoPAAF6kQgTebJ5-GdTQHu-dnudbQ9wUfaIWKAiEA4kNlwtfnb1zuhOb7OlIlBInYYdOTFyoI9mE7-yxxbxM%3D&sig=AOq0QJ8wRgIhALxu_H89hpmniExLrH6A073CxYUCJVhiVe0KFK3Skz7gAiEAlnZsUIv_GSPJYDafWKjskYOJkbRY2tTqSVZO3tHiVPg=", "vbr": 159.026, "filesize": 4215000, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "240p", "acodec": "none", "quality": 1, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 159.026, "width": 426}, {"fps": 25, "format": "134 - 640x360 (360p)", "height": 360, "format_id": "134", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=134&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=5820414&dur=212.040&lmt=1628130952382425&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAOtn2CoLBwcHCnbLpyhRugJMSvb5A3Mt7q0oc2GewlP5AiBSL9UpjE1pdqmlim_prX4T9hURk5K8YDHf24Gvlo29Sw%3D%3D&sig=AOq0QJ8wRAIgGt5L323eYDn6EDy6r2IYX0xGkzGzVMeH7NruficAzMECIGrivYII2PAGKL5Rv6lDc-l53z6PVid6W_8Jco5BYmFB", "vbr": 219.596, "filesize": 5820414, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "360p", "acodec": "none", "quality": 2, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d401e", "tbr": 219.596, "width": 640}, {"fps": 25, "format": "396 - 640x360 (360p)", "height": 360, "format_id": "396", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=396&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=6957752&dur=212.040&lmt=1624947999257981&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgHlGjZ2Fo06YkUp_59h9RpX89UUj7yF86OMbElBaaDRQCIBIJuyfWeNSKFP3s6BkXIk8Cy3F2mHRO3PRoR5CuacA3&sig=AOq0QJ8wRQIhANp7jIO5PM8sEwGd4-EmADAfLNsIw-mWhZDI0XAmQ666AiAfEAjcDgczL2TMBWQm9xobP6cbCrDVxfVxR_3IbYIYXg==", "vbr": 262.507, "filesize": 6957752, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "360p", "acodec": "none", "quality": 2, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.01M.08", "tbr": 262.507, "width": 640}, {"fps": 25, "format": "243 - 640x360 (360p)", "height": 360, "format_id": "243", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=243&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=7257207&dur=212.040&lmt=1628133101141872&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgdk8qX0zqkEIlabAum60ghDNmMy2W1zWAsnvKpoef1igCIQCWvArsFhNndiLBBq7UEdk2qX9FvYej4tCuDFknrNyyDA%3D%3D&sig=AOq0QJ8wRgIhAN3hiLrHN-nYrc4xRIFk0mcVYxqR5FNRhzcEz8DJyLAuAiEAiIsaYG5R6ZcaTuWfwV4qp3iJqAYPBLX0QkDgNbXhGl4=", "vbr": 273.805, "filesize": 7257207, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "360p", "acodec": "none", "quality": 2, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 273.805, "width": 640}, {"fps": 25, "format": "135 - 854x480 (480p)", "height": 480, "format_id": "135", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=135&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=8935471&dur=212.040&lmt=1628130953383927&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgGK75aA2fI4WwFkPZV42bMbNbkOG6OtuIXjuFNqezr4MCIGst4mxew5OX2AYcbwTj9f0e3PBAS8QGTYs3yDeVbNdT&sig=AOq0QJ8wRgIhALIazj23a4uqcFohSavkQCmmByUR_7DxHo6ohKjOc5yiAiEAoleQpPWYZ8tO0O7gZsT_H4aUuGh_p9F2oNjrx5eLKqQ=", "vbr": 337.123, "filesize": 8935471, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "480p", "acodec": "none", "quality": 3, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d401e", "tbr": 337.123, "width": 854}, {"fps": 25, "format": "244 - 854x480 (480p)", "height": 480, "format_id": "244", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=244&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=10532052&dur=212.040&lmt=1628133102160132&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAJKhoFYw7Q-a6k4sgJZO69oCR8yu-_86cfVvZDVnlxcrAiEA6ghEBhCbESj7wH3LcFmHp4dNFEVI_H3dazQKTWPxMnk%3D&sig=AOq0QJ8wRgIhAN3WW-w6rLDTOWF4r6kqvmbOlsgkp0wgxnvHeMJOPa8oAiEA4s9L5_hPFQ9pjUD9VWVjJrYKTT5pzeFfXCD2Cd7tR6s=", "vbr": 397.36, "filesize": 10532052, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "480p", "acodec": "none", "quality": 3, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 397.36, "width": 854}, {"fps": 25, "format": "397 - 854x480 (480p)", "height": 480, "format_id": "397", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=397&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=11930795&dur=212.040&lmt=1624948131494790&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgcoFDjq9zIiJ_ofRzFyQjv_6wRL4EV6mbVDCkwBYN8t0CIFvyQbtU537nm7Iw9-t_e9Scxlcyt5SwbrhtWIiA4zt5&sig=AOq0QJ8wRgIhAPf62Xh3p8Sk1zf3iZTK1zaEoSJz6eft26JJ9VR8N2CPAiEAtZtW4sdAYDDmAqS524Qxy6ZD9BZgvdFZWkTyZwrbkyo=", "vbr": 450.133, "filesize": 11930795, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "480p", "acodec": "none", "quality": 3, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.04M.08", "tbr": 450.133, "width": 854}, {"fps": 25, "format": "136 - 1280x720 (720p)", "height": 720, "format_id": "136", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=136&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=17375531&dur=212.040&lmt=1628130952538181&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAN1ZFXb_ZOXOofsWiuyAlB_PEmFOXLMiMWlLzcrb33zgAiARNS1RT8FOIEst33KIGloOKR9Y6_fSg0o1s_cr8PrDTQ%3D%3D&sig=AOq0QJ8wRAIgeCl2ZWgWyfopoNoWUVV4Lijvm2aYyFZhH4KZsPLOWb8CICgDOyLogiCIwOIiNz4zamJTtkakt8VDaLhV__Z4b9An", "vbr": 655.556, "filesize": 17375531, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "720p", "acodec": "none", "quality": 4, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d401f", "tbr": 655.556, "width": 1280}, {"fps": 25, "format": "247 - 1280x720 (720p)", "height": 720, "format_id": "247", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=247&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=18530394&dur=212.040&lmt=1628133100666546&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAIEWZfOAPFeUw2-xI2l_IvQ2XJG92s_5Yd77n9pgCvISAiByI9uxsyN5xk_PtxDSFF4UG1Q-7OpXrYr3i6jBz880JQ%3D%3D&sig=AOq0QJ8wRgIhAL3l9xAE1mvJmZ5wEGtRO-f_vhHCRtts8Cj-jD1ZpcUqAiEAsKbVkjHRYLtXGbmwUT1qe6medMxHmIYGsLrPTftbuYI=", "vbr": 699.128, "filesize": 18530394, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "720p", "acodec": "none", "quality": 4, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 699.128, "width": 1280}, {"fps": 25, "format": "398 - 1280x720 (720p)", "height": 720, "format_id": "398", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=398&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=22755091&dur=212.040&lmt=1624947952304594&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAPYMgegprlBtjtqtXJkbsbAeeXS6XNWySYoxae2IvrLKAiEApXXh7mr2C8UMrfXNGaIB--m-4kkSy91IN3muC3Z4t18%3D&sig=AOq0QJ8wRgIhAPm3dPdmeLw7e6muiJwhSDKe1nlkHoQ1WkXcmz6ngRkVAiEAqShfUbwRICZ7TI3pggP-3rWlFlpExlV1ebinn5JLc4k=", "vbr": 858.52, "filesize": 22755091, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "720p", "acodec": "none", "quality": 4, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.05M.08", "tbr": 858.52, "width": 1280}, {"fps": 25, "format": "399 - 1920x1080 (1080p)", "height": 1080, "format_id": "399", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=399&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=41772768&dur=212.040&lmt=1624948154710174&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgcCja1-Lsriw-hfwc2KwX9G4VBYJ1a9p3OGBQYwa3pywCIFMEO6QGSXUQoQomqSYxqUu4HOZHqHnhVUFlaroP-l2h&sig=AOq0QJ8wRQIgIPISNyI_OU4-cpSkzZjvP6oF2w0izlJKe8DCwl9bH5QCIQDHydWqPWx7k9ctYkmtelvOV6Ao_hUwUzeJuMaaXqllkw==", "vbr": 1576.033, "filesize": 41772768, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "1080p", "acodec": "none", "quality": 5, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.08M.08", "tbr": 1576.033, "width": 1920}, {"fps": 25, "format": "137 - 1920x1080 (1080p)", "height": 1080, "format_id": "137", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=137&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=93990963&dur=212.040&lmt=1628130818054956&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgfImvk-1wtFA9tIjgPP0B-zd95cwOlEHMhBvV3aE7zl0CIQCEf3d3oZfoThLk__WJL1AOe1URRgkj_SIcftgH8HG_jg%3D%3D&sig=AOq0QJ8wRgIhAJItHQu2MeVv3to1Z0luBDsircwDXjWzWeBmYRAKDW9rAiEA1iafsfDk5Yp-9zACBxgmxyL_pidNC3mqYV_TKjHcklY=", "vbr": 3546.159, "filesize": 93990963, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "1080p", "acodec": "none", "quality": 5, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.640028", "tbr": 3546.159, "width": 1920}, {"fps": 25, "format": "18 - 640x360 (360p)", "height": 360, "format_id": "18", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=18&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=zMV9mnhHv3UnwW1w1ilGGmgG&gir=yes&clen=16724503&ratebypass=yes&dur=212.091&lmt=1624987724234745&mt=1631594013&fvip=4&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5530322&n=EFswOlbBGAoK1nv1&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANvKM6JozEQa97eFLe2GBuj7K6UqHz8r0ilGwRnrl5OBAiAHdOlZ3a0nr2sKPzU2cfBNdSgdtRYyYem2sOJCFRRdkg%3D%3D&sig=AOq0QJ8wRQIhAO27Mc8XHMtx364tjalsNLXk8X5zzE11s4ovWD-0cVMwAiB4giGZbFxOvmRb0Eo1OTuExAAWvFfl_IB8vrJXPHMAsQ==", "filesize": 16724503, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 44100, "format_note": "360p", "acodec": "mp4a.40.2", "quality": 2, "ext": "mp4", "protocol": "https", "vcodec": "avc1.42001E", "tbr": 630.842, "width": 640}], "id": "dQw4w9WgXcQ", "format_id": "137+251", "uploader": "Rick Astley", "channel_id": "UCuAXFkgsw1L7xaCfnd5JJOw", "acodec": "opus", "thumbnails": [{"height": 94, "resolution": "168x94", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDd2KtelLHaNSXrI9_5K-NvTscKNw", "width": 168, "id": "0"}, {"height": 110, "resolution": "196x110", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBUpEOOWUXWkNyijQuZ4UPzp2BE-w", "width": 196, "id": "1"}, {"height": 138, "resolution": "246x138", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBCyhr8AqpJ1SxKVU6SyK5ODJ_IpA", "width": 246, "id": "2"}, {"height": 188, "resolution": "336x188", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB_p0PncTtkrhaNDZtntrE3gKkoYw", "width": 336, "id": "3"}, {"height": 1080, "resolution": "1920x1080", "url": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/maxresdefault.webp", "width": 1920, "id": "4"}], "extractor_key": "Youtube", "fulltitle": "Sample File", "categories": ["Music"], "view_count": 1046140382, "format": "137 - 1920x1080 (1080p)+251 - audio only (tiny)", "is_live": null, "upload_date": "20091024", "track": "Never Gonna Give You Up (7\" Mix)", "extractor": "youtube", "artist": "Rick Astley", "abr": 129.689, "creator": "Rick Astley", "channel": "Rick Astley", "title": "Sample File", "vcodec": "avc1.640028", "display_id": "dQw4w9WgXcQ", "width": 1920, "alt_title": "Never Gonna Give You Up (7\" Mix)", "channel_url": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw", "stretched_ratio": null, "uploader_id": "UCuAXFkgsw1L7xaCfnd5JJOw", "like_count": 11756010, "playlist": null, "tags": ["rick astley", "Never Gonna Give You Up", "nggyu", "never gonna give you up lyrics", "rick rolled", "the boys soundtrack", "the boys amazon prime", "Never gonna give you up the boys", "official", "Rick Roll", "music video", "Rick Astley album", "rick astley official", "together forever", "Whenever You Need Somebody", "rickrolled", "WRECK-IT RALPH 2", "Fortnite song", "Fortnite event", "Fortnite dance", "fortnite never gonna give you up", "rick astley never gonna give you up", "rick astley never gonna give you up lyrics"], "duration": 212, "uploader_url": "http://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw", "dislike_count": 318477, "playlist_index": null} \ No newline at end of file diff --git a/backend/test/sample_mp4.info.json b/backend/test/sample_mp4.info.json new file mode 100644 index 0000000..2195345 --- /dev/null +++ b/backend/test/sample_mp4.info.json @@ -0,0 +1 @@ +{"fps": 25, "webpage_url_basename": "watch", "vbr": 3546.159, "age_limit": 0, "_filename": "video/sample_mp4.mp4", "height": 1080, "description": "Rick Astley's official music video for \u201cNever Gonna Give You Up", "thumbnail": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/maxresdefault.webp", "resolution": null, "webpage_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "average_rating": 4.894496, "ext": "mp4", "formats": [{"fps": null, "abr": 46.492, "height": null, "format_id": "249", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=249&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1232413&dur=212.061&lmt=1624945854503369&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5511222&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAOQPPrlgzOqNtORq4sWu11c9B7xu7oDsAw2tubKwfknwAiBqNjjMPHEVKlGNnOplfYZ_zuITnJ0PQAicXP1qyYRDWA%3D%3D&sig=AOq0QJ8wRgIhAOBiYeG7Pq0puYb5QjUVfMdTQStw09143tjience7YyJAiEAyK77-fXJ55w7RP2_ML9Gysg9ZrqhjcBzsolQIVHx6I4=", "format": "249 - audio only (tiny)", "filesize": 1232413, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 48000, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "opus", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "none", "tbr": 46.492, "width": null}, {"fps": null, "abr": 61.494, "height": null, "format_id": "250", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=250&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1630086&dur=212.061&lmt=1624945852595198&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5511222&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgGn2dRpsfP4xqu8rwvbRoH6SV9eCoQNr9KhOHIzWHcfwCIQCNXPD8U5zRz8nOD86M7E79GYNf9sR1QYI8Q0vRwh90zQ%3D%3D&sig=AOq0QJ8wRAIgMX4-9T8B0Rk8YxA7umuAzrb7Cf81aYG4PiV3uKTP4zQCIDw876bIcVsfWIO4Lx4qS7txMIkqDsnofhAfcIrAc9-T", "format": "250 - audio only (tiny)", "filesize": 1630086, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 48000, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "opus", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "none", "tbr": 61.494, "width": null}, {"fps": null, "abr": 129.51, "height": null, "format_id": "140", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=140&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3433514&dur=212.091&lmt=1628122153868652&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5532434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAIb6WyFCUS1IO9DY2BvkCDbeQpYU54NUMD8wHVUv-CgoAiBBk9HxGnh0qQAJqGRNFHGTtqiNhjBxPQCfHWqDOmzMbg%3D%3D&sig=AOq0QJ8wRAIgUstXqxWkdk_oRE6snyI1OaunA8jmDtA5gFsO__xRSWgCIDN6rrueyDicOohCGgyy-VOLBEHuwtjxpTpEdFrdzLtd", "format": "140 - audio only (tiny)", "filesize": 3433514, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 44100, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "mp4a.40.2", "quality": 0, "container": "m4a_dash", "ext": "m4a", "protocol": "https", "vcodec": "none", "tbr": 129.51, "width": null}, {"fps": null, "abr": 129.689, "height": null, "format_id": "251", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=251&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=audio%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3437753&dur=212.061&lmt=1624945852795821&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5511222&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAO1WGRPqP3fz7DeczBl9uDNWvypP_xmoQapWlTCG66d9AiEAvZrhvA9jWZGnwCDEhntzc9utiYJZq-_PdXBpKlfUKAY%3D&sig=AOq0QJ8wRQIgPP7v5vRzBQVhBUFexSLhOsqNNfttu2TFH4qIctUxqAsCIQDixqdmBoxi72zvNSXdw-VyXAKd6mQfO_GmsvapdAutvA==", "format": "251 - audio only (tiny)", "filesize": 3437753, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 48000, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "tiny", "acodec": "opus", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "none", "tbr": 129.689, "width": null}, {"fps": 25, "format": "394 - 256x144 (144p)", "height": 144, "format_id": "394", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=394&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1806317&dur=212.040&lmt=1624947805339431&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgMcmJsqnRfEbWlqbPt1EPKCpOF5UzkyaABbAi0SXEwHICIHVGwJ69zGvjLE7SfFLy7c-1L-psZ1M4cHbx0s_FlJEu&sig=AOq0QJ8wRQIgXnlbLnaTYCnHNGSv3NHchQ_uPCQKO-EuJ8le0QekHdsCIQDsHRE_83b11n_QLvDF0qhNgOtpfYgkhKU05RNt_DiwYg==", "vbr": 68.15, "filesize": 1806317, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "144p", "acodec": "none", "quality": 0, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.00M.08", "tbr": 68.15, "width": 256}, {"fps": 25, "format": "160 - 256x144 (144p)", "height": 144, "format_id": "160", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=160&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=1902470&dur=212.040&lmt=1628130952822277&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhANAbvnZihueHQl6DlS0KDCcmD612v91WicDPh0MMooE3AiEApFWRu4aPyDGym8F6QMLxc8yrVTWSSFBaUxjDWrx59FA%3D&sig=AOq0QJ8wRgIhAIKLvUYN8RN1LzNPHRN4Rb3fC0zDev9KlSdeCExTXPosAiEA_yY2AJ69va_G3eTdbkifrdePATiSrgb8PVDdMk-6hYw=", "vbr": 71.777, "filesize": 1902470, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "144p", "acodec": "none", "quality": 0, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d400c", "tbr": 71.777, "width": 256}, {"fps": 25, "format": "278 - 256x144 (144p)", "height": 144, "format_id": "278", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=278&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=2377337&dur=212.040&lmt=1628133100068252&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgYxpgVafit-zpha31Q8EtJBdHaBpRj1y65ew-cOr0644CIQD8SJ7dYuyflAm0T7T6ny03WB5jOjmHO87TDSwLeAPwZA%3D%3D&sig=AOq0QJ8wRQIgZP8HNivYFUpLZC2a5UHDX26raL9ekwrCP3fNwgST874CIQDuD4D2kg8lxP-4BC8J_x9cP8vGKfwD1w9HVad9TXIbjg==", "vbr": 89.693, "filesize": 2377337, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "144p", "acodec": "none", "quality": 0, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 89.693, "width": 256}, {"fps": 25, "format": "133 - 426x240 (240p)", "height": 240, "format_id": "133", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=133&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3107257&dur=212.040&lmt=1628130952261127&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgNlYpzWhXOUhMEpm6bv_NUP8flw8_gbDOPuh_BpF1NWkCIA7dMuvigM6xlyoiJa8HxjDx-zeZODadHPUQ7DSxuy-u&sig=AOq0QJ8wRQIgfZ33AlJlf8H6DyxSVCHeZvA7i3QC9giEfW2FL6iXqTACIQCYEK8Rqbt9EgjKbGEks_iWoxXtm6TFLPM1vmx7722hrg==", "vbr": 117.232, "filesize": 3107257, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "240p", "acodec": "none", "quality": 1, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d4015", "tbr": 117.232, "width": 426}, {"fps": 25, "format": "395 - 426x240 (240p)", "height": 240, "format_id": "395", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=395&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=3563582&dur=212.040&lmt=1624947923168885&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhALb3kDbV5djjgibZrxg1kD6hfnxNHcgVWv0snt354vKHAiEA5UJIuEWmRqTsPtKGbHwcWducF6aUoEaFxKx1Tz5L008%3D&sig=AOq0QJ8wRQIgKib1QlEvGVYibzu3l1BDT63OFgt9Ttv4HCcqpCKebncCIQCGk-H3AdMNUzWU5I7015YbmU_X4g2Es44BBWCzLYUM6w==", "vbr": 134.449, "filesize": 3563582, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "240p", "acodec": "none", "quality": 1, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.00M.08", "tbr": 134.449, "width": 426}, {"fps": 25, "format": "242 - 426x240 (240p)", "height": 240, "format_id": "242", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=242&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=4215000&dur=212.040&lmt=1628133101514133&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAPDAPJegoPAAF6kQgTebJ5-GdTQHu-dnudbQ9wUfaIWKAiEA4kNlwtfnb1zuhOb7OlIlBInYYdOTFyoI9mE7-yxxbxM%3D&sig=AOq0QJ8wRgIhALxu_H89hpmniExLrH6A073CxYUCJVhiVe0KFK3Skz7gAiEAlnZsUIv_GSPJYDafWKjskYOJkbRY2tTqSVZO3tHiVPg=", "vbr": 159.026, "filesize": 4215000, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "240p", "acodec": "none", "quality": 1, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 159.026, "width": 426}, {"fps": 25, "format": "134 - 640x360 (360p)", "height": 360, "format_id": "134", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=134&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=5820414&dur=212.040&lmt=1628130952382425&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAOtn2CoLBwcHCnbLpyhRugJMSvb5A3Mt7q0oc2GewlP5AiBSL9UpjE1pdqmlim_prX4T9hURk5K8YDHf24Gvlo29Sw%3D%3D&sig=AOq0QJ8wRAIgGt5L323eYDn6EDy6r2IYX0xGkzGzVMeH7NruficAzMECIGrivYII2PAGKL5Rv6lDc-l53z6PVid6W_8Jco5BYmFB", "vbr": 219.596, "filesize": 5820414, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "360p", "acodec": "none", "quality": 2, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d401e", "tbr": 219.596, "width": 640}, {"fps": 25, "format": "396 - 640x360 (360p)", "height": 360, "format_id": "396", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=396&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=6957752&dur=212.040&lmt=1624947999257981&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgHlGjZ2Fo06YkUp_59h9RpX89UUj7yF86OMbElBaaDRQCIBIJuyfWeNSKFP3s6BkXIk8Cy3F2mHRO3PRoR5CuacA3&sig=AOq0QJ8wRQIhANp7jIO5PM8sEwGd4-EmADAfLNsIw-mWhZDI0XAmQ666AiAfEAjcDgczL2TMBWQm9xobP6cbCrDVxfVxR_3IbYIYXg==", "vbr": 262.507, "filesize": 6957752, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "360p", "acodec": "none", "quality": 2, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.01M.08", "tbr": 262.507, "width": 640}, {"fps": 25, "format": "243 - 640x360 (360p)", "height": 360, "format_id": "243", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=243&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=7257207&dur=212.040&lmt=1628133101141872&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgdk8qX0zqkEIlabAum60ghDNmMy2W1zWAsnvKpoef1igCIQCWvArsFhNndiLBBq7UEdk2qX9FvYej4tCuDFknrNyyDA%3D%3D&sig=AOq0QJ8wRgIhAN3hiLrHN-nYrc4xRIFk0mcVYxqR5FNRhzcEz8DJyLAuAiEAiIsaYG5R6ZcaTuWfwV4qp3iJqAYPBLX0QkDgNbXhGl4=", "vbr": 273.805, "filesize": 7257207, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "360p", "acodec": "none", "quality": 2, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 273.805, "width": 640}, {"fps": 25, "format": "135 - 854x480 (480p)", "height": 480, "format_id": "135", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=135&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=8935471&dur=212.040&lmt=1628130953383927&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgGK75aA2fI4WwFkPZV42bMbNbkOG6OtuIXjuFNqezr4MCIGst4mxew5OX2AYcbwTj9f0e3PBAS8QGTYs3yDeVbNdT&sig=AOq0QJ8wRgIhALIazj23a4uqcFohSavkQCmmByUR_7DxHo6ohKjOc5yiAiEAoleQpPWYZ8tO0O7gZsT_H4aUuGh_p9F2oNjrx5eLKqQ=", "vbr": 337.123, "filesize": 8935471, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "480p", "acodec": "none", "quality": 3, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d401e", "tbr": 337.123, "width": 854}, {"fps": 25, "format": "244 - 854x480 (480p)", "height": 480, "format_id": "244", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=244&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=10532052&dur=212.040&lmt=1628133102160132&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAJKhoFYw7Q-a6k4sgJZO69oCR8yu-_86cfVvZDVnlxcrAiEA6ghEBhCbESj7wH3LcFmHp4dNFEVI_H3dazQKTWPxMnk%3D&sig=AOq0QJ8wRgIhAN3WW-w6rLDTOWF4r6kqvmbOlsgkp0wgxnvHeMJOPa8oAiEA4s9L5_hPFQ9pjUD9VWVjJrYKTT5pzeFfXCD2Cd7tR6s=", "vbr": 397.36, "filesize": 10532052, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "480p", "acodec": "none", "quality": 3, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 397.36, "width": 854}, {"fps": 25, "format": "397 - 854x480 (480p)", "height": 480, "format_id": "397", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=397&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=11930795&dur=212.040&lmt=1624948131494790&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgcoFDjq9zIiJ_ofRzFyQjv_6wRL4EV6mbVDCkwBYN8t0CIFvyQbtU537nm7Iw9-t_e9Scxlcyt5SwbrhtWIiA4zt5&sig=AOq0QJ8wRgIhAPf62Xh3p8Sk1zf3iZTK1zaEoSJz6eft26JJ9VR8N2CPAiEAtZtW4sdAYDDmAqS524Qxy6ZD9BZgvdFZWkTyZwrbkyo=", "vbr": 450.133, "filesize": 11930795, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "480p", "acodec": "none", "quality": 3, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.04M.08", "tbr": 450.133, "width": 854}, {"fps": 25, "format": "136 - 1280x720 (720p)", "height": 720, "format_id": "136", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=136&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=17375531&dur=212.040&lmt=1628130952538181&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAN1ZFXb_ZOXOofsWiuyAlB_PEmFOXLMiMWlLzcrb33zgAiARNS1RT8FOIEst33KIGloOKR9Y6_fSg0o1s_cr8PrDTQ%3D%3D&sig=AOq0QJ8wRAIgeCl2ZWgWyfopoNoWUVV4Lijvm2aYyFZhH4KZsPLOWb8CICgDOyLogiCIwOIiNz4zamJTtkakt8VDaLhV__Z4b9An", "vbr": 655.556, "filesize": 17375531, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "720p", "acodec": "none", "quality": 4, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.4d401f", "tbr": 655.556, "width": 1280}, {"fps": 25, "format": "247 - 1280x720 (720p)", "height": 720, "format_id": "247", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=247&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fwebm&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=18530394&dur=212.040&lmt=1628133100666546&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhAIEWZfOAPFeUw2-xI2l_IvQ2XJG92s_5Yd77n9pgCvISAiByI9uxsyN5xk_PtxDSFF4UG1Q-7OpXrYr3i6jBz880JQ%3D%3D&sig=AOq0QJ8wRgIhAL3l9xAE1mvJmZ5wEGtRO-f_vhHCRtts8Cj-jD1ZpcUqAiEAsKbVkjHRYLtXGbmwUT1qe6medMxHmIYGsLrPTftbuYI=", "vbr": 699.128, "filesize": 18530394, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "720p", "acodec": "none", "quality": 4, "container": "webm_dash", "ext": "webm", "protocol": "https", "vcodec": "vp9", "tbr": 699.128, "width": 1280}, {"fps": 25, "format": "398 - 1280x720 (720p)", "height": 720, "format_id": "398", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=398&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=22755091&dur=212.040&lmt=1624947952304594&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRgIhAPYMgegprlBtjtqtXJkbsbAeeXS6XNWySYoxae2IvrLKAiEApXXh7mr2C8UMrfXNGaIB--m-4kkSy91IN3muC3Z4t18%3D&sig=AOq0QJ8wRgIhAPm3dPdmeLw7e6muiJwhSDKe1nlkHoQ1WkXcmz6ngRkVAiEAqShfUbwRICZ7TI3pggP-3rWlFlpExlV1ebinn5JLc4k=", "vbr": 858.52, "filesize": 22755091, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "720p", "acodec": "none", "quality": 4, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.05M.08", "tbr": 858.52, "width": 1280}, {"fps": 25, "format": "399 - 1920x1080 (1080p)", "height": 1080, "format_id": "399", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=399&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=41772768&dur=212.040&lmt=1624948154710174&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5531432&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRAIgcCja1-Lsriw-hfwc2KwX9G4VBYJ1a9p3OGBQYwa3pywCIFMEO6QGSXUQoQomqSYxqUu4HOZHqHnhVUFlaroP-l2h&sig=AOq0QJ8wRQIgIPISNyI_OU4-cpSkzZjvP6oF2w0izlJKe8DCwl9bH5QCIQDHydWqPWx7k9ctYkmtelvOV6Ao_hUwUzeJuMaaXqllkw==", "vbr": 1576.033, "filesize": 41772768, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "1080p", "acodec": "none", "quality": 5, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "av01.0.08M.08", "tbr": 1576.033, "width": 1920}, {"fps": 25, "format": "137 - 1920x1080 (1080p)", "height": 1080, "format_id": "137", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=137&aitags=133%2C134%2C135%2C136%2C137%2C160%2C242%2C243%2C244%2C247%2C278%2C394%2C395%2C396%2C397%2C398%2C399&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=flWNw8FESVeF__wRUpmII5wG&gir=yes&clen=93990963&dur=212.040&lmt=1628130818054956&mt=1631594013&fvip=4&keepalive=yes&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5535434&n=7iJIhDM_ktV3660j&sparams=expire%2Cei%2Cip%2Cid%2Caitags%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIgfImvk-1wtFA9tIjgPP0B-zd95cwOlEHMhBvV3aE7zl0CIQCEf3d3oZfoThLk__WJL1AOe1URRgkj_SIcftgH8HG_jg%3D%3D&sig=AOq0QJ8wRgIhAJItHQu2MeVv3to1Z0luBDsircwDXjWzWeBmYRAKDW9rAiEA1iafsfDk5Yp-9zACBxgmxyL_pidNC3mqYV_TKjHcklY=", "vbr": 3546.159, "filesize": 93990963, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": null, "downloader_options": {"http_chunk_size": 10485760}, "format_note": "1080p", "acodec": "none", "quality": 5, "container": "mp4_dash", "ext": "mp4", "protocol": "https", "vcodec": "avc1.640028", "tbr": 3546.159, "width": 1920}, {"fps": 25, "format": "18 - 640x360 (360p)", "height": 360, "format_id": "18", "url": "https://r2---sn-j5caxvox-cvpe.googlevideo.com/videoplayback?expire=1631616016&ei=sCdAYdCGAZD7kgadtbT4AQ&ip=174.126.238.181&id=o-AB6FjTBkJE3OCIRR6E4MV93s_EQC6Wem5GQY3nsgnbhd&itag=18&source=youtube&requiressl=yes&mh=7c&mm=31%2C29&mn=sn-j5caxvox-cvpe%2Csn-nx5s7n76&ms=au%2Crdu&mv=m&mvi=2&pl=24&initcwndbps=1847500&vprv=1&mime=video%2Fmp4&ns=zMV9mnhHv3UnwW1w1ilGGmgG&gir=yes&clen=16724503&ratebypass=yes&dur=212.091&lmt=1624987724234745&mt=1631594013&fvip=4&fexp=24001373%2C24007246&beids=9466585&c=WEB&txp=5530322&n=EFswOlbBGAoK1nv1&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cvprv%2Cmime%2Cns%2Cgir%2Cclen%2Cratebypass%2Cdur%2Clmt&lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&lsig=AG3C_xAwRQIhANvKM6JozEQa97eFLe2GBuj7K6UqHz8r0ilGwRnrl5OBAiAHdOlZ3a0nr2sKPzU2cfBNdSgdtRYyYem2sOJCFRRdkg%3D%3D&sig=AOq0QJ8wRQIhAO27Mc8XHMtx364tjalsNLXk8X5zzE11s4ovWD-0cVMwAiB4giGZbFxOvmRb0Eo1OTuExAAWvFfl_IB8vrJXPHMAsQ==", "filesize": 16724503, "http_headers": {"Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.33 Safari/537.36", "Accept-Encoding": "gzip, deflate", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-us,en;q=0.5"}, "asr": 44100, "format_note": "360p", "acodec": "mp4a.40.2", "quality": 2, "ext": "mp4", "protocol": "https", "vcodec": "avc1.42001E", "tbr": 630.842, "width": 640}], "id": "dQw4w9WgXcQ", "format_id": "137+251", "uploader": "Rick Astley", "channel_id": "UCuAXFkgsw1L7xaCfnd5JJOw", "acodec": "opus", "thumbnails": [{"height": 94, "resolution": "168x94", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEbCKgBEF5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLDd2KtelLHaNSXrI9_5K-NvTscKNw", "width": 168, "id": "0"}, {"height": 110, "resolution": "196x110", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEbCMQBEG5IVfKriqkDDggBFQAAiEIYAXABwAEG&rs=AOn4CLBUpEOOWUXWkNyijQuZ4UPzp2BE-w", "width": 196, "id": "1"}, {"height": 138, "resolution": "246x138", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEcCPYBEIoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBCyhr8AqpJ1SxKVU6SyK5ODJ_IpA", "width": 246, "id": "2"}, {"height": 188, "resolution": "336x188", "url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLB_p0PncTtkrhaNDZtntrE3gKkoYw", "width": 336, "id": "3"}, {"height": 1080, "resolution": "1920x1080", "url": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/maxresdefault.webp", "width": 1920, "id": "4"}], "extractor_key": "Youtube", "fulltitle": "Sample File", "categories": ["Music"], "view_count": 1046140382, "format": "137 - 1920x1080 (1080p)+251 - audio only (tiny)", "is_live": null, "upload_date": "20091024", "track": "Never Gonna Give You Up (7\" Mix)", "extractor": "youtube", "artist": "Rick Astley", "abr": 129.689, "creator": "Rick Astley", "channel": "Rick Astley", "title": "Sample File", "vcodec": "avc1.640028", "display_id": "dQw4w9WgXcQ", "width": 1920, "alt_title": "Never Gonna Give You Up (7\" Mix)", "channel_url": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw", "stretched_ratio": null, "uploader_id": "UCuAXFkgsw1L7xaCfnd5JJOw", "like_count": 11756010, "playlist": null, "tags": ["rick astley", "Never Gonna Give You Up", "nggyu", "never gonna give you up lyrics", "rick rolled", "the boys soundtrack", "the boys amazon prime", "Never gonna give you up the boys", "official", "Rick Roll", "music video", "Rick Astley album", "rick astley official", "together forever", "Whenever You Need Somebody", "rickrolled", "WRECK-IT RALPH 2", "Fortnite song", "Fortnite event", "Fortnite dance", "fortnite never gonna give you up", "rick astley never gonna give you up", "rick astley never gonna give you up lyrics"], "duration": 212, "uploader_url": "http://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw", "dislike_count": 318477, "playlist_index": null} \ No newline at end of file diff --git a/backend/test/tests.js b/backend/test/tests.js index 51fe9fd..54617a0 100644 --- a/backend/test/tests.js +++ b/backend/test/tests.js @@ -3,7 +3,8 @@ const assert = require('assert'); const low = require('lowdb') const winston = require('winston'); const path = require('path'); - +const util = require('util'); +const exec = util.promisify(require('child_process').exec); const FileSync = require('lowdb/adapters/FileSync'); @@ -41,11 +42,13 @@ const subscriptions_api = require('../subscriptions'); const archive_api = require('../archive'); const categories_api = require('../categories'); const files_api = require('../files'); +const youtubedl_api = require('../youtube-dl'); +const config_api = require('../config'); const fs = require('fs-extra'); const { uuid } = require('uuidv4'); const NodeID3 = require('node-id3'); -db_api.initialize(db, users_db); +db_api.initialize(db, users_db, 'local_db_test.json'); const sample_video_json = { id: "Sample Video", @@ -68,9 +71,9 @@ const sample_video_json = { } describe('Database', async function() { - describe('Import', async function() { + describe.skip('Import', async function() { // it('Migrate', async function() { - // await db_api.connectToDB(); + // // await db_api.connectToDB(); // await db_api.removeAllRecords(); // const success = await db_api.importJSONToDB(db.value(), users_db.value()); // assert(success); @@ -86,7 +89,7 @@ describe('Database', async function() { }); it('Transfer to local', async function() { - await db_api.connectToDB(); + // await db_api.connectToDB(); await db_api.removeAllRecords('test'); await db_api.insertRecordIntoTable('test', {test: 'test'}); @@ -114,7 +117,8 @@ describe('Database', async function() { for (const local_db_mode of local_db_modes) { let use_local_db = local_db_mode; - describe(`Use local DB - ${use_local_db}`, async function() { + const describe_skippable = use_local_db ? describe : describe.skip; + describe_skippable(`Use local DB - ${use_local_db}`, async function() { beforeEach(async function() { if (!use_local_db) { this.timeout(120000); @@ -167,7 +171,7 @@ describe('Database', async function() { ]; await db_api.insertRecordsIntoTable('test', test_duplicates); const duplicates = await db_api.findDuplicatesByKey('test', 'test'); - console.log(duplicates); + assert(duplicates && duplicates.length === 2 && duplicates[0]['key'] === '2' && duplicates[1]['key'] === '4') }); it('Update record', async function() { @@ -279,7 +283,7 @@ describe('Database', async function() { assert(stats); }); - it('Query speed', async function() { + it.skip('Query speed', async function() { this.timeout(120000); const NUM_RECORDS_TO_ADD = 300004; // max batch ops is 1000 const test_records = []; @@ -337,12 +341,13 @@ describe('Database', async function() { }); describe('Multi User', async function() { + this.timeout(120000); const user_to_test = 'test_user'; const user_password = 'test_pass'; const sub_to_test = ''; const playlist_to_test = ''; beforeEach(async function() { - await db_api.connectToDB(); + // await db_api.connectToDB(); await auth_api.deleteUser(user_to_test); }); describe('Basic', function() { @@ -369,17 +374,17 @@ describe('Multi User', async function() { it('Video access - disallowed', async function() { await db_api.setVideoProperty(video_to_test, {sharingEnabled: false}); - const video_obj = auth_api.getUserVideo(user_to_test, video_to_test, true); + const video_obj = await auth_api.getUserVideo(user_to_test, video_to_test, true); assert(!video_obj); }); it('Video access - allowed', async function() { await db_api.setVideoProperty(video_to_test, {sharingEnabled: true}, user_to_test); - const video_obj = auth_api.getUserVideo(user_to_test, video_to_test, true); + const video_obj = await auth_api.getUserVideo(user_to_test, video_to_test, true); assert(video_obj); }); }); - describe('Zip generators', function() { + describe.skip('Zip generators', function() { it('Playlist zip generator', async function() { const playlist = await files_api.getPlaylist(playlist_to_test, user_to_test); assert(playlist); @@ -435,35 +440,50 @@ describe('Multi User', async function() { describe('Downloader', function() { const downloader_api = require('../downloader'); - const url = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'; + const url = 'https://www.youtube.com/watch?v=hpigjnKl7nI'; const sub_id = 'dc834388-3454-41bf-a618-e11cb8c7de1c'; const options = { - ui_uid: uuid(), - user: 'admin' + ui_uid: uuid() } + before(async function() { + const update_available = await youtubedl_api.checkForYoutubeDLUpdate(); + if (update_available) await youtubedl_api.updateYoutubeDL(update_available); + config_api.setConfigItem('ytdl_max_concurrent_downloads', 0); + }); + beforeEach(async function() { - await db_api.connectToDB(); + // await db_api.connectToDB(); await db_api.removeAllRecords('download_queue'); }); it('Get file info', async function() { this.timeout(300000); const info = await downloader_api.getVideoInfoByURL(url); - assert(!!info); + assert(!!info && info.length > 0); }); it('Download file', async function() { - this.timeout(300000); + this.timeout(300000); + await downloader_api.setupDownloads(); + const args = await downloader_api.generateArgs(url, 'video', options, null, true); + const [info] = await downloader_api.getVideoInfoByURL(url, args); + if (fs.existsSync(info['_filename'])) fs.unlinkSync(info['_filename']); const returned_download = await downloader_api.createDownload(url, 'video', options); - console.log(returned_download); - await utils.wait(20000); - + assert(returned_download); + const custom_download_method = async (url, args, options, callback) => { + fs.writeJSONSync(utils.getTrueFileName(info['_filename'], 'video', '.info.json'), info); + await generateEmptyVideoFile(info['_filename']); + return await callback(null, [JSON.stringify(info)]); + } + const success = await downloader_api.downloadQueuedFile(returned_download['uid'], custom_download_method); + assert(success); }); it('Tag file', async function() { - const audio_path = './test/sample.mp3'; - const sample_json = fs.readJSONSync('./test/sample.info.json'); + const success = await generateEmptyAudioFile('test/sample_mp3.mp3'); + const audio_path = './test/sample_mp3.mp3'; + const sample_json = fs.readJSONSync('./test/sample_mp3.info.json'); const tags = { title: sample_json['title'], artist: sample_json['artist'] ? sample_json['artist'] : sample_json['uploader'], @@ -471,14 +491,13 @@ describe('Downloader', function() { } NodeID3.write(tags, audio_path); const written_tags = NodeID3.read(audio_path); - assert(written_tags['raw']['TRCK'] === '27'); + assert(success && written_tags['raw']['TRCK'] === '27'); }); it('Queue file', async function() { this.timeout(300000); - const returned_download = await downloader_api.createDownload(url, 'video', options); - console.log(returned_download); - await utils.wait(20000); + const returned_download = await downloader_api.createDownload(url, 'video', options, null, null, null, null, true); + assert(returned_download); }); it('Pause file', async function() { @@ -493,7 +512,7 @@ describe('Downloader', function() { assert(args.length > 0); }); - it('Generate args - subscription', async function() { + it.skip('Generate args - subscription', async function() { const sub = await subscriptions_api.getSubscription(sub_id); const sub_options = subscriptions_api.generateOptionsForSubscriptionDownload(sub, 'admin'); const args_normal = await downloader_api.generateArgs(url, 'video', options); @@ -506,7 +525,7 @@ describe('Downloader', function() { if (fs.existsSync(nfo_file_path)) { fs.unlinkSync(nfo_file_path); } - const sample_json = fs.readJSONSync('./test/sample.info.json'); + const sample_json = fs.readJSONSync('./test/sample_mp4.info.json'); downloader_api.generateNFOFile(sample_json, nfo_file_path); assert(fs.existsSync(nfo_file_path), true); fs.unlinkSync(nfo_file_path); @@ -534,10 +553,18 @@ describe('Downloader', function() { describe('Twitch', async function () { const twitch_api = require('../twitch'); const example_vod = '1710641401'; - it('Download VOD', async function() { + it('Download VOD chat', async function() { + this.timeout(300000); + if (!fs.existsSync('TwitchDownloaderCLI')) { + try { + await exec('sh ../docker-utils/fetch-twitchdownloader.sh'); + fs.copyFileSync('../docker-utils/TwitchDownloaderCLI', 'TwitchDownloaderCLI'); + } catch (e) { + logger.info('TwitchDownloaderCLI fetch failed, file may exist regardless.'); + } + } const sample_path = path.join('test', 'sample.twitch_chat.json'); if (fs.existsSync(sample_path)) fs.unlinkSync(sample_path); - this.timeout(300000); await twitch_api.downloadTwitchChatByVODID(example_vod, 'sample', null, null, null, './test'); assert(fs.existsSync(sample_path)); @@ -550,7 +577,7 @@ describe('Downloader', function() { describe('Tasks', function() { const tasks_api = require('../tasks'); beforeEach(async function() { - await db_api.connectToDB(); + // await db_api.connectToDB(); await db_api.removeAllRecords('tasks'); const dummy_task = { @@ -569,7 +596,7 @@ describe('Tasks', function() { await tasks_api.executeTask('backup_local_db'); const backups_new = await utils.recFindByExt('appdata', 'bak'); const new_length = backups_new.length; - assert(original_length, new_length-1); + assert(original_length === new_length-1); }); it('Check for missing files', async function() { @@ -579,7 +606,7 @@ describe('Tasks', function() { await db_api.insertRecordIntoTable('files', test_missing_file); await tasks_api.executeTask('missing_files_check'); const missing_file_db_record = await db_api.getRecord('files', {uid: 'test'}); - assert(!missing_file_db_record, true); + assert(!missing_file_db_record); }); it('Check for duplicate files', async function() { @@ -599,27 +626,29 @@ describe('Tasks', function() { await tasks_api.executeTask('duplicate_files_check'); const duplicated_record_count = await db_api.getRecords('files', {path: 'test/missing_file.mp4'}, true); - assert(duplicated_record_count == 1, true); + assert(duplicated_record_count === 1); }); it('Import unregistered files', async function() { this.timeout(300000); + const success = await generateEmptyVideoFile('test/sample_mp4.mp4'); + // pre-test cleanup await db_api.removeAllRecords('files', {title: 'Sample File'}); - if (fs.existsSync('video/sample.info.json')) fs.unlinkSync('video/sample.info.json'); - if (fs.existsSync('video/sample.mp4')) fs.unlinkSync('video/sample.mp4'); + if (fs.existsSync('video/sample_mp4.info.json')) fs.unlinkSync('video/sample_mp4.info.json'); + if (fs.existsSync('video/sample_mp4.mp4')) fs.unlinkSync('video/sample_mp4.mp4'); // copies in files - fs.copyFileSync('test/sample.info.json', 'video/sample.info.json'); - fs.copyFileSync('test/sample.mp4', 'video/sample.mp4'); + fs.copyFileSync('test/sample_mp4.info.json', 'video/sample_mp4.info.json'); + fs.copyFileSync('test/sample_mp4.mp4', 'video/sample_mp4.mp4'); await tasks_api.executeTask('missing_db_records'); const imported_file = await db_api.getRecord('files', {title: 'Sample File'}); - assert(!!imported_file === true); + assert(success && !!imported_file); // post-test cleanup - if (fs.existsSync('video/sample.info.json')) fs.unlinkSync('video/sample.info.json'); - if (fs.existsSync('video/sample.mp4')) fs.unlinkSync('video/sample.mp4'); + if (fs.existsSync('video/sample_mp4.info.json')) fs.unlinkSync('video/sample_mp4.info.json'); + if (fs.existsSync('video/sample_mp4.mp4')) fs.unlinkSync('video/sample_mp4.mp4'); }); it('Schedule and cancel task', async function() { @@ -659,12 +688,12 @@ describe('Tasks', function() { describe('Archive', async function() { beforeEach(async function() { - await db_api.connectToDB(); - await db_api.removeAllRecords('archives', {user_uid: 'test_user'}); + // await db_api.connectToDB(); + await db_api.removeAllRecords('archives'); }); afterEach(async function() { - await db_api.removeAllRecords('archives', {user_uid: 'test_user'}); + await db_api.removeAllRecords('archives'); }); it('Import archive', async function() { @@ -678,7 +707,6 @@ describe('Archive', async function() { const count = await archive_api.importArchiveFile(archive_text, 'video', 'test_user', 'test_sub'); assert(count === 4) const archive_items = await db_api.getRecords('archives', {user_uid: 'test_user', sub_id: 'test_sub'}); - console.log(archive_items); assert(archive_items.length === 4); assert(archive_items.filter(archive_item => archive_item.extractor === 'testextractor2').length === 1); assert(archive_items.filter(archive_item => archive_item.extractor === 'testextractor1').length === 3); @@ -709,9 +737,9 @@ describe('Archive', async function() { }); it('Remove from archive', async function() { - await archive_api.addToArchive('testextractor1', 'testing1', 'video', 'test_user'); - await archive_api.addToArchive('testextractor2', 'testing1', 'video', 'test_user'); - await archive_api.addToArchive('testextractor2', 'testing2', 'video', 'test_user'); + await archive_api.addToArchive('testextractor1', 'testing1', 'video', 'test_title', 'test_user'); + await archive_api.addToArchive('testextractor2', 'testing1', 'video', 'test_title', 'test_user'); + await archive_api.addToArchive('testextractor2', 'testing2', 'video', 'test_title', 'test_user'); const success = await archive_api.removeFromArchive('testextractor2', 'testing1', 'video', 'test_user'); assert(success); @@ -757,7 +785,7 @@ describe('Utils', async function() { describe('Categories', async function() { beforeEach(async function() { - await db_api.connectToDB(); + // await db_api.connectToDB(); const new_category = { name: 'test_category', uid: uuid(), @@ -805,7 +833,6 @@ describe('Categories', async function() { }); const category = await categories_api.categorize([sample_video_json]); - console.log(category); assert(category && category.name === 'test_category'); }); @@ -858,4 +885,14 @@ describe('Categories', async function() { const category = await categories_api.categorize([sample_video_json]); assert(category); }); -}); \ No newline at end of file +}); + +const generateEmptyVideoFile = async (file_path) => { + if (fs.existsSync(file_path)) fs.unlinkSync(file_path); + return await exec(`ffmpeg -t 1 -f lavfi -i color=c=black:s=640x480 -c:v libx264 -tune stillimage -pix_fmt yuv420p "${file_path}"`); +} + +const generateEmptyAudioFile = async (file_path) => { + if (fs.existsSync(file_path)) fs.unlinkSync(file_path); + return await exec(`ffmpeg -f lavfi -i anullsrc=r=44100:cl=mono -t 1 -q:a 9 -acodec libmp3lame ${file_path}`); +} \ No newline at end of file diff --git a/backend/utils.js b/backend/utils.js index 157b6f0..3c7b794 100644 --- a/backend/utils.js +++ b/backend/utils.js @@ -13,7 +13,7 @@ const CONSTS = require('./consts'); const is_windows = process.platform === 'win32'; // replaces .webm with appropriate extension -exports.getTrueFileName = (unfixed_path, type) => { +exports.getTrueFileName = (unfixed_path, type, force_ext = null) => { let fixed_path = unfixed_path; const new_ext = (type === 'audio' ? 'mp3' : 'mp4'); @@ -22,7 +22,7 @@ exports.getTrueFileName = (unfixed_path, type) => { if (old_ext !== new_ext) { - unfixed_parts[unfixed_parts.length-1] = new_ext; + unfixed_parts[unfixed_parts.length-1] = force_ext || new_ext; fixed_path = unfixed_parts.join('.'); } return fixed_path; @@ -347,7 +347,7 @@ exports.checkExistsWithTimeout = async (filePath, timeout) => { if (!err) { clearTimeout(timer); if (watcher) watcher.close(); - resolve(); + resolve(true); } }); @@ -357,7 +357,7 @@ exports.checkExistsWithTimeout = async (filePath, timeout) => { if (eventType === 'rename' && filename === basename) { clearTimeout(timer); if (watcher) watcher.close(); - resolve(); + resolve(true); } }); }); @@ -530,6 +530,40 @@ exports.getDirectoriesInDirectory = async (basePath) => { } } +exports.parseOutputJSON = (output, err) => { + let split_output = []; + // const output_jsons = []; + if (err && !output) { + if (!err.stderr.includes('This video is unavailable') && !err.stderr.includes('Private video')) { + return null; + } + logger.info('An error was encountered with at least one video, backup method will be used.') + try { + split_output = err.stdout.split(/\r\n|\r|\n/); + } catch (e) { + logger.error('Backup method failed. See error below:'); + logger.error(e); + return null; + } + } else if (output.length === 0 || (output.length === 1 && output[0].length === 0)) { + // output is '' or [''] + return []; + } else { + for (const output_item of output) { + // we have to do this because sometimes there will be leading characters before the actual json + const start_idx = output_item.indexOf('{"'); + const clean_output = output_item.slice(start_idx, output_item.length); + split_output.push(clean_output); + } + } + + try { + return split_output.map(split_output_str => JSON.parse(split_output_str)); + } catch(e) { + return null; + } +} + // objects function File(id, title, thumbnailURL, isAudio, duration, url, uploader, size, path, upload_date, description, view_count, height, abr) { diff --git a/backend/youtube-dl.js b/backend/youtube-dl.js index ee3f382..c951589 100644 --- a/backend/youtube-dl.js +++ b/backend/youtube-dl.js @@ -5,6 +5,7 @@ const logger = require('./logger'); const utils = require('./utils'); const CONSTS = require('./consts'); const config_api = require('./config.js'); +const youtubedl = require('youtube-dl'); const OUTDATED_VERSION = "2020.00.00"; @@ -25,6 +26,15 @@ const download_sources = { } } +exports.runYoutubeDL = async (url, args, downloadMethod = youtubedl.exec) => { + return new Promise(resolve => { + downloadMethod(url, args, {maxBuffer: Infinity}, async function(err, output) { + const parsed_output = utils.parseOutputJSON(output, err); + resolve({parsed_output, err}); + }); + }); +} + exports.checkForYoutubeDLUpdate = async () => { return new Promise(async resolve => { const default_downloader = config_api.getConfigItem('ytdl_default_downloader'); diff --git a/src/app/components/downloads/downloads.component.ts b/src/app/components/downloads/downloads.component.ts index f99c4ca..d5e3092 100644 --- a/src/app/components/downloads/downloads.component.ts +++ b/src/app/components/downloads/downloads.component.ts @@ -78,12 +78,6 @@ export class DownloadsComponent implements OnInit, OnDestroy { show: (download: Download) => !download.finished && download.paused && download.finished_step, icon: 'play_arrow' }, - { - tooltip: $localize`Resume`, - action: (download: Download) => this.resumeDownload(download), - show: (download: Download) => !download.finished && download.paused && download.finished_step, - icon: 'play_arrow' - }, { tooltip: $localize`Cancel`, action: (download: Download) => this.cancelDownload(download),