
    M@c&                     8   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 d dlmZ d d	lmZ d d
lmZmZmZmZ dZi ad Z	 d dlZd dlZd dlmZ dZdZ G d de"      Z# G d de      Z$d Z%d Z&d Z'd Z(y# e $ rZ!dZe!ZY dZ![!1dZ![!ww xY w)    N)Path)art)log)guessMimetype)LoaderPlugin)VARIOUS_ARTISTS)
ImageFrame)makeUniqueFileName)printMsgprintWarningcformatForez
filename: c                     d|  dS )NzMissing dependencies z/.  Install with `pip install eyeD3[art-plugin]` )missings    3/usr/lib/python3/dist-packages/eyed3/plugins/art.py_importMessager      s    "7)+Z[[    )getAlbumArtTFc                   2    e Zd Zd Zed        Zed        Zy)ArtFilec                     t        j                  |      | _        || _        | j                  r t         j                  | j                     d   nd | _        d | _        d | _        y )Nr   )r   matchArtFileart_type	file_pathTO_ID3_ART_TYPESid3_art_type	_img_data
_mime_type)selfr   s     r   __init__zArtFile.__init__#   sT    ((3" $ !11$--@C37 	r   c                     | j                   r| j                   S t        | j                  d      5 }|j                         | _         d d d        | j                   S # 1 sw Y   | j                   S xY w)Nrb)r   openr   read)r    fs     r   
image_datazArtFile.image_data+   sT    >>>>!$..$' 	&1VVXDN	&~~	&~~s   AA-c                 ~    | j                   r| j                   S t        | j                        | _         | j                   S N)r   r   r   r    s    r   	mime_typezArtFile.mime_type3   s-    ????"'7r   N)__name__
__module____qualname__r!   propertyr'   r+   r   r   r   r   r   "   s/        r   r   c                   L     e Zd ZdZdZdgZ fdZ fdZd Z fdZ	d Z
 xZS )		ArtPluginzArt for albums, artists, etc. r   c                    t         t        |   |dd       d| _        | j                  }|j                  dddd       |j                  d	d
dd       d}|j                  ddd|       |j                  dddd       y )NT)cache_filestrack_imagesr   z-Fz--update-files
store_truez Write art files from tag images.)actionhelpz-Tz--update-tagszWrite tag image from art files.z)Attempt to download album art if missing.z-Dz
--downloadz-vz	--verbosez,Show detailed information for all art found.)superr1   r!   _retval	arg_groupadd_argument)r    
arg_parsergdl_help	__class__s       r   r!   zArtPlugin.__init__@   s    i'
59 	( 	;NN	t-l> 	 	@	t_\= 	 	?=	t\,WM	t[J 	 	Lr   c                     t         s:t        t        j                  g      }t	        j
                  |       t        |      |j                  r|j                  rt        d      t        t        | 3  ||       y )Nz\The --update-tags and --update-files options are mutually exclusive, use only one at a time.)_PLUGIN_ACTIVEr   _IMPORT_ERRORnamer   criticalRuntimeErrorupdate_filesupdate_tagsStopIterationr9   r1   start)r    argsconfigerr_msgr@   s       r   rJ   zArtPlugin.startO   sh    $m&8&8%9:GLL!w''!1!1   !( ) ) 	i$T62r   c                 H    | j                   j                  rt        |       y y r)   )rK   verboser   )r    ss     r   _verbosezArtPlugin._verbose\   s    99QK r   c                    t         j                          | j                  st        j                  | d       y 	 t        | j                  D cg c]  }|j                  s|j                   c}d       }t        t        |D cg c]  }|j                   c}            dkD  r/t        j                  d| d       	 t        t        | 3  ||       y t        t        dt        j                         |z          g }| j"                  D ]  }t$        j&                  j)                  |      }t+        |      }		 t-        |      }
|	j4                  r?| j7                  d| d	|	j4                   d
t9        |
              |j;                  |	       | j7                  d| d        |s9t=        t        dt        j>                               | xj@                  dz  c_         n#t=        t        dt        jB                               |sc| jD                  jF                  rL|d   }t        |D cg c]  }|jH                   c}      }t        |      dkD  rtJ        }n|jL                  xs |jH                  }	 tO        ||j                        }t=        d       tQ        jR                  |      }|jT                  dk7  r
tW               	 t-        tY        jZ                  |j\                              }t_        |      dja                  |j`                  jc                               z  }|je                         rJ |jg                  t3        |             t=        dja                  |             |D ]  }t$        j&                  j)                  |jh                  jj                        }|jl                  D ]d  }	 t-        |      }
t9        |
      }|jp                  tr        jt                  v rtr        jt                  |jp                     }| j7                  d|d	|d|jv                  d|       | jD                  jx                  s| jD                  jz                  rJ t$        j&                  j}                  |jh                  jj                        }|jv                  j                  t              rM|jv                  t        t              d  j                         }t$        j&                  j                  |      d   }n%tr        j                  |   d   j                  d      }|j                  |      }t        t$        j&                  j                  ||            t        |j                        k(  rt        d|z         t        t$        j&                  j                  ||      |jv                        }t1        d|z         t        |d      5 }|j                  |j                         d d d        E| j7                  d||jp                  fz         g  | jD                  jz                  r| jD                  jx                  rJ |D ]  }|D ]  }	t$        j&                  j)                  |	j                        }t        d|d |	j                  d!       d"t$        j&                  j                  |      d   z  }|jl                  j                  |	j                  |	j                  |	j                  |#        |jg                           t        t        | 3  ||       y c c}w c c}w # t.        $ r}t1        t3        |             Y d }~Dd }~ww xY wc c}w # tV        $ r t=        d       Y 	w xY w# tn        $ r}t1        t3        |             Y d }~d }~ww xY w# 1 sw Y   xY w# t        t        | 3  ||       w xY w)$Nz: nothing to do.c                 .    | j                   j                  S r)   )	file_inforD   )xs    r   <lambda>z+ArtPlugin.handleDirectory.<locals>.<lambda>j   s    AKK,<,< r   )key   zSkipping directory 'z', non-album.z
Checking: zfile z: z
	z: unknown (ignored)NONEOKr   zDownloading album art...   zcover.{}zSave {cover})coverzAlbum art download not foundztag z (Description: z)
	*)rD   z<Skipping writing of %s, file exists and is exactly the same.)uniqzWriting %s...wbz)tag %s: unhandled image type %d (ignored)zCopying z	 to tag 'z' imagezfilename: %s)description)Omd5_file_cacheclear_file_cacher   debugsortedtaglensetalbumr9   r1   handleDirectoryr   r   r   BLUE_dir_imagesospathbasenamer   pilImageIOErrorr   strr   rQ   pilImageDetailsappendprintREDr:   GREENrK   downloadartistr   album_artistr   requestsgetstatus_code
ValueErrorioBytesIOcontentr   formatlowerexistssaverT   rD   imagesOSErrorpicture_typer   FROM_ID3_ART_TYPESr`   rG   rH   dirname
startswithDESCR_FNAME_PREFIXstripsplitext	FILENAMESmakeFileNamemd5Filejoinmd5Datar'   r
   r$   writer   r   r+   )r    d_r&   all_tagstdir_artimg_fileimg_baseart_filepil_imgexrf   artistsartist_queryurlrespimgr\   	file_basepil_img_detailsimg_typern   fnamefpart_pathdescrr@   s                              r   rj   zArtPlugin.handleDirectory`   sT   II+,-z	9d.>.>H!%%quuH"<>H 32A234q8		0=ABf )T21a8c W^TYY7!;< G ,, I77++H5"8,&x0G
 $$MMzH,=,=+>d?SZC[B\]_NN8,MME(3F"GHI  gfdhh/0!gdDJJ/0 tyy11qk:Aqxx:;w<!##2L#&#3#3#AszzL>%lCII>C45#<<,D''3.(l* /
 #2::dll#;<C Gj&7&7

8H8H8J&KKE$||~--HHSZ(.//e/<=   +GG,,S]]-?-?@	:: )C!"*3-*9'*B
 ''3+A+AA#&#9#9#:J:J#K'0(COO'6'8 9  9911'+yy'<'<=#<#%77??3==3E3E#FD"99:LM(+*-.@*A*B)DDIEG !&(*(8(8(?(B(+h(?(B(H(H(M$'$4$4%$4$@E 'T5(A B$+CNN$;!< ( *K).*/ !0 ,>$&GGLLu$=),,: !-_x-G H%)(D%9 !=R$&HHS^^$<!= != G&(8(89:M)+\ yy$$991121# 
C$+ :#%77#3#3H4F4F#G "*H,A,A"C D !/1A1A(1KA1N N

x'<'<'/':':H<N<N38 ' :: HHJ
 )T21a8s I 3   R)( ; " :89:  # !$SW- !>!= !=2 )T21a8s   ^/ \"!\"/^/ \''^/ A!^/ 9\,C(^/ ,]?6^/ 6A] C-^/ 4]7
A7^/ F^/ ^"*D#^/ "
^/ ,	]5]	^/ ]^/ ]40^/ 3]44^/ 7	^ ^^/ ^^/ "^,'^/ /_c                     | j                   S r)   )r:   r*   s    r   
handleDonezArtPlugin.handleDone   s    ||r   )r,   r-   r.   SUMMARYDESCRIPTIONNAMESr!   rJ   rQ   rj   r   __classcell__)r@   s   @r   r1   r1   ;   s0    -GKGEL3B9Hr   r1   c                     ddl m} t        | t              r.|j	                  t        j                  | j                              S |j	                  |       S )Nr   )Image)PILr   
isinstancer	   r$   r   r   r'   )sourcer   s     r   rp   rp      s<    &*%zz"**V%6%6788zz&!!r   c                     | rRd| j                   d   | j                   d   | j                  j                         t        | j	                               fz  S dS )Nz[%dx%d %s md5:%s]r   rX   r2   )sizer   r   r   tobytes)r   s    r   rs   rs      sX     >A #((1+sxx{"%**"2"2"4")#++-"8": : IFHIr   c                 l    t        j                         }|j                  |        |j                         S r)   )hashlibmd5update	hexdigest)datar   s     r   r   r      s%    
++-CJJt==?r   c                 ,   | t         v r	t         |    S t        j                         }	 t        | d      5 }|j	                  |j                                ddd       |j                         t         | <   t         |    S # 1 sw Y   )xY w# t        $ r Y yw xY w)z/Compute md5 hash for contents of ``file_name``.r#   N)ra   r   r   r$   r   r%   r   rq   )	file_namer   r&   s      r   r   r      s     N"i((
++-C)T" 	!aJJqvvx 	! %(MMOy!i((		! 	!
  s(   B  A;'B ;B B 	BB))r   rm   r   pathlibr   eyed3.utilsr   eyed3r   eyed3.mimetyper   eyed3.pluginsr   
eyed3.corer   eyed3.id3.framesr	   r
   eyed3.utils.consoler   r   r   r   r   ra   r   r   r{   eyed3.plugins.lastfmr   rB   rC   ImportErrorr   objectr   r1   rp   rs   r   r   r   r   r   <module>r      s    	 	     ( & & ' * E E! \0NMf 2j jZ"IA  NMs   B BBB