
    }i;                     x    d Z ddlmZmZ ddlmZmZmZmZ ddl	m
Z
mZ ddlmZ  G d de      Z G d d	e      Zy
)zFThis module provides a query interface for media streams and captions.    )MappingSequence)CallableListOptionalUnion)CaptionStream)
deprecatedc                      e Zd ZdZd Z	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d$dZdee   dd fdZde	dd fd	Z
d%d
Zd%dZdeee	f   dee   fdZde	dee   fdZd%dZded    fdZded    fdZd&dee   fdZd'dee   fdZd(de	dee   fdZd)dedd fdZdee   fdZd Z ed      d*dee	   defd       Z ed      dee   fd       Zd ee ef   fd!Z!defd"Z"de	fd#Z#y)+StreamQueryz3Interface for querying the available media streams.c                 n    || _         |D ci c]  }t        |j                        | c}| _        yc c}w )zConstruct a :class:`StreamQuery <StreamQuery>`.

        param list fmt_streams:
            list of :class:`Stream <Stream>` instances.
        N)fmt_streamsintitag
itag_index)selfr   ss      :/usr/local/lib/python3.12/dist-packages/pytubefix/query.py__init__zStreamQuery.__init__   s-     '3>?a3qvv;>??s   2Nc                   	
 g }srkt        t              st        t              r|j                  fd       n5t        t              st        t              r|j                  fd       r|j                  fd       r|j                  fd       r|j                  fd       sr|j                  fd       s	r|j                  	fd       
r|j                  
fd       r|j                  fd	       |r|j                  d
        |r|j                  d        |r|j                  d        |r|j                  d        r|j                  fd       |r|j	                  |       |j                  fd       |j                  fd       | j                  |      S )a	  Apply the given filtering criterion.

        :param fps:
            (optional) The frames per second.
        :type fps:
            int or None

        :param resolution:
            (optional) Alias to ``res``.
        :type res:
            str or None

        :param res:
            (optional) The video resolution.
        :type resolution:
            str or None

        :param mime_type:
            (optional) Two-part identifier for file formats and format contents
            composed of a "type", a "subtype".
        :type mime_type:
            str or None

        :param type:
            (optional) Type part of the ``mime_type`` (e.g.: audio, video).
        :type type:
            str or None

        :param subtype:
            (optional) Sub-type part of the ``mime_type`` (e.g.: mp4, mov).
        :type subtype:
            str or None

        :param file_extension:
            (optional) Alias to ``sub_type``.
        :type file_extension:
            str or None

        :param abr:
            (optional) Average bitrate (ABR) refers to the average amount of
            data transferred per unit of time (e.g.: 64kbps, 192kbps).
        :type abr:
            str or None

        :param bitrate:
            (optional) Alias to ``abr``.
        :type bitrate:
            str or None

        :param video_codec:
            (optional) Video compression format.
        :type video_codec:
            str or None

        :param audio_codec:
            (optional) Audio compression format.
        :type audio_codec:
            str or None

        :param bool progressive:
            Excludes adaptive streams (one file contains both audio and video
            tracks).

        :param bool adaptive:
            Excludes progressive streams (audio and video are on separate
            tracks).

        :param bool is_dash:
            Include/exclude dash streams.

        :param bool only_audio:
            Excludes streams with video tracks.

        :param bool only_video:
            Excludes streams with audio tracks.

        :param bool is_drc:
            Include/exclude stable volume streams.

        :param audio_track_name:
            Name of the dubbed audio track
        :type type:
            str or None

        :param custom_filter_functions:
            (optional) Interface for defining complex filters without
            subclassing.
        :type custom_filter_functions:
            list or None

        c                 *    | j                   xs k(  S N
resolutionr   resr   s    r   <lambda>z$StreamQuery.filter.<locals>.<lambda>   s    #:K)L     c                 (    | j                   xs v S r   r   r   s    r   r   z$StreamQuery.filter.<locals>.<lambda>   s    #:K)L r   c                 "    | j                   k(  S r   )fps)r   r"   s    r   r   z$StreamQuery.filter.<locals>.<lambda>   s    QUUc\ r   c                 "    | j                   k(  S r   )	mime_type)r   r$   s    r   r   z$StreamQuery.filter.<locals>.<lambda>   s    Q[[I%= r   c                 "    | j                   k(  S r   )type)r   r&   s    r   r   z$StreamQuery.filter.<locals>.<lambda>   s    QVVt^ r   c                 *    | j                   xs k(  S r   )subtype)r   file_extensionr(   s    r   r   z$StreamQuery.filter.<locals>.<lambda>   s    QYY73Ln%M r   c                 *    | j                   xs k(  S r   )abr)r   r+   bitrates    r   r   z$StreamQuery.filter.<locals>.<lambda>   s    QUUs~g%> r   c                 "    | j                   k(  S r   )video_codec)r   r.   s    r   r   z$StreamQuery.filter.<locals>.<lambda>       Q]]k%A r   c                 "    | j                   k(  S r   )audio_codec)r   r1   s    r   r   z$StreamQuery.filter.<locals>.<lambda>   r/   r   c                 8    | j                   xr | j                   S r   )includes_audio_trackincludes_video_trackr   s    r   r   z$StreamQuery.filter.<locals>.<lambda>       **I13I3I/I r   c                 8    | j                   xr | j                   S r   )r4   r3   r5   s    r   r   z$StreamQuery.filter.<locals>.<lambda>   r6   r   c                     | j                   S r   )is_progressiver5   s    r   r   z$StreamQuery.filter.<locals>.<lambda>   s    Q%5%5 r   c                     | j                   S r   )is_adaptiver5   s    r   r   z$StreamQuery.filter.<locals>.<lambda>   s
    Q]] r   c                 "    | j                   k(  S r   audio_track_name)r   r>   s    r   r   z$StreamQuery.filter.<locals>.<lambda>   s    Q%7%7;K%K r   c                 "    | j                   k(  S r   )is_dash)r   r@   s    r   r   z$StreamQuery.filter.<locals>.<lambda>   s    QYY'%9 r   c                 "    | j                   k(  S r   )is_drc)r   rB   s    r   r   z$StreamQuery.filter.<locals>.<lambda>   s    QXX%7 r   )
isinstancestrappendlistextend_filter)r   r"   r   r   r$   r&   r(   r)   r+   r,   r.   r1   
only_audio
only_videoprogressiveadaptiver@   rB   r>   custom_filter_functionsfilterss    ```````````    ```  r   filterzStreamQuery.filter   sf   b *#s#z*c'BLMC&*Z*FLMNN12NN=>NN34nNNMN'NN>?NNABNNABNN NN NN56NN23NNKL"NN23NN9:NN78||G$$r   rN   returnc                 h    | j                   }|D ]  }t        ||      } t        t        |            S r   )r   rO   r   rF   )r   rN   r   filter_lambdas       r   rH   zStreamQuery._filter   s8    &&$ 	=M <K	=4,--r   attribute_namec                    | j                   D cg c]  }t        |      | }}|r7t        t        |d         t              r	 t	        t        |fd            S t	        t        |fd            S c c}w # t        $ r Y )w xY w)zApply a sort order. Filters out stream the do not have the attribute.

        :param str attribute_name:
            The name of the attribute to sort by.
        r   c                 |    t        dj                  t        t        j                  t        |                         S )N )r   joinrO   rD   isdigitgetattrr   rS   s    r   r   z&StreamQuery.order_by.<locals>.<lambda>   s-    cGG &s{{GA~4N O' r   )keyc                     t        |       S r   )rY   rZ   s    r   r   z&StreamQuery.order_by.<locals>.<lambda>   s    >0J r   )r   rY   rC   rD   r   sorted
ValueError)r   rS   r   has_attributes    `  r   order_byzStreamQuery.order_by   s     %%
q.)5 
 
 ZM!$n5s

"%	 	 =&JK
 	
3
,  s   A9A> >	B
	B
c                 8    t        | j                  ddd         S )z_Sort streams in descending order.

        :rtype: :class:`StreamQuery <StreamQuery>`

        N)r   r   r   s    r   desczStreamQuery.desc   s     4++DbD122r   c                     | S )z^Sort streams in ascending order.

        :rtype: :class:`StreamQuery <StreamQuery>`

         rc   s    r   asczStreamQuery.asc   s	     r   r   c                     t        |t              r| j                  j                  |      S t        |t              r5|j                         r$| j                  j                  t        |            S yy)a6  Get the corresponding :class:`Stream <Stream>` for a given itag.

        :param int itag:
            YouTube format identifier code.
        :rtype: :class:`Stream <Stream>` or None
        :returns:
            The :class:`Stream <Stream>` matching the given itag or None if
            not found.

        N)rC   r   r   getrD   rX   )r   r   s     r   get_by_itagzStreamQuery.get_by_itag   sV     dC ??&&t,,c"t||~??&&s4y11 (6"r   r   c                 F    | j                  dd|      j                         S )a  Get the corresponding :class:`Stream <Stream>` for a given resolution.

        Stream must be a progressive mp4.

        :param str resolution:
            Video resolution i.e. "720p", "480p", "360p", "240p", "144p"
        :rtype: :class:`Stream <Stream>` or None
        :returns:
            The :class:`Stream <Stream>` matching the given itag or None if
            not found.

        Tmp4)rK   r(   r   )rO   first)r   r   s     r   get_by_resolutionzStreamQuery.get_by_resolution  s(     {{e
  

%'	r   c                 (    | j                  d g      S )zTakes the standard audio tracks, will return all audio tracks if there is no dubbing.

        :rtype: :class:`StreamQuery <StreamQuery>`
        :returns: A StreamQuery object with filtered default dubbing streams.
        c                     | j                   S r   )is_default_audio_trackr5   s    r   r   z5StreamQuery.get_default_audio_track.<locals>.<lambda>$  s    q'?'? r   rH   rc   s    r   get_default_audio_trackz#StreamQuery.get_default_audio_track  s     ||?@AAr   c                 (    | j                  d g      S )zGet only dubbed audio tracks.

        :rtype: :class:`StreamQuery <StreamQuery>` or None
        :returns: A StreamQuery object with filtering only the dubbing streams.
        c                 V    | j                    xr | j                  xr | j                   S r   )rq   r3   r4   r5   s    r   r   z3StreamQuery.get_extra_audio_track.<locals>.<lambda>,  s2    !"!9!99 <!"!7!7<%&%;%;!; r   rr   rc   s    r   get_extra_audio_trackz!StreamQuery.get_extra_audio_track&  s     || < = > 	>r   c                 .    | j                  fdg      S )zFilter dubbed audio streams by name

        :rtype: :class:`StreamQuery <StreamQuery>` or None
        :returns: A StreamQuery object filtering dubbed audio streams by name.
        c                 "    | j                   k(  S r   r=   )r   names    r   r   z;StreamQuery.get_extra_audio_track_by_name.<locals>.<lambda>7  s    q'9'9T'A r   rr   )r   ry   s    `r   get_extra_audio_track_by_namez)StreamQuery.get_extra_audio_track_by_name1  s     ||ABCCr   c                 b    | j                  |d      j                  d      j                         S )a  Get lowest resolution stream that is a progressive mp4.

        :param bool progressive:
            Filter only progressive streams (video and audio in the same file), default is True.
            Set False to get the adaptive stream (separate video and audio) at the lowest resolution
        :rtype: :class:`Stream <Stream>` or None
        :returns:
            The :class:`Stream <Stream>` matching the given itag or None if
            not found.

        rl   )rK   r(   r   )rO   r`   rm   )r   rK   s     r   get_lowest_resolutionz!StreamQuery.get_lowest_resolution9  s*     KKKK?Xl#UW	
r   c                 b    | j                  ||      j                  d      j                         S )a9  Get highest resolution stream that is a progressive video.

        :param bool progressive:
            Filter only progressive streams (video and audio in the same file), default is True.
            Set False to get the adaptive stream (separate video and audio) at the highest resolution
        :param str mime_type:
            Filter by mime_type. Leave as None to accept any mime_type.
        :rtype: :class:`Stream <Stream>` or None
        :returns:
            The :class:`Stream <Stream>` matching the given itag or None if
            not found.

        )rK   r$   r   rO   r`   last)r   rK   r$   s      r   get_highest_resolutionz"StreamQuery.get_highest_resolutionK  s,     {{{i{HQQR^_ddffr   r(   c                 b    | j                  d|      j                  d      j                         S )a9  Get highest bitrate audio stream for given codec (defaults to mp4)

        :param str subtype:
            Audio subtype, defaults to mp4
        :rtype: :class:`Stream <Stream>` or None
        :returns:
            The :class:`Stream <Stream>` matching the given itag or None if
            not found.
        T)rI   r(   r+   r~   )r   r(   s     r   get_audio_onlyzStreamQuery.get_audio_only[  s)     KK4K9Xe_TV	
r   is_otfc                 .    | j                  fdg      S )a  Filter stream by OTF, useful if some streams have 404 URLs

        :param bool is_otf: Set to False to retrieve only non-OTF streams
        :rtype: :class:`StreamQuery <StreamQuery>`
        :returns: A StreamQuery object with otf filtered streams
        c                 "    | j                   k(  S r   )r   )r   r   s    r   r   z!StreamQuery.otf.<locals>.<lambda>r  s    qxx6'9 r   rr   )r   r   s    `r   otfzStreamQuery.otfk  s     ||9:;;r   c                 @    	 | j                   d   S # t        $ r Y yw xY w)zGet the first :class:`Stream <Stream>` in the results.

        :rtype: :class:`Stream <Stream>` or None
        :returns:
            the first result of this query or None if the result doesn't
            contain any streams.

        r   Nr   
IndexErrorrc   s    r   rm   zStreamQuery.firstt  s*    	##A&& 		    	c                 @    	 | j                   d   S # t        $ r Y yw xY w)zGet the last :class:`Stream <Stream>` in the results.

        :rtype: :class:`Stream <Stream>` or None
        :returns:
            Return the last result of this query or None if the result
            doesn't contain any streams.

        rb   Nr   rc   s    r   r   zStreamQuery.last  s*    	##B'' 		r   z.Get the size of this list directly using len()valuec                 R    |r| j                   j                  |      S t        |       S )zAGet the count of items in the list.

        :rtype: int
        )r   countlen)r   r   s     r   r   zStreamQuery.count  s&     16t%%e,D3t9Dr   z6This object can be treated as a list, all() is uselessc                     | j                   S zXGet all the results represented by this query as a list.

        :rtype: list

        r   rc   s    r   allzStreamQuery.all  s     r   ic                      | j                   |   S r   r   r   r   s     r   __getitem__zStreamQuery.__getitem__  s    ""r   c                 ,    t        | j                        S r   )r   r   rc   s    r   __len__zStreamQuery.__len__  s    4##$$r   c                     | j                    S r   r   rc   s    r   __repr__zStreamQuery.__repr__  s    ""#$r   )NNNNNNNNNNNNNNNNNNN)rP   r   )T)TN)rl   )Fr   )$__name__
__module____qualname____doc__r   rO   r   r   rH   rD   r`   rd   rg   r   r   r   r
   rj   rn   rs   rv   rz   r|   r   r   boolr   rm   r   r   r   r   slicer   r   r   rf   r   r   r   r   	   s   =@  $)m%^.tH~ .- .!
s !
} !
F32c3h 2HV4D 2 C HV4D "B	>x'> 	>DXm5L D
&9I 
$g(SYJZ g 
c 
hv6F 
 <$ <= <x'  @AE8C= EC E BE HI T&\   J #U5#:. #% %%# %r   r   c                       e Zd ZdZdee   fdZ ed      dede	e   fd       Z
 ed      dee   fd	       Zd
efdZdefdZd ZdefdZy)CaptionQueryz.Interface for querying the available captions.captionsc                 N    |D ci c]  }|j                   | c}| _        yc c}w )zConstruct a :class:`Caption <Caption>`.

        param list captions:
            list of :class:`Caption <Caption>` instances.

        N)codelang_code_index)r   r   cs      r   r   zCaptionQuery.__init__  s"     4<<a	<<s   "z?This object can be treated as a dictionary, i.e. captions['en']	lang_coderP   c                 8    | j                   j                  |      S )a[  Get the :class:`Caption <Caption>` for a given ``lang_code``.

        :param str lang_code:
            The code that identifies the caption language.
        :rtype: :class:`Caption <Caption>` or None
        :returns:
            The :class:`Caption <Caption>` matching the given ``lang_code`` or
            None if it does not exist.
        )r   ri   )r   r   s     r   get_by_language_codez!CaptionQuery.get_by_language_code  s     ##''	22r   z*This object can be treated as a dictionaryc                 H    t        | j                  j                               S r   )rF   r   valuesrc   s    r   r   zCaptionQuery.all  s     D((//122r   r   c                      | j                   |   S r   r   r   s     r   r   zCaptionQuery.__getitem__  s    ##A&&r   c                 ,    t        | j                        S r   )r   r   rc   s    r   r   zCaptionQuery.__len__  s    4''((r   c                 H    t        | j                  j                               S r   )iterr   r   rc   s    r   __iter__zCaptionQuery.__iter__  s    D((//122r   c                     | j                    S r   r   rc   s    r   r   zCaptionQuery.__repr__  s    &&'(r   N)r   r   r   r   r   r	   r   r   rD   r   r   r   r   r   r   r   r   rf   r   r   r   r     s    8=g = I33	'	33 <=3T'] 3 >3'S ') )3)# )r   r   N)r   collections.abcr   r   typingr   r   r   r   	pytubefixr	   r
   pytubefix.helpersr   r   r   rf   r   r   <module>r      s2    L - 2 2 % (_%( _%D0)7 0)r   