Skip to content

Add BrowserCookieJar class and get_browser function#186

Open
ReK42 wants to merge 2 commits intoborisbabic:masterfrom
ReK42:master
Open

Add BrowserCookieJar class and get_browser function#186
ReK42 wants to merge 2 commits intoborisbabic:masterfrom
ReK42:master

Conversation

@ReK42
Copy link
Copy Markdown

@ReK42 ReK42 commented Jul 16, 2023

Adds the following methods to get cookies:

BrowserCookieJar is a subclass of http.cookiejar.CookieJar which will take the browser name as a string:

Python 3.11.4 (tags/v3.11.4:d2340ef, Jun  7 2023, 05:45:37) [MSC v.1934 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from browser_cookie3 import BrowserCookieJar
>>> cookiejar = BrowserCookieJar("firefox", domain_name="bandcamp.com")
>>> for cookie in cookiejar:
...     print(cookie)
...     break
...
<Cookie client_id=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX for .bandcamp.com/>

get_browser is a function which will return the browser-specific function based on the browser name as a string:

Python 3.11.4 (tags/v3.11.4:d2340ef, Jun  7 2023, 05:45:37) [MSC v.1934 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from browser_cookie3 import get_browser
>>> cookies = get_browser("firefox")(domain_name="bandcamp.com")
>>> for cookie in cookies:
...     print(cookie)
...     break
...
<Cookie client_id=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX for .bandcamp.com/>

To support these, I update the type annotations on the existing browser-specific functions, including adding the key_file argument to those which didn't have it, for consistency. Additionally, both methods use a new SUPPORTED_BROWSERS dictionary, and the load method was updated to use it as well:

Python 3.11.4 (tags/v3.11.4:d2340ef, Jun  7 2023, 05:45:37) [MSC v.1934 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from browser_cookie3 import load
>>> cookies = load("bandcamp.com")
>>> for cookie in cookies:
...     print(cookie)
...     break
...
<Cookie client_id=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX for .bandcamp.com/>

@ReK42 ReK42 changed the title Add BrowserCookieJar and get_browser, update load to use shared dict Add BrowserCookieJar class and get_browser function Jul 16, 2023
@ReK42
Copy link
Copy Markdown
Author

ReK42 commented Jul 16, 2023

I added these because I'm currently using the following method to pull cookies from a specific browser in bcamp-dl, where self.browser is a string argument from the user:

func = getattr(browser_cookie3, self.browser)
self.cookies = func(domain_name="bandcamp.com")

This seems a little fragile to me, as I need to validate the string against a list of supported browsers that isn't easily available from upstream, and it can produce some unhelpful exceptions if it goes wrong. Adding a subclass of http.cookiejar.CookieJar which will raise a helpful exception if the browser is not supported makes this a lot cleaner. I can now rely on upstream to validate for me, and it's a lot more clear that the result is a standard CookieJar object.

The load function is useful but doesn't quite do what I want: I want to load a cookie from a specific browser, not from all available browsers. I did add get_browser as an alternative method to get the specific function, as opposed to getattr.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant