def GET(self): username = web.input().get("u") urls = web.input().get("urls") subject = web.input().get("subject") to = web.input().get("to") language = web.input().get("lng") keepimage = bool(web.input().get("keepimage") == '1') booktype = web.input().get("type", "mobi") tz = int(web.input().get("tz", TIMEZONE)) if not all((username, urls, subject, to, language, booktype, tz)): return "Some parameter missing!<br />" #global log if booktype == 'Download': #直接下载电子书并推送 from lib.filedownload import Download for url in urls.split('|'): dlinfo, filename, content = Download(url) #如果标题已经给定了文件名,则使用标题文件名 if '.' in subject and (1 < len(subject.split('.')[-1]) < 5): filename = subject if content: self.SendToKindle(username, to, filename, '', content, tz) else: if not dlinfo: dlinfo = 'download failed' self.deliverlog(username, to, filename, 0, status=dlinfo, tz=tz) main.log.info("%s Sent!" % filename) return "%s Sent!" % filename user = KeUser.all().filter("name = ", username).get() if not user or not user.kindle_email: return "User not exist!<br />" book = BaseUrlBook() book.title = book.description = subject book.language = language book.keep_image = keepimage book.network_timeout = 60 book.feeds = [(subject, url) for url in urls.split('|')] book.url_filters = [flt.url for flt in user.urlfilter] opts = oeb = None # 创建 OEB opts = getOpts(user.device) oeb = CreateOeb(main.log, None, opts) oeb.container = ServerContainer(main.log) if len(book.feeds) > 1: setMetaData(oeb, subject, language, local_time(tz=tz)) id, href = oeb.manifest.generate('masthead', DEFAULT_MASTHEAD) oeb.manifest.add(id, href, MimeFromFilename(DEFAULT_MASTHEAD)) oeb.guide.add('masthead', 'Masthead Image', href) else: setMetaData(oeb, subject, language, local_time(tz=tz), pubtype='book:book:KindleEar') id, href = oeb.manifest.generate('cover', DEFAULT_COVER) item = oeb.manifest.add(id, href, MimeFromFilename(DEFAULT_COVER)) oeb.guide.add('cover', 'Cover', href) oeb.metadata.add('cover', id) # 对于html文件,变量名字自文档 # 对于图片文件,section为图片mime,url为原始链接,title为文件名,content为二进制内容 itemcnt, hasimage = 0, False sections = {subject: []} toc_thumbnails = {} #map img-url -> manifest-href for sec_or_media, url, title, content, brief, thumbnail in book.Items( opts, user): if sec_or_media.startswith(r'image/'): id, href = oeb.manifest.generate(id='img', href=title) item = oeb.manifest.add(id, href, sec_or_media, data=content) if thumbnail: toc_thumbnails[url] = href itemcnt += 1 hasimage = True else: if len(book.feeds) > 1: sections[subject].append( (title, brief, thumbnail, content)) else: id, href = oeb.manifest.generate(id='page', href='page.html') item = oeb.manifest.add(id, href, 'application/xhtml+xml', data=content) oeb.spine.add(item, False) oeb.toc.add(title, href) itemcnt += 1 if itemcnt > 0: if len(book.feeds) > 1: InsertToc(oeb, sections, toc_thumbnails) elif not hasimage: #单文章没有图片则去掉封面 href = oeb.guide['cover'].href oeb.guide.remove('cover') item = oeb.manifest.hrefs[href] oeb.manifest.remove(item) oeb.metadata.clear('cover') oIO = byteStringIO() o = EPUBOutput() if booktype == "epub" else MOBIOutput() o.convert(oeb, oIO, opts, main.log) self.SendToKindle(username, to, book.title, booktype, str(oIO.getvalue()), tz) rs = "%s(%s).%s Sent!" % (book.title, local_time(tz=tz), booktype) main.log.info(rs) return rs else: self.deliverlog(username, to, book.title, 0, status='fetch failed', tz=tz) rs = "[Url2Book]Fetch url failed." main.log.info(rs) return rs
def ProcessComicRSS(self, username, user, feed): opts = None oeb = None # 创建 OEB #global log opts = getOpts(user.device, 'comic') oeb = CreateOeb(main.log, None, opts) pubtype = 'book:book:KindleEar' language = 'zh-cn' setMetaData(oeb, feed.title, language, local_time("%Y-%m-%d", user.timezone), pubtype=pubtype) oeb.container = ServerContainer(main.log) #guide id_, href = oeb.manifest.generate('masthead', DEFAULT_MASTHEAD) # size:600*60 oeb.manifest.add(id_, href, MimeFromFilename(DEFAULT_MASTHEAD)) oeb.guide.add('masthead', 'Masthead Image', href) id_, href = oeb.manifest.generate('cover', DEFAULT_COVER) item = oeb.manifest.add(id_, href, MimeFromFilename(DEFAULT_COVER)) oeb.guide.add('cover', 'Cover', href) oeb.metadata.add('cover', id_) itemcnt, imgindex = 0, 0 sections = OrderedDict() toc_thumbnails = {} #map img-url -> manifest-href if feed.url.startswith(("http://ac.qq.com", "http://m.ac.qq.com")): book = TencentBaseBook(imgindex=imgindex, opts=opts, user=user) elif feed.url.startswith("http://www.cartoonmad.com"): book = CartoonMadBaseBook(imgindex=imgindex, opts=opts, user=user) else: return "Failed to push book <%s>!" % title book.title = feed.title book.description = feed.title book.language = language book.keep_image = True book.oldest_article = 7 book.fulltext_by_readability = True book.feeds = [(feed.title, feed.url)] book.url_filters = [flt.url for flt in user.urlfilter] try: #书的质量可能不一,一本书的异常不能影响其他书籍的推送 for sec_or_media, url, title, content, brief, thumbnail in book.Items( ): if not sec_or_media or not title or not content: continue if sec_or_media.startswith(r'image/'): id_, href = oeb.manifest.generate(id='img', href=title) item = oeb.manifest.add(id_, href, sec_or_media, data=content) if thumbnail: toc_thumbnails[url] = href imgindex += 1 else: #id, href = oeb.manifest.generate(id='feed', href='feed%d.html'%itemcnt) #item = oeb.manifest.add(id, href, 'application/xhtml+xml', data=content) #oeb.spine.add(item, True) sections.setdefault(sec_or_media, []) sections[sec_or_media].append( (title, brief, thumbnail, content)) itemcnt += 1 except Exception as e: excFileName, excFuncName, excLineNo = get_exc_location() main.log.warn( "Failed to push <%s> : %s, in file '%s', %s (line %d)" % (book.title, str(e), excFileName, excFuncName, excLineNo)) return "Failed to push book <%s>!" % title volumeTitle = '' if itemcnt > 0: insertHtmlToc = False insertThumbnail = False volumeTitle = book.LastDeliveredVolume() oeb.metadata.clear('title') oeb.metadata.add('title', feed.title + volumeTitle) InsertToc(oeb, sections, toc_thumbnails, insertHtmlToc, insertThumbnail) oIO = byteStringIO() o = EPUBOutput() if user.book_type == "epub" else MOBIOutput() o.convert(oeb, oIO, opts, main.log) try: ultima_log = DeliverLog.all().order('-time').get() except: ultima_log = sorted(DeliverLog.all(), key=attrgetter('time'), reverse=True) ultima_log = ultima_log[0] if ultima_log else None if ultima_log: diff = datetime.datetime.utcnow() - ultima_log.datetime if diff.days * 86400 + diff.seconds < 10: time.sleep(8) self.SendToKindle(username, user.kindle_email, feed.title + volumeTitle, user.book_type, str(oIO.getvalue()), user.timezone) rs = "%s(%s).%s Sent!" % (feed.title, local_time(tz=user.timezone), user.book_type) main.log.info(rs) return rs else: self.deliverlog(username, str(user.kindle_email), feed.title + volumeTitle, 0, status='nonews', tz=user.timezone) rs = "No new feeds." main.log.info(rs) return rs
def GET(self): username = web.input().get("u") bookid = web.input().get("id") user = KeUser.all().filter("name = ", username).get() if not user: return "User not exist!<br />" to = user.kindle_email if (';' in to) or (',' in to): to = to.replace(',', ';').replace(' ', '').split(';') booktype = user.book_type #mobi,epub bookmode = user.book_mode or 'periodical' #periodical,comic titlefmt = user.titlefmt tz = user.timezone bookid = bookid.split(',') if ',' in bookid else [bookid] bks = [] for id_ in bookid: try: bks.append(Book.get_by_id(int(id_))) except: continue #return "id of book is invalid or book not exist!<br />" book4meta = None if len(bks) == 0: return "No have book to push!" elif len(bks) == 1: if bks[0].builtin: book4meta = BookClass(bks[0].title) mhfile = book4meta.mastheadfile coverfile = book4meta.coverfile if issubclass(book4meta, BaseComicBook ): #如果单独推送一个继承自BaseComicBook的书籍,则自动设置为漫画模式 bookmode = 'comic' else: #单独的推送自定义RSS book4meta = bks[0] mhfile = DEFAULT_MASTHEAD coverfile = DEFAULT_COVER else: #多本书合并推送时使用“自定义RSS”的元属性 book4meta = user.ownfeeds mhfile = DEFAULT_MASTHEAD coverfile = DEFAULT_COVER_BV if user.merge_books else DEFAULT_COVER if not book4meta: return "No have book to push.<br />" opts = None oeb = None # 创建 OEB #global log opts = getOpts(user.device, bookmode) oeb = CreateOeb(main.log, None, opts) bookTitle = "%s %s" % (book4meta.title, local_time( titlefmt, tz)) if titlefmt else book4meta.title if bookmode == 'comic': pubtype = 'book:book:KindleEar' else: pubtype = 'periodical:magazine:KindleEar' setMetaData(oeb, bookTitle, book4meta.language, local_time("%Y-%m-%d", tz), pubtype=pubtype) oeb.container = ServerContainer(main.log) #guide if mhfile: id_, href = oeb.manifest.generate('masthead', mhfile) # size:600*60 oeb.manifest.add(id_, href, MimeFromFilename(mhfile)) oeb.guide.add('masthead', 'Masthead Image', href) if coverfile: imgData = None imgMime = '' #使用保存在数据库的用户上传的封面 if coverfile == DEFAULT_COVER and user.cover: imgData = user.cover imgMime = 'image/jpeg' #保存在数据库中的只可能是jpeg格式 elif callable(coverfile): #如果封面需要回调的话 try: imgData = book4meta().coverfile() if imgData: imgType = imghdr.what(None, imgData) if imgType: #如果是合法图片 imgMime = r"image/" + imgType else: main.log.warn( 'content of cover is invalid : [%s].' % bookTitle) imgData = None except Exception as e: main.log.warn( 'Failed to fetch cover for book [%s]. [Error: %s]' % (bookTitle, str(e))) coverfile = DEFAULT_COVER imgData = None imgMime = '' if imgData and imgMime: id_, href = oeb.manifest.generate('cover', 'cover.jpg') item = oeb.manifest.add(id_, href, imgMime, data=imgData) else: id_, href = oeb.manifest.generate('cover', coverfile) item = oeb.manifest.add(id_, href, MimeFromFilename(coverfile)) oeb.guide.add('cover', 'Cover', href) oeb.metadata.add('cover', id_) elif len(bks) > 1 and DEFAULT_COVER: #将所有书籍的封面拼贴成一个 #如果DEFAULT_COVER=None说明用户不需要封面 id_, href = oeb.manifest.generate('cover', 'cover.jpg') item = oeb.manifest.add(id_, href, 'image/jpeg', data=self.MergeCovers(bks, opts, user)) oeb.guide.add('cover', 'Cover', href) oeb.metadata.add('cover', id_) itemcnt, imgindex = 0, 0 sections = OrderedDict() toc_thumbnails = {} #map img-url -> manifest-href for bk in bks: if bk.builtin: cbook = BookClass(bk.title) if not cbook: main.log.warn('not exist book <%s>' % bk.title) continue book = cbook(imgindex=imgindex, opts=opts, user=user) book.url_filters = [flt.url for flt in user.urlfilter] if bk.needs_subscription: #需要登录 subs_info = user.subscription_info(bk.title) if subs_info: book.account = subs_info.account book.password = subs_info.password else: # 自定义RSS if bk.feedscount == 0: continue #return "the book has no feed!<br />" book = BaseFeedBook(imgindex=imgindex, opts=opts, user=user) book.title = bk.title book.description = bk.description book.language = bk.language book.keep_image = bk.keep_image book.oldest_article = bk.oldest_article book.fulltext_by_readability = True feeds = bk.feeds book.feeds = [] for feed in feeds: if feed.url.startswith( ("http://www.cartoonmad.com", "http://ac.qq.com", "http://m.ac.qq.com")): self.ProcessComicRSS(username, user, feed) else: book.feeds.append( (feed.title, feed.url, feed.isfulltext)) book.url_filters = [flt.url for flt in user.urlfilter] # 对于html文件,变量名字自文档,thumbnail为文章第一个img的url # 对于图片文件,section为图片mime,url为原始链接,title为文件名,content为二进制内容, # img的thumbail仅当其为article的第一个img为True try: #书的质量可能不一,一本书的异常不能影响其他书籍的推送 for sec_or_media, url, title, content, brief, thumbnail in book.Items( ): if not sec_or_media or not title or not content: continue if sec_or_media.startswith(r'image/'): id_, href = oeb.manifest.generate(id='img', href=title) item = oeb.manifest.add(id_, href, sec_or_media, data=content) if thumbnail: toc_thumbnails[url] = href imgindex += 1 else: #id, href = oeb.manifest.generate(id='feed', href='feed%d.html'%itemcnt) #item = oeb.manifest.add(id, href, 'application/xhtml+xml', data=content) #oeb.spine.add(item, True) sections.setdefault(sec_or_media, []) sections[sec_or_media].append( (title, brief, thumbnail, content)) itemcnt += 1 except Exception as e: excFileName, excFuncName, excLineNo = get_exc_location() main.log.warn( "Failed to push <%s> : %s, in file '%s', %s (line %d)" % (book.title, str(e), excFileName, excFuncName, excLineNo)) continue volumeTitle = '' if itemcnt > 0: #漫画模式不需要TOC和缩略图 if bookmode == 'comic': insertHtmlToc = False insertThumbnail = False if len(bks) == 1 and book: #因为漫画模式没有目录,所以在标题中添加卷号 volumeTitle = book.LastDeliveredVolume() oeb.metadata.clear('title') oeb.metadata.add('title', bookTitle + volumeTitle) else: insertHtmlToc = GENERATE_HTML_TOC insertThumbnail = GENERATE_TOC_THUMBNAIL InsertToc(oeb, sections, toc_thumbnails, insertHtmlToc, insertThumbnail) oIO = byteStringIO() o = EPUBOutput() if booktype == "epub" else MOBIOutput() o.convert(oeb, oIO, opts, main.log) try: ultima_log = DeliverLog.all().order('-time').get() except: ultima_log = sorted(DeliverLog.all(), key=attrgetter('time'), reverse=True) ultima_log = ultima_log[0] if ultima_log else None if ultima_log: diff = datetime.datetime.utcnow() - ultima_log.datetime if diff.days * 86400 + diff.seconds < 10: time.sleep(8) self.SendToKindle(username, to, book4meta.title + volumeTitle, booktype, str(oIO.getvalue()), tz) rs = "%s(%s).%s Sent!" % (book4meta.title, local_time(tz=tz), booktype) main.log.info(rs) return rs else: self.deliverlog(username, str(to), book4meta.title + volumeTitle, 0, status='nonews', tz=tz) rs = "No new feeds." main.log.info(rs) return rs
def GET(self): username = web.input().get("u") bookid = web.input().get("id") user = KeUser.all().filter("name = ", username).get() if not user: return "User not exist!<br />" to = user.kindle_email booktype = user.book_type titlefmt = user.titlefmt tz = user.timezone bookid = bookid.split(',') if ',' in bookid else [bookid] bks = [] for id in bookid: try: bks.append(Book.get_by_id(int(id))) except: continue #return "id of book is invalid or book not exist!<br />" if len(bks) == 0: return "No have book to push!" elif len(bks) == 1: book4meta = BookClass(bks[0].title) if bks[0].builtin else bks[0] else: #多本书合并推送时使用“自定义RSS”的元属性 book4meta = user.ownfeeds if not book4meta: return "No have book to push.<br />" opts = oeb = None # 创建 OEB #global log opts = getOpts(user.device) oeb = CreateOeb(main.log, None, opts) title = "%s %s" % (book4meta.title, local_time(titlefmt, tz)) if titlefmt else book4meta.title setMetaData(oeb, title, book4meta.language, local_time("%Y-%m-%d",tz), 'KindleEar') oeb.container = ServerContainer(main.log) #guide if len(bks)==1 and bks[0].builtin: mhfile = book4meta.mastheadfile coverfile = book4meta.coverfile else: mhfile = DEFAULT_MASTHEAD coverfile = DEFAULT_COVER_BV if user.merge_books else DEFAULT_COVER if mhfile: id_, href = oeb.manifest.generate('masthead', mhfile) # size:600*60 oeb.manifest.add(id_, href, MimeFromFilename(mhfile)) oeb.guide.add('masthead', 'Masthead Image', href) if coverfile: id_, href = oeb.manifest.generate('cover', coverfile) item = oeb.manifest.add(id_, href, MimeFromFilename(coverfile)) oeb.guide.add('cover', 'Cover', href) oeb.metadata.add('cover', id_) elif len(bks)>1 and DEFAULT_COVER: #将所有书籍的封面拼贴成一个 #如果DEFAULT_COVER=None说明用户不需要封面 id_, href = oeb.manifest.generate('cover', 'cover.jpg') item = oeb.manifest.add(id_, href, 'image/jpeg', data=self.MergeCovers(bks,opts)) oeb.guide.add('cover', 'Cover', href) oeb.metadata.add('cover', id_) itemcnt,imgindex = 0,0 sections = OrderedDict() toc_thumbnails = {} #map img-url -> manifest-href for bk in bks: if bk.builtin: book = BookClass(bk.title) if not book: main.log.warn('not exist book <%s>' % bk.title) continue book = book(imgindex=imgindex) book.url_filters = [flt.url for flt in user.urlfilter] if bk.needs_subscription: #需要登录 subs_info = user.subscription_info(bk.title) if subs_info: book.account = subs_info.account book.password = subs_info.password else: # 自定义RSS if bk.feedscount == 0: continue #return "the book has no feed!<br />" book = BaseFeedBook(imgindex=imgindex) book.title = bk.title book.description = bk.description book.language = bk.language book.keep_image = bk.keep_image book.oldest_article = bk.oldest_article book.fulltext_by_readability = True feeds = bk.feeds book.feeds = [(feed.title, feed.url, feed.isfulltext) for feed in feeds] book.url_filters = [flt.url for flt in user.urlfilter] # 对于html文件,变量名字自文档,thumbnail为文章第一个img的url # 对于图片文件,section为图片mime,url为原始链接,title为文件名,content为二进制内容, # img的thumbail仅当其为article的第一个img为True for sec_or_media, url, title, content, brief, thumbnail in book.Items(opts,user): if not sec_or_media or not title or not content: continue if sec_or_media.startswith(r'image/'): id_, href = oeb.manifest.generate(id='img', href=title) item = oeb.manifest.add(id_, href, sec_or_media, data=content) if thumbnail: toc_thumbnails[url] = href imgindex += 1 else: #id, href = oeb.manifest.generate(id='feed', href='feed%d.html'%itemcnt) #item = oeb.manifest.add(id, href, 'application/xhtml+xml', data=content) #oeb.spine.add(item, True) sections.setdefault(sec_or_media, []) sections[sec_or_media].append((title, brief, thumbnail, content)) itemcnt += 1 if itemcnt > 0: InsertToc(oeb, sections, toc_thumbnails) oIO = byteStringIO() o = EPUBOutput() if booktype == "epub" else MOBIOutput() o.convert(oeb, oIO, opts, main.log) ultima_log = DeliverLog.all().order('-time').get() if ultima_log: diff = datetime.datetime.utcnow() - ultima_log.datetime if diff.days * 86400 + diff.seconds < 5: time.sleep(8) self.SendToKindle(username, to, book4meta.title, booktype, str(oIO.getvalue()), tz) rs = "%s(%s).%s Sent!"%(book4meta.title, local_time(tz=tz), booktype) main.log.info(rs) return rs else: self.deliverlog(username, to, book4meta.title, 0, status='nonews',tz=tz) rs = "No new feeds." main.log.info(rs) return rs
def push_comic_book(self, username, user, book, opts=None): if not opts: opts = getOpts(user.device, "comic") oeb = CreateOeb(main.log, None, opts) pubtype = 'book:book:KindleEar' language = 'zh-cn' setMetaData( oeb, book.title, language, local_time("%Y-%m-%d", user.timezone), pubtype=pubtype, ) oeb.container = ServerContainer(main.log) #guide id_, href = oeb.manifest.generate('masthead', DEFAULT_MASTHEAD) # size:600*60 oeb.manifest.add(id_, href, MimeFromFilename(DEFAULT_MASTHEAD)) oeb.guide.add('masthead', 'Masthead Image', href) id_, href = oeb.manifest.generate('cover', DEFAULT_COVER) item = oeb.manifest.add(id_, href, MimeFromFilename(DEFAULT_COVER)) oeb.guide.add('cover', 'Cover', href) oeb.metadata.add('cover', id_) itemcnt, imgindex = 0, 0 sections = OrderedDict() toc_thumbnails = {} #map img-url -> manifest-href chapters = book.ParseFeedUrls() if not chapters: self.deliverlog( username, str(user.kindle_email), book.title, 0, status="nonews", tz=user.timezone, ) return for ( bookname, chapter_title, img_list, chapter_url, next_chapter_index, ) in chapters: try: image_count = 0 for ( mime_or_section, url, filename, content, brief, thumbnail, ) in book.gen_image_items(img_list, chapter_url): if not mime_or_section or not filename or not content: continue if mime_or_section.startswith(r"image/"): id_, href = oeb.manifest.generate(id="img", href=filename) item = oeb.manifest.add(id_, href, mime_or_section, data=content) if thumbnail: toc_thumbnails[url] = href else: sections.setdefault(mime_or_section, []) sections[mime_or_section].append( (filename, brief, thumbnail, content)) image_count += 1 title = book.title + " " + chapter_title if not image_count: self.deliverlog( username, str(user.kindle_email), title, 0, status="can't download image", tz=user.timezone, ) rs = "No new feeds." main.log.info(rs) continue insertHtmlToc = False insertThumbnail = False oeb.metadata.clear("title") oeb.metadata.add("title", title) InsertToc(oeb, sections, toc_thumbnails, insertHtmlToc, insertThumbnail) oIO = byteStringIO() o = EPUBOutput() if user.book_type == "epub" else MOBIOutput() o.convert(oeb, oIO, opts, main.log) try: ultima_log = DeliverLog.all().order("-time").get() except: ultima_log = sorted(DeliverLog.all(), key=attrgetter("time"), reverse=True) ultima_log = ultima_log[0] if ultima_log else None if ultima_log: diff = datetime.datetime.utcnow() - ultima_log.datetime if diff.days * 86400 + diff.seconds < 10: time.sleep(8) self.SendToKindle( username, user.kindle_email, title, user.book_type, str(oIO.getvalue()), user.timezone, ) book.UpdateLastDelivered(bookname, chapter_title, next_chapter_index) rs = "%s(%s).%s Sent!" % ( title, local_time(tz=user.timezone), user.book_type, ) main.log.info(rs) except: main.log.exception(u"Failed to push {} {}".format( bookname, chapter_title))
def GET(self): username = web.input().get("u") urls = web.input().get("urls") subject = web.input().get("subject") to = web.input().get("to") language = web.input().get("lng") keepimage = bool(web.input().get("keepimage") == '1') booktype = web.input().get("type", "mobi") tz = int(web.input().get("tz", TIMEZONE)) if not all((username, urls, subject, to, language, booktype, tz)): return "Some parameter missing!<br />" if (';' in to) or (',' in to): to = to.replace(',', ';').replace(' ', '').split(';') to = list(filter(lambda x: x.find('@', 1, len(x) - 1) > 0, to)) #最简单的判断是否是EMAIL if type(urls) is unicode: urls = urls.encode('utf-8') urls = zlib.decompress(base64.urlsafe_b64decode(urls)) if booktype == 'Download': #直接下载电子书并推送 from lib.filedownload import Download for url in urls.split('|'): dlinfo, filename, content = Download(url) #如果标题已经给定了文件名,则使用标题文件名 if '.' in subject and (1 < len(subject.split('.')[-1]) < 5): filename = subject if content: self.SendToKindle(username, to, filename, '', content, tz) else: if not dlinfo: dlinfo = 'download failed' self.deliverlog(username, str(to), filename, 0, status=dlinfo, tz=tz) main.log.info("%s Sent!" % filename) return "%s Sent!" % filename elif booktype == 'Debug': #调试目的,将链接直接下载,发送到管理员邮箱 from books.base import debug_fetch #如果标题已经给定了文件名,则使用标题文件名,否则为默认文件名(page.html) filename = None if '.' in subject and (1 < len(subject.split('.')[-1]) < 5): filename = subject for url in urls.split('|'): debug_fetch(url, filename) main.log.info('[DEBUG] debug file sent!') return 'Debug file sent!' user = KeUser.all().filter("name = ", username).get() if not user or not user.kindle_email: return "User not exist!<br />" opts = getOpts(user.device) book = BaseUrlBook(opts=opts, user=user) book.title = book.description = subject book.language = language book.keep_image = keepimage book.network_timeout = 60 book.feeds = [(subject, url) for url in urls.split('|')] book.url_filters = [flt.url for flt in user.urlfilter] # 创建 OEB oeb = CreateOeb(main.log, None, opts) oeb.container = ServerContainer(main.log) if len(book.feeds) > 1: setMetaData(oeb, subject, language, local_time(tz=tz)) id_, href = oeb.manifest.generate('masthead', DEFAULT_MASTHEAD) oeb.manifest.add(id_, href, MimeFromFilename(DEFAULT_MASTHEAD)) oeb.guide.add('masthead', 'Masthead Image', href) else: setMetaData(oeb, subject, language, local_time(tz=tz), pubtype='book:book:KindleEar') # id, href = oeb.manifest.generate('cover', DEFAULT_COVER) # item = oeb.manifest.add(id, href, MimeFromFilename(DEFAULT_COVER)) # oeb.guide.add('cover', 'Cover', href) # oeb.metadata.add('cover', id) # 对于html文件,变量名字自文档 # 对于图片文件,section为图片mime,url为原始链接,title为文件名,content为二进制内容 itemcnt, hasimage = 0, False sections = {subject: []} toc_thumbnails = {} #map img-url -> manifest-href for sec_or_media, url, title, content, brief, thumbnail in book.Items( ): if sec_or_media.startswith(r'image/'): id_, href = oeb.manifest.generate(id='img', href=title) item = oeb.manifest.add(id_, href, sec_or_media, data=content) if thumbnail: toc_thumbnails[url] = href itemcnt += 1 hasimage = True else: if len(book.feeds) > 1: sections[subject].append( (title, brief, thumbnail, content)) else: id_, href = oeb.manifest.generate(id='page', href='page.html') item = oeb.manifest.add(id_, href, 'application/xhtml+xml', data=content) oeb.spine.add(item, False) oeb.toc.add(title, href) itemcnt += 1 if itemcnt > 0: if len(book.feeds) > 1: InsertToc(oeb, sections, toc_thumbnails, GENERATE_HTML_TOC, GENERATE_TOC_THUMBNAIL) # elif not hasimage: #单文章没有图片则去掉封面 # href = oeb.guide['cover'].href # oeb.guide.remove('cover') # item = oeb.manifest.hrefs[href] # oeb.manifest.remove(item) # oeb.metadata.clear('cover') oIO = byteStringIO() o = EPUBOutput() if booktype == "epub" else MOBIOutput() o.convert(oeb, oIO, opts, main.log) self.SendToKindle(username, to, book.title, booktype, str(oIO.getvalue()), tz) rs = "%s(%s).%s Sent!" % (book.title, local_time(tz=tz), booktype) main.log.info(rs) return rs else: self.deliverlog(username, str(to), book.title, 0, status='fetch failed', tz=tz) rs = "[Url2Book]Fetch url failed." main.log.info(rs) return rs