
    Z'i G                         d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ  G d d	e      Zy)
    N)etree)mktemp)encrypt)BookFile)Mimetype)list_zip_file_infosc                      e Zd Z G d de      Z G d de      Z G d de      ZdZdZd	Z	ej                  d
z   Z G d de      Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd!dZd Zd Zd  Z y)"EPubc                       e Zd ZdZdZy)
EPub.Issue      N)__name__
__module____qualname__FIRST_ITEM_NOT_MIMETYPEMIMETYPE_ITEM_IS_DEFLATED     $/opt/sopds/book_tools/format/epub.pyIssuer      s    "#$%!r   r   c                   ,    e Zd ZdZdZdZdZdZdZdZ	dZ
y	)
EPub.Namespacezhttp://www.w3.org/1999/xhtmlz/urn:oasis:names:tc:opendocument:xmlns:containerzhttp://www.idpf.org/2007/opfz http://purl.org/dc/elements/1.1/z!http://www.w3.org/2001/04/xmlenc#z"http://www.w3.org/2000/09/xmldsig#zhttp://marlin-drm.com/epubz+http://calibre.kovidgoyal.net/2009/metadataN)r   r   r   XHTML	CONTAINEROPFDUBLIN_CORE
ENCRYPTIONDIGITAL_SIGNATUREMARLINCALIBREr   r   r   	Namespacer      s+    .E	,88
@-?r   r"   c                   (    e Zd ZdZdZdZdZdZdZdZ	y)	
EPub.EntrymimetypezMETA-INF/manifest.xmlzMETA-INF/metadata.xmlzMETA-INF/container.xmlzMETA-INF/encryption.xmlzMETA-INF/rights.xmlzMETA-INF/signatures.xmlN)
r   r   r   MIMETYPEMANIFESTMETADATAr   r   RIGHTS
SIGNATURESr   r   r   Entryr$      s%    **,	.
&.
r   r+   z/https://books.fbreader.org/drm/marlin/get-tokenz*urn:marlin:organization:fbreader.org:0001:z"http://www.idpf.org/2008/embedding
aes128-cbcc                       e Zd Zd Zy)EPub.StructureExceptionc                 6    t         j                  | d|z          y )NzePub verification failed: )	Exception__init__)selfmessages     r   r1   z EPub.StructureException.__init__)   s    t%AG%KLr   N)r   r   r   r1   r   r   r   StructureExceptionr.   (   s    	Mr   r4   c                     t        j                  | ||t        j                         d | _        g | _        d | _        | j                          y N)r   r1   r   EPUBroot_filenamecover_fileinfos_EPub__zip_file_EPub__initialize)r2   fileoriginal_filenames      r   r1   zEPub.__init__,   s>    $&7G!!r   c                    | j                   j                  dd       t        j                  | j                         | _        g | _        	 | j                  j                         rt        j                  d      | j                  j                         }t        |      dk(  rt        j                  d      |d   }|j                  t        j                  j                  k7  r4| j
                  j                  t        j                  j                          nP|j"                  t        j$                  k7  r3| j
                  j                  t        j                  j&                         | j                  j)                  t        j                  j                        5 }|j+                  d      j-                         j/                  d      t0        j2                  k7  rt        j                  d      	 d d d        | j5                          y # 1 sw Y   xY w# t        j                  $ r}| j7                          |d }~wt8        $ r4}| j7                          t        j                  |j:                        d }~ww xY w)Nr   zbroken zip archivezempty zip archive   z
z$'mimetype' item content is incorrect)r<   seekzipfileZipFiler:   issuestestzipr
   r4   infolistlenfilenamer+   r&   appendr   r   compress_type
ZIP_STOREDr   openreaddecoderstripr   r7   _EPub__extract_metainfocloser0   r3   )r2   infosmimetype_infomimetype_fileerrors        r   __initializezEPub.__initialize4   s   		q!//$))4	9&&(--.BCCOO,,.E5zQ--.ABB!!HM%%)<)<<""4::#E#EF,,0B0BB""4::#G#GH%%djj&9&9: \m %%b)00299&AX]]R112Z[[ S\ ##%	\ \
 && 	JJLK 	9JJL))%--88	9s>   	EH AH.H HH I8&H88I8/I33I8c                 8    | j                   j                          y r6   )r:   rP   )r2   s    r   rP   z
EPub.closeR   s    r   c                 >    | j                   j                  |||       y r6   )r:   __exit__)r2   kindvalue	tracebacks       r   rX   zEPub.__exit__U   s      ui8r   c                    | j                   j                  |      5 }	 t        j                  |j	                  d            cd d d        S #  t
        j                  d|j                  z   dz         xY w# 1 sw Y   y xY w)Ni   'z' is not a valid XML)r:   rK   r   
fromstringrL   r
   r4   rG   )r2   infoentrys      r   __etree_from_entryzEPub.__etree_from_entryX   sz    __!!$' 	^5^''

7(;<	^ 	^^--dT]].BE\.\]]		^ 	^s   A5#A'A22A55A>c                 @   | j                         }|j                  | _        | j                  |      }t        j
                  j                  t        j
                  j                  d}|j                  d|      }t        |      dkD  r| j                  |d   j                         |j                  d|      }t        |      dk(  r|j                  d|      }t        |      dkD  r| j                  |d   j                         |j                  d|      }t        |      dk(  r|j                  d|      }|D ]  }| j                  |j                          |j                  d	|      }t        |      dkD  r1|d   j                  r"|d   j                  j                         | _        |j                  d
|      }|D ]  }| j!                  |j                          |j                  d|      }t        |      dkD  rt#        j$                  |d   j'                  d            }|rX|j                  d|      }t        |      dkD  r't#        j$                  |d   j'                  d            nd }||xs d d| _        |j                  d|      }t        |      dkD  r1|d   j                  r"|d   j                  j                         | _        t,        j.                  j1                  |j                        }|r|dz  }| j3                  ||      | _        y )Nopfdcz"/opf:package/opf:metadata/dc:title
namespacesr   z8/opf:package/opf:metadata/dc:date[@event="modification"]z!/opf:package/opf:metadata/dc:datez1/opf:package/opf:metadata/dc:creator[@role="aut"]z$/opf:package/opf:metadata/dc:creatorz%/opf:package/opf:metadata/dc:languagez$/opf:package/opf:metadata/dc:subjectz:/opf:package/opf:metadata/opf:meta[@name="calibre:series"]contentz@/opf:package/opf:metadata/opf:meta[@name="calibre:series_index"])titleindexz(/opf:package/opf:metadata/dc:description/)_EPub__get_root_inforG   r8   _EPub__etree_from_entryr
   r"   r   r   xpathrF   __set_title__text__set_docdate____add_author__striplanguage_code__add_tag__r   __normalise_string__getseries_infodescriptionospathdirname_EPub__find_coverr9   )	r2   	root_infotreerg   resnodeseriesrj   prefixs	            r   __extract_metainfozEPub.__extract_metainfo_   s   ((*	&//&&y1!^^//t~~7Q7QR
jj=*jUs8a<s1v{{+jjS`jjks8q=**@Z*XCs8a<  Q-jjLYcjds8q=**CPZ*[C 	+D		*	+ jj@ZjXs8a<CFKK!$Q!2!2!4Djj?JjW 	(DTYY'	( jjUbljms8a<223q6::i3HIFjj!cpzj{PSTWPX[\P\55c!fjj6KLbf#"]d$ 
 jjCPZj[s8a<CFKK"1v{{002D!3!34cMF#00v>r   c                     t         j                  j                  t         j                  j                  dfdfd} fd}	  d      } ||      S # t        $ r
}Y d }~nd }~ww xY w	  d      } | d|j                  d      z              S # t        $ r
}Y d }~nd }~ww xY w	  d	      } | d|j                  d      z              S # t        $ r
}Y d }~nd }~ww xY w	  d
      } | d|j                  d      z              S # t        $ r
}Y d }~nd }~ww xY w	  d      } | ||j                  d                  S # t        $ r
}Y d }~nd }~ww xY w	  d      } | ||j                  d                  S # t        $ r
}Y d }~nd }~ww xY w	  d      } ||      S # t        $ r}Y d }~g S d }~ww xY w)Nrc   c                 0    j                  |       d   S )Nrf   r   )rn   )queryrg   r   s    r   rn   z EPub.__find_cover.<locals>.xpath   s    ::e
:;A>>r   c                      d| z        S )Nz./opf:package/opf:manifest/opf:item[@href="%s"]r   )refrn   s    r   item_for_hrefz(EPub.__find_cover.<locals>.item_for_href   s    ICOPPr   c                    t         j                  j                  | j                  d      z         j	                  dd      }	 	j
                  j                  |      }| j                  d      }|j                  |d}|j                  d      r|gS |dk(  r	j                  |      }t         j                  j                  |j                        dz   }|j                  dd	t        j                  j                   i
      d   }|t         j                  j                  ||j                  d      z         ddgS t#        d|z        #  	j
                  j                  t        j                  |            }Y xY w)Nhref\rk   
media-type)rG   mimezimage/zapplication/xhtml+xmlz//xhtml:img[@src]xhtmlrf   r   srcz
image/autozunknown mimetype %s)rz   r{   normpathrw   replacer:   getinfourllibunquoterG   
startswithrm   r|   rn   r
   r"   r   r0   )
r   r{   fileinfor   r_   r   xhtml_prefiximgr   r2   s
           r   image_infosz&EPub.__find_cover.<locals>.image_infos   sN   77##FTXXf-=$=>FFtCPDI??2248 88L)D$--D x(v00//9!wwx/@/@ACGkk"57DNNL`L`Bakbcde$&GG$4$4\CGGEN5R$S ,    5 <==+I??226>>$3GHs   E	 	0E<z=/opf:package/opf:manifest/opf:item[@properties="cover-image"]z1/opf:package/opf:metadata/opf:meta[@name="cover"]z,/opf:package/opf:manifest/opf:item[@id="%s"]rh   z-/opf:package/opf:metadata/meta[@name="cover"]z%/package/metadata/meta[@name="cover"]z /package/manifest/item[@id="%s"]zZ/opf:package/opf:guide/opf:reference[@type="other.ms-coverimage-standard"][@title="Cover"]r   zJ/opf:package/opf:guide/opf:reference[@type="other.ms-coverimage-standard"]z//opf:package/opf:manifest/opf:item[@id="cover"])r
   r"   r   r   r0   rw   )	r2   r   r   r   r   r   errrg   rn   s	   ```    @@r   __find_coverzEPub.__find_cover   s   !^^//t~~7Q7QR
	?	Q	>6	XYDt$$ 			LMDu%SVZV^V^_hVi%ijkk 			HIDu%SVZV^V^_hVi%ijkk 			@ADu%G$((S\J]%]^__ 			uvD}TXXf-=>?? 			efD}TXXf-=>?? 			JKDt$$ 			s~   A 	A0+A04'B 	B/*B/3'C 	C.)C.2'D 	D-(D-1$E 	E)$E)-$F 	F% F%)F9 9	GGc                    	 | j                   j                  t        j                  j                        }|r| j                  |      }d }dt        j                  j                  i}|j                  d|      }t        |      dk(  r+|d   j                  d      dk(  r|d   j                  d      }|r| j                   j                  |      S | j                   j                         D cg c]   }|j                  j                  d	      s|" }}t        |      dkD  rt        j                  d
      t        |      dk(  r|d   S t        j                  d      #  d }Y /xY wc c}w )Ncontz,/cont:container/cont:rootfiles/cont:rootfilerf   r   r   r   zapplication/oebps-package+xmlz	full-pathz.opfz several OPF files in the archivezOPF entry not found)r:   r   r
   r+   r   rm   r"   rn   rF   rw   rE   rG   endswithr4   )r2   container_infor   	root_filerg   r   i	opf_infoss           r   __get_root_infozEPub.__get_root_info   s:   	"!__44TZZ5I5IJN **>:DI $..":":;J**KXb*cC3x1}QL!9=\!\FJJ{3	..y99$(OO$<$<$>^q!**BUBUV\B]^I^9~!--.PQQY1$ |#%%&;<<%	"!N _s   3E + E'E'E$c                 Z    	 | j                   j                  |       y# t        $ r Y yw xY w)NTF)r:   r   KeyError)r2   names     r   __contains_entryzEPub.__contains_entry   s.    	OO##D) 		s    	**c                 .   t               }	 | j                  t        j                  j                        }t        j
                  j                  t        j
                  j                  t        j
                  j                  d}|j                  d|      }|D ]_  }|d   j                  }|s|j                  t        j                        s5|j                  |t        t        j                        d         a 	 t        |      S #  Y t        |      S xY w)N)cedz1/c:encryption/e:EncryptedData/d:KeyInfo/d:KeyNamerf   r   )setrm   r
   r+   r   r"   r   r   rn   rp   r   CONTENT_ID_PREFIXaddrF   list)r2   content_idsr   nsr   r   key_names          r   __extract_content_idszEPub.__extract_content_ids   s    e	**4::+@+@AD^^--^^..^^55B
 **P]_*`C Lq6;; 3 3D4J4J KOOHS1G1G-H-I$JKL K  	K  s   B D -D -D Dc           
      p   ddi}d }| j                  t        j                  j                        r	 | j	                  t        j                  j                        }t        j
                  j                  t        j
                  j                  d}|j                  d|      }t        t        |D cg c]  }|j                  d       c}            }t        |      dk7  rd|d	S |d
   t        j                  k(  rddiS |d
   t        j                  k(  r|d
   }n|S 	 | j                  t        j                  j                        r|t        j                  k(  r	 | j	                  t        j                  j                        }dt        j
                  j                  i}|j                  d|      }|r:|d
   j                   }|t        j"                  k(  r| j%                         ng }	d||	dS 	 |S |S | j                  t        j                  j&                        r|S i S c c}w #  |cY S xY w#  Y |S xY w)Nmethodunknown)r   r   z0/c:encryption/e:EncryptedData/e:EncryptionMethodrf   	Algorithmr   multi)r   idsr   	embeddingmz*/m:Marlin/m:RightsURL/m:RightsIssuer/m:URLmarlin)r   	token_urlr   )_EPub__contains_entryr
   r+   r   rm   r"   r   rn   r   r   rw   rF   ALGORITHM_EMBEDDINGALGORITHM_AES128r)   r    rp   	TOKEN_URL_EPub__extract_content_idsr*   )
r2   UNKNOWN_ENCRYPTIONalgor   rg   r   r
algorithmsr   r   s
             r   get_encryption_infozEPub.get_encryption_info  s   '4  !6!67*..tzz/D/DE#'>>#;#;AZAZ[
jj!S`jjk!#3&Gaquu['9&G"HI
z?a'&-jAAa=D$<$<<$k22]d&;&;;%a=D--    !2!23t,,,224::3D3DED"%t~~'<'<!=J**%Q^h*iC$'FKK	FOSWSaSaFad&@&@&Bgi&.)2+6    &%%%  !6!67%%	C 'H*)) %%s7   A?H' 0H"H' &H'  H' BH0 "H' 'H-0H5c                     t         j                  j                  ||      }t        |d      5 }|j	                  |d       d d d        |j	                  ||       y # 1 sw Y   xY w)NwT)pretty_printarcname)rz   r{   joinrK   write)r2   zip_filerG   r   working_dirr{   pfiles          r   __save_treezEPub.__save_tree>  sV    ww||K2$_ 	1JJu4J0	1tX.	1 	1s   AA&c                    t         j                  |z   }t        j                  |t        j                  t         j
                  j                  d      d|z        }t        j                  |t        j                  t         j
                  j                  d      t         j
                  j                  dz          t        j                  |t        j                  t         j
                  j                  d            }t        j                  |t        j                  t         j
                  j                  d            }||_        t        j                  |t        j                  t         j
                  j                  d	            }	t        j                  |	t        j                  t         j
                  j                  d
      |       y )NEncryptedDatazED%d)IdEncryptionMethodr,   )r   KeyInfoKeyName
CipherDataCipherReference)URI)	r
   r   r   
SubElementQNamer"   r   r   rp   )
r2   rj   rooturi
content_idr   enc_datakey_infokey_name_tagcipher_datas
             r   __add_encryption_sectionzEPub.__add_encryption_sectionD  s<    ))J6##D%++dnn6O6OQ`*aflotftu5;;t~~/H/HJ\#]imiwiw  jC  jC  FR  jR  	S##Hekk$..:Z:Z\e.fg''%++dnn>^>^`i2jk$&&xT^^=V=VXd1efekk$..2K2KM^&_ehir   c                    t         j                  j                  t         j                  j                  t         j                  j                  d}t        j                  t        j                  t         j                  j                  d      |      }t        j                  |      }d}|D ]  }	| j                  |||	|       |dz  } | j                  |t         j                  j                  ||       y )N)Nencds
encryptionnsmapr   )r
   r"   r   r   r   r   Elementr   ElementTree_EPub__add_encryption_section_EPub__save_treer+   )
r2   r   r   encrypted_filesr   rg   r   r   rj   rG   s
             r   __create_encryption_filezEPub.__create_encryption_fileQ  s    001188


 }}U[[)A)A<PXbc  &' 	H))%xLQJE	 	4::#8#8$Lr   c                    d t         j                  j                  i}t        j                  t        j
                  t         j                  j                  d      |      }t        j                  |      }dt        j                  |t        j
                  t         j                  j                  d            _        t        j                  |t        j
                  t         j                  j                  d            }t        j                  |t        j
                  t         j                  j                  d            }t         j                  t        j                  |t        j
                  t         j                  j                  d            _        | j                  |t         j                  j                  ||       y )NMarlinr   z1.0Version	RightsURLRightsIssuerURL)r
   r"   r    r   r   r   r   r   rp   r   r   r+   r)   )r2   r   r   rg   r   r   
rights_urlrights_issuers           r   __create_rights_filezEPub.__create_rights_filea  s   DNN112
}}U[[)>)>IQ[\  &UZu{{4>>+@+@)LMR%%dEKK8M8M{,[\
((U[[AVAVXf5ghZ^ZhZhDNN4I4I5(QRW4::#4#4dKHr   Nc                 |   | j                         r"t        d| j                  j                  z        |s}t        j
                  j                  t        j
                  j                  t        j
                  j                  g}|| j                  gz  }|| j                  D cg c]  }|d   	 c}z  }| j                  j                  |       t        |      }t        j                  |dt        j                         5 }|j#                  t        j
                  j$                  t&        j(                  t        j*                         g }t-        | j                        D cg c]6  }|j.                  t        j
                  j$                  k7  s+|j.                  8 c}D ]  }	t0        j2                  j5                  ||	      }
|	|v r|j7                  |
|	       ;t9        t0        j2                  j5                  ||	      ||       |j;                  |	       |j7                  |
|	t        j*                          | j=                  ||||       | j?                  ||       d d d        tA        jB                  || j2                         | jE                          | jG                          y c c}w c c}w # 1 sw Y   TxY w)Nz/Cannot encrypt file %s, it is already encryptedrG   r{   dirr   r   )r   rI   )$r   r0   r<   r   r
   r+   r'   r(   r   r8   r9   r:   
extractallr   rA   rB   ZIP_DEFLATEDwritestrr&   r   r7   rJ   r   rG   rz   r{   r   r   r   rH   _EPub__create_encryption_file_EPub__create_rights_fileshutilmoverP   r;   )r2   keyr   r   files_to_keepr_   new_epubr   r   r`   r{   s              r   r   zEPub.encryptk  s"   ##%MPTPYPYP^P^^__!ZZ00$**2E2EtzzG[G[\Md0011M4;O;OP4d:.PPM"""4k*__XsG,@,@A 	=Xdjj118=='BTBTU O4G4X  BD\`\i\imqmwmw  nA  nA  ]A$--  B Zww||K7M)NN4N7BGGLLe<c;O#**51NN4gFXFXNYZ ))(KR\]%%h<	= 	Hdii(

) Q B	= 	=s,   !J(?A!J2 ,J-J-CJ2-J22J;c                    | j                   j                  |       t        |      }t        j                  |dt        j
                        5 }|j                  t        j                  j                  t        j                  t        j                         t        | j                         D cg c]6  }|j                  t        j                  j                  k7  s+|j                  8 c}D ]3  }|j                  t         j"                  j%                  ||      |       5 	 d d d        t'        j(                  || j"                         | j+                          | j-                          y c c}w # 1 sw Y   OxY w)Nr   r   r   r   )r:   r  r   rA   rB   r  r  r
   r+   r&   r   r7   rJ   r   rG   r   rz   r{   r   r  r  rP   r;   )r2   r   r
  r   r_   r`   s         r   repairzEPub.repair  s   """4k*__XsG,@,@A 	PXdjj118=='BTBTU4G4X  BD\`\i\imqmwmw  nA  nA  ]A$--  B Prww||K?OP	P 	Hdii(

	 B	P 	Ps%   AE0-,E+E+(9E0+E00E9c                 B   t        | j                        dk(  ry| j                  d   d   }| j                  j                  ||       |j	                  d      D cg c]  }|s|	 }}t        |      dkD  rt        j                  t        j                  j                  ||      t        j                  j                  ||d                t        j                  t        j                  j                  ||d                t        |      dkD  r|d   dfS d dfS c c}w )	Nr   )NFrG   r   rk   r   F)rF   r9   r:   extractsplitr  r  rz   r{   r   rmtree)r2   r   r   partr  s        r   extract_cover_internalzEPub.extract_cover_internal  s    t##$) ##B'
3;7"&**S/:$T::u:>KK[$7kSXY[S\9]^MM"'',,{E!H=> Z!^b	u==u==	 ;s   D$Dc                     t        | j                        dk(  ry | j                  d   d   }| j                  j                  |      j	                         }|S )Nr   r  rG   )rF   r9   r:   rK   rL   )r2   r   rh   s      r   extract_cover_memoryzEPub.extract_cover_memory  sO    t##$)##B'
3//&&t,113r   r6   )!r   r   r   objectr   r"   r+   r   r   r   r   r   r0   r4   r1   r;   rP   rX   rm   rO   r}   rl   r   r   r   r   r   r  r  r   r  r  r  r   r   r   r
   r
   
   s    & &@F @/ / BID> ++l:MY M9< 9^0?dN`=.!$+Z/jM I:
	>r   r
   )rz   r  r   rA   lxmlr   tempfiler   book_tools.format.aesr   book_tools.format.bookfiler   book_tools.format.mimetyper   book_tools.format.utilr   r
   r   r   r   <module>r     s+    " "   ) / / 6Z8 Zr   