diff options
author | Gonzalo Odiard <godiard@sugarlabs.org> | 2011-03-28 17:00:03 (GMT) |
---|---|---|
committer | Gonzalo Odiard <godiard@sugarlabs.org> | 2011-03-28 17:00:03 (GMT) |
commit | 8120aaf46d0bcc94ea9a59a6615571b3a791f5b4 (patch) | |
tree | 470d8e66971783172592ee778a1dc4a735af15d9 | |
parent | 8cc8f18877af5debb4667ba31dd04904f3978868 (diff) |
Initial support to OPDS Catalogs
-rwxr-xr-x | GetIABooksActivity.py | 95 | ||||
-rw-r--r-- | get-books.cfg | 7 | ||||
-rw-r--r-- | icons/catalogs.svg | 93 | ||||
-rw-r--r-- | opds.py | 5 |
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> @@ -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) |