/ PornAPI / Rule34 / __pycache__ / client.cpython-312.pyc
client.cpython-312.pyc
 1 2  ��h���*�ddlmZddlZddlmcmZddlmZm	Z	m
 3  Z
 4  mZmZm
Z
mZmZddlmZddlmZddlmZddlmZdd	lmZdd
 5  lmZddlmZdd
�Zddd�Zddd�Z														dd�Z e							d																	dd��Z!y)�)�annotationsN)�Union�List�Optional�Set�Callable�	Awaitable�Any�Tuple)�datetime)�
 6  quote_plus)�	monotonic�)�AsyncHttpClient)�
read_metadata)�	dual_mode�)�
 7  Rule34Postc��	tj|�}|jd�D�cgc]}t	di|j
 8  ����c}S#t$rgcYSwxYwcc}w)zn
 9      Parse XML API response into a list of Rule34Post objects.
10      Returns an empty list on parse errors.
11      �post�)�ET�
12  fromstring�	Exception�findallr�attrib)�xml_text�root�els   �9/root/projects/PAPI/Python_Tests/PornAPI/Rule34/client.py�_parse_postsr!sU��
13  ��}�}�X�&��/3�l�l�6�.B�C��J�#����#�C�C�����	���Cs�A	�A�	A�Ac���K�d}t|�D]}	|��d{���cS|�7�	#t$r?}|}|dz|k(rYd}~|�tj|d|zz��d{���7Yd}~�]d}~wwxYw�w)z<
14      Retry an async operation with exponential backoff.
15      Nrr)�ranger�asyncio�sleep)�coro_factory�retries�
16  base_delay�exc�i�es      r �_retryr,s������C�
�7�^�7��	7�%��'�'�7��I�
(���	7��C��1�u����
17  
�I��-�-�
18  �a�1�f� 5�6�6�6��		7�sM�A5�
19  *�(�*�A5�*�	A2�
20  A-�A5�A-�"A%�#A-�(A5�-A2�2A5c	��L�����	�
21  K�tj|��
22  d�d�d�����
23  fd��	|rtdt|��d|�d��d��t	�}tj
24  �	fd�|D���d{���t	�|z
25  }|rtd	��d
26  ��d|d�d
����fS7�-�w)z�
27      Fetch and fill media metadata for a list of posts with bounded concurrency and byte budget.
28      Returns a tuple of (success_count, fail_count).
29      rc��F��K��4�d{���	t���fd���d{���}|s�dz
�	ddd��d{���y|jd��_|jd��_|jd��_|jd��_|jd��_|jd��_|jd	i��_	�dz
�ddd��d{���y7��7��#t$rd}Y��wxYw7��7�#1�d{���7swYyxYw�w)
30  Nc�4��t��j���S)N)�	max_bytes)r�file_url)�httpr0�ps���r �<lambda>z+_enrich_meta.<locals>.one.<locals>.<lambda>6s���M�$��
3132  �V_�,`��r�duration�bitrate�sample_rate�channels�bits_per_sample�codec�tags)
33  r,r�getr6r7r8r9r:r;�	meta_tags)r3�meta�failr2r0�ok�sems` �����r �onez_enrich_meta.<locals>.one2s������	�	�
�#�$`�a�a�����	���	�	�	����*�-�A�J�����+�A�I� �H�H�]�3�A�M����*�-�A�J� $���):� ;�A���h�h�w�'�A�G��(�(�6�2�.�A�K��!�G�B�	�	�	��a���
���
��	��	��	�	�	�s��D!�C3�D!�D�C7�C5�C7�D�D!�D�D!�B D�"D!�-D
34  �.D!�5C7�7D�D�D�D�D!�
35  D!�D�D�D�D!z[DEBUG] meta.start total=z conc=z budget=�Bc3�.�K�|]}�|����y�w�Nr)�.0r3rCs  �r �	<genexpr>z_enrich_meta.<locals>.<genexpr>Gs�����1�a�3�q�6�1�s�Nz[DEBUG] meta.done ok=� fail=� took=�.2f�s)r3r)r$�	Semaphore�print�lenr�gather)�postsr2�max_concurrencyr0�debug�t0�dtr@rArCrBs ` `   @@@@r �_enrich_metarV*s������
36  �
37  �
38  �O�
39  ,�C�	
40  �B��D���$
�
�)�#�e�*��V�O�;L�H�U^�T_�_`�a�b�	��B�
41  �.�.�1�5�1�
42  2�2�2�	��r�	�B��
�%�b�T���v�V�B�s�8�1�E�F�
�t�8�O�	3�s�A,B$�4B"�5.B$c�J�|j|vry|r*t|jt�r|j|kry|r*t|jt�r|j|kDry|�|j�|j|kry|�|j�|j|kDryy)z2
43      Validate a post against filtering rules.
44      FT)�id�
45  isinstance�
46  created_atrr6)r�blocked�min_date�max_date�min_duration�max_durations      r �_validr`Ns����w�w�'����J�t����9�d�o�o�PX�>X���J�t����9�d�o�o�PX�>X����D�M�M�$=�$�-�-�R^�B^����D�M�M�$=�$�-�-�R^�B^��r5c��h�����K�t|t�rdj|�}t|j	���t|xsg�}g}	t�}
47  d�d}d�|duxs|du}t
�4�d{����d���fd��t|	�|k�r�t�}
|rtd��d|���tj��fd	�t|�D���d{���}td
48  �|D��}g}d}|D]I}|D]B}|j|
49  vr|dz
}�|
50  j|j�|j!|��D�K|r/t�|
z
51  }td|�d
t|��d|�d|d�d�	�|s|rtd�n�|r.t#|�dd|���d{���\}}|rtd|�d|���d}|D]9}t|	�|k\rn)t%||||||�s�$|	j!|�|dz
}�;|rtd|�dt|	��d|���t|	�|kr1�|z
�t|��kr|dkDrd}nt|	�dk(r	|dkrd}nnt|	�|kr���ddd��d{���|rtdt|	����|	d|S7��7���7��7�*#1�d{���7swY�:xYw�w)a'
52      Search posts from rule34.xxx API with adaptive paging and optional metadata filtering.
53      If duration constraints are provided, metadata probing is performed with bounded concurrency and byte budget.
54      Set debug=True for verbose progress output with per-wave statistics and timings.
55      � �d�rNc��l��K�d��d��d|���t��fd���d{���}t|�S7��w)Nz;https://rule34.xxx/index.php?page=dapi&s=post&q=index&tags=z&limit=z&pid=c�&���j��SrF)�	read_text)r2�urls��r r4z+search.<locals>.fetch_pid.<locals>.<lambda>�s������s�(;�r5)r,r!)r3�textrhr2�	page_size�qs  @���r �	fetch_pidzsearch.<locals>.fetch_pid�sD�����O�PQ�s�RY�Zc�Yd�di�jk�il�m�C�� ;�<�<�D���%�%�=�s�4�2�4z[DEBUG] wave.fetch start_pid=z pages=c3�4�K�|]}��|z����y�wrFr)rGr*rl�pids  ��r rHzsearch.<locals>.<genexpr>�s�����+Z�1�I�c�A�g�,>�+Z�s�c3�2K�|]}t|����y�wrF)rO)rG�gs  r rHzsearch.<locals>.<genexpr>�s����1�Q�#�a�&�1�s�rz![DEBUG] wave.fetched posts_total=z new=z dup=rJrKrLz [DEBUG] wave.empty no-more-posts��)rRr0rSz[DEBUG] wave.meta ok=rIzEBUG] wave.collect added=z total=�/r�z[DEBUG] done return=)r3�int�return�List[Rule34Post])rY�list�joinr
�strip�setrrOrrNr$rPr#�sumrX�add�appendrVr`)r<�limit�blocked_idsr\r]r^r_rSr[�	collected�seen�
56  wave_pages�	need_metarT�groups�fetched�	new_batch�duprpr3rUrAr@�addedrlr2rjrnrks                        @@@@@r �searchr�fs������ �$����x�x��~���4�:�:�<� �A��K�-�2�.�G�"$�I��U�D��I��J�
57  �C��D�(�D�L��,D�I�� �/�/�D�	&��)�n�u�$���B���5�c�U�'�*��N�O�"�>�>�+Z��j�HY�+Z�[�[�F��1�&�1�1�G��I��C��
(���(�A��t�t�t�|��q��� ��H�H�Q�T�T�N��$�$�Q�'�(�
(���[�2�%���9�'��%��I��GW�W\�]`�\a�ag�hj�kn�go�op�q�r����<�=���!-�i��r�]f�ns�!t�t���D���1�"��V�D�6�B�C��E��
���y�>�U�*���!�W�h��,��U��$�$�Q�'��Q�J�E�
���3�E�7�'�#�i�.�AQ�QR�SX�RY�Z�[��9�~��%��z�!���y�>�I�-�*�q�.�!"�J���^�q�(�Z�!�^�!"�J��U�)�n�u�$�/�/�`
�
�$�S��^�$4�5�6��V�e���e/��\��&u��9/��/�/�/�sv�A4J2�;J�<J2�?AJ�J�B>J�J�AJ�BJ�%J2�0J�1#J2�J�J�J2�J/�#J&�$J/�+J2)r�strrvrw)�g�������?)r&zCallable[[], Awaitable[Any]]r'rur(�floatrvr
58  )rqrrF)rQrwr2rrRrur0rurS�boolrvzTuple[int, int])rrr[zSet[int]r\�Optional[datetime]r]r�r^�Optional[float]r_r�rvr�)�
59  NNNNNF)r<zUnion[str, List[str]]rrur�zOptional[List[int]]r\r�r]r�r^r�r_r�rSr�rvrw)"�
60  __future__rr$�xml.etree.ElementTree�etree�ElementTreer�typingrrrrrr	r
61  rr�urllib.parser
�timer�	base.httpr�
62  base.utilsr�base.decoratorsrrrr!r,rVr`r�rr5r �<module>r�s��"��"�"�N�N�N��#��'�&�'��	D�
� !�H�
63  ��
��!��!�	�
64  "��"�
�
65  ��0��'+�#'�#'�$(�$(��K�
66  �K��K�%�K�!�	K�
67  !�K�"�
K�"�K��K��K��Kr5