From 223a64738d7eb1c5bb64603b1142cdcc0e1a8c96 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 23 May 2018 14:18:38 +0200 Subject: [PATCH] cleanup --- .gitignore | 5 +++ app/__init__.pyc | Bin 1053 -> 0 bytes app/__pycache__/__init__.cpython-36.pyc | Bin 867 -> 0 bytes app/__pycache__/forms.cpython-36.pyc | Bin 1480 -> 0 bytes app/__pycache__/models.cpython-36.pyc | Bin 1899 -> 0 bytes app/__pycache__/views.cpython-36.pyc | Bin 6207 -> 0 bytes app/cover.py | 56 ++++++++++++++++++++++++ app/forms.pyc | Bin 641 -> 0 bytes app/models.pyc | Bin 1032 -> 0 bytes app/templates/edit_book_detail.html | 37 ++++++++++++++++ app/templates/red_link.html | 30 +++++++++++++ app/views.pyc | Bin 4789 -> 0 bytes 12 files changed, 128 insertions(+) create mode 100644 .gitignore delete mode 100644 app/__init__.pyc delete mode 100644 app/__pycache__/__init__.cpython-36.pyc delete mode 100644 app/__pycache__/forms.cpython-36.pyc delete mode 100644 app/__pycache__/models.cpython-36.pyc delete mode 100644 app/__pycache__/views.cpython-36.pyc create mode 100644 app/cover.py delete mode 100644 app/forms.pyc delete mode 100644 app/models.pyc create mode 100644 app/templates/edit_book_detail.html create mode 100644 app/templates/red_link.html delete mode 100644 app/views.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5cec076 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +__pycache__/ +*.pyc +*~ +app/uploads/ +app/mydatabase.db diff --git a/app/__init__.pyc b/app/__init__.pyc deleted file mode 100644 index b3828d219c265b2cef49ab22c697c692b18f169d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1053 zcmZ8eU2oGc6unN{wd=>$eZxR#LPF}xmUmQ5lr<9*WrcJD79K3OcDrzA0kS8eXfsB?mf5gqfsri;mZhCPZ{GY{PYU~!0{y@0Th9V0I}Eu>47RhRLF4w zWD!&eq7tYzh}J-rAu5BaKvc;YMUd+dtvj_6$SSBBL^U8{9j0}dHej{c0I>-V#J*AU zcXA6v6ZjfDco1!a*a2P!UIC7BRp2$?b(r8OUfBgfKhFHOSX!SR=1{)SGvxC9gzE=4k0?k_KGlQ?V?@rPkdTv8JH3-=aT8W z999tyKJ+?rbSu=dRkV~fo3og??Kl>aYqN>jk4(m#nK+pRS(ap`g1IykR3?mH=7N@{ z#b}P%aV*7*DPio?=BXuVQ^38sH!h}poX6S3#c4V*wt{IY^28(_>!uZ)ry@H-*-V(D zJFzsb?BFa6uISs~#x#&~{l3@lbm@7&*9}5#3Hqyyjdr1b<^VIc z@!r{+;N1=FcCI?FJA;5;hZld1`WB0YZaqP&^KEQ>3lV{_RXIrUFD!R2bOzV(M6pcY zDkf#J2tCB1?K-rrh1P##bBQ(^7#1SC`!42_levkd4z2gjgOr(DXB->qKYJc$&QR++ zb^cQ7NVY3H%-u`kS!l=LJk`ROZ3LZOum36N(%|z|a5=c>Uk=>#D7Av9Vk=~6>Lxx) zX5)C`szj%3L*pz_G#O6C$b?&nTloF6=u?FLwHBH7nH2X~5_9Qylf}#p-FHqM=kqvL zOdFB;_%ol!$8sv!7y(aku Du+`y( diff --git a/app/__pycache__/__init__.cpython-36.pyc b/app/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index 5bdcb03a085bd5114551fbb8e48cfedbd67a2038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 867 zcmY*X&u`N(6poWLNzZ?iHitJ)Itc?DL0LCbM9t`%6PjSbiU*es$g+9b}# zgssQORnazW6OWXMPb#EJYI8@`?@&OWsIx=rv=i@=#-Tx51#2D}Wb3iNwJ|$Jk>6Go z7VW5>r#gHcEAHtX;`xTm;1Ho7~%luM%v^3pNG@%2>7+qjap}S1=om|)cl3<$LQUR^( zK7&?DW(pQ_XvOIq+Hp!1okz2EQ!Y~~_LZ8T+5Qb(L4O<`orf3bH2jj+E3ENPESU`Kly9=!|Se?f!(MgMJo9HPtf6YcjlqIa_U z9F}IckV6)&z3F3zh2=zJ)Sm9X6YmOO9?u4x}qNKsmpr1=_CKA@~sJL0v<-E7d zA|{2WFYFX&*SU))@_~>@=)L3~Dt3erboHz%o!fB|Eks#$!R`MHqNCAOc%EC5X0X*C z4o9ED0SZ4~glFTE(b-sQX-$N33#V!BOq0bdnnP3hugpZkQ8J0?G!wp({%(jJbrkTs z7hFmzWPlmH7fD1|aGx$G1-xX@Bv5JrLeV115bC9?+&kn6Su*+>C<*yOK^0WNF7QCr TY@2mZ2W`_cebd)DvkLwI?u_ul diff --git a/app/__pycache__/forms.cpython-36.pyc b/app/__pycache__/forms.cpython-36.pyc deleted file mode 100644 index 44774c30b1be5391a4ad7713b2e6ed75f342bafb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1480 zcmb_cOK;Oa5Z<*N$MK^{+O(915Z4Hi9N>gdRVWl8P!2>~mV@Q6o7U<&PS-Y+N}S5I z|A8xiX|HhUU*N>dx@jA!94g_+lX>jCzM1voDDvO_wmyEd3He2?JPz>N@D@LSaKfo1 z8D*3rZ%He&nVmVzF|sWinakX)$(lxX!0s{6@D1Qw%s0F%1LGI6FpF4ZbWOREwOKps zuuj%xT}oaP?(x=l!dt>WvDqrfJ`X?+1O<5w3s~=gMi53hVV1Bt70wCS zque^RScBWplB50FA2S{YHUD6gWCCjPKPNKfNtvr+)OWQP$1^a*vG(IQ%XuY{599c- zN@Q&@L4+78JC|#^+0FHpNGQ_g;2#Xk>W_@DVM{ec{MTQkxVDUWIi8Gp_*ba z|EgBN&4;(JfOwXXms)Lrej5)w1@f;}g)5rE<2H9-qK#9FySxby;Oq$txCcPAw1;IO z47yRKr33&}8)7bHqoCNqY}jH+P6&9?5uA)bzU;B))BRyx~nddRU|eN>|NbL(nQiif`Dna#$MqbXlDv5 zd0lO41I&2dbmP$u-K0jh)ba(uPvGQD0X~N|T67%0;%RA0{x9gNO{fWBu7TZHN^=EW zbsNs8J3t`qUHBXI{Tm^w@FHD{;e9Zy!CN5Kh@nEwsK3ryQ~XH8U&^V%Qlt{Plkw0fwxUiDBtJm-({okC4XNq5sqMkZl5$(gx8Nj_1vQPmA2$7i0 k#3`H6n(D4=1QxZv(p$KI1uj_#-E?ROzaH(`9jDXy3sXclJpcdz diff --git a/app/__pycache__/models.cpython-36.pyc b/app/__pycache__/models.cpython-36.pyc deleted file mode 100644 index a37e9422ddb5aa0b9603f54be99d8084f6362813..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1899 zcmZ`)OK&4Z5bmCr$76ew7zoQt1OXD3mPCT5DYO-K(O`=*y!=(M3`;Z3| z;^ZBQr~@yyD5fs>HYL;p-=RLd8ra~=syegb7_@!@_j)svmzgD~#pjcx9AEg3>&%SO+PQm;X(`9>kvHrthJHrcL=WP}M@Y-5Hx%jthiM8~>O zIql-W%0SOK)#?vNLw?0HE45NKQ3_$17d-DP_3Jz>xU#QL@|le?S1X2{H?K3{S8l|Jb7?qGrUSxosCio~ z1G&Ba5-*No-|e^^JwM{eZRoiK`mf<9x)eY{iz080qJ)tFZ1k4c=u?cScTEr1rk&OW z27~EBaS=Og?B{g#8N`W8DJIN$xa4ucv@lo|J&@F1QCj{VJDR zE#B58dN>-GH~HLMCT}r$n+Y2??=WEywwX%4sf^B#r{C-Iv@-`_P$%X+UUrsUT3iZV z5%&i6oG-1}5l+TX?#gZ7MdVrve5^m@jZ9W4(Ee#alDwBP4KYX1(ZE`cR_f&Lk|#^v zBOf6TY{G@x_EPRXU7D9ORZWZY!%_dH*IX^uM`gCY`l!mbB;Uuvjkd87H-gNAS^pQB;74Pp3I)?|Crs@a>F>S<1z_E9k08{tNP ze}Zh|2^?d)Q_kx~;e;A%H7>I0**&Oh_DUe)<`ZyuZGE(|7L7eL;`*e_ilX|>aO4ed tc18@h3mg8x9nS&9rONr?F4{1@_TR?$+g9*^n~qC$U*7eGyTfEV{tq>Hg2ey; diff --git a/app/__pycache__/views.cpython-36.pyc b/app/__pycache__/views.cpython-36.pyc deleted file mode 100644 index 52157229259bdab35dcab48ea216dc86438d7b0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6207 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 G>;C~8z{RNm diff --git a/app/cover.py b/app/cover.py new file mode 100644 index 0000000..1b0e04f --- /dev/null +++ b/app/cover.py @@ -0,0 +1,56 @@ +import PyPDF2 +from wand.image import Image +import io +import os + + +def pdf_page_to_png(src_pdf, pagenum = 0, resolution = 72,): + """ + Returns specified PDF page as wand.image.Image png. + :param PyPDF2.PdfFileReader src_pdf: PDF from which to take pages. + :param int pagenum: Page number to take. + :param int resolution: Resolution for resulting png in DPI. + """ + dst_pdf = PyPDF2.PdfFileWriter() + dst_pdf.addPage(src_pdf.getPage(pagenum)) + + pdf_bytes = io.BytesIO() + dst_pdf.write(pdf_bytes) + pdf_bytes.seek(0) + + img = Image(file = pdf_bytes, resolution = resolution) + img.convert("png") + + return img + + +def get_cover(file_path, filename): + # Main + # ==== + print(file_path) + src_filename = file_path + + src_pdf = PyPDF2.PdfFileReader(open(src_filename, "rb")) + + # What follows is a lookup table of page numbers within sample_log.pdf and the corresponding filenames. + pages = [{"pagenum": 0, "filename": filename}] + + # Convert each page to a png image. + for page in pages: + big_filename = "app/uploads/cover/"+page["filename"] + "_cover.png" + small_filename = "app/uploads/cover/"+page["filename"] + "cover_small" + ".png" + + img = pdf_page_to_png(src_pdf, pagenum = page["pagenum"], resolution = 300) + img.save(filename = big_filename) + + # Ensmallen + img.transform("", "200") + img.save(filename = small_filename) + + return page["filename"] + "_cover.png" + +#--- +#epub +#https://ebooks.stackexchange.com/questions/6517/command-line-extraction-of-metadata-title-author-from-epub-file +#https://hackage.haskell.org/package/epub-tools +#http://stackoverflow.com/questions/9751475/extract-cover-image-from-chm-and-epub-files diff --git a/app/forms.pyc b/app/forms.pyc deleted file mode 100644 index d265833e4452ef57a272758b38205703017a2e60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 641 zcmb_YOHRWu5FIB?fuc%?6-UUX%@zrS5JHt;!6Fq4vWYD06bt85dqQDdZo%<50tYBF zNkw}A9M8n>WyX2)!k_Wz>wA+u!*+%AzNYZ^loV|N7N8W62@s3}umO}IWMPj(umdO~ z$Rff6&;kkpDuPddHNaCg1T}^^BZ0)zrh=ues{G|Ho2`=m93@nNx|k!{L&iKlTv!rE|E=>6g0MguP(C_n)Rhu-ij@5xkh`l*m7m6tpRF%U*D= zuvgdvWTYIVMS-4H+oVZKq&|LB`1g4D`_DF;!tM#_|Bb|sNEP%6&;X@?On@i?Kmqdr zW&(;3egSL%?y?Yy4x~|+GSrryNRZ_MF7VxT=yzV%i~R{cKtcON3V{n_0Q1o64xfo# z*a(sJUc?U=$i{zJ|Bd+Ijrb4b^jdhZX| zU}K~_q1u)~fQXJs@4Bh-5~XyEOG;{WsmV=vo2UAs*2}VT2jpK>4)3w0{l+ZOUq@B= zZK*S=x_?D|!dVHE_S}=V{(BM$GtG0hN2Ge + + back + + + +
+ {{ form.csrf_token }} + +

{{ form.title.label }} {{ form.title(size=20, class="form-control") }}

+ +

+
+ {{ form.author.label }} + + + + + + {% for author in form.author %} + + + + + {% endfor %} +
{{ author.author_name }}
+
+
+ +
+ + +{% endblock %} diff --git a/app/templates/red_link.html b/app/templates/red_link.html new file mode 100644 index 0000000..95b940d --- /dev/null +++ b/app/templates/red_link.html @@ -0,0 +1,30 @@ +{% extends "base.html" %} + +{% block title %}Red link page{% endblock %} + +{% block css %} + +{% endblock %} + +{% block header %}{% endblock %} + +{% block main %} +

ID: {{ id }}

+

red link page

+

go back home?

+{% endblock %} diff --git a/app/views.pyc b/app/views.pyc deleted file mode 100644 index 9e0b4bf73fbfeab325de50d40bc3ac8216e01358..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4789 zcmcIn>v9vx6+R=`vMp?E4EVxzcEO9bf+a&y$<_v_1z%E7#B4@TP^xTAjnpk^H8~^^X)uHj< z48GstXa4CCDWVoyk5q{gk5Z3XXiL;8k;l|BC1pyds5M3DG_|HFtx&5%=?t}ID4nI& zETwbQnxnKzt*YBIMaelz=czUC#?zE6Pl6AasWnpTq^?k}gf*VJI$3jt)HUw6u1*$T7bZ6*3$6+MI;ooz$_=61 zB<0J>FD7)K^cSSQq=OO_|L|C}FG<}ZeT&p>QX8bcB6Wv8QQ6C2rV2G{H8$P9&{X%5 z$Q<}Pd1sXB%tkiOvu}O=>svegw$bSFe0`XA^1PlGy@tv=rcr$!XM^be|JXL(HQ@Qr zcHQTFrzbS3Z*+0+7d`6zg2kA@`|-O{}HP=kMv?0;=^v6mOAqfCMPG|vzA-Hh!TBN*~5K;FD3w{CQJ#D8pO(Log*D?-D=n*s)N6|_Li?Z4M; zgY)hfzn`btA4WZ0H*=WhVZCqDL_`W$GpC}QjXZpHK4uMH!xyHqVbnFEc0RJFvhX^Q zWeFW83rvTwih$Cr@vQODj3u&t{h3t4YAhD3LdGJO;D>=G;{GuzKKRe0O#lDHWp|U~ zZ=f@gm))i@8af0#oPg%>FR^?H3n4qqJb>&Ttpm)!u(RmCUBL9~?_a!pvJ>vTe6h0| z2y}y4kOTZkK-|f*ZrpPcu7G%I&|i&BKHrHk2Inmh95_o0o?#biwBhfjgPwTliB80<>0pYz@)-1K$#5lhU9ol(`_^^Q8S3;H1#vrPT z>mr&J9|Ca+W&~$)z~;rlO*Chy5kAG7+>sfN)v;C*#5E$NHu=JGOT@c=u8e^4`3KrxfTml*(eD_+ z5#$+CQ<6OoWy>_1;HO)#3hWWb-Ez$HaPD+?jFYQ0I7fqd0vHG9Inl0vMA9$OaaqP8e}M+ebUY>D`J(i3+e`EjlxboXWjd~qy-b4@8m!Vsk-{5~*O-yV zlFsms6~6l6hId%wWN+6UaIgUNhSWt9AhCJ&gAKHzbM`#L0d_xkS#=l{7HWpoIO>3E zbb{=sl}rcMcxDyNhVfxYkZtaB=t<&sfmmYLAuu5bJ&iZWnQ2YJFUQz`jVhk$%r6*~ zn*?m~fFUhFK)MasVFNxfILBm;m$}2sFtU9SVvxs~czbZ2mq=uc-f78I@1i7D$m?OA zg=W-F$H~mbHqo*Ylabsd8Uc!hc!_vX;4`x_8ptz_BPs7^bxHCMby4JnalXVi2Qm;2 zkmTG@&jJZH)U5iL-(5n%M<;hFU0_r=1Pm@MX%~Dcnjn2 zWpB~DR$3^}BZngJ(YU@OlYxR+pOc{KQ6UI0L+u-43C>+mD z|H1FTxQU-(M81e49I>g6{=e;C6p_U8LjMgawAElGE%ukISd|{KBE%u z{NxVIS8fn8g<(b$%rWlR+XQo5E4UJNfKG`XBA`PtJeZ<~=rwB`CCuN@RQcWVL@B?o zBb4%nLsC1peIHKPL1f}rg7u&6`mWTEv!1WBUYuzkc-!uyZrA=^0i)a%P7$;lB?e(F z_d8Jsv5n)K+lzR|r6P0o?``>MoQ=S|F8jp9&vqZ}s-C{v5w?%+Ny>h^`TEJ`cAmof z<2K?g7eB*M8xNMdei|KZg5#s#Zf!~I+~yOpII~6WYEXgqShUkRyU=EsXGWi)kr=TY zI^0=ZRxg(nR6)@2;=jW_0$8@w31Cl4Q(zQ!f{(lBglJ=XWNe=L54IkROHqza7)fFf zj-QpC%r|(7<_tw*+_AyJ44Cfbqf8xwGA=?TDu-bj#aS3iY*4yAau2LNa*Pz^TXp%D zXfnjhPdeXheX~`&4NhX4FvJ@*3|$6dDO{Z47j(dilKdb!PcmB|bs9%kDO25IqzefW!WJC5Bqit{*UrCa}t-v!v2kT6eoXgG>+~S6xViKZ) zJ@mxoqb?p?;rPWHJYzB^IEjmW_(GzK;5k#-cA)7m9=U7S8i|2&9BWYpIfWUd;bOD114Ai