
    +j              	       2   d Z 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mZm	Z	m
Z
mZ ddlmZ  ej        e          Z ej        dej                  Zdede
eeef                  fd	Zd
edefdZdedefdZeZde	e         dede	eeef                  fdZdS )uY  
LightClaw — media utility functions.
Mirrors: src/media.ts

Pure helpers for parsing data URLs, formatting file sizes, guessing MIME
types from file extensions, and converting AI-engine-produced mediaUrl
lists (data:// / http:// / local paths) into the canonical
FileAttachment format (`{name, mimeType, bytes: 'data:<mime>;base64,<...>'}`).
    N)AnyDictListOptionalTuple   )	_MIME_MAPz^data:([^;]+);base64,(.+)$data_urlreturnc                 T   | sdS t                               |           }|sdS |                    d                                          }|                    d                                          }	 t	          j        |d          }n# t          t          j        f$ r Y dS w xY w||fS )u   Parse a base64 data URL → ``(buffer, mime_type)``.

    Returns ``None`` if *data_url* is not a well-formed base64 data URL.
    Mirrors TS ``parseDataUrl`` in ``src/media.ts``.
    Nr      F)validate)	_DATA_URL_REmatchgroupstripbase64	b64decode
ValueErrorbinasciiError)r
   mmimepayloadbufs        9/home/agentuser/.hermes/plugins/lightclawbot/src/media.pyparse_data_urlr      s      t8$$A t771::Dggajj  Gw777'   tt9s   2B	 	B#"B#n_bytesc                 f    | dk     r|  dS | dk     r	| dz  ddS | dk     r	| dz  ddS | dz  ddS )	u   Format a byte count as a compact human-readable string.

    Examples::

        0       → "0B"
        512     → "512B"
        2048    → "2.0KB"
        1_500_000 → "1.4MB"
        3_221_225_472 → "3.0GB"
    i   Bi   z.1fKBi   @MBGB )r   s    r   format_file_sizer%   7   ss     ~~}}}D.(((((I%-----	!)))))    name_or_extc                     | sdS |                      d          rd| vr| }n%t          j                            |           d         }|                                }t          j        |d          S )zGuess MIME type from a filename or a bare extension.

    Accepts both ``".png"`` and ``"picture.png"`` style inputs.  Returns
    ``"application/octet-stream"`` when no mapping matches.
    application/octet-stream./r   )
startswithospathsplitextlowerr	   get)r'   exts     r   guess_mime_by_extr3   O   su      *)) c"" /s+'='=g{++A.
))++C=8999r&   urlssessionc                  K   ddl }ddlm} g }| pg D ]}	 d}d}d}|                    d          r3t	          |          }	|	st
                              d           K|	\  }}n|                    d	          r|                    |          4 d{V }
|
j        d
k    r<t
                              d|
j        |dd                    	 ddd          d{V  |
	                                 d{V }|
j
                            d|          p|}|                    d          d                             d          d         pd}ddd          d{V  n# 1 d{V swxY w Y   n|                    |          r|t          |          d         n|}t          j                            |          st
                              d|           t!          |d          5 }|	                                }ddd           n# 1 swxY w Y   t#          |          }t          j                            |          }|3|                    ||d| dt)          j        |                                           d           x# t.          $ r/}t
                              d|dd         |           Y d}~d}~ww xY w|S )uR  Convert a mediaUrl list into ``FileAttachment`` dicts.

    Each returned item has shape::

        {"name": <basename>, "mimeType": <mime>, "bytes": "data:<mime>;base64,<...>"}

    Supported URL forms (mirrors TS mediaUrlsToFiles):
        * ``data:<mime>;base64,<...>``
        * ``http://`` / ``https://``
        * absolute local path (e.g. ``/tmp/foo.png``)
        * ``localfile://<abs>`` — stripped to absolute local path

    *session* must be an ``aiohttp.ClientSession`` (only used for http urls).
    Individual URL failures are logged and skipped; the function never raises.
    r   Nr   )LOCALFILE_SCHEMEr)   filezdata:z[media] skip malformed data URL)zhttp://zhttps://   z[media] HTTP %d for %sP   zcontent-typer+   ?z[media] local file missing: %srbz;base64,)namemimeTypebytesz-[media] media_urls_to_files failed for %s: %s)aiohttpconfigr7   r,   r   loggerwarningr1   statusreadheaderssplitlenr-   r.   isfileopenr3   basenameappendr   	b64encodedecode	Exception)r4   r5   rA   r7   filesurlr   r   r>   parsedresp
local_pathfpexcs                 r   media_urls_to_filesrX   i   s+     ( NNN(((((("$Ezr *[ *[)	[#'C2DD~~g&& 4',, NN#DEEE"	TT 788 4";;s++ H H H H H H Ht{c))'?cRUSURUhWWW H H H H H H H H H H H H H !%		++++++C<++NDAAITDIIcNN2.44S99!<GDH H H H H H H H H H H H H H H H H H H H H H H H H H H =@NNK[<\<\eS%5!6!6!7!788be
w~~j11 NN#CZPPP*d++ $r''))C$ $ $ $ $ $ $ $ $ $ $ $ $ $ $(44w''
33{LL OOOv/?/D/D/K/K/M/MOO     
  	[ 	[ 	[NNJCPSQSPSHVYZZZZZZZZ	[ Ls   AJ7J6EJA-E
J
E&	&J)E&	*A,JJ(H	=J	H	JH	3JAJ
K$J??K)__doc__r   r   loggingr-   retypingr   r   r   r   r   rB   r	   	getLogger__name__rC   compileDOTALLr   strr@   r   intr%   r3   
guess_mimerX   r$   r&   r   <module>rd      ss       				 				 3 3 3 3 3 3 3 3 3 3 3 3 3 3      		8	$	$ rz7CCS XeE3J.?%@    0*c *c * * * *0:3 :3 : : : :& 
E
s)E E 
$sCx.	E E E E E Er&   