mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Ensure only one thread can run the update function for mobileread.
This commit is contained in:
parent
07f0209fc6
commit
4ddc69e0a6
@ -10,6 +10,7 @@ import difflib
|
|||||||
import heapq
|
import heapq
|
||||||
import time
|
import time
|
||||||
from contextlib import closing
|
from contextlib import closing
|
||||||
|
from threading import RLock
|
||||||
|
|
||||||
from lxml import html
|
from lxml import html
|
||||||
|
|
||||||
@ -25,6 +26,7 @@ class MobileReadStore(StorePlugin):
|
|||||||
|
|
||||||
def genesis(self):
|
def genesis(self):
|
||||||
self.config = DynamicConfig('store_' + self.name)
|
self.config = DynamicConfig('store_' + self.name)
|
||||||
|
self.rlock = RLock()
|
||||||
|
|
||||||
def open(self, parent=None, detail_item=None, external=False):
|
def open(self, parent=None, detail_item=None, external=False):
|
||||||
url = 'http://www.mobileread.com/'
|
url = 'http://www.mobileread.com/'
|
||||||
@ -60,45 +62,46 @@ class MobileReadStore(StorePlugin):
|
|||||||
yield s
|
yield s
|
||||||
|
|
||||||
def update_book_list(self, timeout=10):
|
def update_book_list(self, timeout=10):
|
||||||
url = 'http://www.mobileread.com/forums/ebooks.php?do=getlist&type=html'
|
with self.rlock:
|
||||||
|
url = 'http://www.mobileread.com/forums/ebooks.php?do=getlist&type=html'
|
||||||
|
|
||||||
|
last_download = self.config.get(self.name + '_last_download', None)
|
||||||
|
# Don't update the book list if our cache is less than one week old.
|
||||||
|
if last_download and (time.time() - last_download) < 604800:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Download the book list HTML file from MobileRead.
|
||||||
|
br = browser()
|
||||||
|
raw_data = None
|
||||||
|
with closing(br.open(url, timeout=timeout)) as f:
|
||||||
|
raw_data = f.read()
|
||||||
|
|
||||||
|
if not raw_data:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Turn books listed in the HTML file into BookRef's.
|
||||||
|
books = []
|
||||||
|
try:
|
||||||
|
data = html.fromstring(raw_data)
|
||||||
|
for book_data in data.xpath('//ul/li'):
|
||||||
|
book = BookRef()
|
||||||
|
book.url = ''.join(book_data.xpath('.//a/@href'))
|
||||||
|
book.format = ''.join(book_data.xpath('.//i/text()'))
|
||||||
|
book.format = book.format.strip()
|
||||||
|
|
||||||
last_download = self.config.get(self.name + '_last_download', None)
|
text = ''.join(book_data.xpath('.//a/text()'))
|
||||||
# Don't update the book list if our cache is less than one week old.
|
if ':' in text:
|
||||||
if last_download and (time.time() - last_download) < 604800:
|
book.author, q, text = text.partition(':')
|
||||||
return
|
book.author = book.author.strip()
|
||||||
|
book.title = text.strip()
|
||||||
# Download the book list HTML file from MobileRead.
|
books.append(book)
|
||||||
br = browser()
|
except:
|
||||||
raw_data = None
|
pass
|
||||||
with closing(br.open(url, timeout=timeout)) as f:
|
|
||||||
raw_data = f.read()
|
|
||||||
|
|
||||||
if not raw_data:
|
|
||||||
return
|
|
||||||
|
|
||||||
# Turn books listed in the HTML file into BookRef's.
|
|
||||||
books = []
|
|
||||||
try:
|
|
||||||
data = html.fromstring(raw_data)
|
|
||||||
for book_data in data.xpath('//ul/li'):
|
|
||||||
book = BookRef()
|
|
||||||
book.url = ''.join(book_data.xpath('.//a/@href'))
|
|
||||||
book.format = ''.join(book_data.xpath('.//i/text()'))
|
|
||||||
book.format = book.format.strip()
|
|
||||||
|
|
||||||
text = ''.join(book_data.xpath('.//a/text()'))
|
# Save the book list and it's create time.
|
||||||
if ':' in text:
|
if books:
|
||||||
book.author, q, text = text.partition(':')
|
self.config[self.name + '_last_download'] = time.time()
|
||||||
book.author = book.author.strip()
|
self.config[self.name + '_book_list'] = books
|
||||||
book.title = text.strip()
|
|
||||||
books.append(book)
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Save the book list and it's create time.
|
|
||||||
if books:
|
|
||||||
self.config[self.name + '_last_download'] = time.time()
|
|
||||||
self.config[self.name + '_book_list'] = books
|
|
||||||
|
|
||||||
def get_book_list(self, timeout=10):
|
def get_book_list(self, timeout=10):
|
||||||
self.update_book_list(timeout=timeout)
|
self.update_book_list(timeout=timeout)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user