
    gz                     b   d dl Z d dlZ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
Z
d dl
mZ d dl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 Zd Zd	 Zd
 Zd Zd Zd Zd Z d Z!d Z"dQdZ#d Z$d Z%dRdZ&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/	 dSdZ0dTdZ1d  Z2dTd!Z3d" Z4d# Z5d$ Z6d% Z7d& Z8d' Z9d( Z:d) Z;d* Z<d+ Z=d, Z>d- Z?d. Z@d/ ZAd0 ZBd1 ZCd2 ZDd3 ZEd4 ZFd5 ZGd6 ZHd7 ZId8 ZJd9 ZKd: ZLd; ZMd< ZNd= ZOd> ZPd? ZQd@ ZRdA ZSdB ZTdC ZUdD ZVdE ZWdF ZXdG ZYdH ZZdI Z[dJ Z\dK Z]dL Z^dM Z_dQdNZ`dQdOZadQdPZby)U    N)string_types)	HTTPError)utils)call_apicall_metadata_apicall_json_api_call_v2_api)
BadRequestAuthorizationRequired
NotAllowedNotFoundAlreadyExistsRateLimitedGeneralErrorc                       t        ddgi fi | S )Ngetpingr   optionss    #/opt/Tautulli/lib/cloudinary/api.pyr   r      s    EF8R3733    c                      | j                  dd      }dg}|r@t        |t        j                        rt	        j
                  |      }|j                  |       t        d|i fi | S )a  Get account usage details.

    Get a report on the status of your Cloudinary account usage details, including storage, credits, bandwidth,
    requests, number of resources, and add-on usage. Note that numbers are updated periodically.

    See: `Get account usage details
    <https://cloudinary.com/documentation/admin_api#get_account_usage_details>`_

    :param options:     Additional options
    :type options:      dict, optional
    :return:            Detailed usage information
    :rtype:             Response
    dateNusager   )pop
isinstancedatetimer   r   encode_date_to_usage_api_formatappendr   )r   r   uris      r   r   r   #   s\     ;;vt$D)CdHMM*88>D

4E3.g..r   c                  8    t        | d      }t        ddg|fi | S )z
    Get account config details.

    :param options:     Additional options.
    :type options:      dict, optional
    :return:            Detailed config information.
    :rtype:             Response
    settingsr   configonlyr   r   paramss     r   r$   r$   :   s&     ':&FEH:v999r   c                       t        ddgi fi | S )Nr   	resourcesr   r   s    r   resource_typesr+   G   s    EK="888r   c                      | j                  dd      }| j                  dd       }d|g}|r|j                  |       t        di | }|j                  t	        | dd             t        d||fi | S )	Nresource_typeimagetyper*   prefixstart_atr    )r   r    __list_resources_paramsupdater&   r   r   r-   upload_typer!   r(   s        r   r*   r*   K   sq    KK9M++fd+K
&C

;$/w/F
MM$w*56E32'22r   c                 d    |j                  dd      }d|d| g}t        di |}t        d||fi |S )Nr-   r.   r*   tagsr   r2   r   r3   r   tagr   r-   r!   r(   s        r   resources_by_tagr<   V   sA    KK9Mvs
3C$/w/FE32'22r   c                 f    |j                  dd      }d|d| |g}t        di |}t        d||fi |S )Nr-   r.   r*   moderationsr   r2   r9   )kindstatusr   r-   r!   r(   s         r   resources_by_moderationrA   ]   sC    KK9M}dF
CC$/w/FE32'22r   c                     |j                  dd      }|j                  dd      }d||g}t        t        di ||       }t        d||fi |S )	Nr-   r.   r/   uploadr*   
public_idsr   r2   )r   dict__resources_paramsr   rE   r   r-   r6   r!   r(   s         r   resources_by_idsrI   d   sW    KK9M++fh/K{
3C$/w/JGFE32'22r   c                 F    ddg}t        di |}| |d<   t        d||fi |S )an  
    Returns the details of the resources (assets) under a specified asset_folder.

    :param asset_folder:    The Asset Folder of the asset
    :type asset_folder:     string
    :param options:     Additional options
    :type options:      dict, optional
    :return:            Resources (assets) of a specific asset_folder
    :rtype:             Response
    r*   by_asset_folderasset_folderr   r2   )r3   r   )rL   r   r!   r(   s       r   resources_by_asset_folderrM   l   s:     )
*C$/w/F)F>E32'22r   c                 R    ddg}t        t        di ||       }t        d||fi |S )a  Retrieves the resources (assets) indicated in the asset IDs.
    This method does not return deleted assets even if they have been backed up.

    See: `Get resources by context API reference
    <https://cloudinary.com/documentation/admin_api#get_resources>`_

    :param asset_ids:   The requested asset IDs.
    :type asset_ids:    list[str]
    :param options:     Additional options
    :type options:      dict, optional
    :return:            Resources (assets) as indicated in the asset IDs
    :rtype:             Response
    r*   by_asset_ids)	asset_idsr   r2   )rF   rG   r   )rP   r   r!   r(   s       r   resources_by_asset_idsrQ   }   s7     
'C$/w/9EFE32'22r   c                 z    |j                  dd      }d|dg}t        di |}| |d<   |||d<   t        d||fi |S )	a  Retrieves resources (assets) with a specified context key.
    This method does not return deleted assets even if they have been backed up.

    See: `Get resources by context API reference
    <https://cloudinary.com/documentation/admin_api#get_resources_by_context>`_

    :param key:         Only assets with this context key are returned
    :type key:          str
    :param value:       Only assets with this value for the context key are returned
    :type value:        str, optional
    :param options:     Additional options
    :type options:      dict, optional
    :return:            Resources (assets) with a specified context key
    :rtype:             Response
    r-   r.   r*   contextkeyvaluer   r2   r9   )rT   rU   r   r-   r!   r(   s         r   resources_by_contextrV      sY      KK9My
1C$/w/FF5MwE32'22r   c                      t        | dddd      }| j                  d      xr+ t        j                  t        j                  | d               |d<   |S )
       Prepares optional parameters for resources_* API calls.

       :param options: Additional options
       :return: Optional parameters

       :internal
       r8   rS   metadatar>   fields)r&   r   r   encode_listbuild_arrayr'   s     r   rG   rG      sP     '69j-HF{{8,h1B1B5CTCTU\]eUfCg1hF8Mr   c                  V    t        di | }|j                  t        | ddd             |S )rX   next_cursormax_results	directionr2   )rG   r4   r&   )r   resources_paramss     r   r3   r3      s1     *4G4D-TUr   c                 \    ddg}| ||t        j                  |d      d}t        d||fi |S )ai  
    Find images based on their visual content.

    :param image_url:       The URL of an image.
    :type image_url:        str
    :param image_asset_id:  The asset_id of an image in your account.
    :type image_asset_id:   str
    :param text:            A textual description, e.g., "cat"
    :type text:             str
    :param image_file:      The image file.
    :type image_file:       str|callable|Path|bytes
    :param options:         Additional options
    :type options:          dict, optional
    :return:                Resources (assets) that were found
    :rtype:                 Response
    r*   visual_searchfile)	image_urlimage_asset_idtext
image_filepost)r   handle_file_parameterr   )re   rf   rg   rh   r   r!   r(   s          r   rc   rc      sB    " 
(C$PT!77
FKMFFC3733r   c                     |j                  dd      }|j                  dd      }d||| g}t        di |}t        d||fi |S )Nr-   r.   r/   rC   r*   r   r2   )r   _prepare_asset_details_paramsr   	public_idr   r-   r6   r!   r(   s         r   resourcero      sQ    KK9M++fh/K{I
>C*5W5FE32'22r   c                 <    d| g}t        di |}t        d||fi |S )aa  
    Returns the details of the specified asset and all its derived assets by asset id.

    :param asset_id:    The Asset ID of the asset
    :type asset_id:     string
    :param options:     Additional options
    :type options:      dict, optional
    :return:            Resource (asset) of a specific asset_id
    :rtype:             Response
    r*   r   r2   )rl   r   )asset_idr   r!   r(   s       r   resource_by_asset_idrr      s/     
!C*5W5FE32'22r   c                  8    t        | ddddddddd	d
dddddd      S )z
    Prepares optional parameters for resource_by_asset_id API calls.

    :param options: Additional options
    :return: Optional parameters

    :internal
    exiffacescolorsimage_metadatamedia_metadatacinemagraph_analysispagesphashcoordinatesr_   quality_analysisderived_next_cursoraccessibility_analysisversionsrelatedrelated_next_cursorr&   r   s    r   rl   rl      s=     (4DFVXn-@RTi(*iAVX Xr   c                 "   |j                  dd      }|j                  dd      }d||| g}t        |dddd	d
dddd
      }d|v r*dj                  t        j                  |d               |d<   d|v r't        j
                  |j                  d            |d<   d|v r't        j
                  |j                  d            |d<   d|v r't        j                  |j                  d            |d<   d|v r't        j                  |j                  d            |d<   d|v r't        j                  |j                  d            |d<   d|v rt        |j                  d            |d<   d|v r:t        j                  t        j                  |j                  d                  |d<   d|v r|j                  d      |d<   d|v r|j                  d      |d<   d|v r|j                  d      |d<   d|v r|j                  d      |d<   t        d||fi |S )Nr-   r.   r/   rC   r*   moderation_statusraw_convertquality_overrideocrcategorization	detectionsimilarity_searchbackground_removalnotification_urlr8   ,face_coordinatescustom_coordinatesregionsrS   rY   auto_taggingaccess_controlrL   display_nameunique_display_nameclear_invalidri   )r   r&   joinr   r\   encode_double_arrayr   json_encodeencode_contextstrbuild_list_of_dictsr   rm   s         r   r4   r4     s   KK9M++fh/K{I
>C'.$e"K1D&(:<F %"3"3GFO"DEvW$%*%>%>w{{K]?^%_!"w&','@'@MaAb'c#$G!--gkk).DEyG!00Y1GHyW"11'++j2IJz !$W[[%@!A~7"#(#4#4U5N5Nw{{[kOl5m#n  !(^!<~ !(^!<~'(/4I(J$%'!")++o">FC3733r   c                     |j                  dd      }|j                  dd      }d||g}t        ||       }t        d||fi |S )Nr-   r.   r/   rC   r*   rD   deleter   __delete_resource_paramsr   rH   s         r   delete_resourcesr   '  sN    KK9M++fh/K{
3C%g*EFHc65W55r   c                     |j                  dd      }|j                  dd      }d||g}t        ||       }t        d||fi |S )Nr-   r.   r/   rC   r*   r0   r   r   )r0   r   r-   r6   r!   r(   s         r   delete_resources_by_prefixr   /  sN    KK9M++fh/K{
3C%gf=FHc65W55r   c                      | j                  dd      }| j                  dd      }d||g}t        | d      }t        d||fi | S )	Nr-   r.   r/   rC   r*   T)allr   r   r5   s        r   delete_all_resourcesr   7  sN    KK9M++fh/K{
3C%g48FHc65W55r   c                 d    |j                  dd      }d|d| g}t        |      }t        d||fi |S )Nr-   r.   r*   r8   r   r   r:   s        r   delete_resources_by_tagr   ?  s>    KK9Mvs
3C%g.FHc65W55r   c                 ,    dg}d| i}t        d||fi |S )Nderived_resourcesderived_resource_idsr   r   )r   r   r!   r(   s       r   delete_derived_resourcesr   F  s)    
C$&:;FHc65W55r   c                     d||g}t        | t              s| g} | t        j                  |      dd}|||d<   t	        d||fi |S )a  Delete derived resources of public ids, identified by transformations

    :param public_ids: the base resources
    :type public_ids: list of str
    :param transformations: the transformation of derived resources, optionally including the format
    :type transformations: list of (dict or str)
    :param type: The upload type
    :type type: str
    :param resource_type: The type of the resource: defaults to "image"
    :type resource_type: str
    :param invalidate: (optional) True to invalidate the resources after deletion
    :type invalidate: bool
    :return: a list of the public ids for which derived resources were deleted
    :rtype: dict
    r*   T)rE   transformationskeep_original
invalidater   )r   listr   build_eagerr   )rE   r   r-   r/   r   r   r!   r(   s           r    delete_derived_by_transformationr   L  sb    $ t
,Cj$' \
&!&!2!2?!C#%F )|Hc65W55r   c                 Z    dd||| g}dt        j                  |      i}t        d||fi |S )a_  
    Relates an asset to other assets by public IDs.

    :param public_id: The public ID of the asset to update.
    :type public_id: str
    :param assets_to_relate: The array of up to 10 fully_qualified_public_ids given as resource_type/type/public_id.
    :type assets_to_relate: list[str]
    :param type: The upload type. Defaults to "upload".
    :type type: str
    :param resource_type: The type of the resource. Defaults to "image".
    :type resource_type: str
    :param options: Additional options.
    :type options: dict, optional
    :return: The result of the command.
    :rtype: dict
    r*   related_assetsassets_to_relateri   r   r\   r   )rn   r   r-   r/   r   r!   r(   s          r   add_related_assetsr   i  s?    " (-y
IC %"3"34D"EFFf888r   c                 V    dd| g}dt        j                  |      i}t        d||fi |S )ar  
    Relates an asset to other assets by asset IDs.

    :param asset_id: The asset ID of the asset to update.
    :type asset_id: str
    :param assets_to_relate: The array of up to 10 asset IDs.
    :type assets_to_relate: list[str]
    :param options: Additional options.
    :type options: dict, optional
    :return: The result of the command.
    :rtype: dict
    r*   r   r   ri   r   )rq   r   r   r!   r(   s        r   add_related_assets_by_asset_idsr     s;     ((
3C %"3"34D"EFFf888r   c                 Z    dd||| g}dt        j                  |      i}t        d||fi |S )aQ  
    Unrelates an asset from other assets by public IDs.

    :param public_id: The public ID of the asset to update.
    :type public_id: str
    :param assets_to_unrelate: The array of up to 10 fully_qualified_public_ids given as resource_type/type/public_id.
    :type assets_to_unrelate: list[str]
    :param type: The upload type.
    :type type: str
    :param resource_type: The type of the resource: defaults to "image".
    :type resource_type: str
    :param options: Additional options.
    :type options: dict, optional
    :return: The result of the command.
    :rtype: dict
    r*   r   assets_to_unrelater   r   )rn   r   r-   r/   r   r!   r(   s          r   delete_related_assetsr     s?    " (-y
IC"E$5$56H$IJF3:'::r   c                 V    dd| g}dt        j                  |      i}t        d||fi |S )az  
    Unrelates an asset from other assets by asset IDs.

    :param asset_id: The asset ID of the asset to update.
    :type asset_id: str
    :param assets_to_unrelate: The array of up to 10 asset IDs.
    :type assets_to_unrelate: list[str]
    :param options: Additional options.
    :type options: dict, optional
    :return: The result of the command.
    :rtype: dict
    r*   r   r   r   r   )rq   r   r   r!   r(   s        r   "delete_related_assets_by_asset_idsr     s;     ((
3C"E$5$56H$IJF3:'::r   c            
      b    | j                  dd      }d|g}t        d|t        | ddd      fi | S )Nr-   r.   r8   r   r^   r_   r0   )r   r   r&   )r   r-   r!   s      r   r8   r8     s<    KK9M=
!CE3Wm]H UaY`aar   c                  @    dg}t        | ddd      }t        d||fi | S )Nr   namedr^   r_   r   r%   r   r!   r(   s      r   r   r     s.    
C'7M=AFE32'22r   c                 n    dg}t        |dd      }t        j                  |       |d<   t        d||fi |S )Nr   r^   r_   transformationr   )r&   r   build_single_eagerr   r   r   r!   r(   s       r   r   r     sB    
C'=-8F$77GFE32'22r   c                 R    dg}dt        j                  |       i}t        d||fi |S )Nr   r   r   r   r   r   r   s       r   delete_transformationr     s3    
C 8 8 HIFHc65W55r   c                     dg}t        |d      }d|v rt        |j                  d            |d<   t        j                  |       |d<   t        d||fi |S )Nr   allowed_for_strictunsafe_updater   put)r&   transformation_stringr   r   r   r   )r   r   r!   updatess       r   update_transformationr     sa    
C701G'!#8_9U#V  % 8 8 HGE33733r   c                 T    dg}| t        j                  |      d}t        d||fi |S )Nr   )namer   ri   r   )r   
definitionr   r!   r(   s        r   create_transformationr     s3    
Ce.F.Fz.RSFFC3733r   c                 ~    |j                  dd      }d|dg}t        t        |ddd      |       }t        d	||fi |S )
Nr-   r.   r*   publish_resourcesr/   	overwriter   rD   ri   r   rF   r&   r   )rE   r   r-   r!   r(   s        r   publish_by_idsr     sJ    KK9M':
;C$w\BzZFFC3733r   c                 ~    |j                  dd      }d|dg}t        t        |ddd      |       }t        d	||fi |S )
Nr-   r.   r*   r   r/   r   r   r   ri   r   )r0   r   r-   r!   r(   s        r   publish_by_prefixr     sJ    KK9M':
;C$w\B6RFFC3733r   c                 ~    |j                  dd      }d|dg}t        t        |ddd      |       }t        d	||fi |S )
Nr-   r.   r*   r   r/   r   r   )r;   ri   r   r:   s        r   publish_by_tagr     sJ    KK9M':
;C$w\BLFFC3733r   c            	      :    dg}t        d|t        | dd      fi | S )Nupload_presetsr   r^   r_   r   r&   r   r!   s     r   r   r     s'    
CE3Wm] KWwWWr   c                 :    d| g}t        d|t        |d      fi |S )Nr   r   r_   r   r   r   r!   s      r   upload_presetr     s'    T
"CE3Wm <HHHr   c                 &    d| g}t        d|i fi |S )Nr   r   r   r   s      r   delete_upload_presetr     s     T
"CHc2111r   c                     d| g}t        j                  di |}t        j                  |      }|j                  t	        |ddd             t        d||fi |S )Nr   unsigneddisallow_public_idliver   r2   r   build_upload_paramscleanup_paramsr4   r&   r   r   r   r!   r(   s       r   update_upload_presetr     s[    T
"C&&11F!!&)F
MM$w
,@&IJE32'22r   c            	          dg}t        j                  di | }t        j                  |      }|j                  t	        | dddd             t        d||fi | S )Nr   r   r   r   r   ri   r2   r   r   s      r   create_upload_presetr     s[    
C&&11F!!&)F
MM$w
,@&&QRFC3733r   c            	      6    t        ddgt        | dd      fi | S Nr   foldersr^   r_   r   r   s    r   root_foldersr   "  s"    EI;Wm](S_W^__r   c           	      8    t        dd| gt        |dd      fi |S r   r   )of_folder_pathr   s     r   
subfoldersr   &  s&    EI~6WmUb8cognoor   c                 "    t        dd| gi fi |S )Nri   r   r   )pathr   s     r   create_folderr   *  s    FY-r=W==r   c                 *    d|i}t        dd| g|fi |S )z
    Renames folder

    :param from_path: The full path of an existing asset folder.
    :param to_path:   The full path of the new asset folder.
    :param options:   Additional options

    :rtype: Response
    	to_folderr   r   r   )	from_pathto_pathr   r(   s       r   rename_folderr  .  s'     7#FEIy16EWEEr   c                 :    t        |d      }t        dd| g|fi |S )zDeletes folder

    Deleted folder must be empty, but can have descendant empty sub folders

    :param path: The folder to delete
    :param options: Additional options

    :rtype: Response
    skip_backupr   r   r%   )r   r   r(   s      r   delete_folderr  <  s)     '=)FHy$/C7CCr   c                     |j                  dd      }|j                  dd      }d||dg}t        d
d| it        |d      }t        d	||fi |S )Nr-   r.   r/   rC   r*   restorerE   r   ri   r2   )r   rF   r&   r   rH   s         r   r  r  K  s]    KK9M++fh/K{I
>CEZE4+DEFf888r   c            	      :    dg}t        d|t        | dd      fi | S )Nupload_mappingsr   r^   r_   r   r   s     r   r	  r	  S  s'    
CE3Wm] KWwWWr   c                 <    dg}t        |       }t        d||fi |S )Nr	  folderr   rF   r   r   s       r   upload_mappingr  X  s(    
CFE32'22r   c                 <    dg}t        |       }t        d||fi |S )Nr	  r  r   r  r   s       r   delete_upload_mappingr  ^  s(    
CFHc65W55r   c                 r    dg}t        |       }|j                  t        |d             t        d||fi |S )Nr	  r  templater   rF   r4   r&   r   r   s       r   update_upload_mappingr  d  s;    
CF
MM$w
+,E32'22r   c                 r    dg}t        |       }|j                  t        |d             t        d||fi |S )Nr	  r  r  ri   r  r   s       r   create_upload_mappingr  k  s;    
CF
MM$w
+,FC3733r   c                  $    dg}t        d|i fi | S Nstreaming_profilesGETr   r   s     r   list_streaming_profilesr  r  s    
 CE3.g..r   c                 &    d| g}t        d|i fi |S r  r   r   s      r   get_streaming_profiler  w  s     
&CE3.g..r   c                 &    d| g}t        d|i fi |S )Nr  DELETEr   r   s      r   delete_streaming_profiler   |  s     
&CHc2111r   c                 D    dg}t        di |}| |d<   t        d||fi |S )Nr  r   POSTr2   "__prepare_streaming_profile_paramsr   r   s       r   create_streaming_profiler%    s4    
 C/:':FF6NFC3733r   c                 <    d| g}t        di |}t        d||fi |S )Nr  PUTr2   r#  r   s       r   update_streaming_profiler(    s-    
&C/:':FE32'22r   c                 >    |D ci c]  }|| v s|| |    c}S c c}w Nr2   )sourcekeysrT   s      r   r&   r&     s%    (,>vC>>>s   	c                 j    t        | t              r| S t        j                  j                  di | d   S )Nr   r2   )r   r   
cloudinaryr   generate_transformation_string)r   s    r   r   r     s2    .,/>>PPQRSSr   c                      t        | d      }d| v r5| d   D cg c]  }dt        |      i }}t        j                  |      |d<   |S c c}w )Nr   representationsr   )r&   r   jsondumps)r   r(   transr1  s       r   r$  r$    sf    '>*FG#(/0A(BD$ -.CE.JK D D$(JJ$? !MDs   Ac           
          t        ddt        j                  | j                  d            it	        | ddd      }|j                  |       |S )Nr   r   r^   r   r2   )rF   r   r   r   r&   r4   )r   r(   ps      r   r   r     sO     	LU..w{{;L/MN 	LG_m\J	LAHHVHr   c                      t        dg i fi | S )zReturns a list of all metadata field definitions

    See: `Get metadata fields API reference <https://cloudinary.com/documentation/admin_api#get_metadata_fields>`_

    :param options: Additional options

    :rtype: Response
    r   r   r   s    r   list_metadata_fieldsr9    s     UB6g66r   c                 $    | g}t        d|i fi |S )aD  Gets a metadata field by external id

    See: `Get metadata field by external ID API reference
    <https://cloudinary.com/documentation/admin_api#get_a_metadata_field_by_external_id>`_

    :param field_external_id: The ID of the metadata field to retrieve
    :param options: Additional options

    :rtype: Response
    r   r8  field_external_idr   r!   s      r   metadata_field_by_field_idr=    s      
CUC7w77r   c                 0    t        dg t        |       fi |S )a  Creates a new metadata field definition

    See: `Create metadata field API reference <https://cloudinary.com/documentation/admin_api#create_a_metadata_field>`_

    :param field: The field to add
    :param options: Additional options

    :rtype: Response
    ri   r   __metadata_field_params)fieldr   s     r   add_metadata_fieldrB    s     VR)@)GS7SSr   c                 6    | g}t        d|t        |      fi |S )a  Updates a metadata field by external id

    Updates a metadata field definition (partially, no need to pass the entire
    object) passed as JSON data.

    See `Generic structure of a metadata field
    <https://cloudinary.com/documentation/admin_api#generic_structure_of_a_metadata_field>`_ for details.

    :param field_external_id: The id of the metadata field to update
    :param field: The field definition
    :param options: Additional options

    :rtype: Response
    r   r?  )r<  rA  r   r!   s       r   update_metadata_fieldrD    s&     
CUC)@)GS7SSr   c                 *    t        | ddddddddd	
      S )
Nr/   external_idlabel	mandatoryrestrictionsdefault_valuedefault_disabled
validation
datasourcer   )rA  s    r   r@  r@    s'    v}g{N!3\<Q Qr   c                 $    | g}t        d|i fi |S )a  Deletes a metadata field definition.
    The field should no longer be considered a valid candidate for all other endpoints

    See: `Delete metadata field API reference
    <https://cloudinary.com/documentation/admin_api#delete_a_metadata_field_by_external_id>`_

    :param field_external_id: The external id of the field to delete
    :param options: Additional options

    :return: An array with a "message" key. "ok" value indicates a successful deletion.
    :rtype: Response
    r   r8  r;  s      r   delete_metadata_fieldrO    s      
CXsB:'::r   c                 .    | dg}d|i}t        d||fi |S )a  Deletes entries in a metadata field datasource

    Deletes (blocks) the datasource entries for a specified metadata field
    definition. Sets the state of the entries to inactive. This is a soft delete,
    the entries still exist under the hood and can be activated again with the
    restore datasource entries method.

    See: `Delete entries in a metadata field datasource API reference
    <https://cloudinary.com/documentation/admin_api#delete_entries_in_a_metadata_field_datasource>`_

    :param field_external_id: The id of the field to update
    :param  entries_external_id: The ids of all the entries to delete from the
                                 datasource
    :param options: Additional options

    :rtype: Response
    rM  external_idsr   r8  )r<  entries_external_idr   r!   r(   s        r   delete_datasource_entriesrS    s-    $ l
+C12FXsF>g>>r   c                     g }|D ]#  }t        |dd      }|s|j                  |       % | dg}d|i}t        d||fi |S )a~  Updates a metadata field datasource

    Updates the datasource of a supported field type (currently only enum and set),
    passed as JSON data. The update is partial: datasource entries with an
    existing external_id will be updated and entries with new external_id's (or
    without external_id's) will be appended.

    See: `Update a metadata field datasource API reference
    <https://cloudinary.com/documentation/admin_api#update_a_metadata_field_datasource>`_

    :param field_external_id: The external id of the field to update
    :param entries_external_id:
    :param options: Additional options

    :rtype: Response
    rF  rU   rM  valuesr   )r&   r    r   )r<  rR  r   rU  itemexternalr!   r(   s           r    update_metadata_field_datasourcerX    s_    " F# $mW5MM(#$
 l
+CFUC;7;;r   c                 .    | dg}d|i}t        d||fi |S )aw  Restores entries in a metadata field datasource

    Restores (unblocks) any previously deleted datasource entries for a specified
    metadata field definition.
    Sets the state of the entries to active.

    See: `Restore entries in a metadata field datasource API reference
    <https://cloudinary.com/documentation/admin_api#restore_entries_in_a_metadata_field_datasource>`_

    :param field_external_id: The ID of the metadata field
    :param entries_external_ids: An array of IDs of datasource entries to restore
                                 (unblock)
    :param options: Additional options

    :rtype: Response
    datasource_restorerQ  ri   r8  )r<  entries_external_idsr   r!   r(   s        r   !restore_metadata_field_datasourcer\  /  s.    " 2
3C23FVS&<G<<r   c                 2    | ddg}||d}t        d||fi |S )aJ  Reorders metadata field datasource. Currently, supports only value.

    :param field_external_id: The ID of the metadata field.
    :param order_by: Criteria for the order. Currently, supports only value.
    :param direction: Optional (gets either asc or desc).
    :param options: Additional options.

    :rtype: Response
    rM  orderorder_byr`   ri   r8  )r<  r`  r`   r   r!   r(   s         r   !reorder_metadata_field_datasourcera  E  s.     lG
4C";FVS&<G<<r   c                 .    dg}| |d}t        d||fi |S )zReorders metadata fields.

    :param order_by: Criteria for the order (one of the fields 'label', 'external_id', 'created_at').
    :param direction: Optional (gets either asc or desc).
    :param options: Additional options.

    :rtype: Response
    r^  r_  r   r8  )r`  r`   r   r!   r(   s        r   reorder_metadata_fieldsrc  T  s)     )C";FUC;7;;r   c                 R    dd| g}|||j                  d      d}t        d||fi |S )aV  Analyzes an asset with the requested analysis type.

    :param input_type: The type of input for the asset to analyze ('uri').
    :param analysis_type: The type of analysis to run ('google_tagging', 'captioning', 'fashion').
    :param uri: The URI of the asset to analyze.
    :param options: Additional options.

    :rtype: Response
    analysisanalyze
parameters)analysis_typer!   rg  ri   )r   r	   )
input_typerh  r!   r   api_urir(   s         r   rf  rf  b  s:     9j1G,ST`HabF;7;;r   r*  )NNNN)r.   rC   N)r.   rC   )cr   email.utilsemailr2  socketurllib3sixr   urllib3.exceptionsr   r.  r   cloudinary.api_client.call_apir   r   r   r	   cloudinary.exceptionsr
   r   r   r   r   r   r   r   r   r$   r+   r*   r<   rA   rI   rM   rQ   rV   rG   r3   rc   ro   rr   rl   r4   r   r   r   r   r   r   r   r   r   r   r8   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r	  r  r  r  r  r  r  r   r%  r(  r&   r   r$  r   r9  r=  rB  rD  r@  rO  rS  rX  r\  ra  rc  rf  r2   r   r   <module>rs     s         (     4/.
:933333"3&324.33 X!4H66666 W[6:9,9$;,;$b336
44444X
I
2
34`p>FD9X
3634/
/
2
43?T	78TT(Q
;"?.<8=,=<<r   