diff --git a/src/calibre/gui2/store/web_control.py b/src/calibre/gui2/store/web_control.py index f31b750e52..3b6337f597 100644 --- a/src/calibre/gui2/store/web_control.py +++ b/src/calibre/gui2/store/web_control.py @@ -4,7 +4,9 @@ __license__ = 'GPL 3' __copyright__ = '2011, John Schember ' __docformat__ = 'restructuredtext en' -from PyQt4.Qt import QWebView, QWebPage, QNetworkCookieJar, QNetworkRequest +from cookielib import Cookie, CookieJar + +from PyQt4.Qt import QWebView, QWebPage, QNetworkCookieJar, QNetworkRequest, QString class NPWebView(QWebView): @@ -35,7 +37,7 @@ class NPWebView(QWebView): return url = unicode(request.url().toString()) - self.gui.download_from_store(url) + self.gui.download_from_store(url, self.get_cookies()) def ignore_ssl_errors(self, reply, errors): reply.ignoreSslErrors(errors) @@ -45,6 +47,53 @@ class NPWebView(QWebView): print 'error' print reply.error() #print reply.attribute(QNetworkRequest.HttpStatusCodeAttribute).toInt() + + def get_cookies(self): + cj = CookieJar() + + for c in self.page().networkAccessManager().cookieJar().allCookies(): + version = 0 + name = unicode(QString(c.name())) + value = unicode(QString(c.value())) + port = None + port_specified = False + domain = unicode(c.domain()) + if domain: + domain_specified = True + if domain.startswith('.'): + domain_initial_dot = True + else: + domain_initial_dot = False + else: + domain = None + domain_specified = False + path = unicode(c.path()) + if path: + path_specified = True + else: + path = None + path_specified = False + secure = c.isSecure() + expires = c.expirationDate().toMSecsSinceEpoch() / 1000 + discard = c.isSessionCookie() + comment = None + comment_url = None + rest = None + + cookie = Cookie(version, name, value, + port, port_specified, + domain, domain_specified, domain_initial_dot, + path, path_specified, + secure, + expires, + discard, + comment, + comment_url, + rest) + + cj.set_cookie(cookie) + + return cj class NPWebPage(QWebPage): diff --git a/src/calibre/gui2/store_download.py b/src/calibre/gui2/store_download.py index fe99ae6f14..71378c173f 100644 --- a/src/calibre/gui2/store_download.py +++ b/src/calibre/gui2/store_download.py @@ -8,6 +8,7 @@ import cStringIO import os import shutil import time +from cookielib import CookieJar from contextlib import closing from threading import Thread from Queue import Queue @@ -20,11 +21,12 @@ from calibre.utils.ipc.job import BaseJob class StoreDownloadJob(BaseJob): - def __init__(self, callback, description, job_manager, db, url='', save_as_loc='', add_to_lib=True): + def __init__(self, callback, description, job_manager, db, cookie_jar, url='', save_as_loc='', add_to_lib=True): BaseJob.__init__(self, description) self.exception = None self.job_manager = job_manager self.db = db + self.cookie_jar = cookie_jar self.args = (url, save_as_loc, add_to_lib) self.tmp_file_name = '' self.callback = callback @@ -123,6 +125,7 @@ class StoreDownloader(Thread): return br = browser() + br.set_cookiejar(job.cookie_jar) basename = br.open(url).geturl().split('/')[-1] ext = os.path.splitext(basename)[1][1:].lower() @@ -155,9 +158,9 @@ class StoreDownloader(Thread): shutil.copy(job.tmp_fie_name, save_loc) - def download_from_store(self, callback, db, url='', save_as_loc='', add_to_lib=True): + def download_from_store(self, callback, db, cookie_jar, url='', save_as_loc='', add_to_lib=True): description = _('Downloading %s') % url - job = StoreDownloadJob(callback, description, self.job_manager, db, url, save_as_loc, add_to_lib) + job = StoreDownloadJob(callback, description, self.job_manager, db, cookie_jar, url, save_as_loc, add_to_lib) self.job_manager.add_job(job) self.jobs.put(job) @@ -167,10 +170,10 @@ class StoreDownloadMixin(object): def __init__(self): self.store_downloader = StoreDownloader(self.job_manager) - def download_from_store(self, url='', save_as_loc='', add_to_lib=True): + def download_from_store(self, url='', cookie_jar=CookieJar(), save_as_loc='', add_to_lib=True): if not self.store_downloader.is_alive(): self.store_downloader.start() - self.store_downloader.download_from_store(Dispatcher(self.downloaded_from_store), self.library_view.model().db, url, save_as_loc, add_to_lib) + self.store_downloader.download_from_store(Dispatcher(self.downloaded_from_store), self.library_view.model().db, cookie_jar, url, save_as_loc, add_to_lib) self.status_bar.show_message(_('Downloading') + ' ' + url, 3000) def downloaded_from_store(self, job):