# -*- coding: utf-8 -*- import shutil import json import os from loguru import logger import tempfile from os.path import basename, splitext, exists, join from mobi.kindleunpack import unpackBook from mobi.makencx import extractNcx def extract(infile): """Extract mobi file and return path to epub file""" tempdir = tempfile.mkdtemp(prefix="mobiex") if hasattr(infile, "fileno"): tempname = next(tempfile._get_candidate_names()) + ".mobi" pos = infile.tell() infile.seek(0) with open(join(tempdir, tempname), "wb") as outfile: shutil.copyfileobj(infile, outfile) infile.seek(pos) infile = join(tempdir, tempname) logger.debug("file: %s" % infile) fname_in = basename(infile) base, ext = splitext(fname_in) fname_out_epub = base + ".epub" fname_out_html = "book.html" fname_out_pdf = base + ".001.pdf" unpackBook(infile, tempdir, epubver="A") epub_filepath = join(tempdir, "mobi8", fname_out_epub) html_filepath = join(tempdir, "mobi7", fname_out_html) pdf_filepath = join(tempdir, fname_out_pdf) if exists(epub_filepath): return tempdir, epub_filepath elif exists(html_filepath): return tempdir, html_filepath elif exists(pdf_filepath): return tempdir, pdf_filepath raise ValueError("Coud not extract from %s" % infile) def extracttest(infile): """Extract mobi file and return path to epub file""" tempdir = './t/' if hasattr(infile, "fileno"): tempname = next(tempfile._get_candidate_names()) + ".mobi" pos = infile.tell() infile.seek(0) with open(join(tempdir, tempname), "wb") as outfile: shutil.copyfileobj(infile, outfile) infile.seek(pos) infile = join(tempdir, tempname) # tempname 8x2vf7yv.mobi pos 0 infile ./t/8x2vf7yv.mobi print('tempname {} pos {} infile {}'.format(tempname,pos,infile)) logger.debug("file: %s" % infile) fname_in = basename(infile) base, ext = splitext(fname_in) fname_out_epub = base + ".epub" fname_out_html = "book.html" fname_out_pdf = base + ".001.pdf" # infile ./t/8x2vf7yv.mobi unpackBook(infile, tempdir, epubver="A") epub_filepath = join(tempdir, "mobi8", fname_out_epub) html_filepath = join(tempdir, "mobi7", fname_out_html) pdf_filepath = join(tempdir, fname_out_pdf) # CGDBG #epub_filepath ./t/mobi8/p302tbwb.epub html_filepath ./t/mobi7/book.html pdf_filepath ./t/p302tbwb.001.pdf print('epub_filepath {} html_filepath {} pdf_filepath {}'.format( epub_filepath, html_filepath, pdf_filepath)) if exists(epub_filepath): return tempdir, epub_filepath elif exists(html_filepath): return tempdir, html_filepath elif exists(pdf_filepath): return tempdir, pdf_filepath raise ValueError("Coud not extract from %s" % infile) ## CG test extractNcx def extract_ncx_test(): #infile = "./tests/youxi.mobi" #infile = "./tests/xiaodao.mobi" filelst = [ 'youxi.mobi', 'xiaodao.mobi', 'laocan.azw3', # 'shikong.kfx', 'shisu.azw', 'ETF全球投资指南(一个账户,投资全球。告诉你用美股ETF投什么、怎么投,低门槛、低成本地进行全球化投资和配_JYT5RZBTKMUUJCV2XZ6RWZFNJWAS3KWP.azw3', '正義_ 一場思辨之旅_SVQL2PQHADT6UEVYYMJLNLP3TNVZZ2PO.azw3', '赘婿_IFYXK7EVMAJZU6SRDI4G3PF6KG5AA3CF.azw', '熊逸·佛学50讲_MW5FG7LWUA3G5ZSRJHOI6YNS4E6EC3AP.azw', '哲学·科学·常识_Q7IU43GSXSQ3TZULYN46U5DSTJBOSVTW.azw3', '理想国2020年豆瓣高分文学作品集【理想国2020年度最受好评新书】_H5LB5WWKBT55NDVJ44TGWNP3YWUXMGAN.azw', '大问题_ 简明哲学导论_3MGHFPCGYUPS5OX6PLI2U2ZN2D4QY6IP.azw', '利维坦_BQNVQ3PLMU5NABEUEYPESXWK4KEVXH2V.azw', #'马克斯·韦伯作品集(套装6册)【现代社会学奠基人,余英时、苏国勋推荐译本 理想国出品】_LUVR3MEUTXTZLMGRQS7RBEDQ32QB2WDZ.azw', '物种起源 (译林人文精选)_EFRUCMHSILFZ7IY75OF6KU3FXKG5DYQS.azw', '公式之美 (中国好书,人类最美的23个公式)_JWP4OH34GQTHTM4UB5KVTDDPMV5Q45XW.azw', '經濟學人104個大解惑:從紙鈔面額、廣告祕辛,到航空公司如何節省成本的全面揭密_RSN23YIUQOGLI5XMNP4UUWZFFBKW7SWT.azw', '快思慢想_6RD4VKANWTU2EIIS5ZQSW4H2WAVW6BKS.azw3', '老残游记_GYDUNWUDXOSL6GX376HXF6Y5BZB4BYWK.azw3', '美的历程_HRFLXR3SWA7YIMUHHBMOHKIFCXTKWDEN.azw', '世俗时代_JAJCAPFHKMBTWHQC3Z3M23MQHVM4LD5H.azw', '先知之後_OVMTC2SMQGT6WR5BEPB3NLIHPEXAPOZ2.azw', '股市稳赚_TKUOH7HY4AFL6MHGDXOA2JTJMDQMJ2M2.azw', '货币野史_TNDZWSPMBH3OU3GA4OONJOOS5N3RML46.azw', '黄金时代_UECZKDFEYBBCXD7VEGKUF3JAIZCNQTLD.azw', '哲学小引_ZIPCDHPBDNDXGPGFMHVMWTW2T43H4H33.azw', '危险的关系(译文名著精选)_LCIX4CJDXKBN44DFWQC6BNQP5T4QUJGQ.azw3', '生命是什么-活细胞的物理观_KHTK74YI2ZCNNLTDNO42O5TEUCFY4OAE.azw', '时间的边缘_FTWBORVACPNFZEHJGDPP3F5G3ZTP2API.azw3', '苏菲的世界_GY2VU27R6NLR5DYLSK2X3SGMDOS6OEHA.azw', '责任的重负_IOEVP74VFX7HI7CZLHNVDYUSBR5SKWHP.azw', '非常潜力股_RSO2TPJMR4Z5GRVVK27M6CZIOKXDOGFA.azw', '超级聊天学_为中国人量身定制的口才实操指南(会聊天,瞬间提升你的魅力指数,和任何人都能说上话,和任何人_UJSIR4LXOYUXNN3VKNM2VEJAZWPWXIA5.azw3', '世说新语精读 (汉语言文学原典精读系列)_EIQTMTBSOBUBAZTIO76QY3UE5DHG7QUX.azw', '打开:周濂的100堂西方哲学课(一部有营养、有态度,读得懂、读得动的西方哲学史)_NBLLIRUDZVFARGUMVTO3IYM7RZFWAHF5.azw', '中国游戏风云_45BZOYKQWCVIMPV5J5TUQB3A4WMSXG6Y.azw3', '顾准历史笔记_664YSYONYO3WYLR7KN4EHLAVN5AZYJPJ.azw', '克拉拉与太阳_AHT6ZF3TVFNTKQLLAZJHBPWVMXHXP6HC.azw', '现代汉英词典_B00771V9HS.azw', '现代汉语词典_B00AKJGTAQ.azw', '香帅财富报告_US63WJUWKWW2Y7GPKCIDMRVUEYTQVOKM.azw', '送你一颗子弹_YIFYW7SIWRQULQ5I7OHSFWW5GWJQPRXF.azw', '从沸腾到癫狂_泡沫背后的中国房地产真相_Z67UZLBWFW7E7RXRCMSBQK2X2TQJMV54.azw', '诸子百家闪耀时 (豆瓣“大神”林欣浩首部中国哲学史力作)_Z65JN5SBZKB5CXWP4QEJ5N36WBJK7LYG.azw', '增广贤文(精)--中华经典名著全本全注全译 (中华书局)_55WRYKJTRRUSR3F7PUHSCT7VCYLNXAO5.azw', '吃货的孤单心事_4TSS34PIM3LDOE7STPZLPVI5Z2NJ63ZA.azw3', '专业团队的管理_CZQZGKOZ2O4B5657CBJX62YTDTHGFTHI.azw3', '《新青年》文选_D63BJHTSQMXJOD3WZMITH5MCXPPX4TQO.azw3', '中国改革三步走_YAIFAT7KHQG3FKXYDBGDAODOQB3IXREP.azw3', '手把手教你读财报2——18节课看透银行业_N2ULAPFBPTYYROEZR6OXSFRZHWGVPP47.azw', '伯罗奔尼撒战争史_7IG7PYJEFQCQZKJFADJQPB63WOJZ457K.azw', '股市投资致富之道_DRFDHRKUZOGBOQANCZ7WCXQPO4IFXLZ3.azw', '中国人的性格历程_F7WWWMHTDUNPAJPQKPMRQQBUVFVWVO2J.azw', '股市投资致富之道_QE5QXSGVXZIU6YKQ37ILICN3Y4KMOHFB.azw', '手把手教你读财报_财报是用来排除企业的_BIO354K2A7W6AKDRG672GCTOW256C7W3.azw', '不可思议的自然对数 (探秘数学常数)_RXHNPMVRRSAJGPFS4EZMEW6YRIOAUJHL.azw', '关键选择【帮助起底27个赚钱的逻辑,经济下行趋势下的个人财富增长方案】_XX73ZPD6RPCZSB3XBKBTZZSC5RKQDXJO.azw', '中国法律与中国社会_SH3O32FVYFABLOLPVCAQEG2YFWSLTZKY.azw', '印度,漂浮的次大陆_YGTGYKH3CAVXF5QZIORNOU4HY3JWUFT2.azw', '关于那个人的备忘录_ZCIQC6KSVBPKAIOJJSASQ4T7CUSC23IO.azw', '尼采哲学经典(套装共5册) (李敖力荐台湾经典译本)_OQ6CLDRDV34ZPOF2ZLK6CJTMMDJMLVEW.azw', '刘擎西方现代思想讲义_2X4PDLIAHHBVF2JV4WS6SSWMEU6WCC2W.azw3', '故事是这个世界的解药_YIRJ7ONGJKHJF4VHEGAHXCRAZRUQWDC5.azw', '哲学家们都干了些什么_(2015年全新修订版)_7YZCO42RPEELUVMTCWMXV7VAFJHNUBH3.azw', '韩炳哲作品系列(套装共9册)_XQLLBYAIEHIDC6DDKPUSDUCXA5JJDV7E.azw3', '異常流行幻象與群眾瘋狂_54WCNGW254RB2VX2QAQOQJCTOIS5UDVZ.azw', '通胀来了,你准备好了吗_6EY3XVPBUCU3S2Z6GASBJ3ZFIYG7XAPV.azw3', '第二十二条军规:纪念版_XHGD4NJJO7IJJLI6NZQVR7GWGIPZASKU.azw', '反智:不願說理的人是偏執 不會說理的人是愚蠢 不敢說理的人是奴隸_FQGEEYA535SOIWBGTZMINNYUUUVOHGCO.azw', '中国货币史(校订版)豆瓣9.5分,好评如潮!_5QDPZ4BJCNFCQEW6OOTFT5WGGFEKJVCM.azw', '海洋与权力:一部新文明史_DZARAFK3BF3JM2Y6G275TNEHS3YFIY63.azw', '蘇東坡新傳(上下合併冊)_MQJ52QLZFG7GJIQXLGO6EOOEWDUPOTGC.azw', '刷新:重新发现商业与未来_SJJ2ZXTZYRIYOTA6PRLQNRBILPM6TN3O.azw', '禅宗是什么:胡适谈禅说佛_UV6UYZCLIBT7T5XOIZ3XEHLGYP524UUU.azw', '可塑的我:自我发展心理学的35堂必修课(自我发展心理学的35堂必修课)_LE5ZTKZITLXRBQVHN2GPNXODGRRZHE7C.azw3', '诺贝尔奖经济学合集(套装共5册)(经济学领域的集大成作品)_TD4FJVAQB35P77SCIG3VGERLQZJKG27G.azw', '费雪论成长股获利:投资大师80年投资致富的选股方法 (深受普通投资者欢迎与推荐的投资经典,巴菲特之师、“近_MXG3UMBD2MUQN3EEY7VC545U567VQC76.azw', '阿含经校注(全九册)【豆瓣9.6高分推荐!线装书局出品!一套书读通佛教“根本佛法”!阿含经专家、苏州西园_4Q3JWY3QBCLYZDBOUFU76KUYXNTXESBB.azw', '伤花怒放:摇滚的被缚与抗争_SGVGLBLRNURM5MCXKFKBRLUZS4HLAQOY.azw', '区块链:通往资产数字化之路_SHFSC7TLUVLQBYANOLNKJJTWNMHNNVZ5.azw', '历史的轨迹——二千年教会史_ZIMUOQ5JGFYGF4SRKFPGX5MEWMC6DPX2.azw', '深蓝帝国:英国海军的兴衰(全2册)【《星期日泰晤士报》年度最佳畅销书】 (甲骨文系列)_JRZSCWPDFXTNZRTBCR7HQ6BMXKLJ7QYG.azw3', '如何提升专注力:手把手教你用7项改变打造10倍速效率人生_S3NJU6MR5WP3ECFWFQ4NYWHYEB6P5RSZ.azw', '性欲和性行为:一种批判理论的99条断想(全2册)【舞蹈家金星、社会学家李银河推荐!继弗洛伊德、福柯之后的_UGCIUTVYKZYV6PDVDQPBM2JCDV7SX6VP.azw', '后疫情时代的全球经济与世界秩序(傅莹、蔡昉、江小娟、李扬、余永定、郑永年、迟福林、赵汀阳等20位学者合力_75MHOUFWOONZQOP5CY7E7HMI4P5SZPLT.azw3', '何为良好生活:行之于途而应于心_A2ETZLWN3OSZAVWDJOJBB3LTDSFLMHBC.azw', '万万没想到:用理工科思维理解世界_57F2POLFMUHUIDHE7KH6Z2Q732VQ5UX3.azw3', '徐远的投资课:投资原则与实战方法_7ESQ4POTRSIH4JOOHBL7PSWQ6JT4PLEZ.azw', '爆款短视频:如何频繁产出刷屏视频_EWJQBSGVTM2OXQKC5M77MKLFNWGL25CT.azw3', '思维的艺术:如何像哲学家一样思考_PSNIXLNDMEXX7T7K5J5NWRDIOFXY3XPX.azw', '牛津通识读本:佛学概论(中文版)_TUEO6SWCHMURQIGO3JKQRMZT5DWSYNYP.azw', '利益、制度与信息:国内政治与国际关系 (东方编译所译丛)_ESVTYWPTPGMVNMJJW7T5YP2LOQKFSHHY.azw', '哲学的故事【让深奥的哲学立刻生动起来!上市首年连续再版22次,迅速译成18种语言,掀起全球哲学热潮】_QCOIVA3QQN2BMYFTZQIXLGD45E2CSUNC.azw', '千年贸易战争史——贸易冲突与大国兴衰_ESA55ZHIJ6KVQY3OTCM3N5SB6BHDYKPC.azw3', '投资至简:从原点出发构建价值投资体系_GSKBIPYDNJJOAZUMNH4T3PZ2EHYYJPE4.azw3', '新金融秩序:如何应对不确定的金融风险(2013年诺贝尔经济学奖得主罗伯特•希勒著作)_YO7GZEODTNSUX4JJR5SRL7MOWP4PZFJ4.azw', '超越“街角发言者”:表达权的边缘与中心_P7SJECOJBQOYBJ5D4ZCSTPIFD2ZCMM6C.azw', '米开朗琪罗与教皇的天花板(甲骨文系列)_RIR7YAXJJSRRSGEPUU47ULOHDCAKQW7M.azw', '诗人十四个:十四位古代诗人和一位现代闯入者 一场始于1600年前的诗歌沙龙_UDDD6AF6HYA4V3SRY6KBN6M677757CCI.azw', '叔本华心灵咒语:请优雅地拥抱这个苦难的世界(获得独立的人格,做内心强大的自己!孤独而伟大的哲学家,道破_AZLKLSE2R3KAK5S6WXRYHPTPZLCX4RSO.azw', '世界观:现代人必须要懂的科学哲学和科学史(原书第3版)_WI6LHG2VGA6QITWLONOU4KOGNXKGB5EB.azw', '野兽绅士(单身男士必备撩妹宝典。坏男孩创始人、教父Tango终极力作!汇集超人气恋爱社区「坏男孩」中超经典_UZKJVFNZXM2C5GHYLRDJABRLKTHZYBFH.azw', '怪医笔记【薄世宁、李治中(菠萝)、姬十三、刘润、于莺 真诚力荐!期待值100%的医学题材小说,胸外科医生亲_FXMMP37MN4PRL2TAELQYDDMACRTECSZQ.azw', '不拘一格:网飞的自由与责任工作法(网飞官方图书,创始人兼CEO哈斯廷斯重磅作品。一家市值超2000亿美元,全球_3XOUEBICN4XWPCC5FESAMRAQSALMLABE.azw', '雅典帝国的覆亡(耶鲁大学教授为你讲述伯罗奔尼撒战争的后十年!)_HU7HIAFMRETK2JTCDVWRDNY35GSHSQGI.azw', '无规则游戏:阿富汗屡被中断的历史(本书获“美国北加州图书奖”提名)_SXDQBXUOP5W36IAZFWHXOALY7VS7WCKG.azw', '无限记忆力(如何在两周内记住更多知识,改善注意力,并培养出过目不忘的记忆力。 +附:21种实用的记忆力提升_5HCR7CSSQ32XICMV3ZQ5UY4N7AMFDT3S.azw', '我是谁,或什么:一部心与自我的辩证奇想集(关于“我”的终极哲学问题,嬉皮年代的思想群峰 本书可能烧掉你_C4HD4VEU4LC54IY4A7I43CK3PONLMNSJ.azw3', '高效论证:美国大学最实用的逻辑训练课(全美大学批判性思维经典教材,美国哲学学会重磅推荐)_FDA4AB6DURIL5RT7OZEXM76I2PUW7YCP.azw', '一把刀,千个字(茅盾文学奖获奖作家王安忆全新长篇;登顶《收获》长篇小说榜;人民文学出版社倾力打造)_ALQY4IH3LLNYF4KDK7LVXJGOWTYBH4PP.azw', '透明社会(以哲学小品文的简练和犀利,照察当今社会情状和人类心灵,洞穿数字媒体时代的群体狂欢和孤独个体_2YTTCLR4QTNFVCWKXZ7GIHEDSNQL6THE.azw', '不变与万变:葛剑雄说国史(中国当代历史学家、复旦大学教授葛剑雄重磅新作!全面勾勒中国历史发展的源与流_IOMBENXF5TGWX7F3BJLL322UTV5FDQTZ.azw', '下沉年代(白宫之乱的根本原因是什么?拜登上任后美国何去何从?通俗版《美国陷阱》,面对面访谈民主党前幕_KGL4UJC74AOO3HEMV6LRCMRZ5A6YPQGT.azw', '一生的读书计划(这一版有实质性的修订和扩充,最突出的变化是推荐的阅读材料的来源范围已经扩展到整个世界_SFGZNMVNLL3RE36GAERWSTDVEWRBZ4MG.azw', '三岛由纪夫典藏作品九部(两次入围诺贝尔奖的文学大师三岛由纪夫代表作;日本文学翻译家陈德文先生译本;人_TBNZC7F5EQ5YEKOODF6VMW2I2LBZRD4W.azw', ] for fn in filelst: mhdict = extractNcx(os.path.join('./tests',fn)) print('process file {} \n {}'.format(fn, json.dumps(mhdict, indent=4, sort_keys=True, ensure_ascii=False))) if __name__ == "__main__": #print(extracttest("../tests/demo.mobi")) #extract_ncx_test("../tests/demo.mobi") pass