From 956e68f551e3b756effa95f73278dc9d91ffafe4 Mon Sep 17 00:00:00 2001 From: gavin Date: Mon, 15 Jun 2020 21:28:17 +0800 Subject: [PATCH] kindle manager --- backup/bk.info.data | 1 + backup/bk.info.data.bk | 1 + changelog.md | 7 +++- downimg/71GBLkJWDTL._AC_UY218_.jpg | Bin 5892 -> 0 bytes downimg/71Zs1nSJrgL._AC_UY218_.jpg | Bin 9891 -> 0 bytes kman.py | 5 ++- kmanapp.py | 65 ++++++++++++++++++++++++++--- parseweb.py | 12 ++---- 8 files changed, 73 insertions(+), 18 deletions(-) create mode 100644 backup/bk.info.data create mode 100644 backup/bk.info.data.bk delete mode 100644 downimg/71GBLkJWDTL._AC_UY218_.jpg delete mode 100644 downimg/71Zs1nSJrgL._AC_UY218_.jpg diff --git a/backup/bk.info.data b/backup/bk.info.data new file mode 100644 index 0000000..bd80496 --- /dev/null +++ b/backup/bk.info.data @@ -0,0 +1 @@ +{"\u4ece\u96f6\u5f00\u59cb\u5b66\u5199\u4f5c": {"link": "https://book.douban.com/subject/30266255", "bookname": "\u4ece\u96f6\u5f00\u59cb\u5b66\u5199\u4f5c", "img": "https://img1.doubanio.com/view/subject/s/public/s29811329.jpg", "rate": "7.8", "author": "\u5f18\u4e39"}, "24\u5802\u8d22\u5bcc\u8bfe": {"link": "https://book.douban.com/subject/3845101", "bookname": "24\u5802\u8d22\u5bcc\u8bfe", "img": "https://img9.doubanio.com/view/subject/s/public/s29357535.jpg", "rate": "7.8", "author": "\u9648\u5fd7\u6b66"}, "\u859b\u5146\u4e30\u7ecf\u6d4e\u5b66\u8bb2\u4e49": {"link": "https://book.douban.com/subject/30280804", "bookname": "\u859b\u5146\u4e30\u7ecf\u6d4e\u5b66\u8bb2\u4e49", "img": "https://img9.doubanio.com/view/subject/s/public/s29841565.jpg", "rate": "8.4", "author": "\u859b\u5146\u4e30"}, "\u5e86\u4f59\u5e74": {"link": "https://book.douban.com/subject/25853071", "bookname": "\u5e86\u4f59\u5e74 \u7b2c\u4e00\u5b63", "img": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2575362797.jpg", "rate": "8.0", "author": "\u539f\u540d:\u5e86\u4f59\u5e74"}, "\u67aa\u70ae\u3001\u75c5\u83cc\u4e0e\u94a2\u94c1": {"link": "https://book.douban.com/subject/1813841", "bookname": "\u67aa\u70ae\u3001\u75c5\u83cc\u4e0e\u94a2\u94c1", "img": "https://img3.doubanio.com/view/subject/s/public/s1738643.jpg", "rate": "8.7", "author": "[\u7f8e]"}, "\u5982\u4f55\u5047\u88c5\u61c2\u97f3\u4e50": {"link": "https://book.douban.com/subject/34454494", "bookname": "\u5982\u4f55\u5047\u88c5\u61c2\u97f3\u4e50", "img": "https://img9.doubanio.com/view/subject/s/public/s33314966.jpg", "rate": "7.0", "author": "\u738b\u7855"}, "\u8d27\u5e01\u7684\u6559\u8bad": {"link": "https://book.douban.com/subject/10439662", "bookname": "\u8d27\u5e01\u7684\u6559\u8bad", "img": "https://img1.doubanio.com/view/subject/s/public/s7046197.jpg", "rate": "8.9", "author": "\u5468\u5176\u4ec1"}, "\u4e2d\u56fd\u53e4\u4ee3\u7b80\u53f2": {"link": "https://book.douban.com/subject/2246559", "bookname": "\u4e2d\u56fd\u53e4\u4ee3\u7b80\u53f2", "img": "https://img1.doubanio.com/view/subject/s/public/s2689149.jpg", "rate": "8.0", "author": "\u5f20\u5e06"}, "\u94b1\u4ece\u54ea\u91cc\u6765": {"link": "https://book.douban.com/subject/34925762", "bookname": "\u94b1\u4ece\u54ea\u91cc\u6765", "img": "https://img3.doubanio.com/view/subject/s/public/s33551591.jpg", "rate": "7.0", "author": "\u5510\u6daf"}, "\u5e02\u573a\u7684\u903b\u8f91": {"link": "https://book.douban.com/subject/4893663", "bookname": "\u5e02\u573a\u7684\u903b\u8f91", "img": "https://img1.doubanio.com/view/subject/s/public/s4397638.jpg", "rate": "8.2", "author": "\u5f20\u7ef4\u8fce"}, "\u7f57\u9a6c\u4eba\u7684\u6545\u4e8b": {"link": "https://book.douban.com/subject/7055441", "bookname": "\u7f57\u9a6c\u4eba\u7684\u6545\u4e8b1", "img": "https://img1.doubanio.com/view/subject/s/public/s8488837.jpg", "rate": "8.8", "author": "\u76d0\u91ce\u4e03\u751f"}, "\u4e2d\u56fd\u56fd\u5bb6\u6cbb\u7406\u7684\u5236\u5ea6\u903b\u8f91": {"link": "https://book.douban.com/subject/26901114", "bookname": "\u4e2d\u56fd\u56fd\u5bb6\u6cbb\u7406\u7684\u5236\u5ea6\u903b\u8f91", "img": "https://img3.doubanio.com/view/subject/s/public/s29399593.jpg", "rate": "9.2", "author": "\u5468\u96ea\u5149"}, "\u6295\u8d44\u4e2d\u6700\u7b80\u5355\u7684\u4e8b": {"link": "https://book.douban.com/subject/26163553", "bookname": "\u6295\u8d44\u4e2d\u6700\u7b80\u5355\u7684\u4e8b", "img": "https://img9.doubanio.com/view/subject/s/public/s27653114.jpg", "rate": "8.7", "author": "\u90b1\u56fd\u9e6d"}, "\u5c11\u5e74\u51ef\u6b4c": {"link": "https://book.douban.com/subject/1091203", "bookname": "\u5c11\u5e74\u51ef\u6b4c", "img": "https://img1.doubanio.com/view/subject/s/public/s24399718.jpg", "rate": "9.2", "author": "\u9648\u51ef\u6b4c"}, "\u4e2d\u592e\u5e1d\u56fd\u7684\u54f2\u5b66\u5bc6\u7801": {"link": "https://book.douban.com/subject/30276702", "bookname": "\u4e2d\u592e\u5e1d\u56fd\u7684\u54f2\u5b66\u5bc6\u7801", "img": "https://img9.doubanio.com/view/subject/s/public/s29879195.jpg", "rate": "8.1", "author": "\u90ed\u5efa\u9f99"}, "\u7532\u9aa8\u6587": {"link": "https://book.douban.com/subject/6539859", "bookname": "\u7532\u9aa8\u6587", "img": "https://img1.doubanio.com/view/subject/s/public/s6979148.jpg", "rate": "9.3", "author": "\u4f55\u5049"}, "\u5386\u53f2\u7684\u5de8\u955c": {"link": "https://book.douban.com/subject/26591910", "bookname": "\u5386\u53f2\u7684\u5de8\u955c", "img": "https://img3.doubanio.com/view/subject/s/public/s28283792.jpg", "rate": "9.1", "author": "\u91d1\u89c2\u6d9b"}, "\u65b0\u7f16\u8bf4\u6587\u89e3\u5b57\u5927\u5168\u96c6": {"link": "https://book.douban.com/subject/1032967", "bookname": "\u8bf4\u6587\u89e3\u5b57", "img": "https://img9.doubanio.com/view/subject/s/public/s1026024.jpg", "rate": "9.2", "author": "[\u6c49]"}, "\u5546\u541b\u4e66": {"link": "https://book.douban.com/subject/4090803", "bookname": "\u5546\u541b\u4e66", "img": "https://img1.doubanio.com/view/subject/s/public/s4052388.jpg", "rate": "8.4", "author": "\u77f3\u78ca"}, "\u6539\u53d8\u5fc3\u7406\u5b66\u768440\u9879\u7814\u7a76": {"link": "https://book.douban.com/subject/5248516", "bookname": "\u6539\u53d8\u5fc3\u7406\u5b66\u768440\u9879\u7814\u7a76", "img": "https://img3.doubanio.com/view/subject/s/public/s27276912.jpg", "rate": "9.2", "author": "\u7f57\u6770\u2022\u970d\u514b"}, "\u6768\u4f2f\u5cfb": {"link": "https://book.douban.com/subject/1000888", "bookname": "\u8ad6\u8a9e\u8b6f\u8a3b", "img": "https://img1.doubanio.com/view/subject/s/public/s1670329.jpg", "rate": "9.0", "author": "\u694a\u4f2f\u5cfb"}, "\u4e2d\u56fd\u4e3a\u4ec0\u4e48\u6709\u524d\u9014": {"link": "https://book.douban.com/subject/4873444", "bookname": "\u4e2d\u56fd\u4e3a\u4ec0\u4e48\u6709\u524d\u9014", "img": "https://img1.doubanio.com/view/subject/s/public/s4386858.jpg", "rate": "7.1", "author": "\u7fdf\u4e1c\u5347"}, "\u7ba1\u5b50": {"link": "https://book.douban.com/subject/3661571", "bookname": "\u7ba1\u5b50", "img": "https://img9.doubanio.com/view/subject/s/public/s3948396.jpg", "rate": "8.3", "author": "\u674e\u5c71"}, "\u767d\u9c7c\u89e3\u5b57": {"link": "https://book.douban.com/subject/21649772", "bookname": "\u767d\u9c7c\u89e3\u5b57", "img": "https://img9.doubanio.com/view/subject/s/public/s26303695.jpg", "rate": "9.0", "author": "\u6d41\u6c99\u6cb3"}, "\u6295\u8d44\u8981\u4e49": {"link": "https://book.douban.com/subject/27173829", "bookname": "\u6295\u8d44\u8981\u4e49", "img": "https://img9.doubanio.com/view/subject/s/public/s29581756.jpg", "rate": "8.4", "author": "\u5218\u8bda\uff08\u5fae\u5149\u7834\u6653\uff09"}, "\u82cf\u4e16\u6c11": {"link": "https://book.douban.com/subject/34952676", "bookname": "\u82cf\u4e16\u6c11\uff1a\u6211\u7684\u7ecf\u9a8c\u4e0e\u6559\u8bad", "img": "https://img1.doubanio.com/view/subject/s/public/s33587329.jpg", "rate": "8.3", "author": "[\u7f8e]"}, "\u5c0f\u7a97\u5e7d\u8bb0": {"link": "https://book.douban.com/subject/1491630", "bookname": "\u5c0f\u7a97\u5e7d\u8bb0", "img": "https://img9.doubanio.com/view/subject/s/public/s5641654.jpg", "rate": "8.5", "author": "\u9648\u7ee7\u5112"}, "\u91d1\u878d\u7684\u672c\u8d28": {"link": "https://book.douban.com/subject/25843334", "bookname": "\u91d1\u878d\u7684\u672c\u8d28", "img": "https://img9.doubanio.com/view/subject/s/public/s27246465.jpg", "rate": "8.2", "author": "\u3010\u7f8e\u3011\u4f2f\u5357\u514b"}, "\u65e5\u672c\u7684\u4e16\u754c\u89c2": {"link": "https://book.douban.com/subject/34937365", "bookname": "\u65e5\u672c\u7684\u4e16\u754c\u89c2", "img": "https://img1.doubanio.com/view/subject/s/public/s33559469.jpg", "rate": "7.9", "author": "[\u7f8e]\u9a6c\u91cc\u4e4c\u65af\u00b7\u8a79\u68ee"}} \ No newline at end of file diff --git a/backup/bk.info.data.bk b/backup/bk.info.data.bk new file mode 100644 index 0000000..4d3b0b1 --- /dev/null +++ b/backup/bk.info.data.bk @@ -0,0 +1 @@ +{"\u859b\u5146\u4e30\u7ecf\u6d4e\u5b66\u8bb2\u4e49": {"link": "https://book.douban.com/subject/30280804", "bookname": "\u859b\u5146\u4e30\u7ecf\u6d4e\u5b66\u8bb2\u4e49", "img": "https://img9.doubanio.com/view/subject/s/public/s29841565.jpg", "rate": "8.4", "author": "\u859b\u5146\u4e30"}, "\u5e86\u4f59\u5e74": {"link": "https://book.douban.com/subject/25853071", "bookname": "\u5e86\u4f59\u5e74 \u7b2c\u4e00\u5b63", "img": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2575362797.jpg", "rate": "8.0", "author": "\u539f\u540d:\u5e86\u4f59\u5e74"}, "\u67aa\u70ae\u3001\u75c5\u83cc\u4e0e\u94a2\u94c1": {"link": "https://book.douban.com/subject/1813841", "bookname": "\u67aa\u70ae\u3001\u75c5\u83cc\u4e0e\u94a2\u94c1", "img": "https://img3.doubanio.com/view/subject/s/public/s1738643.jpg", "rate": "8.7", "author": "[\u7f8e]"}, "\u5982\u4f55\u5047\u88c5\u61c2\u97f3\u4e50": {"link": "https://book.douban.com/subject/34454494", "bookname": "\u5982\u4f55\u5047\u88c5\u61c2\u97f3\u4e50", "img": "https://img9.doubanio.com/view/subject/s/public/s33314966.jpg", "rate": "7.0", "author": "\u738b\u7855"}, "\u8d27\u5e01\u7684\u6559\u8bad": {"link": "https://book.douban.com/subject/10439662", "bookname": "\u8d27\u5e01\u7684\u6559\u8bad", "img": "https://img1.doubanio.com/view/subject/s/public/s7046197.jpg", "rate": "8.9", "author": "\u5468\u5176\u4ec1"}, "\u4e2d\u56fd\u53e4\u4ee3\u7b80\u53f2": {"link": "https://book.douban.com/subject/2246559", "bookname": "\u4e2d\u56fd\u53e4\u4ee3\u7b80\u53f2", "img": "https://img1.doubanio.com/view/subject/s/public/s2689149.jpg", "rate": "8.0", "author": "\u5f20\u5e06"}, "\u94b1\u4ece\u54ea\u91cc\u6765": {"link": "https://book.douban.com/subject/34925762", "bookname": "\u94b1\u4ece\u54ea\u91cc\u6765", "img": "https://img3.doubanio.com/view/subject/s/public/s33551591.jpg", "rate": "7.0", "author": "\u5510\u6daf"}, "\u5e02\u573a\u7684\u903b\u8f91": {"link": "https://book.douban.com/subject/4893663", "bookname": "\u5e02\u573a\u7684\u903b\u8f91", "img": "https://img1.doubanio.com/view/subject/s/public/s4397638.jpg", "rate": "8.2", "author": "\u5f20\u7ef4\u8fce"}, "\u7f57\u9a6c\u4eba\u7684\u6545\u4e8b": {"link": "https://book.douban.com/subject/7055441", "bookname": "\u7f57\u9a6c\u4eba\u7684\u6545\u4e8b1", "img": "https://img1.doubanio.com/view/subject/s/public/s8488837.jpg", "rate": "8.8", "author": "\u76d0\u91ce\u4e03\u751f"}, "\u4e2d\u56fd\u56fd\u5bb6\u6cbb\u7406\u7684\u5236\u5ea6\u903b\u8f91": {"link": "https://book.douban.com/subject/26901114", "bookname": "\u4e2d\u56fd\u56fd\u5bb6\u6cbb\u7406\u7684\u5236\u5ea6\u903b\u8f91", "img": "https://img3.doubanio.com/view/subject/s/public/s29399593.jpg", "rate": "9.2", "author": "\u5468\u96ea\u5149"}, "\u6295\u8d44\u4e2d\u6700\u7b80\u5355\u7684\u4e8b": {"link": "https://book.douban.com/subject/26163553", "bookname": "\u6295\u8d44\u4e2d\u6700\u7b80\u5355\u7684\u4e8b", "img": "https://img9.doubanio.com/view/subject/s/public/s27653114.jpg", "rate": "8.7", "author": "\u90b1\u56fd\u9e6d"}, "\u5c11\u5e74\u51ef\u6b4c": {"link": "https://book.douban.com/subject/1091203", "bookname": "\u5c11\u5e74\u51ef\u6b4c", "img": "https://img1.doubanio.com/view/subject/s/public/s24399718.jpg", "rate": "9.2", "author": "\u9648\u51ef\u6b4c"}, "\u4e2d\u592e\u5e1d\u56fd\u7684\u54f2\u5b66\u5bc6\u7801": {"link": "https://book.douban.com/subject/30276702", "bookname": "\u4e2d\u592e\u5e1d\u56fd\u7684\u54f2\u5b66\u5bc6\u7801", "img": "https://img9.doubanio.com/view/subject/s/public/s29879195.jpg", "rate": "8.1", "author": "\u90ed\u5efa\u9f99"}, "\u7532\u9aa8\u6587": {"link": "https://book.douban.com/subject/6539859", "bookname": "\u7532\u9aa8\u6587", "img": "https://img1.doubanio.com/view/subject/s/public/s6979148.jpg", "rate": "9.3", "author": "\u4f55\u5049"}, "\u5386\u53f2\u7684\u5de8\u955c": {"link": "https://book.douban.com/subject/26591910", "bookname": "\u5386\u53f2\u7684\u5de8\u955c", "img": "https://img3.doubanio.com/view/subject/s/public/s28283792.jpg", "rate": "9.1", "author": "\u91d1\u89c2\u6d9b"}, "\u65b0\u7f16\u8bf4\u6587\u89e3\u5b57\u5927\u5168\u96c6": {"link": "https://book.douban.com/subject/1032967", "bookname": "\u8bf4\u6587\u89e3\u5b57", "img": "https://img9.doubanio.com/view/subject/s/public/s1026024.jpg", "rate": "9.2", "author": "[\u6c49]"}, "\u5546\u541b\u4e66": {"link": "https://book.douban.com/subject/4090803", "bookname": "\u5546\u541b\u4e66", "img": "https://img1.doubanio.com/view/subject/s/public/s4052388.jpg", "rate": "8.4", "author": "\u77f3\u78ca"}, "\u6539\u53d8\u5fc3\u7406\u5b66\u768440\u9879\u7814\u7a76": {"link": "https://book.douban.com/subject/5248516", "bookname": "\u6539\u53d8\u5fc3\u7406\u5b66\u768440\u9879\u7814\u7a76", "img": "https://img3.doubanio.com/view/subject/s/public/s27276912.jpg", "rate": "9.2", "author": "\u7f57\u6770\u2022\u970d\u514b"}, "\u6768\u4f2f\u5cfb": {"link": "https://book.douban.com/subject/1000888", "bookname": "\u8ad6\u8a9e\u8b6f\u8a3b", "img": "https://img1.doubanio.com/view/subject/s/public/s1670329.jpg", "rate": "9.0", "author": "\u694a\u4f2f\u5cfb"}, "\u4e2d\u56fd\u4e3a\u4ec0\u4e48\u6709\u524d\u9014": {"link": "https://book.douban.com/subject/4873444", "bookname": "\u4e2d\u56fd\u4e3a\u4ec0\u4e48\u6709\u524d\u9014", "img": "https://img1.doubanio.com/view/subject/s/public/s4386858.jpg", "rate": "7.1", "author": "\u7fdf\u4e1c\u5347"}, "\u7ba1\u5b50": {"link": "https://book.douban.com/subject/3661571", "bookname": "\u7ba1\u5b50", "img": "https://img9.doubanio.com/view/subject/s/public/s3948396.jpg", "rate": "8.3", "author": "\u674e\u5c71"}, "\u767d\u9c7c\u89e3\u5b57": {"link": "https://book.douban.com/subject/21649772", "bookname": "\u767d\u9c7c\u89e3\u5b57", "img": "https://img9.doubanio.com/view/subject/s/public/s26303695.jpg", "rate": "9.0", "author": "\u6d41\u6c99\u6cb3"}, "\u6295\u8d44\u8981\u4e49": {"link": "https://book.douban.com/subject/27173829", "bookname": "\u6295\u8d44\u8981\u4e49", "img": "https://img9.doubanio.com/view/subject/s/public/s29581756.jpg", "rate": "8.4", "author": "\u5218\u8bda\uff08\u5fae\u5149\u7834\u6653\uff09"}, "\u82cf\u4e16\u6c11": {"link": "https://book.douban.com/subject/34952676", "bookname": "\u82cf\u4e16\u6c11\uff1a\u6211\u7684\u7ecf\u9a8c\u4e0e\u6559\u8bad", "img": "https://img1.doubanio.com/view/subject/s/public/s33587329.jpg", "rate": "8.3", "author": "[\u7f8e]"}, "\u5c0f\u7a97\u5e7d\u8bb0": {"link": "https://book.douban.com/subject/1491630", "bookname": "\u5c0f\u7a97\u5e7d\u8bb0", "img": "https://img9.doubanio.com/view/subject/s/public/s5641654.jpg", "rate": "8.5", "author": "\u9648\u7ee7\u5112"}, "\u91d1\u878d\u7684\u672c\u8d28": {"link": "https://book.douban.com/subject/25843334", "bookname": "\u91d1\u878d\u7684\u672c\u8d28", "img": "https://img9.doubanio.com/view/subject/s/public/s27246465.jpg", "rate": "8.2", "author": "\u3010\u7f8e\u3011\u4f2f\u5357\u514b"}, "\u65e5\u672c\u7684\u4e16\u754c\u89c2": {"link": "https://book.douban.com/subject/34937365", "bookname": "\u65e5\u672c\u7684\u4e16\u754c\u89c2", "img": "https://img1.doubanio.com/view/subject/s/public/s33559469.jpg", "rate": "7.9", "author": "[\u7f8e]\u9a6c\u91cc\u4e4c\u65af\u00b7\u8a79\u68ee"}} \ No newline at end of file diff --git a/changelog.md b/changelog.md index abc149a..787175a 100644 --- a/changelog.md +++ b/changelog.md @@ -84,10 +84,12 @@ b['1']['2'] = {'3':1} # OK ## learn lesson +--- + # feature list - first abstract from kindle hard / local directory for different OS **done** - add GUI use QT **done** -- use thread to check kindle connection status **XXXX** +- use thread to check kindle connection status **done** - import function: - local **done** - kindle **done** @@ -101,7 +103,7 @@ b['1']['2'] = {'3':1} # OK - onenote - txt **done** - markdown **done** -- easily coly filter notes to clipboard +- easily copy filter notes to clipboard - implement command line based on [argparse](https://www.jianshu.com/p/a41fbd4919f8) - mobi / epub reader **XXXX** - import .azw3/.epub/.mobi file to kindle @@ -117,3 +119,4 @@ b['1']['2'] = {'3':1} # OK - sync modify to kindle device - compare parse html info with xpath & beautisoap & regex + diff --git a/downimg/71GBLkJWDTL._AC_UY218_.jpg b/downimg/71GBLkJWDTL._AC_UY218_.jpg deleted file mode 100644 index b2aa87652b2b82889aac124daa57b3aefffe3201..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5892 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 RjKXg%ZOW9yzS_So{trrI5V`;W diff --git a/kman.py b/kman.py index 6cb767c..dbeba0e 100644 --- a/kman.py +++ b/kman.py @@ -71,8 +71,9 @@ DEBUG = 1 # 0 - INFO; 1 - DEBUG LOG2FILE = 1 # 0 - to stdio; 1 - to file LOGFILE = 'log' DELIMITER= '|' -BACKUPNOTEFN = './backup/bk.note.data' -BACKUPWORDFN = './backup/bk.word.data' +BACKUPNOTEFN = './backup/bk.note.data' # kindle notes +BACKUPWORDFN = './backup/bk.word.data' # kindle words +BACKUPINFOFN = './backup/bk.info.data' # book information from douban/amazon #HEADER = {0:'type',1:'bookname',2:'author',3:'position',4:'date',5:'content'} # log info diff --git a/kmanapp.py b/kmanapp.py index 70afb9b..de8c532 100644 --- a/kmanapp.py +++ b/kmanapp.py @@ -89,6 +89,29 @@ class kmanWindow(QMainWindow): [self.filter_books, self.filter_list] = self.km.filter_clips(self.books_data) #self.filter_list = self.km.filter_words(self.words_data) + # initial books information which grab from douban or amazon + # if the information exist in backup file, initial with this file, + # and grap new book's information from douban + # else grap all book information from douban + self.books_info = defaultdict(dict) + try: + if os.path.exists(BACKUPINFOFN): + self.books_info = self.km.json2dict(BACKUPINFOFN) + increase_book_list = self.check_increase_books(self.books_data, self.books_info) + if len(increase_book_list) > 0: + trd = threading.Thread(target=self.grab_books_info, args=(increase_book_list,)) + trd.setDaemon(True) + trd.start() + else: + booklist = list(self.books_data.keys()) + trd = threading.Thread(target=self.grab_books_info, args=(book_list,)) + trd.setDaemon(True) + trd.start() + except Exception as e: + print(e) + finally: + pass + self.fill_treeview() self.refresh_ui_component(comp=1) @@ -126,6 +149,20 @@ class kmanWindow(QMainWindow): ui.tableView.verticalHeader().hide() ui.tableView.setModel(self.ui.tablemodel) + def check_increase_books(self, bks, bksinfo): + new_list = list(bks.keys()) # kindle's books with note + new_list = [re.split(r'[\((\-\::_\s]',nn.strip())[0] for nn in new_list] + last_list = list(bksinfo.keys()) # grab book information last time + increase_list = [] + for nn in new_list: + flag = 0 + for gg in last_list: + if nn in gg: flag = 1 + if flag == 0: + increase_list.append(nn) + + return increase_list + def add_ui_component(self): self.ui.searchComboBox.addItems([u'ALL',u'BOOKNAME',u'CONTENT',u'AUTHOR']) self.ui.treeView.resize(200,200) @@ -514,26 +551,32 @@ class kmanWindow(QMainWindow): r = msgBox.exec() # backup file when kman closed - # read backup file when kman start + # so we can read backup file when kman start def closeEvent(self, e): with open(BACKUPNOTEFN, 'w', encoding='utf8', errors='ignore') as fw: fw.write(self.km.dict2json(self.books_data)) with open(BACKUPWORDFN, 'w', encoding='utf8', errors='ignore') as fw: fw.write(self.km.dict2json(self.words_data)) + with open(BACKUPINFOFN, 'w', encoding='utf8', errors='ignore') as fw: + fw.write(self.km.dict2json(self.books_info)) # stop check thread self.flag = False - def grab_all_book_info(self): + def grab_books_info(self, booklist): - for bkname in self.books_data.keys(): + bks_info = {} + for bkname in booklist: bkname = re.split(r'[\((\-\::_\s]',bkname.strip())[0] print(bkname) bkinfo = self.spide.grab_book_info(bkname) filter_bkinfo = self.spide.filter_spide_book(bkinfo) + bks_info.update(filter_bkinfo) if filter_bkinfo: self.spide.down_book_img(filter_bkinfo) + return self.books_info.update(bks_info) + # thanks Martin Fitzpatrick ^_^ # https://www.learnpyqt.com/courses/model-views/qtableview-modelviews-numpy-pandas/ class nTableModel(QAbstractTableModel): @@ -576,9 +619,19 @@ if __name__ == "__main__": #kmw.showFullScreen() kmw.show() - trd = threading.Thread(target=kmw.grab_all_book_info) - trd.setDaemon(True) - trd.start() + """ + # move to __init__() + try: + booklist = self.books_data.keys() + trd = threading.Thread(target=kmw.grab_books_info, args=(booklist,)) + trd.setDaemon(True) + trd.start() + except Exception as e: + print(e) + pass + finally: + pass + """ # loop check kindle is connected or not # BUG to be implement XXXX diff --git a/parseweb.py b/parseweb.py index 3e91cdc..6c0eb6a 100644 --- a/parseweb.py +++ b/parseweb.py @@ -182,20 +182,17 @@ class bookInfoSpide(): mparams['k'] = mbkn try: - s = requests.Session() - s.header = mheaders - s.params = mparams - r = s.get(murl) + session = requests.Session() + session.header = mheaders + session.params = mparams + r = session.get( url=murl, headers=mheaders, params=mparams) #r = requests.get( url=murl, headers=mheaders, params=mparams) - except requests.exceptions.ConnectionError: print('ConnectionError -- please wait 3 seconds') time.sleep(3) - except requests.exceptions.ChunkedEncodingError: print('ChunkedEncodingError -- please wait 3 seconds') time.sleep(3) - except: print('Unfortunitely -- An Unknow Error Happened, Please wait 3 seconds') time.sleep(3) @@ -361,7 +358,6 @@ class bookInfoSpide(): except Exception as e: print(e) - if __name__ == '__main__': spide = bookInfoSpide()