ó
ř¨ÖTc           @   sé	  d  d l  Z  d  d l Z d  d l Z d  d l Z y d  d l Z e Z Wn e k
 rd d GHe	 Z n Xe	 d  Z
 e e	 d  Z d d  Z d d d	 d
 g a d d d d d	 d d d d
 d d d d d d d f a d f  d     YZ d f  d     YZ d   Z e d k rĺ	d GHd GHd GHHe e  j  d k  rd GHd GHd  GHd! GHd" GHd# GHd$ GHd% GHd& GHd' GHd( GHd) GHd* GHd+ GHd, GHd- GHe  j   n  d  d l Z d  d l Z e  j d. d/ k rQd0 Ge j j e  j d1  rěd2 GHe  j   n  e   j e  j d1 e  Z e r&d3 GHd4 GHe  j   n  d5 GHd6 Ge e j   e  j d  d5 GHne  j d. d7 k ree e  j  d8 k  rd3 GHd9 GHe  j   n  d0 Ge j j e  j d1  rŔd2 GHe  j   n  e   j e  j d1  Z e rňd: GHe  j   n  d5 GHe e  j  d; k  rŠe j j e  j d  r8d< GHe  j   n  xk e e j   D]Z Z! d= e! d. Ge e j" e!  e j j# e  j d d> e$ e! d.  j% d    d5 GHqHWnš y e& e  j d8  Wn d? GHe  j   n Xd@ e& e  j d8  d. k oe j  k  n rdA GHe  j   n  d= e& e  j d8  Ge e j" e& e  j d8  d.  e  j d  d5 GHn}e  j d. dB dC f k re e  j  d8 k  rŞd3 GHd9 GHe  j   n  d0 Ge j j e  j d1  rÚd2 GHe  j   n  e   j e  j d1 dD e	 dE e Z e rd: GHe  j   n  d5 GHe j j e  j d  rIdF GHe  j   n  dG GxŞ e' e j(  D] \ Z! Z) e) rvq]n  e j j# e  j d dH dI dJ dK f e!  Z e j* e! e  e  j d. dC k röe+ e dL  dM dN  Z, e, j- e)  e, j.   n  q]Wd5 GHdO Ge+ e j j# e  j d dP  dQ  Z, xO e' e j/  D]> \ Z! \ Z0 Z1 Z2 e, j- dR e! dS e0 dT e1 dU e2 f  q8We, j.   d5 GHnVe  j d. dV k rÝ	e j3 e j4 dW d. d. d@ d@ d@ d; d. d  g	   Z5 e j j e  j d1  rţd2 GHe  j   n  e  j d1 dL dX k rdX n dY Z6 e6 dY k rFe   j e  j d1  n e   j e  j d1 dD e	 Z e rżdZ GHe e  j  d8 k r˛e+ e  j dN  Z, e, j- dZ  e, j.   n  e  j   n  g  Z7 e7 j8 d[ e j9 dL  e6  e7 j8 d\ e j: dL  e6  e7 j8 d] e j   e7 j8 d^ e j;  e6 dX k rpe7 j8 d_ e j<  e7 j8 d_ e j=  e7 j8 d` e j>  n  e7 j8 da e j? d.  e7 j8 db e j@  e7 j8 dc e jA  e7 j8 dd e jB  e7 j8 de e jC  e7 j8 df e jD  e7 j8 dg e jE  e7 j8 e jF dh e jG e5 e jE   di  dj ZH e  jI dk dl f k rQ	dm ZH n e  jI dn k ri	do ZH n  eH j# e7  jJ dp dq  GHe e  j  d8 k rÚ	e+ e  j d dN  Z, e, j- eH j# e7  jJ dr   e, j.   n  n ds GHn  d S(t   i˙˙˙˙Ns4   Warning: PIL not found, image extraction won't work!c         C   sK   d } t  t |   } | r( | j   n  x | D] } | d >| B} q/ W| S(   Ni    i   (   t   mapt   ordt   reverse(   t   asciit   LittleEndiant   rett   lt   i(    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyt   AscDec   s     c         C   sš   g  } x. |  d k r6 | j  d |  d @ |  d L}  q	 W| r t |  | k r] | | } n  t |  | k  r d g | t |  | } q n  | rŁ | j   n  d j t t |   S(   Ni    i˙   i   t    (   t   insertt   lenR   t   joinR    t   chr(   t   dect   lengthR   t   out(    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyt   DecAsc   s    ! i   c         C   s$   |  | d k r  |  | |  | S|  S(   Ni    (    (   R   t   pad(    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyt
   AddPadding0   s    l   ˙˙ i˙   l   ˙  ~ i˙˙  l   ˙~ý} i˙OOOl   ˙?? i˙  wl   ˙wî~ i˙ ˙ i˙w  i˙˙wwl   ˙~ t   PPMc           B   sk   e  Z d    Z e e e d  Z e e e d  Z d   Z d   Z e d  Z	 d d  Z d d  Z RS(	   c         C   s:   t  t  t  g |  _ d  |  _ d  |  _ d  |  _ d  |  _ d  S(   N(   t   Falset   Loadedt   Nonet   Framest	   Thumbnailt   RawThumbnailt	   SoundData(   t   self(    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyt   __init__n   s
    			c         C   s;   t  | d  } |  j | j   | | |  } | j   | S(   Nt   rb(   t   opent   Readt   readt   close(   R   t   patht   DecodeThumbnailt
   ReadFramest	   ReadSoundt   fR   (    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyt   ReadFilet   s    
c      	   C   sQ  | d  d k s" t  |  d k r& t St | d d !t  d } t | d d !t  } t | d d !t  d |  _ t | d  d @d k |  _ t | d	 d
 !t  |  _ | d
 d !j d  j	 d  d |  _
 | d d !j d  j	 d  d |  _ | d d !j d  j	 d  d |  _ | d d !d  d  d  j d  j   |  _ | d d !d  d  d  j d  j   |  _ | d d !|  _ | d d !|  _ d |  j d  j d  j   |  j d d !t t |  j d t   j d  f |  _ d |  j d  j d  j   |  j d d !t t |  j d t   j d  f |  _ | d d !d  d  d  j d  j   |  _ t | d d !t  |  _ | d d !|  _ | rĽ|  j   n  t |  j d <t | d  d ?d @d k |  _ d t | d d  !t  } g  t |  j  D]4 } | t | d | d d | d d !t  ^ qý}	 g  t t | | | |  j ! D]3 } | d @d k | d! @d k | d @d k f ^ qU|  _ t | t  | |  j d  t  | |  j d  d !t  t | t  | |  j d  d t  | |  j d  d !t  t | t  | |  j d  d t  | |  j d  d !t  t | t  | |  j d  d t  | |  j d  d !t  f }
 d t | t  | |  j d  d  |  _! d t | t  | |  j d  d"  |  _" | r¤g  |  _# x­ t$ |	  D] \ } } t | |  d @d k } t | |  d ?d @t | |  d ?d @f } |  j% | | | rn|  j# | d d! n d   } |  j# j' | | | g  qńWt |  j d <n t |  j d <d  |  _# | r7g  |  _( t  | |  j d# d  } xA t d  D]3 } |  j( j' | | | |
 | ! | |
 | 7} qđWt |  j d! <n t |  j d! <d  |  _( |  S($   Ni   t   PARAi   i   i   i   i   i   i   i   i*   s   UTF-16LEu    i    i@   iV   i^   i˙˙˙˙t   HEXif   ix   i   s   %s_%s_%s.ppmi   iţ˙˙˙i   i   i   i    iŚ  i¨  i¤  i   i   i    ()   R   R   R   t   Truet
   FrameCountR   t   Lockedt   ThumbnailFrameIndext   decodet   splitt   OriginalAuthorNamet   EditorAuthorNamet   Usernamet   encodet   uppert   OriginalAuthorIDt   EditorAuthorIDt   OriginalFilenameCt   CurrentFilenameCt   strt   zfillt   OriginalFilenamet   CurrentFilenamet   PreviousEditAuthorIDt   DateR   t   GetThumbnailR   t   Loopedt   xrangeR    t   SFXUsageR   t
   Framespeedt   BGMFramespeedR   t	   enumeratet   ExtractFrameR   t   appendR   (   R   t   dataR$   R%   R&   t   AudioOffsett   AudioLenghtt   AnimationOffsetR   t   FrameOffsetst	   SoundSizet   offsett   Invertedt   Colorst   Framet   pos(    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyR    y   sj    "&&&,,UU,!JZ7;;A++	0			c         C   s   d  S(   N(    (   R   R#   (    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyt	   WriteFileĎ   s    c   	      C   s°   |  j  d s d  S|  j | \ } } } t } | rT | d | d | d <| d <n  | | d } | | d } t j d d d } | d | (| | | d <| | | d <| S(   Ni   i    i   iŔ   t   dtypes   >u4(   i   iŔ   (   R   R   R   t   FramePalettet   npt   zeros(	   R   t   frameRP   RQ   RR   t   Palettet   Color1t   Color2R   (    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyt   GetFrameŇ   s      c   	   
   C   s5  |  j  d  k s | r.|  j s" t St j d d d } t } xâ t d  D]Ô } xË t d  D]˝ } x´ t d  D]Ś } x t d d d  D] } t |  j | d	 | d | d | d  } | | d
 @| | | d | | d f <| | d ?| | | d d | | d f <q Wqp Wq] WqJ W| |  _  n  |  j  S(   Ni@   i0   RU   s   >u4i   i   i    i   i   i   i   i   (   i@   i0   (	   R   R   R   R   RW   RX   t   ThumbPalettet   rangeR   (	   R   t   forceR   t   palettet   tyt   txt   yt   xt   byte(    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyR@   ĺ   s    	/(<c         C   sř   |  j  d rô |  j | rí g  } xA t t |  j |  D]) } | j t | d @d >| d ?B  q7 Wd j |  } t j | d d   d } | rć t
 j | d  } | j d  | j d  | j d  | j |  | j   t S| Sqô t Sn  d  S(	   Ni   i   i   R	   i    t   wbi   i    (   R   R   R    R   RH   R   R   t   audioopt	   adpcm2linR   t   waveR   t   setnchannelst   setsampwidtht   setframeratet   writeframesR"   R+   R   (   R   t   indext
   outputpathRI   R   t   decodedR'   (    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyt   GetSoundü   s"    '
c      	   C   s|  g  g  g } t  j d d t  j } t | |  d @d k } t | |  d ?d @} | d	 7} d d g } | d @rÝ d
 G| Gd G| d	 GHt | | | d !t  }	 |	 d k rÂ |	 d | d <n d |	 | d	 <| d 7} n | rű d
 G| Gd G| d	 GHn  x t d  D] }
 x~ t t | | | d ! D]b } | |
 j | d @ | |
 j | d ?d @ | |
 j | d ?d @ | |
 j | d ? q)W| d 7} qWxźt d  D]Ž}
 xĽt d  D]} | |
 | d k rÚq˝| |
 | d	 k rŽt | | | d ! } | d 7} d } x<| d @rŞ| d @rt | |  } | d	 7} xT t d  D]9 } | d	 @rxt | |
 | | <n  | d	 7} | d	 L} qSWn
 | d 7} | d	 K} qWq˝| |
 | d k rťt | | | d ! } | d 7} d } x | d @r| d @rht | |  } | d	 7} xU t	 d  D]: } | d	 @sMt | |
 | | f <n  | d	 7} | d	 L} q'Wn
 | d 7} | d	 K} qěWxŃ t	 d  D]' } | |
 | | f | |
 | | f <qWq˝| |
 | d k r˝d } x| t	 d  D]k } t | |  } | d	 7} xH t	 d  D]: } | d	 @r5t | |
 | | f <n  | d	 7} | d	 L} qWqâWq˝q˝WqŞW| rx| d  k rx| d s| d	 rit  j d d t  j } xÂ t	 d  D]´ } xŤ t	 d  D] } | | d } | | d	 } d | k oôd k  n rťd | k od k  n rť| d | | f | d | | f <| d	 | | f | d	 | | f <qťqťWq¨W| } n  | | k } n  | S(   Ni   i   iŔ   RU   i   i    i   i   i   s   Unknown tags:s   (FrameMove) at offset s
   at offset i0   i   i   l   ˙˙ l        i   i    (   i   i   iŔ   (   i   i   iŔ   (   RW   RX   t   bool_R   R   R+   RB   R    RH   R_   R   (   R   RI   RO   t	   PrevFramet   EncodingRR   t   NewFramet   Unknownt	   FrameMovet   movet   layerRf   Rd   t   UseByteRe   t   _t   nt   NewPrevFramet   TempXt   TempY(    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyRG     s˘    

!











(


8 +	N(   t   __name__t
   __module__R   R   R+   R(   R    RT   R]   R@   R   Rr   RG   (    (    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyR   m   s   	V		t   TMBc           B   sY   e  Z d    Z e d  Z e d  Z d   Z d d  Z e d  Z	 e
 e d  Z RS(   c         C   s   t  |  _ d  |  _ d  |  _ d  S(   N(   R   R   R   R   R   (   R   (    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyR      s    		c         C   s5   t  | d  } |  j | j   |  } | j   | S(   NR   (   R   R    R!   R"   (   R   R#   R$   R'   R   (    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyR(   ¤  s    
c         C   sČ  | d  d k s" t  |  d k  r& t St | d d !t  d |  _ t | d d !t  |  _ t | d d !t  d |  _ t | d  d @d k |  _ t | d	 d
 !t  |  _	 | d
 d !j
 d  j d  d |  _ | d d !j
 d  j d  d |  _ | d d !j
 d  j d  d |  _ | d d !d  d  d  j d  j   |  _ | d d !d  d  d  j d  j   |  _ | d d !|  _ | d d !|  _ d |  j d  j d  j   |  j d d !t t |  j d t   j d  f |  _ d |  j d  j d  j   |  j d d !t t |  j d t   j d  f |  _ | d d !d  d  d  j d  j   |  _ | d d !|  _ t | d d !t  |  _ | d d !|  _ | rť|  j   n  t |  _ |  S(   Ni   R)   i   i   i   i   i   i   i   i   i*   s   UTF-16LEu    i    i@   iV   i^   i˙˙˙˙R*   if   ix   i   s   %s_%s_%s.tmbi   iţ˙˙˙i   i   i   i    (   R   R   R   R+   RJ   RK   R,   R   R-   R.   R/   R0   R1   R2   R3   R4   R5   R6   R7   R8   R9   R:   R;   R<   R=   R>   t   PartialFilenameCR?   R   R@   R   (   R   RI   R$   (    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyR    Š  s0    "&&&,,UU,	c         C   sD   |  j    } | r< t | d  } | j |  | j   t St Sd  S(   NRg   (   t   PackR   t   writeR"   R+   R   (   R   R#   R   R'   (    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyRT   Ń  s    
c         C   su  |  j  s t Sd t |  j d d t  t |  j d t  t |  j d d t  d t |  j  d t |  j	 d t  |  j
 j d  d	 d
 t |  j
  |  j j d  d	 d
 t |  j  |  j j d  d	 d
 t |  j  |  j j d  d  d  d  |  j j d  d  d  d  |  j |  j |  j j d  d  d  d  |  j t |  j d t  d	 |  j   g } d j |  S(   NR)   i   i   i   i   s   $ t    s   UTF-16LEt     i   R*   i˙˙˙˙R	   (   R   R   R   RJ   R+   RK   R,   R   R-   R.   R1   R4   R   R2   R3   R6   R/   R7   R8   R9   R>   R   R?   t   PackThumbnailR   (   R   t   ppmR   (    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyR   Ú  s,    	 $$$c   	   
   C   s5  |  j  d  k s | r.|  j s" t St j d d d } t } xâ t d  D]Ô } xË t d  D]˝ } x´ t d  D]Ś } x t d d d  D] } t |  j | d	 | d | d | d  } | | d
 @| | | d | | d f <| | d ?| | | d d | | d f <q Wqp Wq] WqJ W| |  _  n  |  j  S(   Ni@   i0   RU   s   >u4i   i   i    i   i   i   i   i   (   i@   i0   (	   R   R   R   R   RW   RX   R^   R_   R   (	   R   R`   R   Ra   Rb   Rc   Rd   Re   Rf   (    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyR@   ő  s    	/(<c         C   s(  d } |  j  s |  j S| r g  } xâ t d  D]Ô } xË t d  D]˝ } x´ t d  D]Ś } x t d d d  D] } | j t |  j  | | d | | d f   }	 | j t |  j  | | d d | | d f   }
 | j t |
 d >|	 B  qn WqU WqB Wq/ Wd j |  |  _ |  j St Sd  S(   Nl   ˙~ý} i˙OOOl   ˙˙ l   ˙?? l   ˙  ~ i˙  wl   ˙wî~ i˙ ˙ i˙˙  i˙w  i˙˙wwl   ˙~ i   i   i    i   i   i   R	   (   l   ˙~ý} i˙OOOl   ˙˙ l   ˙?? l   ˙  ~ i˙  wl   ˙wî~ i˙ ˙ i˙˙  i˙w  i˙˙wwi˙ ˙ l   ˙~ i˙ ˙ i˙ ˙ i˙ ˙ (	   R   R   R_   Ro   t   intRH   R   R   R   (   R   t   ExactR`   Ra   R   Rb   Rc   Rd   Re   t   p1t   p2(    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyR     s<                   	26+N(   R   R   R   R   R(   R    RT   R   R   R@   R+   R   (    (    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyR     s   	(		c         C   st   t  s d GHt S|  j d  } t j d t |   t |  d  f |  } | | j d  d } | j | |  t S(   Ns   Error: PIL not found!t   Ft   RGBAi    t   .i   (	   t   hasPILR   t   tostringt   Imaget
   fromstringR   t   rfindt   saveR+   (   t   imaget
   outputPathR   t   filetype(    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyt
   WriteImage<  s    +t   __main__s$                 ==      PPM.py      ==s%                ==      by pbsds      ==s#                 ==       v1.3      ==i   s   Usage:s0         PPM.py <Mode> <Input> [<Output>] [<Frame>]R	   s         <Mode>:s9             -t: Extracts the thumbnail to the file <Output>s/             -f: Extracts the frame(s) to <Output>s:             -s: Dumps the sound files to the folder <Output>sJ             -S: Same as mode -s, but will also dump the raw sound data filessO             -m: Prints out the metadata. Can also write it to <output> which alsos)                 supports unicode charactes.s2             Mode -t and -m supports TMB files aswells         <Frame>s             Only used in mode -fsO             Set this to the exact frame you want to extract(starting at 1) and its.             will be saved as a file to <Output>.sM             If not specified, it will extract all frames to the folder <Output>i   s   -ts   Reading the flipnote file...i   s$   Error!
Specified file doesn't exist!s   Error!s6   The given file is not a Flipnote PPM file or TMB file!s   Done!s   Dumping the thumbnail...s   -fi   s   <Output> not specified!s1   Error!
The given file is not a Flipnote PPM file.i   s-   Error!
The specified directory doesn't exist!s   Dumping frame #%i...s   frame %s.pngs   Error!
Invalid <Frame>!i    s    Error!
<Frame> is out of bounds!s   -ss   -SR%   R&   s4   Error!
The specified output directory doesn't exist!s   Converting the sound files...s   BGM.wavs   SFX1.wavs   SFX2.wavs   SFX3.waviý˙˙˙t   binRg   s!   Dumping the sound effect usage...s   SFX usage.txtt   ws   Frame %i:%s%s%s
s    SFX1s    SFX2s    SFX3s   -miĐ  R   t   tmbs=   Error!
The given file is not a Flipnote PPM file or TMB file.u%   Current filename:                  %su%   Original filename:                 %su%   Number of frames:                  %su%   Locked:                            %su%   Frame speed:                       %su%   Looped:                            %su%   Thumbnail frame index:             %iu%   Original author:                   %su%   Editor author:                     %su%   Username:                          %su%   Original author ID:                %su%   Editor author ID:                  %su%   Date(seconds since 1'st Jan 2000): %su1   Date:                              %H:%M %d/%m-%Ys	    (faulty)s   
t   win32t   cygwins   
t   darwins   R   t   ignores   UTF-8s   Error!
There's no such mode.(K   t   sysRj   Rh   t   numpyRW   R   R+   R   t   ImportErrorR   R   R   R   R   RV   R^   R   R   R   R   R   t   argvt   exitt   ost   timeR#   t   isfileR(   t   flipnoteR@   t   isdirRB   R,   R   R]   R   R:   R;   R   RF   R   RI   Rr   R   R'   R   R"   RC   t   s1t   s2t   s3t   mktimet   struct_timet   epochR   t   metaRH   R=   R<   R-   RD   RE   RA   R.   R1   R2   R3   R6   R7   R?   t   strftimet   gmtimet   newlinet   platformR4   (    (    (    sD   C:\Users\pbsdsjhgfjhgfjhg\Desktop\Flipnote-Player\Hatenatools\PPM.pyt   <module>   sd  $

	'˙ 3	C1.% ,%%-
3#D- 	 	