Ensure only one thread can run the update function for mobileread.

This commit is contained in:
John Schember 2011-03-08 07:04:04 -05:00
parent 07f0209fc6
commit 4ddc69e0a6

View File

@ -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) 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. # Don't update the book list if our cache is less than one week old.
if last_download and (time.time() - last_download) < 604800: if last_download and (time.time() - last_download) < 604800:
return return
# Download the book list HTML file from MobileRead. # Download the book list HTML file from MobileRead.
br = browser() br = browser()
raw_data = None raw_data = None
with closing(br.open(url, timeout=timeout)) as f: with closing(br.open(url, timeout=timeout)) as f:
raw_data = f.read() raw_data = f.read()
if not raw_data: if not raw_data:
return return
# Turn books listed in the HTML file into BookRef's. # Turn books listed in the HTML file into BookRef's.
books = [] books = []
try: try:
data = html.fromstring(raw_data) data = html.fromstring(raw_data)
for book_data in data.xpath('//ul/li'): for book_data in data.xpath('//ul/li'):
book = BookRef() book = BookRef()
book.url = ''.join(book_data.xpath('.//a/@href')) book.url = ''.join(book_data.xpath('.//a/@href'))
book.format = ''.join(book_data.xpath('.//i/text()')) book.format = ''.join(book_data.xpath('.//i/text()'))
book.format = book.format.strip() book.format = book.format.strip()
text = ''.join(book_data.xpath('.//a/text()')) text = ''.join(book_data.xpath('.//a/text()'))
if ':' in text: if ':' in text:
book.author, q, text = text.partition(':') book.author, q, text = text.partition(':')
book.author = book.author.strip() book.author = book.author.strip()
book.title = text.strip() book.title = text.strip()
books.append(book) books.append(book)
except: except:
pass pass
# Save the book list and it's create time. # Save the book list and it's create time.
if books: if books:
self.config[self.name + '_last_download'] = time.time() self.config[self.name + '_last_download'] = time.time()
self.config[self.name + '_book_list'] = books 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)