#!/usr/bin/python3 # -*- coding: utf-8 -*- """ RSS module for Inky-Calendar Project Copyright by aceisace """ from inkycal.custom import * from random import shuffle try: import feedparser except ImportError: print('feedparser is not installed! Please install with:') print('pipe install feedparser') # Debug Data size = (384, 160) config = {'rss_urls': ['http://feeds.bbci.co.uk/news/world/rss.xml#']} class rss: """RSS class parses rss feeds from given urls and writes them on the image """ logger = logging.getLogger(__name__) logging.basicConfig(level=logging.DEBUG) def __init__(self, section_size, section_config): """Initialize inkycal_rss module""" self.name = os.path.basename(__file__).split('.py')[0] self.config = section_config self.width, self.height = section_size self.background_colour = 'white' self.font_colour = 'black' self.fontsize = 12 self.font = ImageFont.truetype(fonts['NotoSans-SemiCondensed'], size = self.fontsize) self.padding_x = 0.02 self.padding_y = 0.05 print('{0} loaded'.format(self.name)) def set(self, **kwargs): """Manually set some parameters of this module""" for key, value in kwargs.items(): if key in self.__dict__: setattr(self, key, value) else: print('{0} does not exist'.format(key)) pass def get(self, **kwargs): """Manually get some parameters of this module""" for key, value in kwargs.items(): if key in self.__dict__: getattr(self, key, value) else: print('{0} does not exist'.format(key)) pass def get_options(self): """Get all options which can be changed""" return self.__dict__ def generate_image(self): """Generate image for this module""" # Define new image size with respect to padding im_width = int(self.width - (self.width * 2 * self.padding_x)) im_height = int(self.height - (self.height * 2 * self.padding_y)) im_size = im_width, im_height logging.info('image size: {} x {} px'.format(im_width, im_height)) # Create an image for black pixels and one for coloured pixels im_black = Image.new('RGB', size = im_size, color = self.background_colour) im_colour = Image.new('RGB', size = im_size, color = 'white') # Check if internet is available if internet_available() == True: logging.info('Connection test passed') else: logging.error('Network could not be reached :/') raise Exception('Network could not be reached :(') # Set some parameters for formatting rss feeds line_spacing = 1 line_height = self.font.getsize('hg')[1] + line_spacing line_width = im_width max_lines = (im_height // (self.font.getsize('hg')[1] + line_spacing)) # Calculate padding from top so the lines look centralised spacing_top = int( im_height % line_height / 2 ) # Calculate line_positions line_positions = [ (0, spacing_top + _ * line_height ) for _ in range(max_lines)] try: # Create list containing all rss-feeds from all rss-feed urls parsed_feeds = [] for feeds in self.config['rss_urls']: text = feedparser.parse(feeds) for posts in text.entries: parsed_feeds.append('•{0}: {1}'.format(posts.title, posts.summary)) # print(parsed_feeds) # Shuffle the list to prevent showing the same content shuffle(parsed_feeds) # Trim down the list to the max number of lines del parsed_feeds[max_lines:] # Wrap long text from feeds (line-breaking) flatten = lambda z: [x for y in z for x in y] filtered_feeds, counter = [], 0 for posts in parsed_feeds: wrapped = text_wrap(posts, font = self.font, max_width = line_width) counter += len(filtered_feeds) + len(wrapped) if counter < max_lines: filtered_feeds.append(wrapped) filtered_feeds = flatten(filtered_feeds) # Write rss-feeds on image """Write the correctly formatted text on the display""" for _ in range(len(filtered_feeds)): write(im_black, line_positions[_], (line_width, line_height), filtered_feeds[_], font = self.font, alignment= 'left') # Cleanup del filtered_feeds, parsed_feeds, wrapped, counter, text except Exception as e: print('Error in {0}'.format(self.name)) print('Reason: ',e) write(im_black, (0,0), (im_width, im_height), str(e), font = self.font) # Save image of black and colour channel in image-folder im_black.save(images+self.name+'.png') im_colour.save(images+self.name+'_colour.png') if __name__ == '__main__': print('running {0} in standalone mode'.format( os.path.basename(__file__).split('.py')[0]))