Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add BrowserCookieJar class and get_browser function #186

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

ReK42
Copy link

@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
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