← yt-playlist-export

support yt-dlp cookie syntax (#7)

718113000f6ad1d700de1a97c53e14bf4a10a57f · Aleksandr Tabakov · Mar 28, 2025 11:14

+26 −1 · 1 file changed

  • src/yt_playlist_export/yt_playlist_export.py +26 −1
diff --git a/src/yt_playlist_export/yt_playlist_export.py b/src/yt_playlist_export/yt_playlist_export.py
index 23e9ea2..7064fd2 100755
--- a/src/yt_playlist_export/yt_playlist_export.py
+++ b/src/yt_playlist_export/yt_playlist_export.py
@@ -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