
    "f{\                        d 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mZ ddlmZmZmZmZmZ dd	lmZmZmZmZmZmZmZ dd
lmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z-  G d d          Z.dS )z-APP1 metadata interface module for EXIF tags.    N)List)Buffer)uint16)UnpackError)	pack_intovalue_fits_in_ifd_tag)ATTRIBUTE_ID_MAPATTRIBUTE_NAME_MAPATTRIBUTE_TYPE_MAPERROR_IMG_NO_ATTRExifMarkers)ExifTypeIfdIfdLeIfdTagIfdTagLeTiffByteOrder
TiffHeader)Ascii
BaseIfdTagByteExifVersionLongRationalShortSlong	SrationalSshortUserComment	WindowsXp)RationalDtype)SrationalDtype)%USER_COMMENT_CHARACTER_CODE_LEN_BYTESc                        e Zd ZdZd Zd Zd Zd ZdefdZ	dd	e
dee         fd
Zd Zd Zd Zd Z fdZd Z fdZ xZS )App1MetaDataz,APP1 metadata interface class for EXIF tags.c                    |dk    st          d|           d| j        vrt          d          | j        t          j        k    rt
          }nt          }| j        d | j        d                  }| j        | j        d         d          }t          g d          }||                                z  }t          |          }| j        d         |_
        |                    |          }|xj        |j        z  c_        |                                || j        d         | j        d         |j        z   <   t          |          }d|_
        |                    |          }	t          |	j                  D ]T}
|	j        |
         }t#          |          }|j        t&          d         fv s|s|xj        |j        z  c_        ||	j        |
<   Ut+          |	|d           ||z   | _        |                                  t/          j        | j        d	
          }||j        z  }| j        d         |j        z
  }|                     d|           d S )Ngpsz#only can add GPS IFD to image, not    z2can't yet add to images without a subsequent IFD 1r   tagsnextjpeg_interchange_formatdatatypebufferoffset   r0   _gps_ifd_pointer)RuntimeErrorifd_pointers
endiannessr   BIGr   r   
body_bytesipackr   r0   unpackr+   nbytesrangecountr*   r   tag_idr	   value_offsetr   _parse_ifd_segmentsr   viewheader_bytes_add_tag)selfifdifd_clsnew_app1_bytesbytes_after_new_ifd	empty_ifdnew_app1_bytes_bufferifd_zeroafter_new_ifd_bufferifd1	tag_indextag_tis_value_in_ifd_tag_itselfapp1_lenoffset_of_new_ifds                  W/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/exif/_app1_metadata.py_add_empty_ifdzApp1MetaData._add_empty_ifd6   sy   e||JSJJKKKD%%%STTT?m///GGG)?4+<Q+?)?@"od.?.B.D.DE Ra(((	)//+++ !'~ 6 6'+'8';$(//88)) NN 	a 4#4Q#7(/#II	

  &&9::&'##**733tz** 	) 	)IIi(E)>u)E)E&!12K!L MMM1 N ""i&66""#(DIi  4(;AFFFF )+>>  """ ;a
 
 
 	I$$ !-a093CC(*;<<<<<    c                     	 t           |         \  }n!# t          $ r t          d| d          w xY w j        t          j        k    rt          }t          }nt          }t          } j
        vr                                 fd j
                                        D             }t           fd j
                                        D                       }|j        }d}	d}
|t           j        k    r%t%          |          dk    rt%          |          dz   }	|t           j        k    rt%          |          dz   }
|t           j        k    r6t)          |t*                    rt%          |          }
nd}
|
t,          j        z  }	|t           j        k    r|
t0          j        z  }	|dk    rGt2          t%          |          z   dz   }
t%          |          dk    rt2          t%          |          z   dz   }	||	z  } j        d  j
                          }dk    rt7          |          } j
        d         |_        |                    |          }|j        rd|v r|xj        |z  c_        t?          |j                   D ]b}|j!        |         }|j"        tF          d	         k    od
|v }||j"        tF          d         k    od|v z  }|r|xj$        |z  c_$        ||j!        |<   ctK          || j
        d                    d|v rd|vrt7          |          } j
        d         |_        |                    |          }t?          |j                   D ]E}|j!        |         }|j"        tF          d         k    od|v }|r|xj$        |z  c_$        ||j!        |<   FtK          || j
        d                     j
                 }t7           j                  }||_        |                    |          }|r|d         nt%           j                  }|dz   |j         dz  z   dz   }t?          |j                   D ]}|j!        |         }tM          |          }|j"        tF          d         fv s|sfd}|j'        t           j        k    rt,          j        }|j'        t           j        k    rt0          j        }|j$        |j(        |z  z   }tS          ||          } j        ||j        z   |         } j        ||         }|t           j        k    rt%          |          dk    s3|t           j        t           j        fv s|dk    rt%          |          dk    r||j        z   }n|d	k    r||z  }|}nd}t?          |j                   D ]}|j!        |         }|j"        tF          d	         k    od
|v }||j"        tF          d         k    od|v z  }tM          |          }|r|xj$        |z  c_$        n|s|xj$        |j        z  c_$        ||j!        |<   |xj         dz  c_         |j!        *                     |tF          |         ||
|                     |j        r|xj        |z  c_        |+                                ||||j        z   <   ||z  }|d|	z  z  }||z  }|r<|,                    d          }t7           j                  }||_        |                    |          }|r j        ||j        z   |d                  }n j        ||j        z   d          }t?          |j                   D ]u}|j!        |         }tM          |          }|j"        tF          d         fv s|s|xj$        |z  c_$        n%|j"        tF          d         fv r|xj$        |z  c_$        ||j!        |<   v|j        r|xj        |z  c_        ||+                                z  }||z  }|<t[          j.         j/        d          }||z  }| _         0                                  j1        tF          |                  2                    |           |dk    r, j1        tF          |                  3                                 d S d S )Nzcannot add attribute z	 to imagec                 <    g | ]\  }}|j                  k    |S  r5   ).0rE   r0   
ifd_numberrD   s      rS   
<listcomp>z)App1MetaData._add_tag.<locals>.<listcomp>   s:      
  
  
V)*555 555rU   c                 6    g | ]}|j                  k    |S rX   rY   )rZ   r0   r[   rD   s     rS   r\   z)App1MetaData._add_tag.<locals>.<listcomp>   s6       D-j999 999rU   r   r(      user_commentr3   r'   _exif_ifd_pointerexifr-   interopt_interoperability_ifd_Pointerr1      r,   r>   typevalue_countr?       r2   )4r   KeyErrorAttributeErrorr6   r   r7   r   r   r   r   r5   rT   itemssortedvaluesr;   r   ASCIIlenRATIONAL
isinstancetupler!   	SRATIONALr"   r#   r8   r   r0   r:   r+   r<   r=   r*   r>   r	   r?   r   r   rf   rg   maxappendr9   popr   rA   rB   r@   ifd_tagsmodifyset_character_code_to_ascii) rD   tagvaluetag_typerF   ifd_tag_clssubsequent_ifd_namessubsequent_ifd_offsetsadded_bytespointer_value_bytesrg   rG   new_app1_bufferrK   rN   rO   is_ifd_pointer_to_adjustifd_exiftarget_ifd_offsetbody_bytes_buffer
target_ifdtarget_ifd_endtarget_ifd_tail_startrP   itemsizetag_data_endorig_ifd_valuesorig_ifd_values_tailvalue_pointercurrent_ifd_offsetrQ   r[   s    `                              @rS   rC   zApp1MetaData._add_tags   s
   	I#5c#: Hjj 	I 	I 	I !G!G!G!GHHH	I ?m///G KKG"KT...
+++ 
  
  
  
  
#06688 
  
  

 "(    "/6688  "
 "
 "(x~%%#e**//"%e**q.x~%%e**q.Kx(((%''  !%jj"-0D"Dx)))"-0E"E >!!?#e**LqPK5zzQ9CJJFJ $ 	** )H4+<Z+H)HI ??$^44O%)%6q%9O"&--g66H} -&:!:!:, #8>22 1 1	 i0 L$45G$HH 6!55 ) )L$45H$II 7"66(
 , 6&&+5&&+0i((!.ARSTAU   
 ---&@T2T2T$^44O%)%6v%>O"&--g66H"8>22 
1 
1	 i0L$45T$UU ;"&:: )
 , 6&&+5&&+0i((!%(0    !-j9"4?33#4 &--g66
 &&"1%%T_%% 	 !2A 5
8H28M MPQ Qz/00 	Q 	QIOI.E)>u)E)E&!12K!L MMM1 N :!222,3H:!333-4H$1E4E4PP(+,A<(P(P% /
 114II
  $/D^/ST ''CJJ!OOH-x/ABBB~%%#e**//1K4FFMM&&& [ E!MMM z/00 	/ 	/IOI.E  01C DD 211 % % 01D EE 322$
 *?u)E)E&' 9""k1"""/ 9""k&88"").JOI&& 	AK','*	  	
 	
 	
 ? 	+OO{*OO
  	 1J4E EE	
 	/)'$777.. % #	.!7!;!;A!>!> &t 7 7'9$*11'::J% "&/&)::=STU=VV# #'/&)::<<# #:#344 3 3	"	2-B5-I-I*L%56O%P$QQQ5 R &&+5&&&\$%DE&   &&+5&&-2
	** /;.j..000No-NG % #	.L ;a
 
 
 	K )  """&s+,33E::: .  M*3/0LLNNNNN ! s    3c                 >   | j                                                   | j        | j                          }| j        t
          j        k    rt          }nt          }t          | j
                  }||_        |                    |          }fd|j        D             } |||j                  }t          || j
        |           t          t!          dddd          | j
        ||j        z              | j         = | j        = |                                  d S )Nc                 *    g | ]}|j         k    |S rX   )r>   )rZ   rz   attribute_ids     rS   r\   z0App1MetaData._delete_ifd_tag.<locals>.<listcomp>  s%    UUU##*:T:T#:T:T:TrU   r)   r-   r   re   )rw   wiper5   tag_parent_ifdr6   r   r7   r   r   r   r8   r0   r:   r*   r+   r   r   r;   r@   )rD   r   corresponding_ifd_offsetrF   r   orig_ifdpreserved_tagsnew_ifds    `      rS   _delete_ifd_tagzApp1MetaData._delete_ifd_tag  s@   l#((*** $(#4T5H5V#W ?m///GGG"4?33#; $++G44 VUUUUUU'~HMBBB 	T_=U	
 	
 	
 	
 	11!!LLL?+gn<	
 	
 	
 	
 M,'- 	  """""rU   c                 B   d| j         v r| j        | j         d         d          }	 |                    t          j                  }|                    t          j                  t          t          j                  z   }|||         | _        d S # t          $ r Y d S w xY wd S )Nr(   )	r5   r8   indexr   SOIEOIro   thumbnail_bytes
ValueError)rD   hex_after_ifd1start_index	end_indexs       rS   _extract_thumbnailzApp1MetaData._extract_thumbnail  s    !!!!_T->q-A-C-CDNM,22;?CC*00AACDXDXX	 (6k)6K'L$$$     "!s   AB 
BBreturnc                 T    t          | j                  t          | j                  z   S )z"Get equivalent APP1 segment bytes.)bytesrB   r8   )rD   s    rS   get_segment_byteszApp1MetaData.get_segment_bytes  s"    T&''%*@*@@@rU   Tinclude_unknownc                     |rd | j         D             }n=g }| j         D ]3}	 |                    t          |                    $# t          $ r Y 0w xY w|S )z>Get a list of EXIF tag attributes present in the image object.c                 @    g | ]}t          j        |d | d          S )z<unknown EXIF tag >)r
   get)rZ   keys     rS   r\   z-App1MetaData.get_tag_list.<locals>.<listcomp>  sA        #&s,G,G,G,GHH  rU   )rw   ru   r
   ri   )rD   r   tag_listr   s       rS   get_tag_listzApp1MetaData.get_tag_list  s     	 =  HH H}  OO$6s$;<<<<   D s    A
AAc                    | j         |         }| j        t          j        k    rt          }nt
          }	 t          | j                  }||_        |	                    |          }t          |j                  D ]}|dz   |t          j        z  z   }|j        |         }|                     ||          }	|dk    s|j        | j        vr|	| j        |j        <   || j        |j        <   |j        t&          d         k    r|j        | j         d<   |j        t&          d         k    r|j        | j         d<   |j        t&          d         k    r|j        | j         d<   |j        }
n/# t,          $ r" t/          j        d	| t2                     d
}
Y nw xY w|
S )Nr1   r(   r`   ra   r3   r'   rc   rb   zskipping bad IFD r   )r5   r6   r   r7   r   r   r   r8   r0   r:   r<   r=   r   r;   r*   _tag_factoryr>   rw   r   r	   r?   r+   r   warningswarnRuntimeWarning)rD   ifd_key
ifd_offsetrF   r   ifd_trN   
tag_offsetrO   
tag_py_insnext_ifd_offsets              rS   _iter_ifd_tagszApp1MetaData._iter_ifd_tags  s   &w/
?m///GGG	) &t 7 7'1$%,,W55E
 #5;// G G	NY%>>  
9-!..ujAA
 qLLEL$E$E2<DM%,/8?D'5<#34G#HHH050BD%f-<#34F#GGG/4/AD%e,<#34S#TTT494FD%j1#jOO5  	  	  	 M7g77HHHOOO	 8 s   0E )FFc                 X   t          | j                  }|                    t                    }|j        | _        d}|j        }|r&|| j        |<   |                     |          }|dz  }|&d| j        v r|                     d           d| j        v r|                     d           d S d S )Nr   r(   ra   r'   )	r   r8   r:   r   
byte_orderr6   r   r5   r   )rD   r   tiff_headercurrent_ifdr   s        rS   r@   z App1MetaData._parse_ifd_segments  s    "4?33'..z::%0(3  	-?Dk*!%!4!4[!A!A1K ! 	
 T&&&'''D%%%&&&&& &%rU   c                    t           d         |j        cxk    rt           d         k    rn n	t          }n,t           d         |j        k    r	t          }nt           d         |j        k    rt          }n|j        t          j        k    rt          }n|j        t          j	        k    rt          }n|j        t          j        k    rt          }n|j        t          j        k    rt          }n{|j        t          j        k    rt           }n^|j        t          j        k    rt$          }nA|j        t          j        k    rt(          }n$|j        t          j        k    rt,          }nt.          } |||           S )Nxp_title
xp_subjectexif_versionr_   )r	   r>   r    r   r   rf   r   BYTEr   rn   r   SHORTr   LONGr   rp   r   SLONGr   rs   r   SSHORTr   r   )rD   rO   r0   clss       rS   r   zApp1MetaData._tag_factory  sH   Z(|. . . .-. . . . . CC^,<<CCn-==CCZ8=((CCZ8>))CCZ8>))CCZ8=((CCZ8,,,CCZ8>))CCZ8---CCZ8?**CCCs64   rU   c                    t          |d d                   | _        t          |dd                    | _        d | _        i | _        i | _        i | _        d | _        |                                  | 	                                 d S )N
   )
	bytearrayrB   r8   r6   r5   rw   r   r   r@   r   )rD   segment_bytess     rS   __init__zApp1MetaData.__init__.  s    %mDSD&9::#M#$$$788 #  """!!!!!rU   c                 <   	 t           |         }	 | j        |          n/# t          $ r" t          t	          j        |                    w xY w|                     |           d S # t          $ r, t          t          |           	                    |           Y d S w xY w)N)
r	   rw   ri   rj   r   formatr   superr%   __delattr__)rD   itemr   	__class__s      rS   r   zApp1MetaData.__delattr__;  s    	/+D1LEl+++ E E E$%6%=d%C%CDDDE   .....  	8 	8 	8 ,%%11$777777	8s   A%  ,A%2BBc                 (   	 t           |                                         }n # t          $ r t          d|           w xY w	 | j        |         }n/# t          $ r" t          t          j        |                    w xY w|                                S )zSIf attribute is not a class member, get the value of the EXIF tag of the same name.zunknown image attribute )r	   lowerri   rj   rw   r   r   read)rD   r   r   ifd_tags       rS   __getattr__zApp1MetaData.__getattr__L  s    	D+DJJLL9LL 	D 	D 	D !BD!B!BCCC	D	AmL1GG 	A 	A 	A !2!9$!?!?@@@	A ||~~s   " ?A ,A=c                 $   	 t           |         }	 | j        |         }	 |                    |           d S # t          $ rn}	 t          |         d         }n# t
          $ r |w xY w|t          j        k    r,|                     |           | 	                    ||           n|Y d }~d S d }~ww xY w# t
          $ r | 	                    ||           Y d S w xY w# t
          $ r- t          t          |                               ||           Y d S w xY w)Nr   )r	   rw   rx   r   r   ri   r   rn   r   rC   r   r%   __setattr__)rD   r   r{   r   r   excattr_exif_typer   s          rS   r   zApp1MetaData.__setattr__Z  sh   	"+C0L
"-5
"NN5)))))! 
" 
" 
"");C)@)C# " " "!	" &77,,\:::c51111!	 211111
"  * * *c5))))))*  	> 	> 	>,%%11#u======	>sJ   C B1 6 
B.AB)A""AB))B.1 CC3DD)T)__name__
__module____qualname____doc__rT   rC   r   r   r   r   boolr   strr   r   r@   r   r   r   r   r   __classcell__)r   s   @rS   r%   r%   2   s7       66;= ;= ;=zSO SO SOj## ## ##J	M 	M 	MA5 A A A A D DI    &( ( (T' ' '& !  !  !D" " "/ / / / /"  " " " " " " " " "rU   r%   )/r   r   typingr   plum.bufferr   plum.bigendianr   plum.exceptionsr   exif._utilsr   r   exif._constantsr	   r
   r   r   r   exif._datatypesr   r   r   r   r   r   r   exif.ifd_tagr   r   r   r   r   r   r   r   r   r   r   r    exif.ifd_tag._rationalr!   exif.ifd_tag._srationalr"   exif.ifd_tag._user_commentr#   r%   rX   rU   rS   <module>r      s   3 3              ! ! ! ! ! ! ' ' ' ' ' ' 8 8 8 8 8 8 8 8                                                          1 0 0 0 0 0 2 2 2 2 2 2 L L L L L LB	" B	" B	" B	" B	" B	" B	" B	" B	" B	"rU   