
    "f                          d Z ddlZddlZddlZddlmZmZmZmZm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZ  ej        e          Z G d d	          ZdS )
z%Image EXIF metadata interface module.    N)AnyBinaryIODictListUnion)uint16)ATTRIBUTE_ID_MAPExifMarkers)generate_empty_app1_bytes)App1MetaDatac                   4    e Zd ZdZdeddfdZdeeeef         ddfdZ	de
e         fdZd	 Z fd
Z fdZd Zd Zd ZdeddfdZddZddededefdZdeeef         fdZdefdZdefdZedefd            Zde
e         fdZdeddfdZ xZS )ImagezImage EXIF metadata interface class.

    :param img_file: image file with EXIF metadata
    :type image_file: str (file path), bytes (already-read contents), or File

    	img_bytesreturnNc                    d}|||t          t          j                  z            t          j        k    rk|t          t          j                  z  }|t          |          k    r
d| _        d}n2|||t          t          j                  z            t          j        k    k|d |         | j        d<   |}| j        rt          j        ||dz   |dz                      }||dz   z  }|||dz            t          j        k    r;|dz  }|t          |          k    rd| _        n|||dz            t          j        k    ;| j        r3t          |||                   | j        d<   ||d          | j        d<   d S ||d          | j        d<   d S )	Nr   F   	preceding      APP1
succeeding)	lenr
   r   	_has_exif	_segmentsr   unpack
SEG_PREFIXr   )selfr   cursorapp1_start_indexapp1_lens        O/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/exif/_image.py_parse_segmentszImage._parse_segments   s    #k.>*?*?!??@KDTTTc+*+++FI&&!& #k.>*?*?!??@KDTTT '0&8{#!> 	}*Q.1AA1EEF H hl"F FVaZ/0K4JJJ!C	NN**%*DN FVaZ/0K4JJJ > 	H%1)<LV<S2T%U%UDN6"+4VWW+=DN<((( ,55E5F5F+GDN<(((    img_filec                    d| _         i | _        t          |d          r|                                }nt	          |t
                    r|}nkt          j                            |          r=t          |d          5 }|                                }d d d            n# 1 swxY w Y   nt          d          |                     |           d S )NTreadrbz0expected file object, file path as str, or bytes)r   r   hasattrr&   
isinstancebytesospathisfileopen
ValueErrorr"   )r   r$   r   file_descriptors       r!   __init__zImage.__init__?   s      	 8V$$ 	Q II%(( 	Q IIW^^H%% 	Qh%% 3+0022	3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 OPPPY'''''s   ;BB #B c                     g d}| j         rDt          | j        d         t                    sJ || j        d                                         z  }|S )N)	delete
delete_allgetget_allget_fileget_thumbnailhas_exiflist_allr   r   r   r)   r   r   get_tag_list)r   memberss     r!   __dir__zImage.__dir__T   s^    

 

 

 > 	=dnV4lCCCCCt~f-::<<<Gr#   c                 8    t          | j        d         |          S Nr   )getattrr   r   items     r!   __getattr__zImage.__getattr__g   s    t~f-t444r#   c                 z   	 t           |                                          | j        s*t          t	                                | j        d<   d| _        t          | j        d         |                                |           d S # t          $ r- t          t          |           
                    ||           Y d S w xY w)Nr   T)r	   lowerr   r   r   r   setattrKeyErrorsuperr   __setattr__)r   keyvalue	__class__s      r!   rJ   zImage.__setattr__j   s    		@SYY[[)) > &)56O6Q6Q)R)Rv&!%DN6*CIIKK?????  	7 	7 	7%**3666666	7s   B 3B:9B:c                     	 t           |          t          | j        d         |           d S # t          $ r, t	          t
          |                               |           Y d S w xY wr@   )r	   delattrr   rH   rI   r   __delattr__)r   rC   rM   s     r!   rP   zImage.__delattr__v   sv    	2T"" DN6*D11111  	1 	1 	1%**4000000	1s   - 2A#"A#c                 ,    |                      |          S N)rD   rB   s     r!   __getitem__zImage.__getitem__~   s    %%%r#   c                 2    |                      ||           d S rR   )rJ   )r   rK   rL   s      r!   __setitem__zImage.__setitem__   s    e$$$$$r#   c                 0    |                      |           d S rR   )rP   )r   rK   s     r!   __delitem__zImage.__delitem__   s    r#   	attributec                 &    t          | |           dS )zmRemove the specified attribute from the image.

        :param attribute: image EXIF attribute name

        N)rO   )r   rX   s     r!   r3   zImage.delete   s     	i     r#   c                    t          d          D ]}t          | j        d         t                    sJ | j        d                                         D ]E}|dvr?	 t          | |           # t          $ r  t          j        d|z   t                     Y Aw xY wF| 
                    |                                            dS )z$Remove all EXIF tags from the image.r   r   )_exif_ifd_pointer_gps_ifd_pointerexif_versionzcould not delete tag N)ranger)   r   r   r<   rO   AttributeErrorwarningswarnRuntimeWarningr"   r7   )r   _tags      r!   r4   zImage.delete_all   s    
 
 	2 	2A dnV4lCCCCC~f-::<< U UWWWUc****) U U U &=&C^TTTTTU X   1111	2 	2s   A++'BBdefaultc                 \    	 t          | |          }n# t          t          f$ r |}Y nw xY w|S )a  Return the value of the specified tag.

        If the attribute is not available or set, return the value specified by the ``default``
        keyword argument.

        :param attribute: image EXIF attribute name
        :param default: return value if attribute does not exist
        :returns: tag value if present, ``default`` otherwise
        :rtype: corresponding Python type

        )rA   r_   NotImplementedError)r   rX   re   retvals       r!   r5   z	Image.get   sI    	T9--FF 34 	 	 	FFF	 s    ))c                     i }|                                  D ]C}	 t          | |          }|||<   # t          $ r t                              d|           Y @w xY w|S )zCReturn dictionary containing all EXIF tag values keyed by tag name.zunable to read tag %r)r:   rA   	Exceptionloggerwarning)r   all_tagstag_name	tag_values       r!   r6   zImage.get_all   s     	/ 	/H/#D(33	 &/""  B B B6AAAAAB
 s   0%AAc                 ^   t          | j        d         t                    sJ | j        d         }| j        rDt          | j        d         t                    sJ || j        d                                         z  }t          | j        d         t                    sJ || j        d         z  }|S )zfGenerate equivalent binary file contents.

        :returns: image binary with EXIF metadata

        r   r   r   )r)   r   r*   r   r   get_segment_bytes)r   r   s     r!   r7   zImage.get_file   s     $.5u=====N;/	> 	DdnV4lCCCCC/AACCCI$.6>>>>>T^L11	r#   c                     d}	 | j         d         }t          |t                    sJ |j        }n# t          $ r Y nw xY w|st          d          |S )zExtract thumbnail binary contained in EXIF metadata.

        :returns: thumbnail binary
        :raises RuntimeError: image does not contain thumbnail

        Nr   z image does not contain thumbnail)r   r)   r   thumbnail_bytesrH   RuntimeError)r   rs   app1_segments      r!   r8   zImage.get_thumbnail   s~     	;>&1L lL99999*:OO	  	 	 	D	  	CABBBs   0 
==c                     | j         S )z<Report whether or not the image currently has EXIF metadata.)r   )r   s    r!   r9   zImage.has_exif   s     ~r#   c                     g }| j         rFt          | j        d         t                    sJ || j        d                             d          z  }|S )z*List all EXIF tags contained in the image.r   F)include_unknownr;   )r   	tags_lists     r!   r:   zImage.list_all   sW    	> 	TdnV4lCCCCC/<<U<SSSIr#   c                 (    t          | ||           dS )zSet the value of the specified attribute.

        :param attribute: image EXIF attribute name
        :param value: tag value
        :type value: corresponding Python type

        N)rG   )r   rX   rL   s      r!   setz	Image.set   s     	i'''''r#   )r   NrR   ) __name__
__module____qualname____doc__r*   r"   r   r   strr1   r   r>   rD   rJ   rP   rS   rU   rW   r3   r4   r   r5   r   r6   r7   r8   propertyboolr9   r:   r{   __classcell__)rM   s   @r!   r   r      s;        #H #H4 #H #H #H #HJ(%,-( 
( ( ( (*c    &5 5 5
@ 
@ 
@ 
@ 
@2 2 2 2 2& & &% % %  ! ! ! ! ! !2 2 2 2 S 3 #    &c3h    %    $u    , $    X$s)    (S (D ( ( ( ( ( ( ( (r#   r   )r   loggingr+   r`   typingr   r   r   r   r   plum.bigendianr   exif._constantsr	   r
   exif._app1_creater   exif._app1_metadatar   	getLoggerr|   rk   r    r#   r!   <module>r      s    + +  				  3 3 3 3 3 3 3 3 3 3 3 3 3 3 ! ! ! ! ! ! 9 9 9 9 9 9 9 9 7 7 7 7 7 7 , , , , , ,		8	$	$m( m( m( m( m( m( m( m( m( m(r#   