mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-12-18 17:27:47 +01:00
[cookies] Fix --cookies-from-browser
for snap
Firefox (#9016)
Authored by: Grub4K
This commit is contained in:
parent
3725b4f0c9
commit
cbed249aaa
@ -1,6 +1,7 @@
|
|||||||
import base64
|
import base64
|
||||||
import collections
|
import collections
|
||||||
import contextlib
|
import contextlib
|
||||||
|
import glob
|
||||||
import http.cookiejar
|
import http.cookiejar
|
||||||
import http.cookies
|
import http.cookies
|
||||||
import io
|
import io
|
||||||
@ -122,13 +123,14 @@ def _extract_firefox_cookies(profile, container, logger):
|
|||||||
return YoutubeDLCookieJar()
|
return YoutubeDLCookieJar()
|
||||||
|
|
||||||
if profile is None:
|
if profile is None:
|
||||||
search_root = _firefox_browser_dir()
|
search_roots = list(_firefox_browser_dirs())
|
||||||
elif _is_path(profile):
|
elif _is_path(profile):
|
||||||
search_root = profile
|
search_roots = [profile]
|
||||||
else:
|
else:
|
||||||
search_root = os.path.join(_firefox_browser_dir(), profile)
|
search_roots = [os.path.join(path, profile) for path in _firefox_browser_dirs()]
|
||||||
|
search_root = ', '.join(map(repr, search_roots))
|
||||||
|
|
||||||
cookie_database_path = _find_most_recently_used_file(search_root, 'cookies.sqlite', logger)
|
cookie_database_path = _newest(_firefox_cookie_dbs(search_roots))
|
||||||
if cookie_database_path is None:
|
if cookie_database_path is None:
|
||||||
raise FileNotFoundError(f'could not find firefox cookies database in {search_root}')
|
raise FileNotFoundError(f'could not find firefox cookies database in {search_root}')
|
||||||
logger.debug(f'Extracting cookies from: "{cookie_database_path}"')
|
logger.debug(f'Extracting cookies from: "{cookie_database_path}"')
|
||||||
@ -182,12 +184,21 @@ def _extract_firefox_cookies(profile, container, logger):
|
|||||||
cursor.connection.close()
|
cursor.connection.close()
|
||||||
|
|
||||||
|
|
||||||
def _firefox_browser_dir():
|
def _firefox_browser_dirs():
|
||||||
if sys.platform in ('cygwin', 'win32'):
|
if sys.platform in ('cygwin', 'win32'):
|
||||||
return os.path.expandvars(R'%APPDATA%\Mozilla\Firefox\Profiles')
|
yield os.path.expandvars(R'%APPDATA%\Mozilla\Firefox\Profiles')
|
||||||
|
|
||||||
elif sys.platform == 'darwin':
|
elif sys.platform == 'darwin':
|
||||||
return os.path.expanduser('~/Library/Application Support/Firefox/Profiles')
|
yield os.path.expanduser('~/Library/Application Support/Firefox/Profiles')
|
||||||
return os.path.expanduser('~/.mozilla/firefox')
|
|
||||||
|
else:
|
||||||
|
yield from map(os.path.expanduser, ('~/.mozilla/firefox', '~/snap/firefox/common/.mozilla/firefox'))
|
||||||
|
|
||||||
|
|
||||||
|
def _firefox_cookie_dbs(roots):
|
||||||
|
for root in map(os.path.abspath, roots):
|
||||||
|
for pattern in ('', '*/', 'Profiles/*/'):
|
||||||
|
yield from glob.iglob(os.path.join(root, pattern, 'cookies.sqlite'))
|
||||||
|
|
||||||
|
|
||||||
def _get_chromium_based_browser_settings(browser_name):
|
def _get_chromium_based_browser_settings(browser_name):
|
||||||
@ -268,7 +279,7 @@ def _extract_chrome_cookies(browser_name, profile, keyring, logger):
|
|||||||
logger.error(f'{browser_name} does not support profiles')
|
logger.error(f'{browser_name} does not support profiles')
|
||||||
search_root = config['browser_dir']
|
search_root = config['browser_dir']
|
||||||
|
|
||||||
cookie_database_path = _find_most_recently_used_file(search_root, 'Cookies', logger)
|
cookie_database_path = _newest(_find_files(search_root, 'Cookies', logger))
|
||||||
if cookie_database_path is None:
|
if cookie_database_path is None:
|
||||||
raise FileNotFoundError(f'could not find {browser_name} cookies database in "{search_root}"')
|
raise FileNotFoundError(f'could not find {browser_name} cookies database in "{search_root}"')
|
||||||
logger.debug(f'Extracting cookies from: "{cookie_database_path}"')
|
logger.debug(f'Extracting cookies from: "{cookie_database_path}"')
|
||||||
@ -947,7 +958,7 @@ def _get_windows_v10_key(browser_root, logger):
|
|||||||
References:
|
References:
|
||||||
- [1] https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/os_crypt_win.cc
|
- [1] https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/os_crypt_win.cc
|
||||||
"""
|
"""
|
||||||
path = _find_most_recently_used_file(browser_root, 'Local State', logger)
|
path = _newest(_find_files(browser_root, 'Local State', logger))
|
||||||
if path is None:
|
if path is None:
|
||||||
logger.error('could not find local state file')
|
logger.error('could not find local state file')
|
||||||
return None
|
return None
|
||||||
@ -1049,17 +1060,20 @@ def _get_column_names(cursor, table_name):
|
|||||||
return [row[1].decode() for row in table_info]
|
return [row[1].decode() for row in table_info]
|
||||||
|
|
||||||
|
|
||||||
def _find_most_recently_used_file(root, filename, logger):
|
def _newest(files):
|
||||||
|
return max(files, key=lambda path: os.lstat(path).st_mtime, default=None)
|
||||||
|
|
||||||
|
|
||||||
|
def _find_files(root, filename, logger):
|
||||||
# if there are multiple browser profiles, take the most recently used one
|
# if there are multiple browser profiles, take the most recently used one
|
||||||
i, paths = 0, []
|
i = 0
|
||||||
with _create_progress_bar(logger) as progress_bar:
|
with _create_progress_bar(logger) as progress_bar:
|
||||||
for curr_root, dirs, files in os.walk(root):
|
for curr_root, _, files in os.walk(root):
|
||||||
for file in files:
|
for file in files:
|
||||||
i += 1
|
i += 1
|
||||||
progress_bar.print(f'Searching for "{filename}": {i: 6d} files searched')
|
progress_bar.print(f'Searching for "{filename}": {i: 6d} files searched')
|
||||||
if file == filename:
|
if file == filename:
|
||||||
paths.append(os.path.join(curr_root, file))
|
yield os.path.join(curr_root, file)
|
||||||
return None if not paths else max(paths, key=lambda path: os.lstat(path).st_mtime)
|
|
||||||
|
|
||||||
|
|
||||||
def _merge_cookie_jars(jars):
|
def _merge_cookie_jars(jars):
|
||||||
@ -1073,7 +1087,7 @@ def _merge_cookie_jars(jars):
|
|||||||
|
|
||||||
|
|
||||||
def _is_path(value):
|
def _is_path(value):
|
||||||
return os.path.sep in value
|
return any(sep in value for sep in (os.path.sep, os.path.altsep) if sep)
|
||||||
|
|
||||||
|
|
||||||
def _parse_browser_specification(browser_name, profile=None, keyring=None, container=None):
|
def _parse_browser_specification(browser_name, profile=None, keyring=None, container=None):
|
||||||
|
Loading…
Reference in New Issue
Block a user