diff --git a/src/calibre/gui2/images/news/dilbert.png b/src/calibre/gui2/images/news/dilbert.png deleted file mode 100644 index d2f48423ab..0000000000 Binary files a/src/calibre/gui2/images/news/dilbert.png and /dev/null differ diff --git a/src/calibre/gui2/images/news/espn.png b/src/calibre/gui2/images/news/espn.png new file mode 100644 index 0000000000..bd42977d8c Binary files /dev/null and b/src/calibre/gui2/images/news/espn.png differ diff --git a/src/calibre/web/feeds/news.py b/src/calibre/web/feeds/news.py index 8ea9d5bd0d..b85a7f5de5 100644 --- a/src/calibre/web/feeds/news.py +++ b/src/calibre/web/feeds/news.py @@ -82,6 +82,9 @@ class BasicNewsRecipe(object, LoggingInterface): #: @type: boolean needs_subscription = False + #: If True the navigation bar is center aligned, otherwise it is left aligned + center_navbar = True + #: Specify an override encoding for sites that have an incorrect #: charset specification. The most common being specifying ``latin1`` and #: using ``cp1252``. If None, try to detect the encoding. @@ -451,7 +454,7 @@ class BasicNewsRecipe(object, LoggingInterface): if body is not None: templ = self.navbar.generate(False, f, a, feed_len, not self.has_single_feed, - url, __appname__) + url, __appname__, center=self.center_navbar) elem = BeautifulSoup(templ.render(doctype='xhtml').decode('utf-8')).find('div') body.insert(0, elem) @@ -522,10 +525,13 @@ class BasicNewsRecipe(object, LoggingInterface): bn = bn.rpartition('/')[-1] if bn: img = os.path.join(imgdir, 'feed_image_%d%s'%(self.image_counter, os.path.splitext(bn))) - open(img, 'wb').write(self.browser.open(feed.image_url).read()) - self.image_counter += 1 - feed.image_url = img - self.image_map[feed.image_url] = img + try: + open(img, 'wb').write(self.browser.open(feed.image_url).read()) + self.image_counter += 1 + feed.image_url = img + self.image_map[feed.image_url] = img + except: + pass templ = templates.FeedTemplate() return templ.generate(feed, self.description_limiter).render(doctype='xhtml') @@ -606,6 +612,8 @@ class BasicNewsRecipe(object, LoggingInterface): url = self.print_version(article.url) except NotImplementedError: url = article.url + if not url: + continue func, arg = (self.fetch_embedded_article, article) if self.use_embedded_content else \ (self.fetch_article, url) @@ -703,7 +711,8 @@ class BasicNewsRecipe(object, LoggingInterface): prefix = '/'.join('..'for i in range(2*len(re.findall(r'link\d+', last)))) templ = self.navbar.generate(True, num, j, len(f), not self.has_single_feed, - a.orig_url, __appname__, prefix=prefix) + a.orig_url, __appname__, prefix=prefix, + center=self.center_navbar) elem = BeautifulSoup(templ.render(doctype='xhtml').decode('utf-8')).find('div') body.insert(len(body.contents), elem) open(last, 'wb').write(unicode(soup).encode('utf-8')) diff --git a/src/calibre/web/feeds/recipes/__init__.py b/src/calibre/web/feeds/recipes/__init__.py index a27908bdb3..8ffb3ca147 100644 --- a/src/calibre/web/feeds/recipes/__init__.py +++ b/src/calibre/web/feeds/recipes/__init__.py @@ -7,7 +7,7 @@ Builtin recipes. recipes = [ 'newsweek', 'atlantic', 'economist', 'portfolio', 'nytimes', 'usatoday', 'outlook_india', 'bbc', 'greader', 'wsj', - 'wired', 'globe_and_mail', 'smh', + 'wired', 'globe_and_mail', 'smh', 'espn', ] import re, imp, inspect, time diff --git a/src/calibre/web/feeds/recipes/espn.py b/src/calibre/web/feeds/recipes/espn.py new file mode 100644 index 0000000000..d8c33847cf --- /dev/null +++ b/src/calibre/web/feeds/recipes/espn.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python +__license__ = 'GPL v3' +__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' +__docformat__ = 'restructuredtext en' + +''' +espn.com +''' +import re +from calibre.web.feeds.news import BasicNewsRecipe + +class ESPN(BasicNewsRecipe): + + title = 'ESPN' + description = 'Sports news' + __author__ = 'Kovid Goyal' + + needs_subscription = True + remove_tags = [dict(name='font', attrs={'class':'footer'}), dict(name='hr', noshade='noshade')] + remove_tags_before = dict(name='font', attrs={'class':'date'}) + center_navbar = False + html2lrf_options = ['--base-font-size', '0'] + + feeds = [('Top Headlines', 'http://sports.espn.go.com/espn/rss/news'), + 'http://sports.espn.go.com/espn/rss/nfl/news', + 'http://sports.espn.go.com/espn/rss/nba/news', + 'http://sports.espn.go.com/espn/rss/mlb/news', + 'http://sports.espn.go.com/espn/rss/nhl/news', + 'http://sports.espn.go.com/espn/rss/golf/news', + 'http://sports.espn.go.com/espn/rss/rpm/news', + 'http://sports.espn.go.com/espn/rss/tennis/news', + 'http://sports.espn.go.com/espn/rss/boxing/news', + 'http://soccernet.espn.go.com/rss/news', + 'http://sports.espn.go.com/espn/rss/ncb/news', + 'http://sports.espn.go.com/espn/rss/ncf/news', + 'http://sports.espn.go.com/espn/rss/ncaa/news', + 'http://sports.espn.go.com/espn/rss/outdoors/news', + 'http://sports.espn.go.com/espn/rss/bassmaster/news', + 'http://sports.espn.go.com/espn/rss/oly/news', + 'http://sports.espn.go.com/espn/rss/horse/news'] + + def get_browser(self): + br = BasicNewsRecipe.get_browser() + br.set_handle_refresh(False) + if self.username is not None and self.password is not None: + br.open('http://espn.com') + br.select_form(nr=0) + br.form.find_control(name='username', type='text').value = self.username + br.form['password'] = self.password + br.submit() + br.set_handle_refresh(True) + return br + + def print_version(self, url): + if 'eticket' in url: + return url.partition('&')[0].replace('story?', 'print?') + match = re.search(r'story\?(id=\d+)', url) + if match: + return 'http://sports.espn.go.com/espn/print?'+match.group(1)+'&type=story' + + return None + + def preprocess_html(self, soup): + for div in soup.findAll('div'): + if div.has_key('style') and 'px' in div['style']: + div['style'] = '' + + return soup + + def postprocess_html(self, soup): + for div in soup.findAll('div', style=True): + div['style'] = div['style'].replace('center', 'left') + return soup + \ No newline at end of file diff --git a/src/calibre/web/feeds/templates.py b/src/calibre/web/feeds/templates.py index e550513956..76ad2c70a7 100644 --- a/src/calibre/web/feeds/templates.py +++ b/src/calibre/web/feeds/templates.py @@ -53,7 +53,7 @@ class NavBarTemplate(Template): >
-