From 8e90fc851c2902467f04ab7a1d3239afe6083e0f Mon Sep 17 00:00:00 2001 From: Mike Date: Tue, 1 Oct 2019 17:30:36 -0400 Subject: [PATCH] Began extracting data from epub files --- README.md | 2 +- __pycache__/config.cpython-37.pyc | Bin 574 -> 623 bytes __pycache__/library.cpython-37.pyc | Bin 2642 -> 0 bytes __pycache__/main.cpython-37.pyc | Bin 629 -> 0 bytes __pycache__/pyShelf.cpython-37.pyc | Bin 1441 -> 0 bytes config.py | 4 +- data/catalogue.db | Bin 0 -> 8192 bytes data/shelf.json | 145 +----------------- lib/__init__.py | 0 lib/library.py | 96 ++++++++++++ lib/pyShelf.py | 33 ++++ lib/storage.py | 48 ++++++ main.py | 8 +- tests/__pycache__/test_library.cpython-37.pyc | Bin 786 -> 847 bytes tests/__pycache__/test_sysio.cpython-37.pyc | Bin 932 -> 987 bytes tests/test_library.py | 6 +- tests/test_storage.py | 16 ++ tests/test_sysio.py | 2 + 18 files changed, 210 insertions(+), 150 deletions(-) mode change 100755 => 100644 __pycache__/config.cpython-37.pyc delete mode 100644 __pycache__/library.cpython-37.pyc delete mode 100755 __pycache__/main.cpython-37.pyc delete mode 100755 __pycache__/pyShelf.cpython-37.pyc create mode 100644 data/catalogue.db create mode 100644 lib/__init__.py create mode 100755 lib/library.py create mode 100755 lib/pyShelf.py create mode 100644 lib/storage.py mode change 100755 => 100644 tests/__pycache__/test_sysio.cpython-37.pyc create mode 100644 tests/test_storage.py diff --git a/README.md b/README.md index 6544847..3590dc4 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # pyShelf A simple terminal based ebook server -Frusterated with Calibre being my only option for hosting my eBook collection, I have decided to spin up my own. +Frustrated with Calibre being my only option for hosting my eBook collection, I have decided to spin up my own. Calibre is a great organizational tool for your books, however not having a terminal based option for running and maintaining a server is cumbersome when running on older equipment. Thus I am creating pyShelf and I hope to be able to provide all diff --git a/__pycache__/config.cpython-37.pyc b/__pycache__/config.cpython-37.pyc old mode 100755 new mode 100644 index e08c325592beefb4d4a96f0dc70761f709ba1d26..c3590a7cb39a573c85d5f478bca6f2b6b7e9428a GIT binary patch delta 196 zcmdnT@}7m)iI8KRpJ7}K02!Pe+yDRo diff --git a/__pycache__/library.cpython-37.pyc b/__pycache__/library.cpython-37.pyc deleted file mode 100644 index a2d2151e63efae2532dbbcfc82f778073acba5d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2642 zcmZ`*OK;mo5Z+xbA9`4EZ0FH5ZG=98ut4nORv1ALG-(p_Af$BxyKDl2=B{ii5=k$q z))uH<9Q0WK1?kuy(Nq7$UVG}T=bSpTvSlT8DR7^&!`W}XnbB8EOLYRzAIWd8{;3i2 z7f#L|3kHwiEuKIlh@gEE%z7G7GiL!ay%ku{vpyf#flZ0Dk4eCv5n&1bh6sMl0!Pp- z;@f|NCerb#b{=PGH`$AEe)i12_Z(Iv!Eb{HHbkEn2^Wt76CMSq#_|HX~}w)pvUaw;g}xXDEY*$=#;{qQ;~@~MJaEa zq&GP!Yp?6-8%pp8d-W;wKaiB|kZnNnTk;**fgY@69Zi+r(6w&Tmtj9CO3kxerrL=O zP`Zw0hQ+?@cQx-7S*m$Ii-fMlXP48BB979qoArfM!BRX_N~UFq3JYEP`Y@I`UQah+ zrIac}g@w;FFHk4#{!Y|oxa8YA8~fQnZm3B1vvlKy%6c*`i;etf3qQWmPj*$Lj@I)d z?S)~ICS@2dAwn%^2z6+SGTMZ;MMo=h4EcxTiArj@{$^(^mx z|J1j&J4$k7k9LD3e+mPI{!-{{ZRaXU%Tq8kM=k|+DD&ZNP&Zv@*h}SmSm>I$C(7Rf zJq5x?XdP(7NS$!HOgu7LeGe6sRv49YV9=0xX#NTla6Q4`D(MUkppONYXFa>*f*~1> z8T>Fv-Gq#hR@Q5#s?sZKy*j3-lY3)+coQUDpx?^a291r%hOo9O`vE!VY?HD%S%Mj# zGK%5LX5pJc(Dz(`7vT5p(VzA9>9ZJSckcP^yARvv_cFnEvFLpxib1(b! zX$!2*_;dr}%Yziugebet zMpw^~Uv$fyPiV}XPYNc2VgkZ+B-oUV>5MZcFUA~-fF-O4q~a4cC1bm^CR}hxPR`+a zWdnC^k6l=^E2naM4xIHWPi^9v51=?yUe7ZrX>)s_1XK{7zWr_pDh_678_bo(sPPh` zvWl~xr1ER(BiK?O(CIuya}%Z$fFPHfInv+(?#?b zDez9AMTVF(_Xq|@b%-g5=F=idA*J1(7g0d{tcaEt${kbFL!!G*#^5o)l6D|9`Jl;U zD}@BnRv}A;+0A;UE)3sPmz2hT*|5>YwhoVJNaV4Am-{j*+8l#wS=_ObDt^a0lO1-E-BpeT@!)o3Mw$%F{ColiY3|zU8Gri T4`$XsL@@&ix*LB@>RA5*uUU9U diff --git a/__pycache__/main.cpython-37.pyc b/__pycache__/main.cpython-37.pyc deleted file mode 100755 index 07efeb462d531f41c3e3e3b6d3f6d051e383b819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 629 zcmYjOJ#X7E5G5s9{(#*82~f0KmJV91rDIV94bY%Ni~`;S6bDA6Wjd1RlJsC9n~Sdf z9sNsOJM}Mg>YWq=IpCg-@5sA%r%#K;jG--l{rm=;u|IS;Ta3XCx_gfxndCKVc)>Zl zV=|KQ4<_SNR75H|u_9Komb8Ez#Xjc+O#E#?~T4B{1)B4Mv(l8 zK`&S)Rg5v7N!qGQAB=f)d3Pm+7kPK$rnEMjo&^ggLv PK2i%u)I5HbrZ~`l=FFH+ diff --git a/__pycache__/pyShelf.cpython-37.pyc b/__pycache__/pyShelf.cpython-37.pyc deleted file mode 100755 index c06098d77651b629567c3ae1e133ffd7a585a04a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1441 zcmb7EO>fjN5cN18n=b8w5R?{yv?>=Oq?Q{OgrF@&TvkXNkXEX!5NEq7*(BIr0nzr< zir>-R;4k^giNC;!8Ha7Rs6xV$#~$06H}83z?Uj`-!}jFc*ZmETu^;5j8~W@ycD;>8 zG6@A6wj&GyeO~a1H}rsI-Z4w~D<(bZpD^hk^P!JkAVc&*^a2TQS={-Fao8XR8}3x) zC_hNapEr(^=h$^0O~wde$R!Lt$)$I~hQ9P=fFnkwSa#`knVY@5$aJ%@mn&`hYFhS3 zxX@2kmYBRM`&FGOH`6JFr$(fF>^s=?V>AYd9Rsk>8#CBt`*)AHfkS@k&G;GU-i)34 zGz0dr_YTP;G#@k%wzGr0%*%rXs8Nfpjhd!rssb$RZ*Tb!GHOaPAk`-0C^+r{PS!(oF{pIZ# zznzbpHGL{DGb6+j5sc6#NDI%n<(P)5q>FT7bH+>3HqgrvEHr04Vp%1Lx}XnQT6 z)Ri)VQn-H(0nH5uv9NiG*#Dxm42vB92MZWIhvCT678T!Z+*Ye(?vPm{br3m-dj&=D+>7&%wO3cnmDB7%iKfZmfo z&gb*;Y+fzqR+x6q=SFC%K9$z$he#>a39}Vu6Vgj`O};<+Rr7#V7zhYJ z00Izz00bZa0SG_<0uX?}`wCo!x*J82z7E7B87Iyi%6e)2E#uibruFQ19#dWV+S!aZ zg~^$O&oZX1JF%xEbIG_z_Yf;tb8r4-?|jp2gj44&m-oWaq#?J3JRTptOFfr$byWS$ e!>1ns0SG_<0uX=z1Rwwb2tWV=5P-lN3)}!l6F9{H literal 0 HcmV?d00001 diff --git a/data/shelf.json b/data/shelf.json index f8a2eac..5efa207 100644 --- a/data/shelf.json +++ b/data/shelf.json @@ -1,144 +1 @@ -{ - "/home/raelon/Projects/pyShelf/books/Python Tricks by Dan Bader.epub": { - "files": [ - "content.opf", - "media/cover-6x9.png", - "cover.xhtml" - ] - }, - "/home/raelon/Projects/pyShelf/books/Automate the Boring Stuff with Python - Practical Programming for Total Beginners - 1st Edition (2015) (Pdf, Epub & Mobi) Gooner/Automate the Boring Stuff with Python (2015).epub": { - "files": [ - "OEBPS/content.opf", - "OEBPS/Images/cover00710.jpeg", - "OEBPS/Text/cover_page.xhtml" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Dune Chronicles (Dune 7)/Dune Chronicles 1 - Hunters of Dune.epub": { - "files": [ - "OPS/xhtml/cover.html", - "OPS/9780765312921.opf" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Dune Chronicles (Dune 7)/Dune Chronicles 2 - The Sandworms of Dune.epub": { - "files": [ - "OPS/package.opf", - "OPS/xhtml/cover.html" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 1 - Sisterhood of Dune.epub": { - "files": [ - "OEBPS/content.opf", - "OEBPS/Text/cover.xml" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 2 - Mentats of Dune.epub": { - "files": [ - "OEBPS/content.opf", - "OEBPS/Images/cover.jpeg" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 2.5 - Red Plague.epub": { - "files": [ - "OEBPS/content.opf", - "OEBPS/Text/cover.xhtml" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 3 - Navigators of Dune.epub": { - "files": [ - "OEBPS/content.opf", - "OEBPS/Text/cover.xhtml" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Heroes of Dune/Heroes of Dune 1 - Paul of Dune.epub": { - "files": [ - "OPS/package.opf", - "OPS/xhtml/cover.xml" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Heroes of Dune/Heroes of Dune 2 - The Winds of Dune.epub": { - "files": [ - "OPS/package.opf", - "OPS/xhtml/cover.xml" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/1 - Dune - Frank Herbert (1965).epub": { - "files": [ - "OEBPS/package.opf", - "OEBPS/cover.xml" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/2 - Dune Messiah - Frank Herbert (1969).epub": { - "files": [ - "OEBPS/9780575104426_oeb_opf_r1.opf", - "OEBPS/9780575104426_oeb_cover_r1.html" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/3 - Children of Dune - Frank Herbert (1976).epub": { - "files": [ - "OEBPS/9780575104402_oeb_cover_r1.html", - "OEBPS/9780575104402_oeb_opf_r1.opf" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/4 - God Emperor Of Dune - Frank Herbert (1981).epub": { - "files": [ - "OEBPS/9780575104440_oeb_opf_r1.opf", - "OEBPS/9780575104440_oeb_cover_r1.html" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/5 - Heretics of Dune - Frank Herbert (1984).epub": { - "files": [ - "OEBPS/9780575104457_oeb_cover_r1.html", - "OEBPS/9780575104457_oeb_opf_r1.opf" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/6 - Chapter House Dune - Frank Herbert (1985).epub": { - "files": [ - "OEBPS/9780575104396_oeb_opf_r1.opf", - "OEBPS/9780575104396_oeb_cover_r1.html" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Prelude to Dune/Prelude to Dune 1 - House Atreides.epub": { - "files": [ - "OEBPS/content.opf" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Prelude to Dune/Prelude to Dune 2 - House Harkonnen.epub": { - "files": [ - "Herb_9780553897838_epub_opf_r1.opf" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Prelude to Dune/Prelude to Dune 3 - House Corrino.epub": { - "files": [ - "OPS/content.opf" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/CliffsNotes on Herbert's Dune & Other Works - L. David Allen.epub": { - "files": [ - "OPS/images/cover.jpg", - "OPS/content.opf" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/Dreamer of Dune- The Biography of Frank Herbert by Brian Herbert.epub": { - "files": [ - "OEBPS/content.opf", - "OEBPS/Images/cover.jpg" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/Eye (Short stories) - Frank Herbert.epub": { - "files": [ - "OEBPS/content.opf", - "OEBPS/Text/cover.xhtml" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/Tales of Dune (Short stories) - Brian Herbert and Kevin J. Anderson.epub": { - "files": [ - "OEBPS/content.opf" - ] - }, - "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/The Road to Dune (Companion book) - Frank Herbert et al.epub": { - "files": [ - "OEBPS/e9781429924917_cover.jpg", - "OEBPS/e9781429924917_content.opf" - ] - } -} \ No newline at end of file +{"/home/raelon/Projects/pyShelf/books/Python Tricks by Dan Bader.epub": {"files": ["content.opf", "media/cover-6x9.png", "cover.xhtml"], "path": "/home/raelon/Projects/pyShelf/books/Python Tricks by Dan Bader.epub"}, "/home/raelon/Projects/pyShelf/books/Automate the Boring Stuff with Python - Practical Programming for Total Beginners - 1st Edition (2015) (Pdf, Epub & Mobi) Gooner/Automate the Boring Stuff with Python (2015).epub": {"files": ["OEBPS/content.opf", "OEBPS/Images/cover00710.jpeg", "OEBPS/Text/cover_page.xhtml"], "path": "/home/raelon/Projects/pyShelf/books/Automate the Boring Stuff with Python - Practical Programming for Total Beginners - 1st Edition (2015) (Pdf, Epub & Mobi) Gooner/Automate the Boring Stuff with Python (2015).epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Dune Chronicles (Dune 7)/Dune Chronicles 1 - Hunters of Dune.epub": {"files": ["OPS/xhtml/cover.html", "OPS/9780765312921.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Dune Chronicles (Dune 7)/Dune Chronicles 1 - Hunters of Dune.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Dune Chronicles (Dune 7)/Dune Chronicles 2 - The Sandworms of Dune.epub": {"files": ["OPS/package.opf", "OPS/xhtml/cover.html"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Dune Chronicles (Dune 7)/Dune Chronicles 2 - The Sandworms of Dune.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 1 - Sisterhood of Dune.epub": {"files": ["OEBPS/content.opf", "OEBPS/Text/cover.xml"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 1 - Sisterhood of Dune.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 2 - Mentats of Dune.epub": {"files": ["OEBPS/content.opf", "OEBPS/Images/cover.jpeg"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 2 - Mentats of Dune.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 2.5 - Red Plague.epub": {"files": ["OEBPS/content.opf", "OEBPS/Text/cover.xhtml"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 2.5 - Red Plague.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 3 - Navigators of Dune.epub": {"files": ["OEBPS/content.opf", "OEBPS/Text/cover.xhtml"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Great Schools of Dune/Great Schools of Dune 3 - Navigators of Dune.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Heroes of Dune/Heroes of Dune 1 - Paul of Dune.epub": {"files": ["OPS/package.opf", "OPS/xhtml/cover.xml"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Heroes of Dune/Heroes of Dune 1 - Paul of Dune.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Heroes of Dune/Heroes of Dune 2 - The Winds of Dune.epub": {"files": ["OPS/package.opf", "OPS/xhtml/cover.xml"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Heroes of Dune/Heroes of Dune 2 - The Winds of Dune.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/1 - Dune - Frank Herbert (1965).epub": {"files": ["OEBPS/package.opf", "OEBPS/cover.xml"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/1 - Dune - Frank Herbert (1965).epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/2 - Dune Messiah - Frank Herbert (1969).epub": {"files": ["OEBPS/9780575104426_oeb_opf_r1.opf", "OEBPS/9780575104426_oeb_cover_r1.html"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/2 - Dune Messiah - Frank Herbert (1969).epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/3 - Children of Dune - Frank Herbert (1976).epub": {"files": ["OEBPS/9780575104402_oeb_cover_r1.html", "OEBPS/9780575104402_oeb_opf_r1.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/3 - Children of Dune - Frank Herbert (1976).epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/4 - God Emperor Of Dune - Frank Herbert (1981).epub": {"files": ["OEBPS/9780575104440_oeb_opf_r1.opf", "OEBPS/9780575104440_oeb_cover_r1.html"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/4 - God Emperor Of Dune - Frank Herbert (1981).epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/5 - Heretics of Dune - Frank Herbert (1984).epub": {"files": ["OEBPS/9780575104457_oeb_cover_r1.html", "OEBPS/9780575104457_oeb_opf_r1.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/5 - Heretics of Dune - Frank Herbert (1984).epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/6 - Chapter House Dune - Frank Herbert (1985).epub": {"files": ["OEBPS/9780575104396_oeb_opf_r1.opf", "OEBPS/9780575104396_oeb_cover_r1.html"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Original Dune series/6 - Chapter House Dune - Frank Herbert (1985).epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Prelude to Dune/Prelude to Dune 1 - House Atreides.epub": {"files": ["OEBPS/content.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Prelude to Dune/Prelude to Dune 1 - House Atreides.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Prelude to Dune/Prelude to Dune 2 - House Harkonnen.epub": {"files": ["Herb_9780553897838_epub_opf_r1.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Prelude to Dune/Prelude to Dune 2 - House Harkonnen.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Prelude to Dune/Prelude to Dune 3 - House Corrino.epub": {"files": ["OPS/content.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Prelude to Dune/Prelude to Dune 3 - House Corrino.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/CliffsNotes on Herbert's Dune & Other Works - L. David Allen.epub": {"files": ["OPS/images/cover.jpg", "OPS/content.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/CliffsNotes on Herbert's Dune & Other Works - L. David Allen.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/Dreamer of Dune- The Biography of Frank Herbert by Brian Herbert.epub": {"files": ["OEBPS/content.opf", "OEBPS/Images/cover.jpg"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/Dreamer of Dune- The Biography of Frank Herbert by Brian Herbert.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/Eye (Short stories) - Frank Herbert.epub": {"files": ["OEBPS/content.opf", "OEBPS/Text/cover.xhtml"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/Eye (Short stories) - Frank Herbert.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/Tales of Dune (Short stories) - Brian Herbert and Kevin J. Anderson.epub": {"files": ["OEBPS/content.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/Tales of Dune (Short stories) - Brian Herbert and Kevin J. Anderson.epub"}, "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/The Road to Dune (Companion book) - Frank Herbert et al.epub": {"files": ["OEBPS/e9781429924917_cover.jpg", "OEBPS/e9781429924917_content.opf"], "path": "/home/raelon/Projects/pyShelf/books/All Dune books + short stories + extras ePUB/Short story collections and extras/The Road to Dune (Companion book) - Frank Herbert et al.epub"}} \ No newline at end of file diff --git a/lib/__init__.py b/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/library.py b/lib/library.py new file mode 100755 index 0000000..fda0bac --- /dev/null +++ b/lib/library.py @@ -0,0 +1,96 @@ +#!/usr/bin/python +import json +import os +import re +import zipfile +from bs4 import BeautifulSoup +from config import Config +config = Config() + + +class Catalogue: + """Decodes and stores book information""" + """Step One: filter_books""" + def __init__(self): + self.file_list = [] + with open(config.book_shelf, 'r') as f: + try: + self.catalogue = json.load(f) + self.current_files = self.scan_folder() + except Exception: + self.filter_books() + + def scan_folder(self, folder=config.book_path): + for f in os.listdir(folder): + _path = os.path.abspath(folder+'/'+f) + #_path = os.path.abspath('.')+'/'+folder+f+'/' + _is_dir = os.path.isdir(_path.strip()+'/') + if _is_dir: + self.file_list.append(self.scan_folder(_path)) + self.file_list.append(_path) + + def scan_book(self, book): + """REMOVE ME?""" + _epub = zipfile.ZipFile(book) + with _epub as _epub_open: + try: _epub_open.open('content.opf'); return True + except Exception as e: print(e); return False + + def filter_books(self): + """ + Scan book folder recursively for epub files + filter_books(0) -> Catalogue.books + filter_books(1) -> self.books[] + :param ret: 0 -> create class property -> dump json + :param ret: 1 -> create & return class property + """ + self.scan_folder() + regx = re.compile(r"\.epub") + self.books = list(filter(regx.search, filter(None, self.file_list))) + _book_list_expanded = {} + with open(config.book_shelf, 'w') as f: + for book in self.books: + _book_list_expanded[book] = self.process_book(book) + json.dump(_book_list_expanded, f) + return _book_list_expanded + + def process_book(self, book): + """Return dictionary of epub file contents""" + f_name = 'content.opf' + book = zipfile.ZipFile(book, 'r') + details = {} + with book as book_zip: + details['files'] = [] + details['path'] = book.filename + expanded = book_zip.infolist() + regx = re.compile(r'\.opf|cover') + for i in expanded: + match = re.search(regx, i.filename) + if match: + # Returns zip file location of requested files + details['files'].append(match.string) + return details + + def extract_metadata(self, book): + """ + Return extracted metadata and cover picture + book['path'] == Full path to ebook file + book['files'] == list of files from self.process_book(book) + """ + book_zip = zipfile.ZipFile(book['path'], 'r') + opf_regx, cover_regx = re.compile(r'\.opf'), re.compile(r'\.jpg|\.png|\.bmp|\.gif') + with book_zip as f: + content = list(filter(opf_regx.search, book['files'])) + content = book_zip.open(content[0]) + soup = BeautifulSoup(content, "xml") + title = soup.find("dc:title") + author = soup.find("dc:creator") + cover = soup.find("meta", attrs={"name" : "cover"}) + return title + def compare_shelf_current(self): + try: + self.books + except Exception: + self.filter_books() + unique = set(self.books) - set(self.catalogue) + return unique \ No newline at end of file diff --git a/lib/pyShelf.py b/lib/pyShelf.py new file mode 100755 index 0000000..aefeb2a --- /dev/null +++ b/lib/pyShelf.py @@ -0,0 +1,33 @@ +#!/usr/bin/python +import os +import zipfile +from config import Config +config = Config() + +class InitFiles: + """First run file creation operations""" + def __init__(self, file_array): + print("Begining creation of file structure") + for _pointer in file_array: + if not os.path.isfile(_pointer): + self.CreateFile(_pointer) + + def CreateFile(self, _pointer): + """Create the file""" + if not os.path.isdir(os.path.split(_pointer)[0]): + os.mkdir(os.path.split(_pointer)[0]) + f = open(_pointer, "w+") + f.close() + + +class Epub: + """All Epub file handling""" + def __init__(self): + global config + self.book_path = config.book_path + + def import_book(self): + pass + + def book_list(self): + pass diff --git a/lib/storage.py b/lib/storage.py new file mode 100644 index 0000000..fdf29a7 --- /dev/null +++ b/lib/storage.py @@ -0,0 +1,48 @@ +#!/usr/bin/python +import sys +import sqlite3 +sys.path.insert(1,'../') +from config import Config +db_pointer = Config().catalogue_db + + +class Storage: + """Contains all methods for system storage""" + + def __init__(self): + self.db_file = db_pointer + self.database() + + def database(self): + """Create database cursor""" + try: + self.db = sqlite3.connect(self.db_file) + self.cursor = self.db.cursor() + return True + except Exception as e: + return False + + def create_tables(self): + """Create table structure""" + q_check = "SELECT * FROM books" + q_create = '''CREATE TABLE books(title text, author text, + categories text, cover blob, pages int, progress int, + file_name text)''' + try: + self.cursor.execute(q_check) + except Exception as e: + self.cursor.execute(q_create) + + def insert_book(self, book): + """ + Insert book in database + :returns: True if succeeds False if not + """ + q = '''INSERT INTO books (title, author, categories, cover, + pages, progress, file_name) values (%s, %s, %s, %s, 0, %s)''' % () + try: + self.cursor.execute(q) + return True + except Exception as e: + print(e) + return False \ No newline at end of file diff --git a/main.py b/main.py index a437626..a2cd878 100755 --- a/main.py +++ b/main.py @@ -1,5 +1,7 @@ #!/usr/bin/python # import zipfile as Zip +import sys +sys.path.insert(1, 'lib/') from pyShelf import InitFiles from config import Config from library import Catalogue @@ -11,5 +13,7 @@ InitFiles(config.file_array) Catalogue = Catalogue() # Filter Your books # This only needs to be run on first run, & when new books are added -book_list = Catalogue.filter_books(0) - +book_list = Catalogue.filter_books() +for book in book_list: + extracted = Catalogue.extract_metadata(book_list[book]) + print(extracted) \ No newline at end of file diff --git a/tests/__pycache__/test_library.cpython-37.pyc b/tests/__pycache__/test_library.cpython-37.pyc index f11933cd17d9e368df3e6d883806e25a220bc880..3a54b6d3827bb3e7a4e2d902e65c4e26e91ca42c 100644 GIT binary patch literal 847 zcmZ`%J8#=C5I*W<+Hu;VXtyp!CoR#?wJ3smC<+8ZfMgO-5VFbCa`bRXdQi|Unfn{; zF@K3`rl9|zQ}3h-bpZE(J05wj?<4u?_;>;+;@8iw1p|1X%^(3fr>N!}jReU`$oiFK zOtF=>^`$5MoyX`jD1$1@LI$5fhBCSX87Wvrw|+KKT#l|ieWqYL-T`K_3yAq6c7^m2 zr@~E87V{)#Zam9vUN+x0YC+LKJakS`%^NfdGA1GOB$M79WWMxefNLN_>>9bFvtq7u z-CinV7u1}DRv&eSYF?oE0b8)_7IuulVZ?4{h zDfUaJm^ffg4rBgrZ5oG;3sL8l62eV{s2aH`$)5`GeUq1cMAN-!`j~qFJE(+G6Ls1d za=6F+?t~gwc~J`yPaNOWg(Wi1H?48OI=4#~6*awXHv0Q6-Mu(|iD|POBh*eGp>Y8< aIyBqy4?X0M^rH;j1!tT+V^jYn=j;z-R?yY} delta 439 zcmY+9u}T9$5Qb-WFL#T{K@b%zY)q3w5GxB2Q3J7yg%)xkN5XF8%q0iAm%<=e#5P5| z!Zs;=8vARk^A^q=QFIq(*_rwOZ|2i|bNx%--vB&=>FoY|?(eow@S{Mn1VVaw!iGHL z46Z;4<-CG&G(3u_2pwHfl>s-$8W!#n7;0`Ha98Bkna|qNyVW*}M-TI_i#o?-zzWCe zr2hfN&5zjimWN486=0LSb#wmC8g~^;wWzp*;TaZ?u_-LLVoSUT0tE5SieWVn#=*ys zO<3#4Nv2KIOVfc3m?0nI{su3v^5!G+GQXx-= TsTwExjFz-Cm1H%sDJA;`-XB>cj{GV&EZ`!qQHWP*ku{Q?Z?n|H-07m#nLqm>r*%e7-sIWqFEegy(Ew0R-oB9Pm~gclGM7a8PKGd7Lr-! zC3zvFis)$C>5KG65-YN9nsv?4`Ek$m?Hajhi;ngE6M30umHQwY@^LB-?QaxK0}NI- L1Rs3T3>f?X_g`7Q delta 360 zcmY+8Jx;_h5QRO?pOZ}%u@x09$_bVNQLrGI6$OhZBB3b4g9zkjt?xfF<