Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGonzalo Odiard <godiard@sugarlabs.org>2011-03-28 17:00:03 (GMT)
committer Gonzalo Odiard <godiard@sugarlabs.org>2011-03-28 17:00:03 (GMT)
commit8120aaf46d0bcc94ea9a59a6615571b3a791f5b4 (patch)
tree470d8e66971783172592ee778a1dc4a735af15d9
parent8cc8f18877af5debb4667ba31dd04904f3978868 (diff)
Initial support to OPDS Catalogs
-rwxr-xr-xGetIABooksActivity.py95
-rw-r--r--get-books.cfg7
-rw-r--r--icons/catalogs.svg93
-rw-r--r--opds.py5
4 files changed, 184 insertions, 16 deletions
diff --git a/GetIABooksActivity.py b/GetIABooksActivity.py
index 5518adb..4321501 100755
--- a/GetIABooksActivity.py
+++ b/GetIABooksActivity.py
@@ -30,8 +30,10 @@ except ImportError:
OLD_TOOLBAR = True
from sugar.graphics import style
+from sugar.graphics.toolbutton import ToolButton
from sugar.graphics.toolcombobox import ToolComboBox
from sugar.graphics.combobox import ComboBox
+from sugar.graphics.menuitem import MenuItem
from sugar.graphics import iconentry
from sugar import profile
from sugar.activity import activity
@@ -89,6 +91,7 @@ class GetIABooksActivity(activity.Activity):
self.show_images = True
self.languages = {}
self._lang_code_handler = languagenames.LanguageNames()
+ self.catalogs = {}
if os.path.exists('/etc/get-books.cfg'):
self._read_configuration('/etc/get-books.cfg')
@@ -142,19 +145,38 @@ class GetIABooksActivity(activity.Activity):
lang_code = language.strip()
if len(lang_code) > 0:
self.languages[lang_code] = \
- self._lang_code_handler.get_full_language_name(lang_code)
+ self._lang_code_handler.get_full_language_name(lang_code)
for section in config.sections():
- if section != 'GetBooks':
+ if section != 'GetBooks' and not section.startswith('Catalogs'):
name = config.get(section, 'name')
_SOURCES[section] = name
repo_config = {}
repo_config['query_uri'] = config.get(section, 'query_uri')
repo_config['opds_cover'] = config.get(section, 'opds_cover')
_SOURCES_CONFIG[section] = repo_config
+
logging.error('_SOURCES %s', _SOURCES)
logging.error('_SOURCES_CONFIG %s', _SOURCES_CONFIG)
+
+ for section in config.sections():
+ if section.startswith('Catalogs'):
+ catalog_source = section.split('_')[1]
+ if not catalog_source in _SOURCES_CONFIG:
+ logging.error('There are not a source for the catalog ' +
+ 'section %s', section)
+ break
+ source_config = _SOURCES_CONFIG[catalog_source]
+ opds_cover = source_config['opds_cover']
+ for catalog in config.options(section):
+ catalog_config = {}
+ catalog_config['query_uri'] = config.get(section, catalog)
+ catalog_config['opds_cover'] = opds_cover
+ catalog_config['source'] = catalog_source
+ self.catalogs[catalog] = catalog_config
+
logging.error('languages %s', self.languages)
+ logging.error('catalogs %s', self.catalogs)
def _add_search_controls(self, toolbar):
book_search_item = gtk.ToolItem()
@@ -182,16 +204,31 @@ class GetIABooksActivity(activity.Activity):
if len(self.languages) > 0:
toolbar.language_combo = ComboBox()
toolbar.language_combo.props.sensitive = True
- toolbar.language_changed_cb_id = \
- toolbar.language_combo.connect('changed',
- self.__language_changed_cb)
combotool = ToolComboBox(toolbar.language_combo)
- toolbar.language_combo.append_item('all',_('Any language'))
+ toolbar.language_combo.append_item('all', _('Any language'))
for key in self.languages.keys():
toolbar.language_combo.append_item(key, self.languages[key])
toolbar.language_combo.set_active(0)
toolbar.insert(combotool, -1)
combotool.show()
+ toolbar.language_changed_cb_id = \
+ toolbar.language_combo.connect('changed',
+ self.__language_changed_cb)
+
+ if len(self.catalogs) > 0:
+ bt_catalogs = ToolButton('catalogs')
+ bt_catalogs.set_tooltip(_('Catalogs'))
+
+ toolbar.insert(bt_catalogs, -1)
+ bt_catalogs.show()
+ palette = bt_catalogs.get_palette()
+
+ for key in self.catalogs.keys():
+ menu_item = MenuItem(key)
+ menu_item.connect('activate',
+ self.__activate_catalog_cb, self.catalogs[key])
+ palette.menu.append(menu_item)
+ menu_item.show()
self._device_manager = devicemanager.DeviceManager()
self._refresh_sources(toolbar)
@@ -202,6 +239,24 @@ class GetIABooksActivity(activity.Activity):
toolbar.search_entry.grab_focus()
return toolbar
+ def __activate_catalog_cb(self, menu, catalog_config):
+ query_language = self.get_query_language()
+
+ self.enable_button(False)
+ self.clear_downloaded_bytes()
+ self.book_selected = False
+ self.listview.clear()
+
+ if self.queryresults is not None:
+ self.queryresults.cancel()
+ self.queryresults = None
+
+ self.queryresults = opds.RemoteQueryResult(catalog_config,
+ '', query_language, self.window)
+ self.show_message(_('Performing lookup, please wait...'))
+
+ self.queryresults.connect('updated', self.__query_updated_cb)
+
def update_format_combo(self, links):
self.format_combo.handler_block(self.__format_changed_cb_id)
self.format_combo.remove_all()
@@ -477,12 +532,16 @@ class GetIABooksActivity(activity.Activity):
self.image.set_from_pixbuf(pixbuf)
- def find_books(self, search_text=''):
- source = self._books_toolbar.source_combo.props.value
-
+ def get_query_language(self):
query_language = None
if len(self.languages) > 0:
query_language = self._books_toolbar.language_combo.props.value
+ return query_language
+
+ def find_books(self, search_text=''):
+ source = self._books_toolbar.source_combo.props.value
+
+ query_language = self.get_query_language()
self.enable_button(False)
self.clear_downloaded_bytes()
@@ -495,9 +554,8 @@ class GetIABooksActivity(activity.Activity):
if search_text is None:
return
- elif len(search_text) == 0:
- self._alert(_('Error'),
- _('You must enter at least one search word.'))
+ elif len(search_text) < 3:
+ self.show_message(_('You must enter at least 3 letters.'))
self._books_toolbar.search_entry.grab_focus()
return
@@ -519,6 +577,19 @@ class GetIABooksActivity(activity.Activity):
self.show_message(_('Sorry, no books could be found.'))
elif not midway:
self.hide_message()
+ query_language = self.get_query_language()
+ logging.error('LANGUAGE %s', query_language)
+ if query_language != 'all' and query_language != 'en':
+ # the bookserver send english books if there are not books in
+ # the requested language
+ only_english = True
+ for book in self.queryresults.get_book_list():
+ if book.get_language() == query_language:
+ only_english = False
+ break
+ if only_english:
+ self.show_message(
+ _('Sorry, we only found english books.'))
def __source_changed_cb(self, widget):
search_terms = self.get_search_terms()
diff --git a/get-books.cfg b/get-books.cfg
index eb0528f..29a4416 100644
--- a/get-books.cfg
+++ b/get-books.cfg
@@ -7,6 +7,13 @@ name = Feedbooks
query_uri = http://feedbooks.com/books/search.atom?query=
opds_cover = http://opds-spec.org/image
+[Catalogs_Feedbooks]
+Science Fiction = http://www.feedbooks.com/books/top.atom?category=FBFIC028000&range=week
+Short stories = http://www.feedbooks.com/books/top?category=FBFIC029000&range=week
+Fairy Tales, Folk Tales & Mythology = http://www.feedbooks.com/books/top?category=FBFIC010000&range=week
+Juvenile = http://www.feedbooks.com/books/top?category=FBJUV000000&range=week
+Action & Adventure = http://www.feedbooks.com/books/top?category=FBFIC002000&range=week
+
[Internet Archive]
name = Internet Archive
query_uri = http://bookserver.archive.org/catalog/opensearch?q=
diff --git a/icons/catalogs.svg b/icons/catalogs.svg
new file mode 100644
index 0000000..1556b73
--- /dev/null
+++ b/icons/catalogs.svg
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ height="55px"
+ viewBox="0 0 55 55"
+ width="55px"
+ stroke-linecap="round"
+ stroke-linejoin="round"
+ stroke-width="3.5"
+ stroke="#000"
+ fill="#eee"
+ id="svg3163"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="catalogs.svg">
+ <metadata
+ id="metadata3175">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs3173" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1007"
+ id="namedview3171"
+ showgrid="false"
+ inkscape:zoom="5.4363636"
+ inkscape:cx="-38.53679"
+ inkscape:cy="27.5"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg3163" />
+ <g
+ id="g3794"
+ transform="matrix(0.90045793,0,0,0.88610465,132.19468,25.300159)">
+ <path
+ sodipodi:nodetypes="ccccccccccccccc"
+ inkscape:connector-curvature="0"
+ id="rect3177-3-5"
+ d="m -124.46056,-21.494132 -0.89822,4.756525 -4.26832,-0.537655 -14.89811,9.0304758 22.71871,36.3311012 6.19279,-3.730737 3.96339,2.580136 3.85722,-5.718139 0.81391,0 0,-1.220334 19.250751,-28.6604282 -14.579611,-9.5186088 -4.1322,0.684292 -0.53894,-3.996628 z"
+ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:3.93412137;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <g
+ transform="translate(-143.84615,-25.384615)"
+ id="g3789">
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3177-3"
+ width="15.451505"
+ height="38.260868"
+ x="38.378708"
+ y="-14.139146"
+ transform="matrix(0.83378586,0.55208798,-0.55208798,0.83378586,0,0)" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3177"
+ width="15.451505"
+ height="38.260868"
+ x="20.234114"
+ y="6.438127" />
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3177-8"
+ width="15.451505"
+ height="38.260868"
+ x="-7.4373245"
+ y="16.90127"
+ transform="matrix(0.85164682,-0.5241161,0.5241161,0.85164682,0,0)" />
+ </g>
+ </g>
+</svg>
diff --git a/opds.py b/opds.py
index 9111a98..bb4ce66 100644
--- a/opds.py
+++ b/opds.py
@@ -52,10 +52,7 @@ class DownloadThread(threading.Thread):
if self.obj._language is not None and self.obj._language != 'all':
headers['Accept-Language'] = self.obj._language
logging.error('Searching URL %s headers %s' % (uri, headers))
- logging.error('feedpaser version %s', feedparser.__version__)
- feedobj = feedparser.parse(uri, etag=None, modified=None,
- agent=None, referrer=None, handlers=[],
- request_headers=headers)
+ feedobj = feedparser.parse(uri, request_headers=headers)
else:
feedobj = feedparser.parse(self.obj._uri)