def run(self, runInput=True, runOutput=True): self.loadModules() self.setupModules() if runInput: for key, modules in self.modules['input'].iteritems(): for module in modules: module.input(self) if runOutput: if self.getConfig('kindleOutput') or self.getConfig('epubOutput'): epubSections = [] for section in self.modules['output']: epubSection = {'title': section['section-title'], 'chapters': []} for module in section['modules']: #todo: don't make it append as a side effect, make it return the chapters module.outputEpubDoc(self, epubSection['chapters']) if len(epubSection['chapters']) > 0: epubSections.append(epubSection) if self.getConfig('kindleOutput') or self.getConfig('epubOutput'): today = datetime.date.today().strftime("%Y-%m-%d") epubFilename = "/tmp/steward-%s.epub" % (today, ) mobiFilename = "/tmp/steward-%s.mobi" % (today, ) eb = EpubBuilder(epubFilename, "Steward for %s" % (datetime.date.today().strftime("%B %d, %Y")), "Information Steward", epubSections, True) eb.writeBookFile() if self.getConfig('kindleOutput'): call(["/home/phuff/bin/kindlegen", epubFilename]) message = MIMEMultipart() message["Subject"] = "" message['To'] = self.getConfig('kindleEmailAddress') message['From'] = self.getConfig('senderEmailAddress') fp = open(mobiFilename) attachment = MIMEBase("application", "x-mobipocket-ebook") attachment.set_payload(fp.read()) attachment.add_header('Content-Disposition', 'attachment', filename=os.path.basename(mobiFilename)) fp.close() encoders.encode_base64(attachment) message.attach(attachment) server = smtplib.SMTP(self.getConfig('senderSMTPHost')) server.ehlo() server.starttls() server.login(self.getConfig('senderEmailAddress'), self.getConfig('senderEmailPassword')) server.sendmail(self.getConfig('senderEmailAddress'), self.getConfig('kindleEmailAddress'), message.as_string()) server.quit()
def main(): args = parse_args(sys.argv[1:]) or exit() if args.verbose: root_logger = getLogger() root_logger.setLevel(logging.DEBUG) if args.quiet: root_logger = getLogger() root_logger.setLevel(logging.CRITICAL) grabber_manager = GrabberManager() grabber_manager.load_from_dir(config['grabbers_dir']) if args.grabbers: for grabber in grabber_manager.all_grabbers(): logging.info("%s '%s'", grabber.name, grabber.info) exit() if args.grabber: grabber = grabber_manager.get(args.grabber) if grabber is None: fatal("Grabber '%s' does not exists", args.grabber) logging.debug("Grab by '%s' grabber", grabber.name) else: grabber = None title = args.title epub_name = None logging.debug('Getting pages...') if len(args.sources) == 1: url = args.sources[0] grabber = grabber or grabber_manager.get_suitable(url) info, stream, images = grabber.grab(url) title = title or info['title'] or args.out if not title: url = url.rstrip('/') title = os.path.split(url)[1] if args.out: try: epub_name = args.out.format(**info) except KeyError as exc: fatal("Error in output format key: %s", exc) else: fmt = '{date} {title}'.format(**info) if fmt.strip(): epub_name = fmt lang = args.lang or info.get('lang') builder = EpubBuilder(title, lang=lang, creator=info.get('creator'), date=info.get('create_date')) add2builder(builder, 'ch1.html', stream, info, images) else: # TODO pass arg 'lang' to EpubBuilder(..., lang=language) builder = EpubBuilder(title) for i, url in enumerate(args.sources, 1): grabber = grabber or grabber_manager.get_suitable(url) info, stream, images = grabber.grab(url) add2builder(builder, 'ch{}.html'.format(i), stream, info, images) dest = epub_name or title[:config['autoname_len']] if os.path.splitext(dest)[1] != '.epub': dest = '{}.epub'.format(dest) if args.no_spaces: dest = dest.replace(' ', '_') logging.debug('Building book...') builder.build(dest=dest) logging.info('Complete. Saved to "%s"', dest)