support yt-dlp cookie syntax (#7)
+26 −1 · 1 file changed
-
src/yt_playlist_export/yt_playlist_export.py+26 −1
@@ -2,9 +2,11 @@ import argparse import csv +import re import sys import json import yt_dlp +from yt_dlp.cookies import SUPPORTED_BROWSERS, SUPPORTED_KEYRINGS parser = argparse.ArgumentParser(description='yt-playlist-export exports YouTube playlists to JSON or CSV') parser.add_argument('--browser', type=str, required=False, default='firefox', help='browser where you logged in to YouTube') @@ -89,9 +91,32 @@ def print_json(info: any): with open(output, 'w') as f: f.write(json.dumps(info)) +def parse_browser_arg(cookiesfrombrowser): + if cookiesfrombrowser: + container = None + mobj = re.fullmatch(r'''(?x) + (?P<name>[^+:]+) + (?:\s*\+\s*(?P<keyring>[^:]+))? + (?:\s*:\s*(?!:)(?P<profile>.+?))? + (?:\s*::\s*(?P<container>.+))? + ''', cookiesfrombrowser) + if mobj is None: + raise ValueError(f'invalid cookies from browser arguments: {cookiesfrombrowser}') + browser_name, keyring, profile, container = mobj.group('name', 'keyring', 'profile', 'container') + browser_name = browser_name.lower() + if browser_name not in SUPPORTED_BROWSERS: + raise ValueError(f'unsupported browser specified for cookies: "{browser_name}". ' + f'Supported browsers are: {", ".join(sorted(SUPPORTED_BROWSERS))}') + if keyring is not None: + keyring = keyring.upper() + if keyring not in SUPPORTED_KEYRINGS: + raise ValueError(f'unsupported keyring specified for cookies: "{keyring}". ' + f'Supported keyrings are: {", ".join(sorted(SUPPORTED_KEYRINGS))}') + return (browser_name, profile, keyring, container) + # See help(yt_dlp.YoutubeDL) for a list of available options and public functions ydl_opts = { - 'cookiesfrombrowser': (args.browser,), + 'cookiesfrombrowser': parse_browser_arg(args.browser), 'ignoreerrors': 'only_download', 'extract_flat': True, 'quiet': not verbose