Read The Standard on your iPad or Kindle in no time. Click download to load the free ebook on your reader.
Check out all the available public recipes or write your own with these quick start guides. ReadBeam is built on calibre, so everything in the docs and the fora applies here as well.
News from Kenia
Language: en
Requires Subscription: No, it's available as free ebook
Schedule Every morning
__license__ = 'GPL v3'
__copyright__ = '2010, Hans Donner <hans.donner at pobox.com>'
'''
www.standardmedia.co.ke
'''
import os
from calibre import strftime, __appname__, __version__
from calibre.web.feeds.news import BasicNewsRecipe
from calibre.constants import preferred_encoding
from calibre.utils.magick import Image
class StandardMediaKeRecipe(BasicNewsRecipe):
__author__ = 'Hans Donner'
title = u'The Standard'
description = 'News from Kenia'
language = 'en'
country = 'KE'
publication_type = 'newspaper'
publisher = 'standardmedia.co.ke'
category = 'news, politics, Kenia'
cover_img_url = 'http://www.standardmedia.co.ke/images/easLogoOther.gif'
masthead_url = cover_img_url
max_articles_per_feed = 200
oldest_article = 3
use_embedded_content = False
remove_empty_feeds = True
no_stylesheets = False
feeds = [(u'Headlines', u'http://www.standardmedia.co.ke/rss/headlines.php'),
(u'Business', u'http://www.standardmedia.co.ke/rss/business.php'),
(u'Politics', u'http://www.standardmedia.co.ke/rss/politics.php'),
(u'Editorial', u'http://www.standardmedia.co.ke/rss/editorial.php'),
(u'Columnists', u'http://www.standardmedia.co.ke/rss/columnists.php'),
(u'Sports', u'http://www.standardmedia.co.ke/rss/sports.php'),
(u'Entertainment', u'http://www.standardmedia.co.ke/rss/entertain.php')]
conversion_options = {
'comment' : description
, 'tags' : category
, 'publisher' : publisher
, 'language' : language
}
def print_version(self, url):
import re
p = re.compile('http://www.standardmedia.co.ke/.*InsidePage.php')
return p.sub('http://www.standardmedia.co.ke/print.php', url)
def preprocess_html(self, soup):
return self.adeify_images(soup)
def get_cover_img_url(self):
return getattr(self, 'cover_img_url', None)
def _download_cover_img(self):
# hack to reuse download_cover
old_cu = None
try:
old_cu = self.get_cover_ur()
except:
pass
new_cu = self.get_cover_img_url()
self.cover_url = new_cu
self._download_cover()
outfile = os.path.join(self.output_dir, 'cover_img.jpg')
self.prepare_masthead_image(self.cover_path, outfile)
self.cover_url = old_cu
self.cover_img_path = outfile
def download_cover_img(self):
try:
self._download_cover_img()
self.report_progress(1, _('Downloaded cover to %s') % self.cover_img_path)
except:
self.log.exception('Failed to download cover img')
self.cover_img_path = None
def prepare_cover_image(self, path_to_image, out_path):
img = Image()
img.open(path_to_image)
img.save(out_path)
def default_cover(self, cover_file):
'''
Create a generic cover for recipes that have a special cover img
'''
try:
try:
from PIL import Image, ImageDraw, ImageFont
Image, ImageDraw, ImageFont
except ImportError:
import Image, ImageDraw, ImageFont
font_path = P('fonts/liberation/LiberationSerif-Bold.ttf')
title = self.title if isinstance(self.title, unicode) else \
self.title.decode(preferred_encoding, 'replace')
date = strftime(self.timefmt)
app = '['+__appname__ +' '+__version__+']'
COVER_WIDTH, COVER_HEIGHT = 590, 750
img = Image.new('RGB', (COVER_WIDTH, COVER_HEIGHT), 'white')
draw = ImageDraw.Draw(img)
# Title
font = ImageFont.truetype(font_path, 44)
width, height = draw.textsize(title, font=font)
left = max(int((COVER_WIDTH - width)/2.), 0)
top = 15
draw.text((left, top), title, fill=(0,0,0), font=font)
bottom = top + height
# Date
font = ImageFont.truetype(font_path, 32)
width, height = draw.textsize(date, font=font)
left = max(int((COVER_WIDTH - width)/2.), 0)
draw.text((left, bottom+15), date, fill=(0,0,0), font=font)
# Vanity
font = ImageFont.truetype(font_path, 28)
width, height = draw.textsize(app, font=font)
left = max(int((COVER_WIDTH - width)/2.), 0)
top = COVER_HEIGHT - height - 15
draw.text((left, top), app, fill=(0,0,0), font=font)
# Logo
logo_file = I('library.png')
self.download_cover_img()
if getattr(self, 'cover_img_path', None) is not None:
logo_file = self.cover_img_path
self.report_progress(1, _('using cover img from %s') % logo_file)
logo = Image.open(logo_file, 'r')
width, height = logo.size
left = max(int((COVER_WIDTH - width)/2.), 0)
top = max(int((COVER_HEIGHT - height)/2.), 0)
img.paste(logo, (left, top))
img = img.convert('RGB').convert('P', palette=Image.ADAPTIVE)
img.convert('RGB').save(cover_file, 'JPEG')
cover_file.flush()
except Exception, e:
self.log.exception('Failed to generate default cover ', e)
return False
return True