|
@@ -39,6 +39,7 @@ from .compat import (
|
|
|
compat_HTMLParser,
|
|
|
compat_basestring,
|
|
|
compat_chr,
|
|
|
+ compat_cookiejar,
|
|
|
compat_ctypes_WINFUNCTYPE,
|
|
|
compat_etree_fromstring,
|
|
|
compat_expanduser,
|
|
@@ -1139,6 +1140,33 @@ class YoutubeDLHTTPSHandler(compat_urllib_request.HTTPSHandler):
|
|
|
req, **kwargs)
|
|
|
|
|
|
|
|
|
+class YoutubeDLCookieJar(compat_cookiejar.MozillaCookieJar):
|
|
|
+ def save(self, filename=None, ignore_discard=False, ignore_expires=False):
|
|
|
+ # Store session cookies with `expires` set to 0 instead of an empty
|
|
|
+ # string
|
|
|
+ for cookie in self:
|
|
|
+ if cookie.expires is None:
|
|
|
+ cookie.expires = 0
|
|
|
+ compat_cookiejar.MozillaCookieJar.save(self, filename, ignore_discard, ignore_expires)
|
|
|
+
|
|
|
+ def load(self, filename=None, ignore_discard=False, ignore_expires=False):
|
|
|
+ compat_cookiejar.MozillaCookieJar.load(self, filename, ignore_discard, ignore_expires)
|
|
|
+ # Session cookies are denoted by either `expires` field set to
|
|
|
+ # an empty string or 0. MozillaCookieJar only recognizes the former
|
|
|
+ # (see [1]). So we need force the latter to be recognized as session
|
|
|
+ # cookies on our own.
|
|
|
+ # Session cookies may be important for cookies-based authentication,
|
|
|
+ # e.g. usually, when user does not check 'Remember me' check box while
|
|
|
+ # logging in on a site, some important cookies are stored as session
|
|
|
+ # cookies so that not recognizing them will result in failed login.
|
|
|
+ # 1. https://bugs.python.org/issue17164
|
|
|
+ for cookie in self:
|
|
|
+ # Treat `expires=0` cookies as session cookies
|
|
|
+ if cookie.expires == 0:
|
|
|
+ cookie.expires = None
|
|
|
+ cookie.discard = True
|
|
|
+
|
|
|
+
|
|
|
class YoutubeDLCookieProcessor(compat_urllib_request.HTTPCookieProcessor):
|
|
|
def __init__(self, cookiejar=None):
|
|
|
compat_urllib_request.HTTPCookieProcessor.__init__(self, cookiejar)
|