
    M@c*;                     f   d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZmZmZ d dlmZ d dlmZ ej(                  ej*                  ej,                  ej.                  ej0                  gZej4                  d	ej6                  d
ej8                  dej:                  dej<                  dej>                  diZ  G d d      Z!ej.                  ej0                  gZ" G d de!      Z# G d de!      Z$ejJ                  g dz   Z& G d de!      Z'dZ( G d de!      Z)ejT                  ejV                  gZ, G d de!      Z- G d de      Z. G d d e.      Z/ G d! d"e.      Z0 G d# d$e.      Z1 G d% d&e/      Z2 G d' d(e/      Z3 G d) d*e/      Z4 G d+ d,e.      Z5 G d- d.e/      Z6 G d/ d0e      Z7y)1    N)Counter)id3mp3)	AUDIO_MP3guessMimetype)ForeStyleprintMsg)LoaderPlugin)framesz<=z< z>=z> z= z!=c                       e Zd Zd Zy)Rulec                     t               N)NotImplementedError)selfpath
audio_files      5/usr/lib/python3/dist-packages/eyed3/plugins/stats.pytestz	Rule.test   s    !##    N__name__
__module____qualname__r    r   r   r   r      s    $r   r   c                       e Zd Zd Zy)Id3TagRulesc                    g }|y |j                   sdgS |j                   }|j                  t        vr|j                  ddt        z  f       |j                  s|j                  d       |j
                  s|j                  d       |j                  s|j                  d       |j                  d   s|j                  d       |j                  d	   s|j                  d
       |j                         s|j                  d       n;|j                  s|j                  d       n|j                  s|j                  d       d|j                  vr|j                  d       |S )N)izMissing ID3 tagzID3 version not in %s)r!   zTag missing title)izTag missing artist)izTag missing albumr   )izTag missing track number   )izTag missing total # of tracks)r!   zTag missing any useful dates)zNo original release date)zNo release dates   TLEN)r$   zNo TLEN frame)tagversionPREFERRED_ID3_VERSIONSappendtitleartistalbum	track_numgetBestDateoriginal_release_daterelease_date	frame_set)r   r   r   scoresr%   s        r   r   zId3TagRules.test$   s'   ~~,--nn;;44MM3 7 6!7 8 9yyMM45zzMM56yyMM45}}QMM;<}}QMM@A MM?@,, ?@%%56 #--'MM/0r   Nr   r   r   r   r   r   #   s    'r   r   c                       e Zd ZddgZd Zy)BitrateRule)   i)   r#   c                     g }|sy |j                   sdgS |j                   j                  \  }}| j                  D ]#  \  }}||k  s|j                  |d|z  f        |S  |S )N)izNo audio data foundzBit rate < %d)infobit_rateBITRATE_DEDUCTIONSr(   )r   r   r   r1   is_vbrbitrate	thresholdscores           r   r   zBitrateRule.testQ   sw    011$//22 $ 7 7 	Iu"uo	&ABC	
 r   N)r   r   r   r9   r   r   r   r   r3   r3   N   s    $j1r   r3   )z	image/pngz	image/gifz
image/jpegc                       e Zd Zd Zy)FileRulec                     t        |      }t        j                  j                  |      D ]  }|j	                  d      sdgc S  |t
        vrdd|z  fgS y )N.)zHidden file typerB   zUnsupported file type: %s)r   osr   split
startswithVALID_MIME_TYPES)r   r   r   mtnames        r   r   zFileRule.testk   s_    4 GGMM$' 	4Ds#233	4 %%6;<==r   Nr   r   r   r   r?   r?   j   s    	r   r?   )coverzcover-frontz
cover-backc                       e Zd Zd Zy)ArtworkRulec                     t        |      }|rm|j                  d      r\t        j                  j	                  t        j                  j                  |            \  }}|t        vrddt        t              z  fgS y )Nzimage/r#   zArtwork file not in %s)r   rE   rC   r   splitextbasenameVALID_ARTWORK_NAMESstr)r   r   r   rG   rH   exts         r   r   zArtworkRule.test{   sr    4 "--)(()9)9$)?@ID#..6!"567 8 9 9 r   Nr   r   r   r   rK   rK   z   s    r   rK   c                       e Zd Zd Zy)Id3FrameRulesc                 Z   g }|r|j                   sy |j                   }|j                  D ]~  }|d   dk(  rF|dk7  rAt        |j                  |         dkD  r&|j                  dd|j	                  d      z  f       Q|t
        v sZ|j                  dd	|j	                  d      z  f        |S )
Nr   TTXXXr"   r#   zMultiple %s framesasciiiz%s frames are bad, mmmkay?)r%   r0   lenr(   decode
BAD_FRAMES)r   r   r   r1   r%   fids         r   r   zId3FrameRules.test   s    nn== 	5C1v}3s}}S7I3JQ3Ns$83::g;N$NOP
"s$@"zz'2%3 4 5		5 r   Nr   r   r   r   rS   rS      s    r   rS   c                   J     e Zd ZdZ fdZd Zd Zd Zd	dZd	dZ	d Z
 xZS )
Stattotalc                 X    t        t        | 
  |i | d| | j                  <   i | _        y Nr   )superr]   __init__TOTAL
_key_names)r   argskwargs	__class__s      r   rb   zStat.__init__   s,    dD"D3F3TZZr   c                 V    | | j                   xx   dz  cc<   | j                  ||       y Nr"   )rc   _computer   filer   s      r   computezStat.compute   s$    TZZAdJ'r   c                      y r   r   rk   s      r   rj   zStat._compute       r   c                 $    | j                          y r   )_report)r   s    r   reportzStat.report   s    r   c                      fd}i }t         j                               D ]  }|| ||      <    |sg|j                         D cg c]  }|s|	 }}|j                   j                         |j	                          |j                   j                         n j                         }g }g }|D ]X  \  }}| j                  k7  r|dkD  r|j                   ||             2| j                  k7  sB|j                   ||             Z |j	                          ||z   }|j                   j                         |D cg c]  }||   	 c}S c c}w c c}w )Nc                 B    | j                   v rj                   |    S | S r   )rd   )kr   s    r   keyDisplayNamez(Stat._sortedKeys.<locals>.keyDisplayName   s"    )*doo)=4??1%D1Dr   r   )listkeysremoverc   sortr(   most_common)	r   r{   rv   key_mapru   sorted_namesremainder_namesvrH   s	   `        r   _sortedKeyszStat._sortedKeys   s?   	E diik" 	+A)*GN1%&	+ '.||~;!A;L;

+

+**,KL O# >1

?q1u ''q(9:$**_#**>!+<=	>   "'/9L

+*67$77% <$ 8s   EE Ec                    | j                  |      }d}d}|D ]`  }|| j                  v r| j                  |   n|}t        |t        t	        |                  }t        |t        t	        | |                     }b |dz  }|dz  }|D ]  }|| j                  v r| j                  |   n|}t        |      t        u r|j                  d      }| |   }|r|dk7  r| j                  |      nd}	t        dj                  dt	        |      j                  |      t	        |      j                  |      |	r$d	t        j                  |	t        j                  fz  nd
              y )Nr{   r   r"   latin1r^    z{padding}{key}:{value}{percent}z    z ( %s%.2f%%%s ))paddingkeyvaluepercent)r   rd   maxrX   rP   typebytesrY   r   printformatljustrjustr	   GREENRESET)
r   r{   rx   key_col_widthval_col_widthr   ru   key_namer   r   s
             r   rq   zStat._report   sS   K8 	DC*-*@$//#&cCs3s8}=Ms3tCy>/BCM	D 	 	A-.$//-Atq)qHH~&#??84GE).1<dll1oRG3::M''6%j&&}518 *TZZ$**,MM>@ ;  	r   c                 B    t        | |         t        | d         z  dz  S )Nr^   d   )float)r   r   s     r   r   zStat.percent   s$    d3i 5g#773>>r   F)r   r   r   rc   rb   rm   rj   rr   r   rq   r   __classcell__rg   s   @r   r]   r]      s+    E
(8:4?r   r]   c                       e Zd Zd Zd Zy)	AudioStatc                 @    | dxx   dz  cc<   | j                  |       y )Nr^   r"   )rj   r   r   s     r   rm   zAudioStat.compute   s    Wj!r   c                      y r   r   r   s     r   rj   zAudioStat._compute   ro   r   N)r   r   r   rm   rj   r   r   r   r   r      s    "r   r   c                   >     e Zd ZdZdZdZdZ fdZd Z fdZ	 xZ
S )FileCounterStataudioaudio (unsupported)hiddenotherc                 B    t         t        |           dD ]  }d| |<   	 y )N)r   r   r   r   )ra   r   rb   )r   ru   rg   s     r   rb   zFileCounterStat.__init__   s(    ot-/; 	ADG	r   c                 ^   t        |      }|r| | j                  xx   dz  cc<   y |r)|j                  d      r| | j                  xx   dz  cc<   y t        j
                  j                  |      j                  d      r| | j                  xx   dz  cc<   y | | j                  xx   dz  cc<   y )Nr"   zaudio/rA   )	r   SUPPORTED_AUDIOrE   UNSUPPORTED_AUDIOrC   r   rN   HIDDEN_FILESOTHER_FILESr   rl   r   rG   s       r   rj   zFileCounterStat._compute   s    4 %%&!+&BMM(+''(A-(WWd#..s3""#q(#!!"a'"r   c                     t        t        j                  t        j                  z   dz   t        j
                  z          t        t        | #          y )NzFiles:)	r   r
   BRIGHTr	   YELLOW	RESET_ALLra   r   rq   r   rg   s    r   rq   zFileCounterStat._report  s3    ellT[[(83eooEFot,.r   )r   r   r   r   r   r   r   rb   rj   rq   r   r   s   @r   r   r      s,    O-LK

(/ /r   r   c                   $     e Zd Zd Z fdZ xZS )MimeTypeStatc                 4    t        |      }| |xx   dz  cc<   y ri   r   r   s       r   rj   zMimeTypeStat._compute  s    4 RAr   c                     t        t        j                  t        j                  z   dz   t        j
                  z          t        t        | #  d       y )NzMime-Types:Tr   )	r   r
   r   r	   r   r   ra   r   rq   r   s    r   rq   zMimeTypeStat._report  s8    ellT[[(=85??JKlD)d);r   r   r   r   rj   rq   r   r   s   @r   r   r     s    < <r   r   c                   .     e Zd Z fdZd Z fdZ xZS )Id3VersionCounterc                     t         t        |           t        D ])  }d| |<   t	        j
                  |      | j                  |<   + y r`   )ra   r   rb   ID3_VERSIONSr   versionToStringrd   )r   r   rg   s     r   rb   zId3VersionCounter.__init__  sB    /1 	8ADG!$!4!4Q!7DOOA	8r   c                 z    |j                   r"| |j                   j                  xx   dz  cc<   y | d xx   dz  cc<   y ri   )r%   r&   r   s     r   rj   zId3VersionCounter._compute  s0    >>''(A-(J!OJr   c                     t        t        j                  t        j                  z   dz   t        j
                  z          t        t        | #          y )NzID3 versions:)	r   r
   r   r	   r   r   ra   r   rq   r   s    r   rq   zId3VersionCounter._report#  s4    ellT[[(?:U__LM.0r   r   r   r   rb   rj   rq   r   r   s   @r   r   r     s    81 1r   r   c                   $     e Zd Zd Z fdZ xZS )Id3FrameCounterc                     |j                   rI|j                   j                  D ]/  }| |xx   t        |j                   j                  |         z  cc<   1 y y r   )r%   r0   rX   )r   r   frame_ids      r   rj   zId3FrameCounter._compute)  sK    >>&NN44 JX#jnn&>&>x&H"IIJ r   c                     t        t        j                  t        j                  z   dz   t        j
                  z          t        t        | #  d       y )NzID3 frames:Tr   )	r   r
   r   r	   r   r   ra   r   rq   r   s    r   rq   zId3FrameCounter._report.  s8    ellT[[(=85??JKot,,>r   r   r   s   @r   r   r   (  s    J
? ?r   r   c                   :     e Zd Z fdZd Z fdZd fd	Z xZS )BitrateCounterc           	         t         t        |           d| d<   d| d<   t        j                  dft        j                  dft        j                  dft        j                  dft        j                  dft        j                  d	ft        j                  d
ft        j
                  d
fg| _        | j                  D ]'  }d| |<   |\  }}dt        |   |fz  | j                  |<   ) y )Nr   cbrvbr`   p   r4      r5      i@  z%s %d)	ra   r   rb   operatorlegtbitrate_keys_OP_STRINGSrd   )r   ru   opr;   rg   s       r   rb   zBitrateCounter.__init__4  s    nd,.UU&kk2.&kk3/&kk3/&kk3/&kk3/&kk3/&kk3/&kk3/ "" 	FADGKB!(KOW+E!EDOOA	Fr   c                 &   |j                   t        k7  s|j                  | dxx   dz  cc<   y |j                  j                  \  }}|r| dxx   dz  cc<   n| dxx   dz  cc<   | j                  D ]  }|\  }} |||      s| |xx   dz  cc<    y  y )Nr^   r"   r   r   )r   r   r7   r8   r   )r   r   r   brr   key_opkey_brs          r   rj   zBitrateCounter._computeF  s    ??i':??+BMQM//**RK1KK1K$$ 	C NFFb&!S	Q			r   c                     t        t        j                  t        j                  z   dz   t        j
                  z          t        t        | #  d       y )NzMP3 bitrates:Tr   )	r   r
   r   r	   r   r   ra   r   rq   r   s    r   rq   zBitrateCounter._reportW  s8    ellT[[(?:U__LMnd++=r   c                     t         t        |   |      }|j                  d       |j                  d       |j	                  dd       |j	                  dd       |S )Nr   r   r   r   r"   )ra   r   r   ry   insert)r   r{   rx   rg   s      r   r   zBitrateCounter._sortedKeys[  sP    ^T6;6OEEAuAur   r   )r   r   r   rb   rj   rq   r   r   r   s   @r   r   r   3  s    F$"> r   r   c                        e Zd Z fdZ xZS )RuleViolationStatc                     t        t        j                  t        j                  z   dz   t        j
                  z          t        t        | #  d       y )NzRule Violations:Tr   )	r   r
   r   r	   r   r   ra   r   rq   r   s    r   rq   zRuleViolationStat._reporte  s:    ellT[[(+==OP.4.@r   )r   r   r   rq   r   r   s   @r   r   r   d  s    A Ar   r   c                   .     e Zd Z fdZd Z fdZ xZS )Id3ImageTypeCounterc                 \   t         t        |           i | _        t	        t
        j                        D ]`  }t        t
        j                  |      }t        |t              s.|j                  d      r@|j                  d      rR|| j                  |<   b | j                  D ]  }d| |<   	 y )N_TYPE_r   )ra   r   rb   rd   dirr   
ImageFramegetattr
isinstanceintendswithrE   )r   attrvalr   rg   s       r   rb   zId3ImageTypeCounter.__init__k  s    !413))* 	,D&++T2C#s#DMM',B4??[^K_'+$	,
  	ADG	r   c                     |j                   r3|j                   j                  D ]  }| |j                  xx   dz  cc<    y y ri   )r%   imagespicture_type)r   r   imgs      r   rj   zId3ImageTypeCounter._computew  s=    >>!~~,, ,S%%&!+&, r   c                     t        t        j                  t        j                  z   dz   t        j
                  z          t        t        | #          y )NzAPIC image types:)	r   r
   r   r	   r   r   ra   r   rq   r   s    r   rq   zId3ImageTypeCounter._report|  s5    ellT[[(+>>PQ!402r   r   r   s   @r   r   r   j  s    
,
3 3r   r   c                   <     e Zd ZdgZdZ fdZ fdZ fdZ xZS )StatisticsPluginstatsz0Computes statistics for all audio files scanned.c                    t         t        |   |       | j                  j	                  dddd       g | _        t               | _        | j
                  j                  t                      | j
                  j                  t                      | j
                  j                  t                      | j
                  j                  t                      | j
                  j                  t                      | j
                  j                  t                      d| _        d| _        i | _        t%               t'               t)               t+               t-               g| _        y )Nz	--verbose
store_trueFz0Show details for each file with rule violations.)actiondefaulthelpr   )ra   r   rb   	arg_groupadd_argument_statsr   _rules_statr(   r   r   r   r   r   r   
_score_sum_score_count
_rules_logr   r?   rK   r3   rS   _rules)r   
arg_parserrg   s     r   rb   zStatisticsPlugin.__init__  s    .z:##L%G 	$ 	I ,.?,-<>*,./?,-.01>+,"}z"}"}$	r   c                 x   t         t        |   |       | j                  j                  s=t
        j                  j                  d       t
        j                  j                          | j                  D ]W  }t        |t              r)| j                  s |j                  | j                         <|j                  || j                         Y | xj                  dz  c_        d}| j                  D ]  }|j!                  || j                        xs g }|s&|| j"                  vrg | j"                  |<   |D ]A  \  }}| j$                  |xx   dz  cc<   | j"                  |   j'                  ||f       ||z  }C  |dk7  r%| j$                  t(        j*                  xx   dz  cc<   | xj,                  |z  c_        y )NrA   r"   r   )ra   r   
handleFilere   quietsysstdoutwriteflushr   r   r   r   rm   r   r   r   r   r   r(   r]   rc   r   )	r   r   stattotal_scoreruler1   r=   textrg   s	           r   r  zStatisticsPlugin.handleFile  sg   06yyJJS!JJKK 	4D$	*??LL1T4??3	4 	QKK 
	)DYYtT__5;Ft.,.DOOD)#) )KE4$$T*a/*OOD)00%?5(K	)
	) #TZZ(A-(;&r   c                      j                   dk(  rt        t                   y t	                 j
                   j                  gz   D ]  }|j                          t	                  j                  j                  r} j                  D ]n  }t        |        j                  |   D ]O  \  }}t	        dt        j                   t        |      j                  d       t        j                    d| d       Q p  fd} |       \  }}t	        t"        j$                   dt"        j&                   d| | d	t        j                            j                  j                  st	        d
       t	                y )Nr   	   z ()c                      t        j                        t        j                        z  } | dkD  rt        j                  }| |fS | dkD  rt        j
                  }| |fS t        j                  }| |fS )NP   F   )r   r   r   r	   r   r   RED)scr   s     r   prettyScorez0StatisticsPlugin.handleDone.<locals>.prettyScore  sm    doo&t/@/@)AAA2vJJ
 a4K	 RKK a4K HHa4Kr   Scorez = z%%z9Run with --verbose to see files and their rule violations)_num_loadedra   r   
handleDoner   r   r   rr   re   verboser   r   r	   r  rP   centerr   r
   r   RESET_BRIGHT)r   r  r   r=   r
  r  colorrg   s   `      r   r  zStatisticsPlugin.handleDone  s6   q "D46KK4#3#3"44 	DKKMG	
 99 V#'??4#8 VKE4BtxxjU):):1)=(>tzzl"TFRSTUVV
	 #}ueE$6$6#7s5'%4::,WXyy  MNr   )	r   r   r   NAMESSUMMARYrb   r  r  r   r   s   @r   r   r     s$    IE@G6'@ r   r   )8rC   r  r   collectionsr   eyed3r   r   
eyed3.corer   eyed3.mimetyper   eyed3.utils.consoler	   r
   r   eyed3.pluginsr   	eyed3.id3r   ID3_V1_0ID3_V1_1ID3_V2_2ID3_V2_3ID3_V2_4r   r   ltger   eqner   r   r'   r   r3   
MIME_TYPESrF   r?   rO   rK   PRIVATE_FID
OBJECT_FIDrZ   rS   r]   r   r   r   r   r   r   r   r   r   r   r   r   <module>r2     s   	 
      ( 5 5 & cllcllCLL: {{D{{D{{D{{D{{D{{D$ $
 ,,,, 
($ (V$ , >> %& & 
t 
 = 	$ 	   &"3"34
D "J?7 J?Z /d /8<4 <1	 1$?i ?.Y .bA A3) 3.^| ^r   