
    Z'i!                         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  G d de      Z G d	 d
e      Z G d de	      Z G d de      Z G d de      Zy)    N)etree)abstractmethod)BookFile)Mimetype)list_zip_file_infosc                       e Zd Zd Zy)FB2StructureExceptionc                     t         j                  | d|z         t        |t               rt        t	        j
                                y y )Nzfb2 verification failed: %s)	Exception__init__
isinstanceprint	traceback	print_exc)selferrors     #/opt/sopds/book_tools/format/fb2.pyr   zFB2StructureException.__init__
   s8    4!>!FGeY')%%'( (    N)__name__
__module____qualname__r    r   r   r	   r	   	   s    )r   r	   c                       e Zd ZdZdZdZy)	Namespacez*http://www.gribuser.ru/xml/fictionbook/2.0z*http://www.gribuser.ru/xml/fictionbook/2.1zhttp://www.w3.org/1999/xlinkN)r   r   r   FICTION_BOOK20FICTION_BOOK21XLINKr   r   r   r   r      s    ANAN*Er   r   c                   ^    e Zd Zd Zed        Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zy)FB2Basec                 6   t        j                  | |||       t        j                  t        j                  d| _        	 | j                         }| j                  |       | j                  |       | j                  |       | j                  |       | j                  |       | j                  |       | j                  |       | j                  |      }|r|j                         | _        y y # t"        $ r}|d }~wt$        $ r}t#        |      d }~ww xY w)N)fbxlink)r   r   r   r   r   _FB2Base__namespaces__create_tree___FB2Base__detect_namespaces_FB2Base__detect_title_FB2Base__detect_authors_FB2Base__detect_tags_FB2Base__detect_series_info_FB2Base__detect_language_FB2Base__detect_docdate_FB2Base__detect_descriptionstripdescriptionr	   r   )r   fileoriginal_filenamemimetypetreer.   r   s          r   r   zFB2Base.__init__   s    $&7B"+":":IOOT	/'')D$$T*%!!$'t$%%d+""4(!!$'33D9K#.#4#4#6  $ 	K 	/'..	/s%    B/C1 1	D:C<<DDDc                      y Nr   )r   s    r   r$   zFB2Base.__create_tree__)   s    r   c                    	 | j                         }|j                  d| j                        }|d   j                  dt        j
                  z   dz         dd  }|j                  d|z  | j                        }t        j                  |d   j                        }t        t        j                  j                  |d      d	      5 }|j                  |       d d d        y
# 1 sw Y   y
xY w#  Y yxY w)NB/fb:FictionBook/fb:description/fb:title-info/fb:coverpage/fb:image
namespacesr   {}href   #/fb:FictionBook/fb:binary[@id="%s"]
cover.jpegwb)r=   F)NF)r$   xpathr#   getr   r   base64	b64decodetextopenospathjoinwrite)r   working_dirr2   rescover_idcontent
cover_files          r   extract_cover_internalzFB2Base.extract_cover_internal-   s    
	!'')D**anrnn*  AC1vzz#	"7'"AB12FH**BXMZ^ZkZk*lC&&s1v{{3Gbggll;=tD *
  )*(*(	! s*   CC- C!C- !C*&C- *C- -C1c                    	 | j                         }|j                  d| j                        }t        |      dk(  r|j                  d| j                        }|d   j	                  dt
        j                  z   dz         dd  }|j                  d|z  | j                        }t        j                  |d   j                        }|S # t        $ r}t        d	|z         Y d }~y d }~ww xY w)
Nr6   r7   r   z!/fb:FictionBook/fb:body//fb:imager9   r:   r;   r<   zexception Extract %s)r$   r?   r#   lenr@   r   r   rA   rB   rC   r   r   )r   r2   rJ   rK   rL   errs         r   extract_cover_memoryzFB2Base.extract_cover_memory:   s    	'')D**anrnn*  AC3x1}jj!DQUQbQbjc1vzz#	"7'"AB12FH**BXMZ^ZkZk*lC&&s1v{{3GN 	(,-	s   CC	 		C*C%%C*c                     |j                         j                  j                  t        j                        dkD  rt        j                  | j
                  d<   y )Nr   r!   )getroottagfindr   r   r#   )r   r2   s     r   __detect_namespaceszFB2Base.__detect_namespacesI   s@    <<>""9#;#;<q@&/&>&>Dd#r   c                     |j                  d| j                        }t        |      dk(  r|j                  d      }t        |      dkD  r| j                  |d   j                         y )Nz:/fb:FictionBook/fb:description/fb:title-info/fb:book-titler7   r   z~/*[local-name() = "FictionBook"]/*[local-name() = "description"]/*[local-name() = "title-info"]/*[local-name() = "book-title"])r?   r#   rP   __set_title__rC   r   r2   rJ   s      r   __detect_titlezFB2Base.__detect_titleN   s`    jjUbfbsbsjts8q=**  ^  _Cs8a<s1v{{+r   c                    d}|j                  d| j                        }t        |      dk(  r|j                  d      }t        |      dk(  rd}|j                  d| j                        }t        |      dk(  rd}|j                  d      }t        |      dkD  r%| j                  |r|d   n|d   j                         y )Nr;   z>/fb:FictionBook/fb:description/fb:document-info/fb:date/@valuer7   r   z2/FictionBook/description/document-info/date/@valuez7/fb:FictionBook/fb:description/fb:document-info/fb:datez+/FictionBook/description/document-info/date)r?   r#   rP   __set_docdate__rC   )r   r2   	is_attribrJ   s       r   __detect_docdatezFB2Base.__detect_docdateW   s    	jjYfjfwfwjxs8q=**QRCs8q=I**Vcgctct*uCs8q=I**JKCs8a<  9Q#a&++Fr   c                      d fd fd}|j                  d j                        }t        |      dk(  rd|j                  d      }|D ]
  } ||        y )	NTc                     r!| j                  d|z   j                        }n| j                  |      }||j                  nd}|xs dS )Nzfb:r7    )rV   r#   rC   )nodenamesubnoderC   r   use_namespacess       r   subnode_textz.FB2Base.__detect_authors.<locals>.subnode_textj   sI    ))EDLT=N=N)O))D/#*#67<<BD:2r   c                 p     | d      } | d      }j                  dj                  ||g      |       y )Nz
first-namez	last-name )__add_author__rG   )rc   
first_name	last_namer   rg   s      r   add_author_from_nodez6FB2Base.__detect_authors.<locals>.add_author_from_noder   s9    %dL9J$T;7I*i)@ A9Mr   z6/fb:FictionBook/fb:description/fb:title-info/fb:authorr7   r   Fz*/FictionBook/description/title-info/author)r?   r#   rP   )r   r2   rm   rJ   rc   rg   rf   s   `    @@r   __detect_authorszFB2Base.__detect_authorsg   se    		N jjQ^b^o^ojps8q="N**IJC 	'D &	'r   c                     |j                  d| j                        }t        |      dk(  rd}|j                  d      }t        |      dkD  r|d   j                  | _        y y )Nz4/fb:FictionBook/fb:description/fb:title-info/fb:langr7   r   Fz(/FictionBook/description/title-info/lang)r?   r#   rP   rC   language_code)r   r2   rJ   rf   s       r   __detect_languagezFB2Base.__detect_language   s[    jjO\`\m\mjns8q="N**GHCs8a<!$QD r   c                     |j                  d| j                        }t        |      dk(  rd}|j                  d      }|D ]  }| j                  |j                          y )Nz5/fb:FictionBook/fb:description/fb:title-info/fb:genrer7   r   Fz)/FictionBook/description/title-info/genre)r?   r#   rP   __add_tag__rC   )r   r2   rJ   rf   rc   s        r   __detect_tagszFB2Base.__detect_tags   s\    jjP]a]n]njos8q="N**HIC 	(DTYY'	(r   c                 T   |j                  d| j                        }t        |      dk(  rd}|j                  d      }t        |      dkD  r\t        j                  |d   j                  d            }t        j                  |d   j                  d            }|r||d| _        y y y )	Nz8/fb:FictionBook/fb:description/fb:title-info/fb:sequencer7   r   Fz,/FictionBook/description/title-info/sequencerd   number)titleindex)r?   r#   rP   r   __normalise_string__r@   series_info)r   r2   rJ   rf   rw   rx   s         r   __detect_series_infozFB2Base.__detect_series_info   s    jjS`d`q`qjrs8q="N**KLCs8a<11#a&**V2DEE11#a&**X2FGE""$  	 r   c                     |j                  d| j                        }t        |      dk(  r|j                  d      }t        |      dkD  rt        j                  |d   dd      S y )Nz:/fb:FictionBook/fb:description/fb:title-info/fb:annotationr7   r   z./FictionBook/description/title-info/annotationzutf-8rC   )encodingmethod)r?   r#   rP   r   tostringrZ   s      r   __detect_descriptionzFB2Base.__detect_description   s[    jjUbfbsbsjts8q=**MNCs8a<>>#a&76JJr   N)r   r   r   r   r   r$   rN   rR   r%   r&   r+   r'   r*   r(   r)   r,   r   r   r   r   r      sM    /(  !
 '2-(r   r   c                       e Zd Zd Zd Zd Zy)FB2c                 P    t         j                  | ||t        j                         y r4   )r   r   r   r   )r   r/   r0   s      r   r   zFB2.__init__   s    t%6Er   c                     	 | j                   j                  dd       t        j                  | j                         S # t        $ r}t        d|z        d }~ww xY w)Nr   z the file is not a valid XML (%s))r/   seekr   parser   r	   )r   rQ   s     r   r$   zFB2.__create_tree__   sP    	PIINN1Q;;tyy)) 	P'(J3(NOO	Ps   := 	AAAc                      y r4   r   r   kindvaluer   s       r   __exit__zFB2.__exit__   s    r   Nr   r   r   r   r$   r   r   r   r   r   r      s    FPr   r   c                       e Zd Zd Zd Zd Zy)FB2Zipc                 4   t        j                  |      | _        	 | j                  j                         rt	        d      t        | j                        | _        t        | j                        dk7  r!t	        dt        | j                        z        	 t        j                  | ||t        j                         y # t        $ r!}| j                  j                          |d }~wt        $ r*}| j                  j                          t	        |      d }~ww xY w)Nzbroken zip archiver;   zarchive contains %s files)zipfileZipFile_FB2Zip__zip_filetestzipr	   r   _FB2Zip__infosrP   closer   r   r   r   FB2_ZIP)r   r/   r0   r   s       r   r   zFB2Zip.__init__   s    !//$/	/&&(+,@AA.t?DL4<< A%+,G#dllJ[,[\\ & 	t%68H8HI % 	OO!!#K 	/OO!!#'..	/s$   A8B< <	DC!!D-%DDc                    | j                   j                  | j                  d         5 }	 t        j                  |j                  d            cd d d        S #  t        d| j                  d   j                  z        xY w# 1 sw Y   y xY w)Nr   i   z'%s' is not a valid XML)r   rD   r   r   
fromstringreadr	   filename)r   entrys     r   r$   zFB2Zip.__create_tree__   s    __!!$,,q/2 	ded''

3C(DE	d 	dd+,G$,,WX/JbJb,bcc		d 	ds   B#A'A??BBc                 >    | j                   j                  |||       y r4   )r   r   r   s       r   r   zFB2Zip.__exit__   s      ui8r   Nr   r   r   r   r   r      s    J"dr   r   )rA   rE   r   r   lxmlr   abcr   book_tools.format.bookfiler   book_tools.format.mimetyper   book_tools.format.utilr   r   r	   objectr   r   r   r   r   r   r   <module>r      sY    % %   / / 6)I )+ +
Rh Rh' W r   