diff --git a/fanficfare/cli.py b/fanficfare/cli.py index 18c9da73..d4cc7415 100644 --- a/fanficfare/cli.py +++ b/fanficfare/cli.py @@ -163,6 +163,11 @@ def mkParser(calibre, parser=None): parser.add_option('--color', action='store_true', dest='color', help='Display a errors and warnings in a contrasting color. Requires package colorama on Windows.', ) + parser.add_option('--mozilla-cookies', + dest='mozillacookies', + help='Read and use cookies from COOKIEFILE in Mozilla/Netscape cookies.txt format.', + metavar='COOKIEFILE') + def printVersion(*args): print("Version: %s" % version) @@ -175,6 +180,8 @@ def mkParser(calibre, parser=None): ## undocumented feature for development use. Save page cache and ## cookies between runs. Saves in PWD as files global_cache and ## global_cookies + ## *does* honor --mozilla-cookies setting and writes cookies to + ## *set file instead of global_cookies. parser.add_option('--save-cache', '--save_cache', action='store_true', dest='save_cache', help=SUPPRESS_HELP, ) @@ -655,13 +662,23 @@ def get_configuration(url, ## All CLI downloads are sequential and share one cookiejar, ## loaded the first time through here. if not hasattr(options,'cookiejar'): - options.cookiejar = configuration.get_cookiejar() + cookiefile = None + if options.mozillacookies: + cookiefile = options.mozillacookies + options.cookiejar = configuration.get_cookiejar(filename=cookiefile, + mozilla=True) + else: + options.cookiejar = configuration.get_cookiejar() if options.save_cache: + if not cookiefile: + cookiefile = global_cookies + options.cookiejar.set_autosave(True,filename=cookiefile) + + if cookiefile: try: - options.cookiejar.load_cookiejar(global_cookies) + options.cookiejar.load_cookiejar(cookiefile) except Exception as e: - logger.warning("Didn't load --save-cache %s\nContinue without loading cookies"%e) - options.cookiejar.set_autosave(True,filename=global_cookies) + logger.warning("Didn't load cookie file %s\nContinue without loading cookies"%e) else: configuration.set_cookiejar(options.cookiejar) diff --git a/fanficfare/configurable.py b/fanficfare/configurable.py index 652c4efe..70bbf878 100644 --- a/fanficfare/configurable.py +++ b/fanficfare/configurable.py @@ -1060,8 +1060,8 @@ class Configuration(ConfigParser): def set_sleep_override(self,val): return self.sleeper.set_sleep_override(val) - def get_cookiejar(self,filename=None): - return self.get_fetcher().get_cookiejar(filename) + def get_cookiejar(self,filename=None,mozilla=False): + return self.get_fetcher().get_cookiejar(filename,mozilla) def set_cookiejar(self,cookiejar): self.get_fetcher().set_cookiejar(cookiejar) diff --git a/fanficfare/fetcher.py b/fanficfare/fetcher.py index 6abd03f1..e8a0db7c 100644 --- a/fanficfare/fetcher.py +++ b/fanficfare/fetcher.py @@ -26,7 +26,7 @@ logger = logging.getLogger(__name__) # py2 vs py3 transition from .six.moves.urllib.parse import quote_plus -from .six.moves.http_cookiejar import LWPCookieJar +from .six.moves.http_cookiejar import LWPCookieJar, MozillaCookieJar from .six import text_type as unicode from .six import ensure_binary, ensure_text @@ -297,28 +297,6 @@ class FetcherResponse(object): self.fromcache = fromcache self.json = json -class BasicCookieJar(LWPCookieJar,object): - def __init__(self,*args,**kargs): - super(BasicCookieJar,self).__init__(*args,**kargs) - self.autosave = False - # self.filename from parent(s) - - ## used by CLI --save-cache dev debugging feature - def set_autosave(self,autosave=False,filename=None): - self.autosave = autosave - self.filename = filename - - def load_cookiejar(self,filename=None): - self.load(self.filename or filename, - ignore_discard=True, - ignore_expires=True) - - def save_cookiejar(self,filename=None): - self.save(filename or self.filename, - ignore_discard=True, - ignore_expires=True) - - class Fetcher(object): def __init__(self,getConfig_fn,getConfigList_fn): self.getConfig = getConfig_fn @@ -326,8 +304,36 @@ class Fetcher(object): self.cookiejar = None - def get_cookiejar(self,filename=None): + def get_cookiejar(self,filename=None,mozilla=False): + if self.cookiejar is None: + if mozilla: + ParentCookieJar = MozillaCookieJar + else: + ParentCookieJar = LWPCookieJar + + class BasicCookieJar(ParentCookieJar,object): + def __init__(self,*args,**kargs): + super(BasicCookieJar,self).__init__(*args,**kargs) + self.autosave = False + # self.filename from parent(s) + + ## used by CLI --save-cache dev debugging feature + def set_autosave(self,autosave=False,filename=None): + self.autosave = autosave + self.filename = filename + + def load_cookiejar(self,filename=None): + self.load(self.filename or filename, + ignore_discard=True, + ignore_expires=True) + + def save_cookiejar(self,filename=None): + self.save(filename or self.filename, + ignore_discard=True, + ignore_expires=True) + + self.cookiejar = BasicCookieJar(filename=filename) if filename: try: @@ -360,6 +366,7 @@ class Fetcher(object): referer=None, usecache=True): # logger.debug("fetcher do_request") + # logger.debug(self.get_cookiejar()) headers = self.make_headers(url,referer=referer) fetchresp = self.request(method,url, headers=headers,