o
    i                    @   s@  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z
d dlZ
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl Z d dl!Z!d dl"Z"d dl#Z#d dl$Z$d dl%Z%d dl&Z&d dl'Z'd dl(Z(d dl)Z)d dl*Z*d dl+Z+d dl,Z-d dl.Z-d dl/Z-d dl0Z1ddl2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z: ddl;m<Z<m=Z= e>?ddd  Z>G d	d
 d
Z@dd ZAg dZBeBg dg dg ddZCd d d d dddddddddddZDeEeFdeGddgddgddd gd!d"gd#d$gd%d&gd'd(d)ZHd*ZIeJeIZKeKLg d+ eJeIZMeMLg d, d-ZNd.ZOd/ZPejQd0d1 ZRd2d3 ZSd4d5 ZTd_d6d7ZUd8d9 ZVdd:e@fd;d<ZWdd:e@fd=d>ZXdd:e@fd?d@ZYdAdB ZZdCdD Z[dEdF Z\dGdH Z]dIdJ Z^dKdL Z_dMdN Z`dOdP ZadQdR ZbdSdT ZcdUd(dVdWdXZdG dYdZ dZejejfZgd[d\ ZhG d]d^ d^ejejfZiG d_d` d`ejejfZjdadb Zkdcdd Zldedf ZmG dgdh dhejnZodidj Zpdkdl Zqd:e@fdmdnZrdodp Zsd`dqdrZtdsdtdudvZudwdx Zvdydz Zwd:d{d|d}Zxd~d Zydd Zzdd Z{G dd dejZ|G dd de%j}Z}dd Z~eddZdd ZdaddZdbddZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZdd Zd_ddZeTdcddZddddĄZddddƄZeTdeddȄZeTdfdd˄Zd_dd̈́ZdgddфZdhddӄZddՄ Zdidd؄Zddڄ ZG dd܄ d܃ZejQddބ ZejQdd ZdjddZdd dddZe e_G dd deZe&jdkrd dlZd dlZd dlZG dd dejZedZejZejjejjejjejjejjeege_ejje_ejZejjejjejjejjeege_ejje_dZdZdd Zdd Zn!zd dlZdd Zdd ZW n eĐy   dd Zdd ZY nw G dd dZejQdd ZeǠddiZeǠdddddZd:d ddZːdd Z̐d_ddZ͐dkdd	d
dZΐdd Zϐd`ddZАdd Zѐdd ZҐdd Zd:dddZԐdd ZՐdlddZ֐dd Zאd d! Zؐd"d# Zِd$d% Zڐd&d' Zېd(d) Zܐd*d+ Zݐd,d- Zސd.d/ ZeTd0d1 ZeTdmd2d3Zd_d4d5Zd6d7 ZeTdnd8d9Zd_d:d;Zd_d<d=Zd>d? Zdod@dAZdBdC Zd_dDdEZeed(Zeed:Zg fdFdGZd`dHdIZdpdKdLZdMgddNfdOdPZdqdQdRZG dSdT dTejjZG dUdV dVZG dWdX dXeZG dYdZ dZeZG d[d\ d\Zd]d^ Zd_d` Zdadb Zdcdd Zdedf ZeTddgdhdiZeTdjdk Z dldm Zd_dndoZejje@fdpdqZe@fdrdsZdg i dtdudvZd_dwdxZdydz fd{d|Zd}d~ Z	eR dfddZ
d dddddZd dd d dddZdd Zdd Zi fd:d)ddZdd ZdZdddZddddddddddddZdZdZdd Zd:dddZddddZdd Zdd Zdd ZeTe@fddZdd Zdd ZddddZe@fddZ dd Z!dd Z"g dZ#dd Z$dd Z%drddZ&dd Z'd`ddZ(d_dÐdĄZ)G dŐdƄ dƃZ*dǐdȄ Z+dɐdʄ Z,dːd̄ Z-d͐d΄ Z.d_dϐdЄZ/dsdӐdԄZ0dddՐdքZ1g d(fdאd؄Z2dg d(fdِdڄZ3G dېd܄ d܃Z4G dݐdބ dރZ5G dߐd dZ6dtddZ7dd Z8dd Z9dd Z:dd Z;djddZ<djddZ=dd Z>dd Z?dd Z@dd ZAdd ZBdd ZCdd ZDduddZEd ZFdZGdZHeFeHeGdZIdd ZJdd ZKeTdde@deAfd	d
ZLdd ZMdZNdd ZOd_ddZPdd ZQdd ZRdd ZSdd ZTdddddZUdd ZVejQd d! ZWd"d# ZXe Yd$ZZd%d& Z[d'd( Z\d)dd*d+d,Z]d-d. Z^d/d0 Z_d1d2 Z`d3d4 ZaG d5d6 d6Zbd7d8 Zcd9d: ZdG d;d< d<ZeG d=d> d>ZfG d?d@ d@e*jgZhehdAdBdCdDdEdFdGdHdIZiei jjeijk7  _jei jleijm7  _lg eijjeijleijnR ZoG dJdK dKeZpG dLdM dMZqeTdNdO ZreTdtdPdQZsd:ddRdSdTZtG dUdV dVZudWdX ZvdjdYdZZwG d[d\ d\ZxG d]d^ d^ejyZzdS (v      N   )	traversal   )compat_datetime_from_timestampcompat_etree_fromstringcompat_expandusercompat_HTMLParseError)xattr)IN_CLIWINDOWS_VT_MODE.c                   @      e Zd ZdS )
NO_DEFAULTN__name__
__module____qualname__ r   r   G/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/utils/_utils.pyr   =       r   c                 C      | S Nr   xr   r   r   IDENTITYA      r   )JanuaryFebruaryMarchAprilMayJuneJulyAugust	SeptemberOctoberNovemberDecember)janvieru   févriermarsavrilmaijuinjuilletu   août	septembreoctobrenovembreu	   décembre)u   janúaru   febrúarr)   u   aprílu   maíu   júníu   júlíu   ágúst	septemberu   októberu	   nóvemberdesember)stycznialutegomarcakwietniamajaczerwcalipcasierpniau	   wrześniau   października	listopadagrudnia)enfrispliii)UTUTCGMTZASTADTESTEDTCSTCDTMSTMDTPSTPDTu   ÂÃÄÀÁÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖŐØŒÙÚÛÜŰÝÞßàáâãäåæçèéêëìíîïðñòóôõöőøœùúûüűýþÿAAAAAAAECEEEEIIIIDNOOOOOOOOEUUUUUYTHssaaaaaaaeceeeeiiiionooooooooeuuuuuythyTstrict)*z%d %B %Yz%d %b %Yz%B %d %Yz
%B %dst %Yz
%B %dnd %Yz
%B %drd %Yz
%B %dth %Yz%b %d %Yz
%b %dst %Yz
%b %dnd %Yz
%b %drd %Yz
%b %dth %Yz%b %dst %Y %I:%Mz%b %dnd %Y %I:%Mz%b %drd %Y %I:%Mz%b %dth %Y %I:%Mz%Y %m %d%Y-%m-%dz	%Y.%m.%d.z%Y/%m/%dz%Y/%m/%d %H:%Mz%Y/%m/%d %H:%M:%Sz
%Y%m%d%H%Mz%Y%m%d%H%M%S%Y%m%dz%Y-%m-%d %H:%Mz%Y-%m-%d %H:%M:%Sz%Y-%m-%d %H:%M:%S.%fz%Y-%m-%d %H:%M:%S:%fz%d.%m.%Y %H:%Mz%d.%m.%Y %H.%Mz%Y-%m-%dT%H:%M:%SZz%Y-%m-%dT%H:%M:%S.%fZz%Y-%m-%dT%H:%M:%S.%f0Zz%Y-%m-%dT%H:%M:%Sz%Y-%m-%dT%H:%M:%S.%fz%Y-%m-%dT%H:%Mz%b %d %Y at %H:%Mz%b %d %Y at %H:%M:%Sz%B %d %Y at %H:%Mz%B %d %Y at %H:%M:%Sz%H:%M %d-%b-%Y)z%d-%m-%Yz%d.%m.%Yz%d.%m.%yz%d/%m/%Yz%d/%m/%yz%d/%m/%Y %H:%M:%Sz%d-%m-%Y %H:%Mz%H:%M %d/%m/%Y)z%m-%d-%Yz%m.%d.%Yz%m/%d/%Yz%m/%d/%yz%m/%d/%Y %H:%M:%Sz.}\('(.+)',(\d+),(\d+),'([^']+)'\.split\('\|'\)zc(?is)<script[^>]+type=(["\']?)application/ld\+json\1[^>]*>\s*(?P<json_ld>{.+?}|\[.+?\])\s*</script>z\d+(?:\.\d+)?c                  C   s2   zt  } d|  W | S  ty   d} Y | S w )zGet preferred encoding.

    Returns the best encoding scheme for the system, based on
    locale.getpreferredencoding() and some further tweaks.
    TESTzUTF-8)localegetpreferredencodingencode	Exception)prefr   r   r   preferredencoding   s   rj   c                 C   sL  t jtj| dtj|ddddd}zl| tj| |dd W d   n1 s,w   Y  tj	d	krPt
t t| W d   n1 sKw   Y  t
t td
}t| t|jd| @  W d   n1 stw   Y  t|j| W dS  ty   t
t t|j W d    1 sw   Y   w )z? Encode obj as JSON and write it to fn, atomically if possible r   z.tmpFwutf-8)prefixdirsuffixdeletemodeencoding)ensure_asciiNwin32r     )tempfileNamedTemporaryFileospathbasenamedirnamejsondumpsysplatform
contextlibsuppressOSErrorunlinkumaskchmodnamerenamerh   remove)objfntfmaskr   r   r   write_json_file   s4   



r   c                    s:   t  }dd |j D t  fdd}|S )Nc                 S   s6   g | ]}|j tjjtjjfv r|jtjju r|jqS r   )kindinspect	ParameterPOSITIONAL_ONLYPOSITIONAL_OR_KEYWORDdefaultemptyr   ).0paramr   r   r   
<listcomp>   s    z'partial_application.<locals>.<listcomp>c                     s@   t t| d  |rtj g| R i |S  | i |S r   )setlen
difference	functoolspartialargskwargsfuncrequired_argsr   r   wrapped   s   z$partial_application.<locals>.wrapped)r   	signature
parametersvaluesr   wraps)r   sigr   r   r   r   partial_application   s   
r   c                 C   sD   t d|sJ ||du rd| dnd| d| d }| |S )z  Find the xpath xpath[@key=val] z^[a-zA-Z_-]+$N[@]z='z'])rematchfind)nodexpathkeyvalexprr   r   r   find_xpath_attr   s   *
r   c                 C   sj   dd |  dD }g }|D ]!}t|dkr||d  q|\}}|d||  d|  qd|S )Nc                 S   s   g | ]}| d qS ):)splitr   cr   r   r   r          z!xpath_with_ns.<locals>.<listcomp>/r   r   {})r   r   appendjoin)ry   ns_map
componentsreplacedr   nstagr   r   r   xpath_with_ns   s   
r   Fc                    s|    fdd}t |tr||}n|D ]}||}|d ur nq|d u r<|tur)|S |r:|d u r1|n|}td| d S |S )Nc                    s
     | S r   )r   )r   r   r   r   _find_xpath     
z"xpath_element.<locals>._find_xpathzCould not find XML element )
isinstancestrr   ExtractorError)r   r   r   fatalr   r   nxpr   r   r   xpath_element   s    

r   c                 C   sh   t | ||||d}|d u s||kr|S |jd u r1|tur|S |r/|d u r&|n|}td| d S |jS )N)r   r   z"Could not find XML element's text )r   textr   r   )r   r   r   r   r   r   r   r   r   
xpath_text  s   
r   c                 C   s\   t | ||}|d u r)|tur|S |r'|d u r| d| dn|}td| d S |j| S )Nr   r   zCould not find XML attribute )r   r   r   attrib)r   r   r   r   r   r   r   r   r   r   
xpath_attr&  s   
r   c                 K      t d| |fi |S )zOReturn the content of the tag with the specified ID in the passed HTML documentid)get_element_by_attributer   htmlr   r   r   r   get_element_by_id3     r   c                 K   r   )zLReturn the html of the tag with the specified ID in the passed HTML documentr   )get_element_html_by_attributer   r   r   r   get_element_html_by_id8  r   r   c                 C      t | |}|r|d S dS )zXReturn the content of the first tag with the specified class in the passed HTML documentr   N)get_elements_by_class
class_namer   retvalr   r   r   get_element_by_class=     
r   c                 C   r   )zUReturn the html of the first tag with the specified class in the passed HTML documentr   N)get_elements_html_by_classr   r   r   r   get_element_html_by_classC  r   r   c                 K   $   t | ||fi |}|r|d S d S Nr   )get_elements_by_attribute)	attributevaluer   r   r   r   r   r   r   I     r   c                 K   r   r   )get_elements_html_by_attribute)r   r   r   kargsr   r   r   r   r   N  r   r   c                 K      t ddt|  d|ddS )z]Return the content of all tags with the specified class in the passed HTML document as a listclass[^\'"]*(?<=[\'"\s])(?=[\'"\s])[^\'"]*Fescape_value)r   r   escape)r   r   r   r   r   r   r   S     r   c                 C   r   )zZReturn the html of all tags with the specified class in the passed HTML document as a listr   r   r   Fr   )r   r   r   )r   r   r   r   r   r   Z  r   r   c                  O      dd t | i |D S )zVReturn the content of the tag with the specified attribute in the passed HTML documentc                 S   s   g | ]\}}|qS r   r   )r   content_r   r   r   r   c      z-get_elements_by_attribute.<locals>.<listcomp>'get_elements_text_and_html_by_attributer   r   r   r   r   a     r   c                  O   r   )zSReturn the html of the tag with the specified attribute in the passed HTML documentc                 S   s   g | ]\}}|qS r   r   )r   r   wholer   r   r   r   h  r   z2get_elements_html_by_attribute.<locals>.<listcomp>r   r   r   r   r   r   f  r   r   z[\w:.-]+)r   r   c          
   	   c   s    |sdS t d|rdnd}|rt |n|}d| dt |  d| d| d		}t ||D ]!}t|d
|| d \}}	tt jdd|t j	d|	fV  q0dS )z
    Return the text (content) and the html (whole) of the tag with the specified
    attribute in the passed HTML document
    Nz
[\s"'`=<>] ?z(?x)
        <(?P<tag>z9)
         (?:\s(?:[^>"']|"[^"]*"|'[^']*')*)?
         \sz\s*=\s*(?P<_q>['"]z)(?-x:z)(?P=_q)
        r   z#^(?P<q>["\'])(?P<content>.*)(?P=q)$z\g<content>)flags)
r   r   r   finditer get_element_text_and_html_by_taggroupstartunescapeHTMLsubDOTALL)
r   r   r   r   r   quotepartial_element_remr   r   r   r   r   r   k  s(    r   c                   @   sP   e Zd ZdZG dd deZdd Zdd Zdd	 Zd
d Z	dd Z
dd ZdS )HTMLBreakOnClosingTagParserz
    HTML parser which raises HTMLBreakOnClosingTagException upon reaching the
    closing tag for the first opening tag it has encountered, and can be used
    as a context manager
    c                   @   r   )z:HTMLBreakOnClosingTagParser.HTMLBreakOnClosingTagExceptionNr   r   r   r   r   HTMLBreakOnClosingTagException  r   r  c                 C   s   t  | _tjj|  d S r   )collectionsdequetagstackr   parser
HTMLParser__init__selfr   r   r   r    s   
z$HTMLBreakOnClosingTagParser.__init__c                 C   r   r   r   r  r   r   r   	__enter__  r   z%HTMLBreakOnClosingTagParser.__enter__c                 G   s   |    d S r   )closer  r   r   r   r   __exit__     z$HTMLBreakOnClosingTagParser.__exit__c                 C      d S r   r   r  r   r   r   r    s   z!HTMLBreakOnClosingTagParser.closec                 C   s   | j | d S r   )r  r   )r  r   r   r   r   r   handle_starttag     z+HTMLBreakOnClosingTagParser.handle_starttagc                 C   sN   | j std| j r| j  }||krn| j s
td| d| j s%| jd S )Nzno tags in the stackz!matching opening tag for closing  tag not found)r  r   popr  )r  r   	inner_tagr   r   r   handle_endtag  s   
z)HTMLBreakOnClosingTagParser.handle_endtagN)r   r   r   __doc__rh   r  r  r  r  r  r  r  r   r   r   r   r
    s    r
  c           
   	   C   sf  dd }d|  d}||d|  t d|  d}|||d dt d	|  d
}||d 7 }t w}||||  |jrF|jd | krNt d|  d
|}|t|k r|||d |t d|  d}|t| }	z|||||	   ||	7 }W n! tjy   ||||  ||||	  f Y W  d   S w |t|k sVt d1 sw   Y  dS )z
    For the first element with the specified tag in the passed HTML document
    return its' content (text) and the whole element (html)
    c                 S   s    z|  |W S  ty   |w r   index
ValueError)haystackneedleexcr   r   r   find_or_raise  s
   z7get_element_text_and_html_by_tag.<locals>.find_or_raise</><zopening r  Nzmalformed opening z tagr   r   zparser did not match opening zclosing zunexpected end of html)r   r
  feedr  r   r  )
r   r   r'  closing_tagwhole_startcontent_startr  offsetnext_closing_tag_startnext_closing_tag_endr   r   r   r    s@   r  c                   @       e Zd ZdZdd Zdd ZdS )HTMLAttributeParserzATrivial HTML parser to gather the attributes for a single elementc                 C   s   i | _ tjj|  d S r   )attrsr   r  r  r  r  r   r   r   r    s   zHTMLAttributeParser.__init__c                 C   s   t || _td)Ndone)dictr4  r   r  r   r4  r   r   r   r    s   
z#HTMLAttributeParser.handle_starttagN)r   r   r   r   r  r  r   r   r   r   r3        r3  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	HTMLListAttrsParserz?HTML parser to gather the attributes for the elements of a listc                 C   s   t jj|  g | _d| _d S r   )r   r  r  r  items_levelr  r   r   r   r    s   
zHTMLListAttrsParser.__init__c                 C   s4   |dkr| j dkr| jt| |  j d7  _ d S )Nlir   r   )r;  r:  r   r6  r7  r   r   r   r    s   z#HTMLListAttrsParser.handle_starttagc                 C   s   |  j d8  _ d S Nr   )r;  )r  r   r   r   r   r       z!HTMLListAttrsParser.handle_endtagN)r   r   r   r   r  r  r  r   r   r   r   r9    s
    r9  c                 C   sL   t  }tt ||  |  W d   |jS 1 sw   Y  |jS )af  Given a string for an HTML element such as
    <el
         a="foo" B="bar" c="&98;az" d=boz
         empty= noval entity="&amp;"
         sq='"' dq="'"
    >
    Decode and return a dictionary of attributes.
    {
        'a': 'foo', 'b': 'bar', c: 'baz', d: 'boz',
        'empty': '', 'noval': None, 'entity': '&',
        'sq': '"', 'dq': '''
    }.
    N)r3  r   r   r   r+  r  r4  )html_elementr  r   r   r   extract_attributes  s   


r@  c                 C   s   t  }||  |  |jS )z_Given a string for an series of HTML <li> elements,
    return a dictionary of their attributes)r9  r+  r  r:  )webpager  r   r   r   
parse_list  s   
rB  c                 C   sT   | du r| S t dd| } t dd| } t dd| } t dd| } t| } |  S )	z,Clean an HTML snippet into a readable stringN\s+ z(?u)\s?<\s?br\s?/?\s?>\s?
z(?u)<\s?/\s?p\s?>\s?<\s?p[^>]*>z<.*?>r   )r   r  r  strip)r   r   r   r   
clean_html  s   rG  c                       s>   e Zd Zdddd fdd
Zedd Z fd	d
Z  ZS )LenientJSONDecoderNFr   )transform_sourceignore_extraclose_objectsc                   s.   ||| _ | _d| | _t j|i | d S Nr   )rI  rJ  _close_attemptssuperr  )r  rI  rJ  rK  r   r   	__class__r   r   r  !  s   
zLenientJSONDecoder.__init__c                 C   sn   | j d | j }| jdr|d S |dsd S | jdr'|d d d S | jdr5|d d d S d S )NzExpecting ',',zExpecting property namer   zExpecting valuer   )docposmsg
startswithendswith)errrS  r   r   r   _close_object&  s   
z LenientJSONDecoder._close_objectc                    s   | j r|  |}t| jd D ]Z}z| jr!| | d W   S t |W   S  tj	yi } z3|j
d u r8 || jk rL| |}|d urLW Y d }~qt||j d||j
d |j
d  ||j
d }~ww J d)Nr   r   z in 
   Fz Too many attempts to decode JSON)rI  rangerM  rJ  
raw_decodelstriprN  decoder|   JSONDecodeErrorrT  rY  typerU  )r  sattempterO  r   r   r^  4  s$   



2zLenientJSONDecoder.decode)r   r   r   r  staticmethodrY  r^  __classcell__r   r   rO  r   rH    s
    
rH  c                 C   s.  | dkr>t jdkr-ddl}ttj |t j	 t
j W d   n1 s(w   Y  tt jdr9t jj| fS t j| fS tdD ]R}z(zt jdkrMtt| |dd }W n tye   t| |}Y nw || fW   S  ty } z|s}|jtjfv r~ | t| }} || kr W Y d}~qBd}~ww dS )	ao  Try to open the given filename, and slightly tweak it if this fails.

    Attempts to open the given filename. If this fails, it tries to change
    the filename slightly, step by step, until it's either able to open it
    or it fails and raises a final exception, like the standard open()
    function.

    It returns the tuple (stream, definitive_file_name).
    -rt   r   Nbufferr   F)block)r~   r   msvcrtr   r   ioUnsupportedOperationsetmodestdoutfilenorx   O_BINARYhasattrrg  r[  LockingUnsupportedErrorlocked_filer  r   openerrnoEACCESsanitize_path)filename	open_moderi  rb  streamrX  old_filenamer   r   r   sanitize_openG  s6   

"
r{  c                 C   s(   d}t j| }|durt j|}|S )z:Convert RFC 2822 defined time string into system timestampN)emailutilsparsedate_tz	mktime_tz)timestr	timestamp	timetupler   r   r   timeconvertn  s
   r  c                    s  | dkrdS  fdd}r t u s std| } tddd | } dt|| } t u rGtdd	|}d
}td| d| dd|}|ddpNd} sd|v r_|dd}d|v sU|d}rq|	drq|dd }|	drd|t
dd  }|d}|sd}|S )a/  Sanitizes a string so it could be used as part of a filename.
    @param restricted   Use a stricter subset of allowed characters
    @param is_id        Whether this is an ID that should be kept unchanged if possible.
                        If unset, yt-dlp's new sanitization rules are in effect
    r   c                    s   r
| t v r
t |  S s| dkrdS  tu r+s+| dv r+ddd| tt| d S | dks;t| d	k s;t| d
kr=dS | dkrGrEdS dS | dkrQrOdS dS | dv rWdS rt| dv sg|  sgt| d
krtt| d dv rrdS dS | S )NrE  z  z	"*:<>?|/\u   ⧸u   ⧹)r   \i  r          r   "'r   z _ -z   -z\/|*<>z _z!&'()[]{}$;`^,#r   CM)ACCENT_CHARSr   getchrordisspaceunicodedatacategory)charis_id
restrictedr   r   replace_insane  s"     z)sanitize_filename.<locals>.replace_insaneNFKCz[0-9]+(?::[0-9]+)+c                 S   s   |  dddS )Nr   r   r   )r  replacer	  r   r   r   <lambda>      z#sanitize_filename.<locals>.<lambda>z(\0.)(?:(?=\1)..)+\1z(?:\0.|[ _-])*z^ .|z .$ r   __z-_r   Nrf  r   )r   r  	normalizer   r  r   mapr  rF  rV  r   r]  )ra  r  r  r  resultSTRIP_REr   r  r   sanitize_filenamew  s2   


r  c                 C   sf   g }| D ],}|r|dkrq|dkr$|r|d dkr|   n|d qtdd|}|| q|S )Nr   z..rR  z[/<>:"\|\\?\*]|[\s.]$#)r  r   r   r  )partssanitized_partspartsanitized_partr   r   r   _sanitize_path_parts  s   

r  c                 C   s  t jdkr&|s	| S | drdnd}dt| d}|s |r$|| S dS | dd}|drH|d}d|dd d }|dd }n5|d	d
 dkrl|d
d dkrZdnd
}|d| }||d d}n|dd	 dkrvdnd}|d}dt|}|s|r|| S dS )z(Sanitizes and normalizes path on Windowsrt   r   r   r   r  z\\N   r   r   r      )r~   r   rV  r   r  r   r  )ra  forcerootry   normedr  r/  r   r   r   rv    s&   



rv  http)schemec                C   sX   | d u rd S |  dr| d|  S d}|D ]\}}t|| r)t|||   S q| S )N//r   ))z
^httpss://zhttps://)z^rmtp([es]?)://z	rtmp\1://)rV  r   r   r  )urlr  COMMON_TYPOSmistakefixupr   r   r   sanitize_url  s   
r  c                 C   s   t j| }|jd u r| d fS t j|j|jd u r|jn|j d|j d} t	d
|j|jp2d }| d|  fS )Nr   )netlocz{}:{}r   zBasic )urllibparseurlsplitusername
urlunsplit_replaceporthostnamebase64	b64encodeformatpasswordrg   r^  )r  r  auth_payloadr   r   r   extract_basic_auth  s   

r  c                 C   s   t jt| S )zExpand shell variables and ~)rx   ry   
expandvarsr   ra  r   r   r   expand_path   s   r  )lazyc                   s     fdd}|r| S t | S )z-Remove all duplicates from the input iterablec                  3   s,    g }  D ]}|| vr|  | |V  qd S r   )r   )seenr   iterabler   r   _iter  s   
zorderedSet.<locals>._iter)list)r  r  r  r   r  r   
orderedSet  s   r  c                 C   s   | dd }|t jjv rtt jj| S | t jjv r t jj|  S td|}|durZ|d}|dr<d}d| }nd}t	
t tt||W  d   S 1 sUw   Y  d	| d
S )z)Transforms an HTML entity to a character.NrR  z#(x[0-9a-fA-F]+|[0-9]+)r   r      0rZ  &;)r   entitiesname2codepointr  html5r   r   r  rV  r   r   r#  int)entity_with_semicolonentitymobjnumstrbaser   r   r   _htmlentity_transform  s    

 r  c                 C   s,   | d u rd S t | tsJ tddd | S )Nz
&([^&;]+;)c                 S   s   t | dS r=  )r  r  r  r   r   r   r  4      zunescapeHTML.<locals>.<lambda>)r   r   r   r  r  r   r   r   r  .  s   
r  c                 C   s,   |  dd dd dd dd d	d
S )Nr  &amp;r*  z&lt;r)  z&gt;r  z&quot;r  z&#39;r  )r   r   r   r   
escapeHTML7  s   r  c                   @   s   e Zd Zdd ZdS )netrc_from_contentc                 C   sL   i i | _ | _t|}| d|d W d    d S 1 sw   Y  d S )Nrf  F)hostsmacrosrj  StringIO_parse)r  r   ry  r   r   r   r  C  s   "znetrc_from_content.__init__N)r   r   r   r  r   r   r   r   r  B  s    r  c                       s   e Zd Zejdkre Ze jej	O  _ndZe
dd Zdddd fdd
Zd	d
 Zdd Zdd fdd
ZeddddZ  ZS )Popenrt   Nc                    s6   t tdsd S d d<  fdd}|d |d d S )N_MEIPASS1PYINSTALLER_RESET_ENVIRONMENTc                    s4     |  d}|d u r | d  d S | | < d S )N_ORIG)r  r  )r   origenvr   r   _fix]  s   z+Popen._fix_pyinstaller_issues.<locals>._fixLD_LIBRARY_PATHDYLD_LIBRARY_PATH)rp  r~   )r  r  r   r  r   _fix_pyinstaller_issuesP  s   
zPopen._fix_pyinstaller_issuesF)r  r   shellc                   s  |d u r	t j }| | |dp|dp|p|d| _|du r4d|d< |dd |dd t jdkrq|dd u rq|sTt|t	rT|rT|d	 
 d
rTd}|rqt|tsat|dd}d}d|d< |   d| d}t j|g|R ||d|d| ji d S )Nrr   errorsuniversal_newlinesTrl   r  nt
executabler   )z.batz.cmdr  Fz"^

"=z /Q /S /D /V:OFF /E:ON /C "r  )r  r  startupinfo)rx   environcopyr  r  _Popen__text_mode
setdefaultr   r   r  lowerrW  r   shell_quote_Popen__comspecrN  r  _startupinfo)r  r   r  r   r  	remainingr   rO  r   r   r  g  s$   

$$
.zPopen.__init__c                 C   s>   t jdpt jt jdddd}t j|r|S td)NComSpec
SystemRootr   System32zcmd.exez:shell not found: neither %ComSpec% nor %SystemRoot% is set)rx   r  r  ry   r   isabsFileNotFoundError)r  comspecr   r   r   	__comspec  s   zPopen.__comspecc                 O   s0   z	| j |i |W S  ty   | jd d  w )Ntimeout)communicateBaseExceptionkillr  r   r   r   r   r   communicate_or_kill  s   zPopen.communicate_or_killr   r  c                   s&   t    |dkr| j|d d S d S )Nr   r  )rN  r  wait)r  r  rO  r   r   r    s   
z
Popen.killc                O   sd   | |i |!}|j rdnd}|j|d\}}|p||p||jfW  d    S 1 s+w   Y  d S )Nr       r  )r  r  
returncode)clsr  r   r   procr   rm  stderrr   r   r   run  s
   $z	Popen.run)r   r   r   r~   r   
subprocessSTARTUPINFOr  dwFlagsSTARTF_USESHOWWINDOWrd  r  r  r  r  r  classmethodr  re  r   r   rO  r   r  I  s    

r  c                 C   s   t | tr| S | dS Nascii)r   r   r^  r  r   r   r   encodeArgument  s   r   Time)hoursminutessecondsmillisecondsc                 C   s8   t | d\}} t |d\}}t |d\}}t|||| S )N  <   )divmod
_timetuple)msecsecsminshrsr   r   r   timetuple_from_msec  s   r.  r   c                 C   sf   t | d }|jrd|j||j||jf }n|jr#d|j||jf }nd|j }|r1d||jf S |S )Nr&  z%d%s%02d%s%02dz%d%s%02d%dz%s.%03d)r.  r"  r#  r$  r%  )r+  delimr*  timeretr   r   r   formatSeconds  s   
r3  r  c                 C   s^   ddl m} d| d}|  } | r| dr#|d  |dd   }| r+| d | S d	| S )
Nr   )
REPOSITORYz0please report this issue on  https://github.com/zo/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U)r   !r   r   r   rD  r   )updater4  rstriprW  title)beforer4  rU  r   r   r   bug_reports_message  s   r:  c                       s&   e Zd ZdZdZd fdd	Z  ZS )YoutubeDLErrorz$Base exception for YoutubeDL errors.Nc                    s8   |d ur|| _ n| j d u rt| j| _ t | j  d S r   )rU  r`  r   rN  r  )r  rU  rO  r   r   r    s
   
zYoutubeDLError.__init__r   r   r   r   r   rU  r  re  r   r   rO  r   r;    s    r;  c                       sB   e Zd ZdZd fdd	Zedd Zdd	 Z fd
dZ  Z	S )r   zError during info extraction.NFc                    s   ddl m} t d |v rd}t|| _|| _|| _|| _|| _	|| _
t | _t| jd tr8| jd j| _t | j dS )z tb, if given, is the original traceback (so that it can be printed out).
        If expected is set, this is a normal error message and most likely not a bug in yt-dlp.
        r   )network_exceptionsr   Tr   N)networking.exceptionsr=  r~   exc_infor   orig_msg	tracebackexpectedcausevideo_idier   r   rN  r  _ExtractorError__msg)r  rU  tbrB  rC  rD  rE  r=  rO  r   r   r    s   

zExtractorError.__init__c              	   C   sD   d t| jd dt| jd d| jt| jd d| jrdfS t fS )Nr   z[%s] z%s: z (caused by %r))r   format_fieldrE  rD  r@  rC  rB  r:  r  r   r   r   __msg  s   zExtractorError.__msgc              	   C   sJ   t | jodt| j| jodtd | j| jjdd  ddp$d S )Nr   r   rE  r0  )join_nonemptyrA  r   	format_tbrC  format_exception__traceback__r  r   r   r   format_traceback  s   &zExtractorError.format_tracebackc                    sJ   t  || t| dd r!|dvr#| jpt| j| _| jf| _d S d S d S )NrU  )rU  r   )rN  __setattr__getattrrF  r`  r   rU  r   )r  r   r   rO  r   r   rP    s
   zExtractorError.__setattr__)NFNNN)
r   r   r   r   r  propertyrF  rO  rP  re  r   r   rO  r   r     s    
r   c                       s   e Zd Z fddZ  ZS )UnsupportedErrorc                    s    t  jd| dd || _d S )NzUnsupported URL: TrB  )rN  r  r  )r  r  rO  r   r   r    s   

zUnsupportedError.__init__r   r   r   r  re  r   r   rO  r   rS    s    rS  c                   @      e Zd ZdZdS )RegexNotFoundErrorzError when a regex didn't matchNr   r   r   r   r   r   r   r   rW    s    rW  c                       "   e Zd ZdZd fdd	Z  ZS )GeoRestrictedErrorzGeographic restriction Error exception.

    This exception may be thrown when a video is not available from your
    geographic location due to geographic restrictions imposed by a website.
    Nc                    s&   d|d< t  j|fi | || _d S )NTrB  )rN  r  	countries)r  rU  r[  r   rO  r   r   r    s   
zGeoRestrictedError.__init__r   r   r   r   r   r  re  r   r   rO  r   rZ  
  s    rZ  c                       rY  )UserNotLivez%Error when a channel/user is not liveNc                    s$   d|d< t  j|p
dfi | d S )NTrB  z!The channel is not currently live)rN  r  )r  rU  r   rO  r   r   r    s   zUserNotLive.__init__r   r\  r   r   rO  r   r]        r]  c                       rY  )DownloadErrorzDownload Error exception.

    This exception may be thrown by FileDownloader objects if they are not
    configured to continue on errors. They will contain the appropriate
    error message.
    Nc                    s   t  | || _dS )zh exc_info, if given, is the original exception that caused the trouble (as returned by sys.exc_info()). N)rN  r  r?  )r  rU  r?  rO  r   r   r  '  s   
zDownloadError.__init__r   r\  r   r   rO  r   r_    s    r_  c                   @      e Zd ZdZdZdS )EntryNotInPlaylistzEntry not in playlist exception.

    This exception will be thrown by YoutubeDL when a requested entry
    is not found in the playlist info_dict
    zEntry not found in infoNr   r   r   r   rU  r   r   r   r   ra  -  s    ra  c                       &   e Zd ZdZdZd fdd	Z  ZS )SameFileErrorzSame File exception.

    This exception will be thrown by FileDownloader objects if they detect
    multiple files would have to be downloaded to the same file on disk.
    z4Fixed output name but more than one file to downloadNc                    .   |d ur|  j d| 7  _ t | j  d S N: rU  rN  r  )r  rw  rO  r   r   r  >     zSameFileError.__init__r   r<  r   r   rO  r   rd  6      rd  c                   @   rV  )PostProcessingErrorzPost Processing exception.

    This exception may be raised by PostProcessor's .run() method to
    indicate an error in the postprocessing task.
    NrX  r   r   r   r   rk  D  s    rk  c                   @   r`  )DownloadCancelledz@ Exception raised when the download queue should be interrupted zThe download was cancelledNrb  r   r   r   r   rl  L      rl  c                   @   r`  )ExistingVideoReachedz --break-on-existing triggered zWEncountered a video that is already in the archive, stopping due to --break-on-existingNrb  r   r   r   r   rn  Q  rm  rn  c                   @   r`  )RejectedVideoReachedz  --break-match-filter triggered zSEncountered a video that did not match filter, stopping due to --break-match-filterNrb  r   r   r   r   ro  V  rm  ro  c                   @   r`  )MaxDownloadsReachedz) --max-downloads limit has been reached. zDMaximum number of downloads reached, stopping due to --max-downloadsNrb  r   r   r   r   rp  [  rm  rp  c                       rY  )ReExtractInfoz& Video info needs to be re-extracted. Fc                    s   t  | || _d S r   )rN  r  rB  )r  rU  rB  rO  r   r   r  c  s   
zReExtractInfo.__init__Fr\  r   r   rO  r   rq  `  r^  rq  c                       s$   e Zd ZdZdZ fddZ  ZS )ThrottledDownloadz( Download speed below --throttled-rate. z*The download speed is below throttle limitc                    s   t  j| jdd d S )NFrT  rN  r  rU  r  rO  r   r   r  l     zThrottledDownload.__init__r<  r   r   rO  r   rs  h  s    rs  c                       rc  )UnavailableVideoErrorzUnavailable Format exception.

    This exception will be thrown when a video is requested
    in a format that is not available for that video.
    zUnable to download videoNc                    re  rf  rh  )r  rX  rO  r   r   r  x  ri  zUnavailableVideoError.__init__r   r<  r   r   rO  r   rv  p  rj  rv  c                           e Zd ZdZ fddZ  ZS )ContentTooShortErrorzContent Too Short exception.

    This exception may be raised by FileDownloader objects when a file they
    download is too small for what the server announced first, indicating
    the connection was probably interrupted.
    c                    s*   t  d| d| d || _|| _d S )NzDownloaded z bytes, expected z bytes)rN  r  
downloadedrB  )r  ry  rB  rO  r   r   r    s   
zContentTooShortError.__init__r\  r   r   rO  r   rx  ~  s    rx  c                       s   e Zd Zd fdd	Z  ZS )XAttrMetadataErrorNUnknown errorc                    sr   t  | || _|| _| jtjtjfv sd| jv sd| jv r$d| _d S | jtjks/d| jv r4d| _d S d| _d S )NzNo space leftzDisk quota exceededNO_SPACEzArgument list too longVALUE_TOO_LONGNOT_SUPPORTED)	rN  r  coderU  rt  ENOSPCEDQUOTreasonE2BIG)r  r  rU  rO  r   r   r    s   


zXAttrMetadataError.__init__)Nr{  rU  r   r   rO  r   rz    s    rz  c                   @   r   )XAttrUnavailableErrorNr   r   r   r   r   r    r   r  c                 C   s   t | tttjfS r   )r   r   bytesrx   PathLikefr   r   r   is_path_like  r>  r  c                 C   s   t d| }d }|s3t d| }t|o|d }|d ur2| d t|d  } tj|d}n1| d t|d  } |drd|ddkrMdnd}tj|t	|d	 |t	|d
 d}|d u rr|t
urr|pqt }|| fS )Na  (?x)
            ^.{8,}?                                              # >=8 char non-TZ prefix, if present
            (?P<tz>Z|                                            # just the UTC Z, or
                (?:(?<=.\b\d{4}|\b\d{2}:\d\d)|                   # preceded by 4 digits or hh:mm or
                   (?<!.\b[a-zA-Z]{3}|[a-zA-Z]{4}|..\b\d\d))     # not preceded by 3 alpha word or >= 4 alpha or 2 digits
                   [ ]?                                          # optional space
                (?P<sign>\+|-)                                   # +/-
                (?P<hours>[0-9]{2}):?(?P<minutes>[0-9]{2})       # hh[:]mm
            $)
        +\d{1,2}:\d{1,2}(?:\.\d+)?(?P<tz>\s*[A-Z]+)$tzr"  sign+r   rR  r"  r#  )r"  r#  )r   searchTIMEZONE_NAMESr  r  rF  r   dt	timedeltar  r   )date_strr   r	  timezoner  r   r   r   extract_timezone  s,   	
r  Tc                 C   s   | du rdS t dd| } t| |\}} ttt d| d}tj	| || }t
| W  d   S 1 s;w   Y  dS )z- Return a UNIX timestamp from the given date Nz\.[0-9]+r   rb   z%H:%M:%S)r   r  r  r   r   r#  	TypeErrorr  datetimestrptimecalendartimegmr  )r  	delimiterr  date_formatdt_r   r   r   parse_iso8601  s   $r  c                 C   s   | rt S tS r   )DATE_FORMATS_DAY_FIRSTDATE_FORMATS_MONTH_FIRST)	day_firstr   r   r   date_formats  r  r  c              	   C   s   | du rdS d}|  dd} tdd| } t| \}} t|D ]!}tt tj	
| |d}W d   n1 s;w   Y  q|du rntj| }|rntt tj	|dd  d}W d   n1 siw   Y  |durvt|S dS )z4Return a string with the date in the format YYYYMMDDNrQ  rD  (?i)\s*(?:AM|PM)(?:\s+[A-Z]+)?r   rc      )r  r   r  r  r  r   r   r#  r  r  r  strftimer|  r}  r~  r   )r  r  upload_dater   
expressionr  r   r   r   unified_strdate  s(   r  c           	   	   C   sD  t | tsd S tddtdd| } td| rdnd}t| |r'tj|dnd d	\}} td
d| } td| }|rH| d t|	d  } td| }|rU|	d} t
|D ]/}tt  tj| || tj|d }t| W  d      S 1 sw   Y  qYtj| }|rt||d  t|  S d S )NrC  rD  z>(?i)[,|]|(mon|tues?|wed(nes)?|thu(rs)?|fri|sat(ur)?|sun)(day)?r   z(?i)PM   r   r  r   r  r  r  zT^([0-9]{4,}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\.[0-9]{6})[0-9]+$r     )r   r   r   r  r  r  r  r  r   r  r  r   r   r#  r  r  r  r  r  r|  r}  r~  r  total_seconds)	r  r  	tz_offsetpm_deltar  r	  r  r  r  r   r   r   unified_timestamp  s2   


&r  unknown_videoc                 C   sX   | d u sd| vr
|S |  dd dd }td|r|S |dtv r*|dS |S )Nr   r   r   r   z^[A-Za-z0-9]+$r   )	partition
rpartitionr   r   r7  KNOWN_EXTENSIONS)r  default_extguessr   r   r   determine_ext  s   
r  c                 C   s   t | |d | |S Nr   )replace_extension)rw  sub_lang
sub_formatexpected_real_extr   r   r   subtitles_filename%     r  autorc   c                 C   s,  d}|dkr
d}d}t tjtjj|}| dv r|S | dkr'|tjdd S td	| }|d
urt	|
d||}t|
d|
ddkrIdnd }|
d}|dksY|dkrit||dkrc|d n|}	d}n|dkrsd}|d9 }tjdi |d |i}
||
 }	|rt |	|S |	S t tj| ||S )a  
    Return a datetime object from a string.
    Supported format:
        (now|today|yesterday|DATE)([+-]\d+(microsecond|second|minute|hour|day|week|month|year)s?)?

    @param format       strftime format of DATE
    @param precision    Round the datetime object: auto|microsecond|second|minute|hour|day
                        auto: round to the unit provided in date_str (if applicable).
    Fr  Tmicrosecond)nowtoday	yesterdayr   )dayszf(?P<start>.+)(?P<sign>[+-])(?P<time>\d+)(?P<unit>microsecond|second|minute|hour|day|week|month|year)s?Nr  r1  r  rf  rR  unitmonthyearr  dayweek   ra  r   )datetime_roundr  r  r  r  utcr  r   r   datetime_from_strr  r  datetime_add_monthsr  )r  	precisionr  auto_precisionr  r   
start_timer1  r  new_datedeltar   r   r   r  )  s:   
$

r  c                 C   s2   |rt d| std|  dt| d|d S )z
    Return a date object from a string using datetime_from_str

    @param strict  Restrict allowed patterns to "YYYYMMDD" and
                   (now|today|yesterday)(-\d+(day|week|month|year)s?)?
    z9\d{8}|(now|today|yesterday)(-\d+(day|week|month|year)s?)?zInvalid date format "r  r  )r  r  )r   	fullmatchr#  r  date)r  r  ra   r   r   r   date_from_strS  s   r  c                 C   sN   | j | d }| j|d  }|d d }t| jt||d }| |||S )z0Increment/Decrement a datetime object by months.r   r  )r  r  minr  r  
monthranger  )r  monthsr  r  r  r   r   r   r  _  s
   r  r  c                 C   sP   |dkr| S d}ddddd}dd	 }|t |  | j|  || }t|S )
z@
    Round a datetime object's time to a specific precision
    r  @B Q r  r'  r   )r  hourminutesecondc                 S   s   | |d  | | S rL  r   )r   r   r   r   r   r  v  r   z datetime_round.<locals>.<lambda>)r  r  r  r  r   )r  r  
time_scaleunit_secondsroundtor  r   r   r   r  h  s   "r  c                 C   s&   t d| }|durd| S | S )z?
    Convert a date in 'YYYYMMDD' format to 'YYYY-MM-DD' formatz^(\d\d\d\d)(\d\d)(\d\d)$Nrf  )r   r   r   groups)r  r   r   r   r   hyphenate_date{  s   r  c                   @   sF   e Zd ZdZdddZedd Zdd Zd	d
 Zdd Z	dd Z
dS )	DateRangez,Represents a time interval between two datesNc                 C   sl   |durt |dd| _ntjj | _|durt |dd| _ntjj | _| j| jkr4td|  ddS )z<start and end must be strings in the format accepted by dateNTr`   zDate range: "z." , the start date must be before the end date)	r  r  r  r  r  r  endmaxr#  r  r  r  r   r   r   r    s   zDateRange.__init__c                 C   s
   | ||S )z0Returns a range that only contains the given dayr   )r  r  r   r   r   r    s   
zDateRange.dayc                 C   s0   t |tjs
t|}| j|  ko| jkS   S )z!Check if the date is in the range)r   r  r  r  r  r  )r  r  r   r   r   __contains__  s   zDateRange.__contains__c                 C   s.   t  dt| j  d| j d| j dS Nr   (, ))r   r`  r  	isoformatr  r  r   r   r   __repr__  s   .zDateRange.__repr__c                 C   s   | j  d| j S )Nz to )r  r  r  r   r   r   __str__  r>  zDateRange.__str__c                 C   "   t |to| j|jko| j|jkS r   )r   r  r  r  r  otherr   r   r   __eq__  
   


zDateRange.__eq__NN)r   r   r   r   r  r  r  r  r  r  r  r   r   r   r   r    s    

r  c                  C   s   t  } | dkrttdr| dtjd d  7 } g }tt t  }W d    n1 s.w   Y  d	t 
 | t  t  d t   tjtt|ddid d	S )
NPyPypypy_version_infoz version %d.%d.%dr  z Python {} ({} {} {}) - {} ({}{})r   r0  rD  z, %s)r   python_implementationrp  r~   r  r   r   r   libc_verr  python_versionmachinearchitecturesslOPENSSL_VERSIONrH  rK  )r  r  r   r   r   system_identifier  s    

r  c                   C   s   t jdkrtt d S dS )z@ Get Windows version. returns () if it's not running on Windows r  r   r   )rx   r   version_tupler   	win32_verr   r   r   r   get_windows_version  s   
r  c                 C   s   t | tsJ |ptj}|sd S tjdkr t|r tdd| } d |}}dt	|dd p-dv r5|p3t
 }nt|drH|j}|pGt	|dd pGt
 }||rR| |d	n|  |  d S )
Nr  z	([\r\n]+)z \1brq   r   rg  rr   ignore)r   r   r~   r  rx   r   supports_terminal_sequencesr   r  rQ  rj   rp  rg  writerg   flush)ra  outrr   encrg  r   r   r   write_string  s   


r
  )printer
stacklevelc                K   s~   t jr.| tjv r
d S tj|  |r||  t  fi |S td|  t  dfi |S dd l}|jt	| |d d d S )NzERROR: rE  r   r  )r  )
r
   r   deprecation_warning_cacheaddr:  r
  warningswarnDeprecationWarning)rU  r  r  r   r  r   r   r   r    s   
r  c                       rw  )rq  zFile locking is not supportedc                    s   t  | j d S r   rt  r  rO  r   r   r    r>  z LockingUnsupportedError.__init__)r   r   r   rU  r  re  r   r   rO  r   rq    s    rq  rt   c                   @   sB   e Zd ZdejjfdejjfdejjfdejjfdejjfgZdS )
OVERLAPPEDInternalInternalHighOffset
OffsetHighhEventN)	r   r   r   ctypeswintypesLPVOIDDWORDHANDLE_fields_r   r   r   r   r    s    




r  kernel32    ic                 C   sr   t  }d|_d|_d|_t|| _tt	| 
 |rdnd|r"dndB dtt| js7tdtt d S )Nr   r   r   zLocking file failed: )r  r  r  r  r  pointer_lock_file_overlapped_p
LockFileExri  get_osfhandlern  	whole_low
whole_highBlockingIOErrorFormatErrorGetLastError)r  	exclusiverh  
overlappedr   r   r   
_lock_file  s   
r,  c                 C   s@   | j sJ t|  }t|dtt| j stdt	 d S )Nr   zUnlocking file failed: )
r"  ri  r$  rn  UnlockFileExr%  r&  r   r  r(  )r  handler   r   r   _unlock_file)  s
   
r/  c                 C   s`   |rt jnt j}|s|t jO }z	t | | W d S  ty      ty/   t | | Y d S w r   )fcntlLOCK_EXLOCK_SHLOCK_NBflockr'  r   lockf)r  r*  rh  r   r   r   r   r,  3  s   
c                 C   s   t t t| tjW  d    S 1 sw   Y  t t t| tjW  d    S 1 s3w   Y  t| tjtjB S r   )r   r   r   r0  r4  LOCK_UNr5  r3  r  r   r   r   r/  >  s     c                 C      t r   rq  )r  r*  rh  r   r   r   r,  G  r   c                 C   r7  r   r8  r  r   r   r   r/  J  r   c                   @   sJ   e Zd ZdZdddZdd Zdd	 Zd
d ZeZeZ	dd Z
dd ZdS )rr  FTNc              
      s    dvrt   || _| _t fdddD }t fdddD }ttjtt	ddtt	d	dtt	d
d|r=t	j
ndd v rEt	jndd v rMt	jnd|sSt	jn|rXt	jnt	jf}t	jt	||d |d| _d S )N>   arrk   abrbwbc                 3       | ]}| v V  qd S r   r   r   r  rq   r   r   	<genexpr>V      z'locked_file.__init__.<locals>.<genexpr>zwax+c                 3   r>  r   r   r?  r@  r   r   rA  W  rB  zr+	O_CLOEXECr   ro  O_NOINHERITr9  r   ru   rr   )NotImplementedErrorrq   rh  anyr   reduceoperatoriorrQ  rx   O_CREATO_APPENDO_EXCLO_RDONLYO_RDWRO_WRONLYfdopenrs  r  )r  rw  rq   rh  rr   writablereadabler   r   r@  r   r  Q  s   


 
zlocked_file.__init__c              
   C   s   d| j v}zt| j|| j d| _W n ty   | j   w d| j v rKz| j  W | S  tyJ } z|jtj	tj
fvr? W Y d }~| S d }~ww | S )Nr:  Trk   )rq   r,  r  rh  lockedr   r  truncatert  ESPIPEEINVAL)r  r*  rc  r   r   r   r  d  s.   




zlocked_file.__enter__c                 C   s*   | j sd S zt| j W d| _ d S d| _ w NF)rT  r/  r  r  r   r   r   unlockw  s
   zlocked_file.unlockc                 G   s&   z|    W | j  d S | j  w r   )rY  r  r  r  r   r   r   r    s   
zlocked_file.__exit__c                 C   s   t | j|S r   )rQ  r  )r  attrr   r   r   __getattr__  r  zlocked_file.__getattr__c                 C   s
   t | jS r   )iterr  r  r   r   r   __iter__  r   zlocked_file.__iter__)TN)r   r   r   rT  r  r  rY  r  rs  r  r[  r]  r   r   r   r   rr  N  s    
rr  c                  C   s   t  } | d ur
| S dS )Nrl   )r~   getfilesystemencodingrE  r   r   r   get_filesystem_encoding  s   r_  r  z\"""z%=%z%%cd:~,%)r  rE  %r  c                   sD   t t| } tjdkrt| S |rtnt d fdd| D S )Nr  rD  c                 3   s>    | ]}t d |t jr|nt dd| dV  qdS )z[\w#$*\-+./:?@\\]+z
(\\+)("|$)z\1\1\2r`  N)r   r  ASCIIr  	translater   r   ra  transr   r   rA    s    
zshell_quote.<locals>.<genexpr>)r  variadicrx   r   shlexr   _CMD_QUOTE_TRANS_WINDOWS_QUOTE_TRANS)r   r  r   rf  r   r     s   

r   c                 C   s:   t | i \} }|| tjdt|i}| d | S )z1 Pass additional data in a URL for internal use. __youtubedl_smuggler  )unsmuggle_urlr6  r  r  	urlencoder|   dumps)r  dataidatasdatar   r   r   smuggle_url  s   
rs  c                 C   sF   d| vr| |fS |  d\}}}tj|d d }t|}||fS )Nz#__youtubedl_smuggler  rl  r   )r  r  r  parse_qsr|   loads)smug_urlr   r  r   rr  jsondrp  r   r   r   rm    s   
rm  %d%sr&  factorc                C   s   t | t|} }| du s| dk rdS d}| dkrdnttt| |t|}dg|| }|dkr?ddd|| d}| ||  }|||f S )	z5 Formats numbers with decimal sufixes like K, M, etc Nr   kMGTPEZYr      Ki)kr   i)float_or_nonefloatr  r  mathlogr   r  )numfmtrz  POSSIBLE_SUFFIXESexponentro   	convertedr   r   r   format_decimal_suffix  s   &r  c                 C   s   t | dddpdS )Nz%.2f%sBr|  ry  zN/A)r  )r  r   r   r   format_bytes  r>  r  c                 C   s   |rt nt dd}ddd | D }|rtjntjd| d| d|}|s*d S t|d	d
d}| |d }t|| S )Nz\.z[,.]r  c                 s       | ]}t |V  qd S r   r   r   )r   ur   r   r   rA        z$lookup_unit_table.<locals>.<genexpr>z(?P<num>z)\s*(?P<unit>z)\br  rQ  r   r  )		NUMBER_REr  r   r   r  r   r  r  round)
unit_tablera  ra   num_reunits_rer	  r  multr   r   r   lookup_unit_table  s   r  c                 C   s&   t dd tdgdD |  ddS )z9Parse a string indicating a byte quantity into an integerc                 S   s   i | ]	\}}|d | qS )r|  r   )r   r  r  r   r   r   
<dictcomp>      zparse_bytes.<locals>.<dictcomp>r   KMGTPEZYTr`   )r  	enumerateupperr  r   r   r   parse_bytes  s   r  c              
   C   sj  | d u rd S i ddddddddddd	dd
dddddddddddddddddddddi ddddddddddddddd d!d"d#d$d!d%d#d&d#d'd#d(d!d)d*d+d,d-d*i d.d,d/d,d0d,d1d*d2d3d4d5d6d3d7d5d8d5d9d5d:d3d;d<d=d>d?d<d@d>dAd>dBd>d<dCdDdCdDdDdDdCdE}t || S )FNBr   r  r  KiBr|  KBr&  kBKbkb	kilobytes	kibibytesMiBi   MBr  mBMbmb	megabytes	mebibytesGiBi   @GB ʚ;gBGbgb	gigabytes	gibibytesTiBl        TBl    J)tBTbrG  	terabytes	tebibytesPiBl           PBl     I5 pBPbpb	petabytes	pebibytesEiBl            EBl     NZoeBEbebexabytes	exbibytesZiBl            ZBl     @=7M.czBZbzb
zettabytesl               l      B3v^!< )	zebibytesYiBYByBYbyb
yottabytes	yobibytes)r  )ra  _UNIT_TABLEr   r   r   parse_filesize  s   	
 !"#$%&'()*+,-./01234
>r  c              	   C   s   | d u rd S t dd|  } t d| rt| S ddddddddd}t|| }|d ur/|S t d| }|r>t|d	S d S )
Nz	^[^\d]+\sr   z	^[\d,.]+$r&  r  r  )r~  Kr	  MkkKKr  r  z([\d,.]+)(?:$|\s)r   )r   r  rF  r   
str_to_intr  r  )ra  r  r2  r  r   r   r   parse_count0  s*   
r  )lenientc                C   s   | d u ri S |rt d| }nt d| }|r&t|dt|ddS t d| }|r7dt|diS t d	| }|rJdt|dd
 iS |r]t d| }|r]dt|diS i S )Nu!   (?P<w>\d+)\s*[xX×,]\s*(?P<h>\d+)u@   (?<![a-zA-Z0-9])(?P<w>\d+)\s*[xX×,]\s*(?P<h>\d+)(?![a-zA-Z0-9])rk   hwidthheightz*(?<![a-zA-Z0-9])(\d+)[pPiI](?![a-zA-Z0-9])r  r   z\b([48])[kK]\bi  z (?<!\d)(\d{2,5})w(?![a-zA-Z0-9])r  )r   r  r  r  )ra  r  r  r   r   r   parse_resolutionM  s(   r  c                 C   s0   t | tsd S td| }|rt|dS d S )Nz\b(\d+)\s*kbpsr   )r   r   r   r  r  r  )ra  r  r   r   r   parse_bitratek  s   
r  r=   c                 C   s6   t |t d }z|| d W S  ty   Y dS w )zE Return the number of a month by (locale-independently) English name r=   r   N)MONTH_NAMESr  r"  r#  )r   langmonth_namesr   r   r   month_by_names  s   r  c                 C   s0   zdd t D | d W S  ty   Y dS w )zV Return the number of a month by (locale-independently) English
        abbreviations c                 S   s   g | ]}|d d qS )Nr  r   re  r   r   r   r         z)month_by_abbreviation.<locals>.<listcomp>r   N)ENGLISH_MONTH_NAMESr"  r#  )abbrevr   r   r   month_by_abbreviation~  s
   r  c                 C      t dd| S )z%Replace all the '&' by '&amp;' in XMLz<&(?!amp;|lt;|gt;|apos;|quot;|#x[0-9a-fA-F]{,4};|#[0-9]{,4};)r  r   r  )xml_strr   r   r   fix_xml_ampersands  s
   r  c                 C   s   t | tsJ zdd l}W n
 ty   Y d S w z|jd}W n ty*   Y d S  ty3   Y d S w |  }|	t
|}||_z|d|ddd W d S  tyX   Y d S w )Nr   z	libc.so.6   )r   r   r  ImportErrorcdllLoadLibraryr   r  rg   create_string_bufferr   r   prctlAttributeError)r8  r  libctitle_bytesbufr   r   r   setproctitle  s*   r  c                 C   s&   | d ur|  |r| t|d  S | S r   )rV  r   )ra  r  r   r   r   remove_start     &r  c                 C   s,   | d ur|r|  |r| d t|  S | S r   )rW  r   )ra  r  r   r   r   
remove_end  s   ,r  c                 C   sN   | d u s
t | dk r| S dD ]}| d |kr$| d |kr$| dd   S q| S )Nr   )r  r  r   rR  r   r   )ra  r  r   r   r   remove_quotes  s   r  c                 C   s   t tj| jdpdS )zx
    This implementation is inconsistent, but is kept for compatibility.
    Use this only for "webpage_url_domain"
    zwww.N)r  r  r  urlparser  r  r   r   r   
get_domain  s   r  c                 C   s"   t j| j}|ddd S )Nr   rR  )r  r  r   ry   rF  r   )r  ry   r   r   r   url_basename     r  c                 C   s   t d|  S )Nzhttps?://[^?#]+/)r   r   r  r  r   r   r   base_url  r  r  c                 C   sn   t |tr	| }t |tr|sd S td|r|S t | tr#|  } t | tr.td| s0d S tj| |S )Nz(?:[a-zA-Z][a-zA-Z0-9+-.]*:)?//z^(?:https?:)?//)	r   r  r^  r   r   r   r  r  urljoin)r  ry   r   r   r   r    s   

r  c              
   C   s|   |r| d urt | |d } |dkr|dk rtd| }d}z|d u r%t| nt| |d| | W S  tttfy=   | Y S w )Nr   )r  )rQ  r  r#  r  OverflowError)vscaler   get_attrinvscaler  r   r   r   int_or_none  s   &r  c                 C   s   | d u r|S t | S r   r   r  r   r   r   r   str_or_none  r  r  c                 C   s2   t | tr| S t | trtdd| } t| S dS )z' A more relaxed version of int_or_none z[,\.\+]r   N)r   r  r   r   r  r  )int_strr   r   r   r    s   

r  c              	   C   sZ   | d u r|S |dkr|dk rt d| }d}z	t| | | W S  ttfy,   | Y S w r=  )r  r  r#  r  )r  r	  r  r   r   r   r   r    s   r  c                 C   s   t | tr| S |S r   r   boolr  r   r   r   bool_or_none  r>  r  c                 C   s   t | tr	|  S |S r   )r   r   rF  r  r   r   r   strip_or_none	  ru  r  c                 C   s.   | rt | ts	d S |  } td| r| S d S )Nz@(?:(?:https?|rt(?:m(?:pt?[es]?|fp)|sp[su]?)|mms|ftps?|wss?):)?//)r   r   rF  r   r   r  r   r   r   url_or_none  s   r  c                 C   s~   d }z,t | ttfrt| }nt | trtj| d}t	ddt|
  |}||W S  tttttfy>   | Y S w )Nrc   z(?<!%)(%%)*%s\g<1>)r   r  r  r   r   r  r  r  r   r  r  r  r#  r  r  r  r   )r  r  r   datetime_objectr   r   r   strftime_or_none  s   

r  c                 C   s   t | tsd S |  } | sd S d gd \}}}}}td| }|r0|ddddd\}}}}}n#td| }|rB| \}}}}}ntd	| }|rQ| \}}nd S |r[|d
d}tdd |df|df|df|df|dffD S )N   z(?x)
            (?P<before_secs>
                (?:(?:(?P<days>[0-9]+):)?(?P<hours>[0-9]+):)?(?P<mins>[0-9]+):)?
            (?P<secs>(?(before_secs)[0-9]{1,2}|[0-9]+))
            (?P<ms>[.:][0-9]+)?Z?$
        r  r"  r,  r+  msa  (?ix)(?:P?
                (?:
                    [0-9]+\s*y(?:ears?)?,?\s*
                )?
                (?:
                    [0-9]+\s*m(?:onths?)?,?\s*
                )?
                (?:
                    [0-9]+\s*w(?:eeks?)?,?\s*
                )?
                (?:
                    (?P<days>[0-9]+)\s*d(?:ays?)?,?\s*
                )?
                T)?
                (?:
                    (?P<hours>[0-9]+)\s*h(?:(?:ou)?rs?)?,?\s*
                )?
                (?:
                    (?P<mins>[0-9]+)\s*m(?:in(?:ute)?s?)?,?\s*
                )?
                (?:
                    (?P<secs>[0-9]+)(?P<ms>\.[0-9]+)?\s*s(?:ec(?:ond)?s?)?\s*
                )?Z?$zW(?i)(?:(?P<hours>[0-9.]+)\s*(?:hours?)|(?P<mins>[0-9.]+)\s*(?:mins?\.?|minutes?)\s*)Z?$r   r   c                 s   s$    | ]\}}t |p
d | V  qdS r   N)r  )r   r  r  r   r   r   rA  V     " z!parse_duration.<locals>.<genexpr>r  r  r'  r   )	r   r   rF  r   r   r  r  r  sum)ra  r  r"  r,  r+  r  r	  r   r   r   parse_duration"  s4   

r  c                 C   sd   t j|\}}|r|dd  |kr(|}| r(|r(tj|dd | d| | S | dt| S )Nr   Tprependr   )rx   ry   splitext_UnsafeExtensionErrorsanitize_extension)r   rw  extr  r   real_extr   r   r   _change_extensionZ  s   r&  c                 C   s6   zt j| g|tjtjd W | S  ty   Y dS w )z Checks if the given binary is installed somewhere in PATH, and returns its name.
    args can be a list of arguments for a short output (like -version) )rm  r  F)r  r  r  PIPEr   )exer   r   r   r   check_executablej  s   r)  c                 C   sZ   z"t jt| g|dtjtjtjd\}}}|s|r W d S W |S W |S  ty,   Y dS w )NT)r   stdinrm  r  F)r  r  r   r  r'  STDOUTr   )r(  r   ignore_return_coderm  r   r2  r   r   r   _get_exe_version_outputt  s   r-  presentc                 C   s8   t | tsJ |d u rd}t|| }|r|dS |S )Nzversion\s+([-0-9._a-zA-Z]+)r   )r   r   r   r  r  )output
version_reunrecognizedr	  r   r   r   detect_exe_version  s   
r2  	--version)r.  brokenc                 C   sF   t |}t|dv sJ t| |}|du r|d S |o"t|||d S )z` Returns the version of the specified executable,
    or False if the executable is not present )r   r   NrR  r   )rh  r   r-  r2  )r(  r   r0  r1  r  r   r   r   get_exe_version  s   
r5  c                 c   sb    |du r
d| } }|rddg|dk nd}||  || k r/| V  | |7 } ||  || k sdS dS )zFloat rangeNr   rR  r   r   )r  stopstepr  r   r   r   frange  s   
r8  c                   @   s   e Zd ZdZG dd deZdddddZd	d
 Zdd Zdd Ze	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )LazyListzbLazy immutable list from an iterable
    Note that slices of a LazyList are lists and not LazyListc                   @   r   )zLazyList.IndexErrorNr   r   r   r   r   
IndexError  r   r:  FNreverser  c                C   s&   t || _|d u rg n|| _|| _d S r   )r\  	_iterabler  	_reversed)r  r  r<  r  r   r   r   r    s   

zLazyList.__init__c                 c   sH    | j r|  E d H  d S | jE d H  | jD ]}| j| |V  qd S r   )r>  exhaustr  r=  r   )r  itemr   r   r   r]    s   
zLazyList.__iter__c                 C   s   | j | j g | _| j S r   )r  extendr=  r  r   r   r   _exhaust  s   zLazyList._exhaustc                 C   s    |   dd| jrd S d S )zEvaluate the entire iterableNrR  r   )rB  r>  r  r   r   r   r?    s    zLazyList.exhaustc                 C   s   | d u rd S |  S r   r   r   r   r   r   _reverse_index  s   zLazyList._reverse_indexc              
   C   sf  t |tr(| jrt| |j| |j|jpd }|j|j|jp"d}}}nt |tr>| jr5| |}||d}}}ntd|pEddk s^|pKddk s^|d u rV|dk s^|d u r{|dkr{| 	  z| j
| W S  tyz } z| ||d }~ww t|pd|pdt| j
 d }|dkr| j
t| j| z| j
| W S  ty } z| ||d }~ww )Nr   r   z"indices must be integers or slices)r   slicer>  rC  r  r6  r7  r  r  rB  r  r:  r  r   rA  	itertoolsislicer=  )r  idxr  r6  r7  rc  r   r   r   r   __getitem__  s8   
$

 zLazyList.__getitem__c                 C   s:   z| j r| d  W dS | d  W dS  | jy   Y dS w )NrR  r   FT)r>  r:  r  r   r   r   __bool__  s   
zLazyList.__bool__c                 C   s   |    t| jS r   )rB  r   r  r  r   r   r   __len__  s   
zLazyList.__len__c                 C   s   t | | j| j | jdS Nr;  r`  r=  r>  r  r  r   r   r   __reversed__     zLazyList.__reversed__c                 C   s   t | | j| j| jdS rK  rL  r  r   r   r   __copy__     zLazyList.__copy__c                 C      t |  S r   reprr?  r  r   r   r   r       zLazyList.__repr__c                 C   rQ  r   rR  r  r   r   r   r    r  zLazyList.__str__)r   r   r   r   r:  r  r]  rB  r?  rd  rC  rH  rI  rJ  rM  rO  r  r  r   r   r   r   r9    s     

r9  c                   @   sX   e Zd ZG dd deZdd ZdddZdd	 ZdddZdd Zdd Z	dd Z
dS )	PagedListc                   @   r   )zPagedList.IndexErrorNr   r   r   r   r   r:    r   r:  c                 C   rQ  r   )r   getslicer  r   r   r   rJ  	  rT  zPagedList.__len__Tc                 C   s&   || _ || _td| _|| _i | _d S )Ninf)	_pagefunc	_pagesizer  
_pagecount
_use_cacher  )r  pagefuncpagesize	use_cacher   r   r   r  	  s
   

zPagedList.__init__c                 C   sD   | j |}|d u r|| jkrg nt| |}| jr || j |< |S r   )r  r  rZ  r  rX  r[  )r  pagenumpage_resultsr   r   r   getpage	  s   
zPagedList.getpager   Nc                 C   s   t | ||S r   )r  	_getslicer  r   r   r   rV  	  r  zPagedList.getslicec                 C   s   t d)Nz-This method must be implemented by subclasses)rF  r  r   r   r   rb  	  s   zPagedList._getslicec                 C   sJ   | j sJ dt|tr|dk rtd| ||d }|s!| j|d S )Nz!Indexing PagedList requires cacher   z%indices must be non-negative integersr   )r[  r   r  r  rV  r:  )r  rG  entriesr   r   r   rH  	  s   zPagedList.__getitem__c                 C   s   t | ddS Nr   r   )r  rV  r  r   r   r   rI  #	  r  zPagedList.__bool__Tr  )r   r   r   r:  rJ  r  ra  rV  rb  rH  rI  r   r   r   r   rU    s    

	rU  c                   @   s   e Zd ZdZdd ZdS )OnDemandPagedListz:Download pages until a page with less than maximum resultsc           	   	   c   s   t || j D ]}}|| j }|| j | j }||krq	||  kr'|k r.n n|| j nd}|d urI||  kr>|krIn n	|d | j d nd }z| |}W n ty_   |d | _ w |dksh|d urn||| }|E d H  t|| | jk r d S ||kr d S q	d S rd  )rE  countrY  ra  rh   rZ  r   )	r  r  r  r_  firstidnextfirstidstartvendvr`  r   r   r   rb  *	  s:   

 

zOnDemandPagedList._getsliceN)r   r   r   r   rb  r   r   r   r   rf  '	  s    rf  c                   @   r2  )InAdvancePagedListz5PagedList with total number of pages known in advancec                 C   s   t | ||d || _d S NT)rU  r  rZ  )r  r\  	pagecountr]  r   r   r   r  S	  s   
zInAdvancePagedList.__init__c           	      c   s    || j  }|d u r| jn
t| j|| j  d }||| j   }|d u r%d n|| }t||D ]3}| |}|r?||d  }d }|d ur\t||k rP|t|8 }n|d | E d H   d S |E d H  q.d S r=  )rY  rZ  r  r[  ra  r   )	r  r  r  
start_pageend_page
skip_elems	only_morer_  r`  r   r   r   rb  W	  s"   
$
zInAdvancePagedList._getsliceN)r   r   r   r   r  rb  r   r   r   r   rl  P	  r8  rl  c                   @   sr   e Zd Ze ZdZdd ZedZ	e
dd Zdd Zd	d
 Zejdd Zdd Zdd ZG dd deZdS )PlaylistEntriesFc                 C   s   || _ |d}|d u rtdt|trd| _|d}|d u| _| jrI| js*J | jgt|p2dg | _	t
||D ]\}}|| j	|d < q;d S t|tttfrV|| _	d S t|| _	d S )Nrc  zThere are no entriesTrequested_entriesr   r   )ydlr  ra  r   r  is_exhaustedis_incompleteMissingEntryr  _entriesziprU  r9  )r  ru  	info_dictrc  rt  r  entryr   r   r   r  n	  s"   





zPlaylistEntries.__init__z(?x)
        (?P<start>[+-]?\d+)?
        (?P<range>[:-]
            (?P<end>[+-]?\d+|inf(?:inite)?)?
            (?::(?P<step>[+-]?\d+))?
        )?c                 c   s    | dD ]D}|std| j|}|st|d|dddd\}}}}t|dkr7td	|d
|rEtt|t|t|nt|V  qd S )NrQ  z'There is two or more consecutive commasz is not a valid specificationr  r  r7  r[  r   zStep in z cannot be zero)	r   r#  PLAYLIST_ITEMS_REr  r  r  rD  r  r  )r  stringsegmentr  r  r  r7  	has_ranger   r   r   parse_playlist_items	  s   (z$PlaylistEntries.parse_playlist_itemsc                 c   s    | j jd}| j jdd}| j jd}|dv rd}|s'| d| }n|dks-|r5| j jdd	d
 | |D ]3}| | D ],\}}||fV  |sLq@z| j jds]| j j|d	d	d W q@ ttfyl   Y   d S w q:d S )Nplaylist_itemsplayliststartr   playlistend)rR  Nr   r   zFIgnoring playliststart and playlistend because playlistitems was givenT)	only_oncelazy_playlist)
incompletesilent)ru  paramsr  report_warningr  _match_entryrn  ro  )r  r  playlist_startplaylist_endr"  r  r|  r   r   r   get_requested_items	  s0   

z#PlaylistEntries.get_requested_itemsc                 C   s<   | j r
| js
t| S t| jtr| jjdkr| jjS d S d S r=  )rv  rw  r   r   ry  rl  rY  rZ  r  r   r   r   get_full_count	  s   zPlaylistEntries.get_full_countc                    s,   t  jtr fdd}|S  fdd}|S )Nc                    sV   z j |  }W n ty    j} js jY nw | ju r)td| d  d|S )NzEntry r   z cannot be found)ry  r:  rx  rw  ra  )r  r|  r  r   r   	get_entry	  s   
z*PlaylistEntries._getter.<locals>.get_entryc              	      s@   zt  j fdd j| W S  tjtjfy    jw )Nc                    s
    j | S r   )ry  )r   r  r  r   r   r  	     
 z<PlaylistEntries._getter.<locals>.get_entry.<locals>.<lambda>)r`  ru  _handle_extraction_exceptionsr9  r:  rU  )r  r  r   r   r  	  s
   ")r   ry  r  )r  r  r   r  r   _getter	  s
   zPlaylistEntries._getterc              	   c   s.   t |trt||}|jd u rdn|j}|jd u r'|dkr dnt| d }n|jdkr1|jd nt| |j }|jd u rH|dk rCdntd}n|jdkrR|jd nt| |j }|ddg|dk 7 }t|||D ]+}|dk rpqiz| 	|}W n | j
y   d| _|dkrY  d S Y qiw |d |fV  qid S )Nr   r   rW  rR  T)r   r  rD  r7  r  r   r6  r  r8  r  r:  rv  )r  rG  r7  r  r6  r  r|  r   r   r   rH  	  s0   


"
"zPlaylistEntries.__getitem__c                 C   s   t t| d d  S r   )r   tupler  r   r   r   rJ  	  r  zPlaylistEntries.__len__c                   @   r   )zPlaylistEntries.IndexErrorNr   r   r   r   r   r:  	  r   r:  N)r   r   r   objectrx  rv  r  r   compiler}  r  r  r  r  r   cached_propertyr  rH  rJ  r:  r   r   r   r   rs  j	  s    


rs  c                        t d td fdd| S )Nunicode_escapez\\U[0-9a-fA-F]{8}c                        |  dd S r   r  r  r  r   r   r  	  r  z"uppercase_escape.<locals>.<lambda>codecs
getdecoderr   r  r  r   r  r   uppercase_escape	     

r  c                    r  )Nr  z\\u[0-9a-fA-F]{4}c                    r  r   r  r  r  r   r   r  	  r  z"lowercase_escape.<locals>.<lambda>r  r  r   r  r   lowercase_escape	  r  r  c                 K   s   t jjt j| jfi |S r   )r  r  rt  r   query)r  r   r   r   r   rt  
  s   rt  c                 C   sJ   dd }t | }dd t||D W  d    S 1 sw   Y  d S )Nc                 S   sp   t | ts| dd} d}|D ]}| |r| t|d  } q|  } | r*| dr,dS tjd| ddd	  S )
Nrl   r  )u   ï»¿u   ﻿)r  r  r   Fz\s#r   )maxsplitr   )	r   r   r^  rV  r   r]  r   r   r7  )r  BOM_UTF8bomr   r   r   r  
  s   

zread_batch_urls.<locals>.fixupc                 S   s   g | ]}|r|qS r   r   )r   r  r   r   r   r   
  r   z#read_batch_urls.<locals>.<listcomp>)r   closingr  )batch_fdr  fdr   r   r   read_batch_urls
  s   $r  c                  O   s   t jj| i |dS r  )r  r  rn  rg   )r   r   r   r   r   urlencode_postdata
  rP  r  query_updatec                K   sr   t | tr|s|s| S tj| } |r-d|vsJ dtji tj| j|d|d< tj| j	di |S )zReplace URL components specified by kwargs
       @param url           str or parse url tuple
       @param query_update  update query
       @returns             str
    r  z;query_update and query cannot be specified at the same timeTNr   )
r   r   r  r  r   rn  rt  r  
urlunparser  )r  r  r   r   r   r   
update_url
  s   
r  c                 C   s   t | |dS )Nr  )r  )r  r  r   r   r   update_url_query2
  rT  r  c                 C   s   d| }d}|   D ]:\}}|d|d d 7 }t|tr#| }t|tr,| }d| d | d }|d|v rAtd||7 }q|d|d d	 7 }||fS )
Nzmultipart/form-data; boundary=r  s   --r  s   
s&   Content-Disposition: form-data; name="s   "

zBoundary overlaps with datas   --
)r:  rg   r   r   r#  )rp  boundarycontent_typer  r~  r  r   r   r   r   _multipart_encode_impl7
  s   



r  c                 C   s^   |du}	 |du rdt tdd }zt| |\}}W ||fS  ty-   |r) d}Y nw q)aR  
    Encode a dict to RFC 7578-compliant form-data

    data:
        A dict where keys and values can be either Unicode or bytes-like
        objects.
    boundary:
        If specified a Unicode object, it's used as the boundary. Otherwise
        a random boundary is generated.

    Reference: https://tools.ietf.org/html/rfc7578
    NTz---------------ir   )r   random	randranger  r#  )rp  r  has_specified_boundaryr  r  r   r   r   multipart_encodeM
  s   r  c                 C   s,   |t u rtttjjf}t| |ot| | S r   )r   r   r  r  abcMappingr   )r   allowed_typesblocked_typesr   r   r   is_iterable_likek
  s   r  c                 C   s4   t |ttfstd t|}t| |dr| S | fS )Nz)allowed_types should be a tuple or a type)r  )r   r  r`  r  r  )r   r  r   r   r   rh  q
  s   rh  )expected_typer   r   c                 G   sZ   |D ](}z	||i |}W n t tttttfy   Y qw | d u s&t|| r*|  S qd S r   )r  KeyErrorr  r:  r#  ZeroDivisionErrorr   )r  r   r   funcsr  r   r   r   r   try_callx
  s   r  c                 C   s   t t|| f|dS )N)r   r  )r  rh  )srcgetterr  r   r   r   try_get
  ru  r  c                 C   s   |d uS r   r   )r   r  r   r   r   r  
      r  c                    s    fdd|   D S )Nc                    s    i | ]\}} ||r||qS r   r   r   r~  r  cndnr   r   r  
  s     zfilter_dict.<locals>.<dictcomp>)r:  )dctr  r   r  r   filter_dict
  ru  r  c                  G   sR   i }| D ]"}|  D ]\}}|d ur||vs!t|tr%|| dkr%|||< q
q|S Nr   )r:  r   r   )dictsmergeda_dictr~  r  r   r   r   merge_dicts
  s   r  ra   c                 C   s   t | tr| S t| ||S r   )r   r   )r~  rr   r  r   r   r   encode_compat_str
  rN  r  rZ     r     )GPGzPG-13RNCr        )zTV-YzTV-Y7zTV-GzTV-PGzTV-14zTV-MAc                 C   s   t | tu rd|   krdkr| S  d S t| tsd S td| }|r*t|dS |  } | tv r6t|  S td	d
dd tD | }|rRtd	|d
  S d S )Nr      z^(?P<age>\d{1,2})\+?$agez^TV[_-]?({})$r  c                 s   s    | ]	}|d d V  qdS )r  Nr   r   r~  r   r   r   rA  
      z"parse_age_limit.<locals>.<genexpr>zTV-r   )r`  r  r   r   r   r   r  r  
US_RATINGSr  r   TV_PARENTAL_GUIDELINES)ra  r	  r   r   r   parse_age_limit
  s   
"r  c                 C   r  )Nz(?sx)^
            (?:window\.)?(?P<func_name>[a-zA-Z0-9_.$]*)
            (?:\s*&&\s*(?P=func_name))?
            \s*\(\s*(?P<callback_data>.*)\);?
            \s*?(?://[^\n]*)*$z\g<callback_data>r  )r  r   r   r   strip_jsonp
  s   r  c                   s  dd dd D }d}d| d}d| d	d
fd| d	dff dd fdd fdd}fdd}tdd| } td|| } srtd| dd| } tddd | } tdd| } td d| } td!| d"| d#| d$| d%| d&|| S )'Nz'"`r  c                 s   s$    | ]}| d | d| V  qdS )z(?:\\.|[^\\z])*Nr   )r   qr   r   r   rA  
  r  zjs_to_json.<locals>.<genexpr>z/\*(?:(?!\*/).)*?\*/|//[^\n]*\nz\s*(?:z)?\s*z(?s)^(0[xX][0-9a-fA-F]+)z:?$r  z(?s)^(0+[0-7]+)   c                 S   sF   d}|  dp|  d}||v rd| S |dkrdS |dkr!dS |S )	Nz"\bfnrtur   r   r  r   z\u00rE  r   r  )r   JSON_PASSTHROUGH_ESCAPESr   r   r   r   process_escape
  s   

z"js_to_json.<locals>.process_escapec                    sZ   t | d d}|d dkr+ttj t|W  d    S 1 s&w   Y  |S )Nr   r`   r   r  )
js_to_jsonr  r   r   r|   r_  ru  )r   	evaluated)ra   varsr   r   template_substitute
  s    z'js_to_json.<locals>.template_substitutec                    sP  |  d}|dv r|S |dv rdS |ds|dkrdS |d v rF|d dkr3td	|d
d n|d
d }td|}d| dS  D ]'\}}t||}|rot| d
|}|drid| d  S t|  S qH|v rzst	|  W | S W | S  tj
y   t|  Y S w sd| dS td| )Nr   )truefalsenull)	undefinedzvoid 0r  )z/*r  r5  rQ  r   `z(?s)\${([^}]+)}r   rR  z(?s)(")|\\(.)r  r   z":zUnknown value: )r  rV  r   r  r   r  rW  r   r|   ru  r_  ro  r#  )r	  r  escapedregexr  imr  INTEGER_TABLESTRING_QUOTESr  ra   r  r  r   r   fix_kv
  s<   
.&zjs_to_json.<locals>.fix_kvc              	      s&   t tt t| dpd dS )Nr   z[]r  )r|   ro  r6  ru  r  r  )r  r  r   r   
create_map  r  zjs_to_json.<locals>.create_mapz(?:new\s+)?Array\((.*?)\)z[\g<1>]znew Map\((\[.*?\])?\)znew Date\((z)\)r  znew \w+\((.*?)\)c                 S   s   t | dS r   )r|   ro  r  r  r   r   r   r        zjs_to_json.<locals>.<lambda>zparseInt\([^\d]+(\d+)[^\d]+\)r  zB\(function\([^)]*\)\s*\{[^}]*\}\s*\)\s*\(\s*(["\'][^)]*["\'])\s*\)z(?sx)
        z
|
        z|,(?=z~[\]}])|
        void\s0|(?:(?<![0-9])[eE]|[a-df-zA-DF-Z_$])[.a-zA-Z_$0-9]*|
        \b(?:0[xX][0-9a-fA-F]+|(?<!\.)0+[0-7]+)(?:z:)?|
        [0-9]+(?=z:)|
        !+
        )r   r   r  )r  r  ra   	STRING_RE
COMMENT_RESKIP_REr  r  r   r  r   r  
  s>   	"r  c                    s    fdd}|S )z> Get a numeric quality value out of a list of possible values c                    s"   z  | W S  ty   Y dS w )NrR  r!  )qidquality_idsr   r   r    s
   zqualities.<locals>.qr   )r  r  r   r  r   	qualities  s   r  )pre_processafter_filtervideo	before_dlpost_process
after_moveafter_videoplaylistz%(title)s [%(id)s].%(ext)szC%(title)s - %(section_number)03d %(section_title)s [%(id)s].%(ext)s)r   chapterdescriptionzannotations.xmlz	info.json)r  subtitle	thumbnailr  
annotationinfojsonlinkpl_videopl_thumbnailpl_descriptionpl_infojsona  (?x)
    (?<!%)(?P<prefix>(?:%%)*)
    %
    (?P<has_key>\((?P<key>{0})\))?
    (?P<format>
        (?P<conversion>[#0\-+ ]+)?
        (?P<min_width>\d+)?
        (?P<precision>\.\d+)?
        (?P<len_mod>[hlL])?  # unused in python
        {1}  # conversion type
    )
diouxXeEfFgGcrsac                 C   s8   | du rdS d}t | |kr| d|t |  | S | S )z% Add ellipses to overly long strings N...r  )ra  lengthELLIPSESr   r   r   limit_lengthM  s   r  c                   s0   |rt ddnt t fddtd| D S )NrR  r  c                 3       | ]} |V  qd S r   r   )r   rc  r  r   r   rA  Y  rB  z version_tuple.<locals>.<genexpr>z[-.])r  r  r  r   r   )r  r  r   r  r   r   W  s   r   c                 C   s6   | s| S z	t | t |k W S  ty   |  Y S w r   )r   r#  )versionlimit
assume_newr   r   r   is_outdated_version\  s   
r  c                  C   s   ddl m}  |   S )z* Returns if yt-dlp can be updated with -U r   is_non_updateable)r6  r  r  r   r   r   ytdl_is_updateablee  s   r  c                 C   s   t | S r   )r   )r   r   r   r   args_to_strm  s   r   c                 C   s   t | j d|  S rf  )r`  r   )rX  r   r   r   error_to_strr  r  r!  c                 C   s  t | ts|tur|S d S i ddddddddddd	d
ddddddddddddddddddddddi dddd d!d"d#d"d$dd%d&d'dd(d)d*d+d,dd-d.d/d0d1d2d3d3d4d5d6d6d7d7i d8d7d9d2d:d3d;d)d<d=d>d7d?d?d@d@dAdAdBdCdDdDdEdFdGdHdIdJdKdKdLdMdNdOd@dPdQdRdSdTdUdUdVdWdXdYdZ}| d[d\   }|d]\}}}t||||	d^d_ }|r|S |tur|S |
d^d`S )aN3gpp3gpmp2ttsmp4mpegmpegurlm3u8	quicktimemovwebmvp9z	video/oggogvzx-flvflvzx-m4vm4vz
x-matroskamkvzx-mngmngzx-mp4-fragmentedzx-ms-asfasfzx-ms-wmvwmvz	x-msvideoavizvnd.dlna.mpeg-ttszdash+xmlmpdzf4m+xmlf4mzhds+xmlzvnd.apple.mpegurlzvnd.ms-sstr+xmlismz	x-mpegurlz	audio/mp4m4az
audio/mpegmp3z
audio/webmzaudio/x-matroskamkazaudio/x-mpegurlm3uaacpaacflacmidimidoggwavwavezx-aaczx-flaczx-m4azx-realaudiorazx-wavavifbmpgifjpegjpgpngzsvg+xmlsvgtifftifzvnd.wap.wbmpwbmpwebpzx-iconicozx-jngjngfsttdfxpttmlsamisrtgzr|   xmlrz  )zx-ms-bmpzfilmstrip+jsonzsmptett+xmlzttaf+xmlzttml+xmlz	x-ms-samizx-subripzx-srtgzipr|   rZ  rz  r  r   r   r  rR  r   )r   r   r   r  rF  r  r  r   traverse_objrsplitr  )mtr   MAPmimetyper   subtyper$  r   r   r   mimetype2extv  s   
	
!"#$%&'()*+,-./23456789:;<=Orb  c                 C   s(   | sd S d| vrd|  } t | d S )Nr   zfile.r   )	mimetypes
guess_type)
ext_or_urlr   r   r   ext2mimetype  s
   
rf  c                 C   sb  | si S t td ttj|  dd}d\}}}}|D ]e}tddd |}tdd|d}|d	 d
v rf|r=q|}|d	 dv rHd}q|d	 dkrYt	|ddkrYd}q|d d ddgkred}q|d	 dv rq|po|}q|d	 dv r||pz|}qt
d| d q|s|s|r|pd|pd|d|d urd|iS i S t|dkr|d	 |d dS i S )NrQ  )NNNNz^([^.]+)c                 S   s   |  d S r=  )r  r  r  r   r   r   r    r  zparse_codecs.<locals>.<lambda>z0+(?=\d)r   r   r   )avc1avc2avc3avc4r-  vp8hev1hev2h263h264mp4vhvc1av1theoradvh1dvhe)rt  ru  DVrr  r  10HDR10r   r-  2)r?  mp4aopusvorbisr:  r>  ac-4zac-3ec-3eac3dtscdtsedtshdtsl)stppwvttzWARNING: Unknown codec rE  none)vcodecacodecdynamic_rangescodecr   r  r  )r  filterr  r   rF  r   r   r  r   r\  r
  r   )
codecs_strsplit_codecsr  r  r  hdr
full_codecr  r   r   r   parse_codecs  sN   

r  )preferencesc                    s0  t | t |krt |t |ksJ | pd|v }|r(tt |t | dkr(dS h dh dd}tjtdd d}|| ||}}	|pH| D ]}
||
t }|
dks]|||	fra|
  S qIh d	d
dhf}|pm|D ]!}
|
h|| |
dks |
hkst	 fdd|D r|
  S qn|rdS |d S )Nr1  r   >   rr  aaclrg  ro  hevcrz  r}  r~  >   rr  rk  r-  r{  vp8xvp9xvrbs)r&  r,  c                 S   s   | d  dd dd S )Nr   r   r  r   )r   r  r  r   r   r   r   r    s    z$get_compatible_ext.<locals>.<lambda>)r  >
   r9  m4bm4pm4rr0  r+  r:  r&  ismaismvr,  webac                 3   s    | ]}|  V  qd S r   )
issuperset)r   ext_setscurrent_extsr   r   rA  -  s    

z%get_compatible_ext.<locals>.<genexpr>rR  )
r   r  r   r   r  keysr  r   r  rG  )vcodecsacodecsvextsaextsr  	allow_mkvCOMPATIBLE_CODECSsanitize_codecr  r  r$  	codec_setCOMPATIBLE_EXTSr   r  r   get_compatible_ext
  s6   $r  c                 C   sf   | j j}|d }rtd| }rt|dd d }r|S t|dd dp2|dp2t|d|dS )	NzContent-Dispositionz,attachment;\s*filename="(?P<filename>[^"]+)"rw  )r  zx-amz-meta-namezx-amz-meta-file-typezContent-Typer  )headersr  r   r   r  r  rb  )
url_handler   	getheadercdr	  r$  r   r   r   urlhandle_detect_ext3  s   r  c                 C   s   d |t| dS )Nzdata:{};base64,{}r  )r  r  r  r^  )rp  	mime_typer   r   r   encode_data_uriA  rP  r  c                 C   s    |du rdS | du rdS || k S )z0 Returns True iff the content should be blocked NFr   )content_limit	age_limitr   r   r   age_restrictedE  s
   r  ))s   ﻿rl   )s     z	utf-32-be)s     z	utf-32-le)s   z	utf-16-le)s   z	utf-16-bec                 C   sP   d}t D ]\}}| |r|| t|d }} | |sqtd| |dS )zC Detect whether a file contains HTML by examining its first bytes. rl   Nz\s*<r  )BOMSrV  r   r   r   r^  )first_bytesrr   r  r	  r   r   r   is_htmlY  s   

r  c                 C   s   |  d}|d ur|S t| d }|drdS |drdS |dr&dS t|}|dkr7|  dr5dS dS |d	kr=d	S tj|jS )
Nprotocolr  rtmpmmsrtspr)  is_livem3u8_nativer7  )r  r  rV  r  r  r  r   r  )r{  r  r  r$  r   r   r   determine_protocold  s    



r  c           
   	      s2  dd fdd}dd |r||ng | } fdd|D }| g|}||d	7  rU|  fd
dD g|}|d	 d d t    |d	 d< |D ]7}ttt|D ]-\}}	d|	v r}|	dd| |	  d  ||< q`|	d| |	    ||< q`qWddd |D S )z[ Render a list of rows, each as a list of values.
    Text after a 	 will be right aligned c                 S   s   t t| ddS )N	r   )r   remove_terminal_sequencesr  r~  r   r   r   r  }  r  zrender_table.<locals>.widthc                    s    fddt | ddiD S )Nc                    s"   g | ]}t  fd d|D qS )c                 3   s    | ]	} t |V  qd S r   r  r   r  r  r   r   rA    r  z@render_table.<locals>.get_max_lens.<locals>.<listcomp>.<genexpr>r  )r   colr  r   r   r     s   " z6render_table.<locals>.get_max_lens.<locals>.<listcomp>ra   T)rz  )tabler  r   r   get_max_lens     z"render_table.<locals>.get_max_lensc                 S   s   dd t j|| ddD S )Nc                 S   s   g | ]\}}|r|qS r   r   )r   taker  r   r   r   r     r  z;render_table.<locals>.filter_using_list.<locals>.<listcomp>T)	fillvalue)rE  zip_longest)rowfilter_arrayr   r   r   filter_using_list  rN  z'render_table.<locals>.filter_using_listc                    s   g | ]} |qS r   r   r   r  )r  max_lensr   r   r     r   z render_table.<locals>.<listcomp>r   c                    s   g | ]} |  qS r   r   )r   ml)r0  	extra_gapr   r   r     r  rR  Nr  rD  rE  c                 s   s    | ]
}d  | V  qdS )r   N)r   r7  r  r   r   r   rA        zrender_table.<locals>.<genexpr>)r   r  r  r   r  r   )

header_rowrp  r0  r  
hide_emptyr  r  r  rT  r   r   )r0  r  r  r  r  r   render_tablez  s&   

&*"r  c              
      sX  t jdd dd dd d}i |t jt jt jt jt jd}t tr+ fdd}n fdd}t	
d	d
tt	j| }||  }|r| }||d  |d r`fdd}n}|d pi|d }	|d r{|	d|d |d }	||d }
d }t|
ttfrzt|	}W n  ty   t|	}|d u rt|	 d}|d u rt|	}Y nw |d ur|d |v rtd|d |
d u r||d p|d S ||
|d u r|	S |S dd dd d}t	
dd
tt	j| }||  }|r%||d }||d}
||dr!|
d u r!dS ||
S td| )Nc                 S   
   |  |S r   rV  rZ  r   r   r   r   r    r  z_match_one.<locals>.<lambda>c                 S   r  r   )rW  r  r   r   r   r    r  c                 S   s   t || S r   )r   r  r  r   r   r   r        )z*=z^=z$=z~=)z<=r*  z>=r)  r  c                    s    S r   r   )r   r  r   r   r        c                    s   |  v S r   r   )r~  r  r   r   r    r  z(?x)
        (?P<key>[a-z_]+)
        \s*(?P<negation>!\s*)?(?P<op>{})(?P<none_inclusive>\s*\?)?\s*
        (?:
            (?P<quote>["\'])(?P<quotedstrval>.+?)(?P=quote)|
            (?P<strval>.+?)
        )
        r  opnegationc                    s    | | S r   r   r  )unnegated_opr   r   r    r  quotedstrvalstrvalr  z\{}r   r  z(Operator {} only supports string values!none_inclusivec                 S   s   t | tr	| du S | d uS rm  r  r  r   r   r   r    r  c                 S   s   t | tr	| du S | d u S rX  r  r  r   r   r   r    r  )r   r5  z3(?x)
        (?P<op>{})\s*(?P<key>[a-z_]+)
        TzInvalid filter part )rI  containsleltgegteqr   r  r   r  r  r   r  r   r  r  rF  	groupdictr  r  r  r  r#  r  r  r  )filter_partr  r  STRING_OPERATORSCOMPARISON_OPERATORSrw  operator_rexr	  r  comparison_valueactual_valuenumeric_comparisonUNARY_OPERATORSr   )r  r  r   
_match_one  s|   
	r  c                    s    t  fddtd| D S )aa   Filter a dictionary with a simple string syntax.
    @returns           Whether the filter passes
    @param incomplete  Set of keys that is expected to be missing from dct.
                       Can be True/False to indicate all/none of the keys may be missing.
                       All conditions on incomplete keys pass if the key is missing
    c                 3   s$    | ]}t |d d V  qdS )z\&r  N)r  r  )r   r  r  r  r   r   rA    s
    
zmatch_str.<locals>.<genexpr>z(?<!\\)&)allr   r   )
filter_strr  r  r   r  r   	match_str  s   
r  c                    s   s sd S t j dt j d d  d}t  pdd  ttp#g dv r1d t|d fd	d
	}|S )Nr   r  r  r  c                 S   r  r   r   )r   r  r   r   r   r    r  z#match_filter_func.<locals>.<lambda>rf  Fc                    s    }|d urt |rt fddD r#r! s!tS d S dp.dp.d}dttj}| d| dS )	Nc                 3   s    | ]	}t | V  qd S r   )r  r?  r  r{  r   r   rA    r  z9match_filter_func.<locals>._match_func.<locals>.<genexpr>r8  r   r|  z) | (z does not pass filter (z), skipping ..)ro  rG  r   r  r   r  r   rF  )r{  r  r2  video_titler  breaking_filtersfiltersinteractiver  r   _match_func  s   
z&match_filter_func.<locals>._match_funcrr  )match_filter_funcr   r   r   rh  r   function_with_reprset_repr)r  r  repr_r   r   r  r   r    s    
r  c                   @   s:   e Zd ZdddZdd Zedd Zdd	 Zd
d ZdS )download_range_funcFc                 C   s   |||| _ | _| _d S r   )chaptersranges	from_info)r  r  r  r  r   r   r   r    rN  zdownload_range_func.__init__c           	      c   s   | drdnd}| jpg D ]#}t| dpg D ]\}}t||d r1d }i |d|iV  qq| jrE|rE|d|d  d|  | jpIg D ]\}}| ||| ||d	V  qJ| jr~| d
sj| dr~| d
ppd| dpxt	dd	V  d S | js| jsi V  d S d S d S )Nr  z(There are no chapters matching the regexz>Cannot match chapters since chapter information is unavailabler8  r"  z[info] r   rg  )r  end_timer  r	  r   rW  )
r  r  r  r   r  	to_screenr  _handle_negative_timestampr  r  )	r  r{  ru  warningr  r  r  r  r  r   r   r   __call__  s0   




zdownload_range_func.__call__c                 C   s(   | dr| dk rt|d |  dS | S )Ndurationr   )r  r  )r1  infor   r   r   r  .  s   (z.download_range_func._handle_negative_timestampc                 C   r  r   )r   r  r  r  r  r   r   r   r  2  r  zdownload_range_func.__eq__c                 C   s&   t  dt| j  d| j d| j dS r  )r   r`  r  r  r  r   r   r   r  6  r  zdownload_range_func.__repr__Nrr  )	r   r   r   r  r  rd  r  r  r  r   r   r   r   r    s    

r  c                 C   s|   | sd S t dt d| }|rt|dS t d| }|r<dt|d dt|d  t|d	d
d S d S )Nz^(?P<time_offset>z)s?$time_offsetz%^(\d+):(\d\d):(\d\d(?:(?:\.|:)\d+)?)$r  r   r'  r   r  r   r   )r   r   r  r  r  r  r  )	time_exprr  r   r   r   parse_dfxp_time_expr:  s   :r  c                 C   s   dt | d  S )Nz%02d:%02d:%02d,%03dr&  )r.  )r$  r   r   r   srt_subtitles_timecodeG  r  r  c                 C   s,   t | d }dg |d d |jd R  S )Nr&  z%01d:%02d:%02d.%02drR  rZ  )r.  r%  )r$  r1  r   r   r   ass_subtitles_timecodeK  s    r  c              	      sL  dg dfddgff}g d t jtdddd	d
i i G  fddd| dd} fdd}|D ]\}}|D ]}| ||} q>q8t| }g }|dpY|d}|s`tdd}		 |dD ]?}
|
dpw|
d}|s{qj|
d}|r|vrd}	qj|  |<  D ]}|
d| }|r|	|i |< qqj|	rd}	nnqcdD ]$}t
|d| d| g}|du rq|d}
|
sq|
 qt|tddd D ]>\}}t|jd!}t|jd"}t|jd#}|du rq|s|sq|| }|d$|t|t|||f  qd%|S )&z
    @param dfxp_data A bytes-like object containing DFXP data
    @returns A unicode object containing converted SRT data
    s   http://www.w3.org/ns/ttml)s   http://www.w3.org/2004/11/ttaf1s   http://www.w3.org/2006/04/ttaf1s   http://www.w3.org/2006/10/ttaf1s!   http://www.w3.org/ns/ttml#stylings   http://www.w3.org/ns/ttml#style)color
fontFamilyfontSize	fontStyle
fontWeighttextDecorationz$http://www.w3.org/XML/1998/namespacezhttp://www.w3.org/ns/ttmlz!http://www.w3.org/ns/ttml#styling)rZ  rV  tts)r   c                       sF   e Zd ZdZg Zg Z fddZfddZdd Zdd	 Z	d
S )z$dfxp2srt.<locals>.TTMLPElementParserr   c                    s  |ddfv r|  j d7  _ d S g }i }|d}r!| |r,||i   D ]}|d| }|r?|||< q.|rd}t| D ]w\}	}
| jr\| jd |	|
kr\qJ|	dkri|d	|
 d
7 }qJ|	dkrv|d|
 d
7 }qJ|	dkr|d|
 d
7 }qJ|	dkr|
dkr|  j d7  _ |d qJ|	dkr|
dkr|  j d7  _ |d qJ|	dkr|
dkr|  j d7  _ |d qJ|r|  j d| d 7  _ |d i }| jr|| jd  || | j| | j| d S )Nttml:brbrrE  styletts:r   rR  r  z color="r  r  z size="r  z face="r  boldz<b>r  r  italicz<i>r  r  	underlinez<u>r  z<fontr)  font)_outr  r6  sortedr:  _applied_stylesr   _unclosed_elements)r  r   r   unclosed_elementsr  element_style_idpropprop_valr#  r~  r  applied_styleSUPPORTED_STYLING_xdefault_stylestylesr   r   r  w  sX   




z*dfxp2srt.<locals>.TTMLPElementParser.startc                    sb   | ddfvr+| j  }t|D ]}|  jd| d7  _q|r-| jr/| j  d S d S d S d S )Nr  r  r(  r)  )r'  r  reversedr$  r&  )r  r   r(  element)r/  r   r   r    s   

z(dfxp2srt.<locals>.TTMLPElementParser.endc                 S   s   |  j |7  _ d S r   )r$  )r  rp  r   r   r   rp    r>  z)dfxp2srt.<locals>.TTMLPElementParser.datac                 S   
   | j  S r   )r$  rF  r  r   r   r   r    r   z*dfxp2srt.<locals>.TTMLPElementParser.closeN)
r   r   r   r$  r'  r&  r  r  rp  r  r   r-  r   r   TTMLPElementParserr  s    -r5  s   encoding='UTF-16's   encoding='UTF-8'c                    s2     }t jjj|d}|t jj|  | S )N)target)rZ  etreeElementTree	XMLParserr+  tostringr  )r   r6  r  )r5  r   r   
parse_node  s   zdfxp2srt.<locals>.parse_nodez	.//ttml:pz.//pzInvalid dfxp/TTML subtitleFTz.//ttml:styler   zxml:idr  r  )bodydivz.//ttml:z.//Nr   r`   beginr  durz%d
%s --> %s
%s

r   )r   r   r   r  r   findallr#  r  r  r  r   r6  rz  rE  rg  r  r   r   r  r   )	dfxp_dataLEGACY_NAMESPACESr;  r~  r  r   rU  r  parasrepeatr  style_idparent_style_idr*  r+  peleparar"  
begin_timer	  r?  r   )r.  r5  r/  r0  r1  r   dfxp2srtP  s   
	
B



rK  c                 C   s<   |  |}|d u rg S |d u r|t|gS | | | gS r   )r  r   )r  command_optionr   	separatorr   r   r   
cli_option  s   
rN  r  r  c                 C   s*   |  |}|dv sJ t||d|||S )N)TFN)TF)r  rN  )r  rL  r   
true_valuefalse_valuerM  r   r   r   cli_bool_option  s   
rQ  c                 C   s   |  ||kr
|gS g S r   r  )r  rL  r   expected_valuer   r   r   cli_valueless_option  rP  rT  c                    s   t  ttfr|r S d   d u r|S t  tsJ t |ttfs#J |D ]}ttdd  fddt|D }|rDdd |D   S q%|S )Nc                 S   s   | d uS r   r   r   r   r   r   r    r  z(cli_configuration_args.<locals>.<lambda>c                    s   g | ]	}  | qS r   )r  r  )r   r   argdictr   r   r     r  z*cli_configuration_args.<locals>.<listcomp>c                 S   s   g | ]	}|D ]}|qqS r   r   )r   r   argr   r   r   r     r  )r   r  r  r6  r  rh  )rV  r  r   
use_compatkey_listarg_listr   rU  r   cli_configuration_args	  s"   r[  c                    s   |   |  } }| |kr|n|  d|   fdd|pdgD } |v r7| |kr1|| |f |d nd}t||||S )Nr  c                    s   g | ]}  | qS r   r   r  root_keyr   r   r      r  z'_configuration_args.<locals>.<listcomp>r   r   F)r  r   r[  )main_keyrV  r(  r  r   rX  r   r\  r   _configuration_args  s   r_  c                   @   s  e Zd Zi ddddddddd	d
dddddddddddddddddddddd d!d"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDi dEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfi dgdhdidjdkdldmdndodpdqdrdsdrdtdudvdwdxdydzd{d|d}d~dddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddddēddƓddȓddʓi dd̓ddΓddГddғddԓdd֓ddؓddړddܓddޓddddddddddddddi dddddddddddddddddddd ddddddddd	d
ddddi dddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0i d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRi dSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdldndodpdqdrdsdtduiZedvdw Zedxdy ZdzS ({  ISO639Utilsaaaarr;  abkrZ   aveafafrakakaamamhanrW  araraasasmavavaayaymazazebabakbebelbgbulbhbihbibisbmbambnbenbobodr  brebsboscacatcechechchacocoscrcrecscescuchucvchvcycymdadandedeudvr=  dzdzoeeeweelellr=   engeoepoesspaetesteueusfafasfffulfifinfjfijfofaor>   frafyfrygaglegdglaglglggngrngugujgvglvhahauhehebiwhihinhohmohrhrvhthathuhunhyhyehzheriainar   indinrE  ileigiboiiiiiikipkrj  idor?   islititaiuikujajpnjvjavkakatkgkonkikikkjkuar  kazklkalkmkhmknkankokorkrkaukskaskukurkvkomkwcorkykirlalatlbltzlglugr<  limlnlinlolaor  litlulublvlavmgmlgmhmahmimrimkmkdr  malmnmonmrmarr  msar^  mltmymyananaunbnobndndenenepngndonlnldnnnnononornrnblnvnavnynyaocociojojiomormororirx   osspapanpeperpiplir@   polpspusptporququermrohrnr  roronrurusrwkinsasanscsrdsdsndsesmesgsagsisinskslkslslvsmsmosnsnasosomsqsqisrsrprX   sswstsotsusunsvsweswswatatamteteltgtgkr^   thatitirtktuktltgltntsntotontrturr%  tsorT  tattwtwitytahuguigukukrururduzuzbvevenvivievovolwawlnwowolxhxhoyiyidjiyoyorzazhazhzhozuzulc                 C   s   | j |dd S )z3Convert language code from ISO 639-1 to ISO 639-2/TNr   )	_lang_mapr  r  r  r   r   r   
short2long  s   zISO639Utils.short2longc                 C   s(   | j  D ]\}}||kr|  S qdS )z3Convert language code from ISO 639-2/T to ISO 639-1N)r  r:  )r  r  
short_name	long_namer   r   r   
long2short  s
   zISO639Utils.long2shortN)r   r   r   r  r  r  r  r   r   r   r   r`  *  s   	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                 	  
                                               !  "  #  $  %  &  '  (  )  *  +  ,  -  .  /  0  1  2  3  4  5  6  7  8  9  :  ;  <  =  @r`  c                   @   s  e Zd Zi ddddddddd	d
dddddddddddddddddddddd d!d"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDi dEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfi dgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddēddƓddȓddʓdd̓i ddΓddГddғddԓdd֓ddؓddړddܓddޓddddddddddddddddi dddddddddddddddddd ddddddddd	d
ddddddi dddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2i d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTi dUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvi dwdxdydzd{d|d}d~ddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi dddddddddÐdēdŐdƓdǐdȓdɐdʓdːd̓d͐dΓdϐdГdѐdғdӐdԓdՐd֓dאdؓdِdړdېdܓdݐdސdߐdddddddddddZedd ZdS (  ISO3166UtilsAFAfghanistanAXu   Åland IslandsALAlbaniaDZAlgeriaASzAmerican SamoaADAndorraAOAngolaAIAnguillaAQ
AntarcticaAGzAntigua and BarbudaAR	ArgentinaAMArmeniaAWArubaAU	AustraliaATAustriaAZ
AzerbaijanBSBahamasBHBahrainBD
BangladeshBBBarbadosBYBelarusBEBelgiumBZBelizeBJBeninBMBermudaBTBhutanBOzBolivia, Plurinational State ofBQz Bonaire, Sint Eustatius and SabaBAzBosnia and HerzegovinaBWBotswanaBVzBouvet IslandBRBrazilIOzBritish Indian Ocean TerritoryBNzBrunei DarussalamBGBulgariaBFzBurkina FasoBIBurundiKHCambodiar  CameroonCACanadaCVz
Cape VerdeKYzCayman IslandsCFzCentral African RepublicTDChadCLChileCNChinaCXzChristmas IslandCCzCocos (Keeling) IslandsCOColombiaKMComorosCGCongoCDz%Congo, the Democratic Republic of theCKzCook IslandsCRz
Costa RicaCIu   Côte d'IvoireHRCroatiaCUCubaCWu   CuraçaoCYCyprusCZzCzech RepublicDKDenmarkDJDjiboutiDMDominicaDOzDominican RepublicECEcuadorEGEgyptSVzEl SalvadorGQzEquatorial GuineaEREritreaEEEstoniaETEthiopiaFKzFalkland Islands (Malvinas)FOzFaroe IslandsFJFijiFIFinlandFRFranceGFzFrench GuianaPFzFrench PolynesiaTFzFrench Southern TerritoriesGAGabonGMGambiaGEGeorgiaDEGermanyGHGhanaGI	GibraltarGRGreeceGL	GreenlandGDGrenadaGP
GuadeloupeGUGuamGT	GuatemalaGGGuernseyGNGuineaGWzGuinea-BissauGYGuyanaHTHaitiHMz!Heard Island and McDonald IslandsVAzHoly See (Vatican City State)HNHondurasHKz	Hong KongHUHungaryISIcelandINIndiaID	IndonesiaIRzIran, Islamic Republic ofIQIraqIEIrelandIMzIsle of ManILIsraelITItalyJMJamaicaJPJapanJEJerseyJOJordanKZ
KazakhstanKEKenyaKIKiribatiKPz&Korea, Democratic People's Republic ofKRzKorea, Republic ofKWKuwaitKG
KyrgyzstanLAz Lao People's Democratic RepublicLVLatviaLBLebanonLSLesothoLRLiberiaLYLibyaLILiechtensteinLT	LithuaniaLU
LuxembourgMOMacaoMKz*Macedonia, the Former Yugoslav Republic ofMG
MadagascarMWMalawiMYMalaysiaMVMaldivesMLMaliMTMaltaMHzMarshall IslandsMQ
MartiniqueMR
MauritaniaMU	MauritiusYTMayotteMXMexicoFMzMicronesia, Federated States ofMDzMoldova, Republic ofMCMonacoMNMongoliaME
MontenegroMS
MontserratMAMoroccoMZ
MozambiqueMMMyanmarNANamibiaNRNauruNPNepalNLNetherlandsr  zNew CaledoniaNZzNew ZealandNI	NicaraguaNENigerNGNigeriaNUNiueNFzNorfolk IslandMPzNorthern Mariana IslandsNONorwayOMOmanPKPakistanPWPalauPSzPalestine, State ofPAPanamar  zPapua New GuineaPYParaguayPEPeruPHPhilippinesPNPitcairnPLPolandPTPortugalPRzPuerto RicoQAQatarREu   RéunionRORomaniaRUzRussian FederationRWRwandaBLu   Saint BarthélemySHz,Saint Helena, Ascension and Tristan da CunhaKNzSaint Kitts and NevisLCzSaint LuciaMFzSaint Martin (French part)PMzSaint Pierre and MiquelonVCz Saint Vincent and the GrenadinesWSSamoaSMz
San MarinoSTzSao Tome and PrincipeSAzSaudi ArabiaSNSenegalRSSerbiaSC
SeychellesSLzSierra LeoneSG	SingaporeSXzSint Maarten (Dutch part)SKSlovakiaSISloveniaSBzSolomon IslandsSOSomaliaZAzSouth AfricaGSz,South Georgia and the South Sandwich IslandsSSzSouth SudanESSpainLKz	Sri LankaSDSudanSRSurinameSJzSvalbard and Jan MayenSZ	SwazilandSESwedenCHSwitzerlandSYzSyrian Arab RepublicTWzTaiwan, Province of ChinaTJ
TajikistanTZzTanzania, United Republic ofrW   ThailandTLzTimor-LesteTGTogoTKTokelauTOTongaTTzTrinidad and TobagoTNTunisiaTRTurkeyTMTurkmenistanTCzTurks and Caicos IslandsTVTuvaluUGUgandaUAUkrainerS   zUnited Arab Emiratesr  zUnited KingdomUSzUnited StatesUMz$United States Minor Outlying IslandsUYUruguay
UzbekistanVanuatuz!Venezuela, Bolivarian Republic ofzViet NamzVirgin Islands, BritishzVirgin Islands, U.S.zWallis and FutunazWestern SaharaYemenZambiaZimbabwezAsia/Pacific RegionEurope)UZVUVEVNVGVIWFEHYEZMZWAPEUc                 C   s   | j | S )zAConvert an ISO 3166-2 country code to the corresponding full name)_country_mapr  r  r  r   r   r   
short2full  s   zISO3166Utils.short2fullN)r   r   r   r_	  r  r`	  r   r   r   r   r    s   	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                 	  
                                               !  "  #  $  %  &  '  (  )  *  +  ,  -  .  /  0  1  2  3  4  5  6  7  8  9  :  ;  <  =  >  ?  @  A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z  [  \  ]  ^  _  `  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p 
  r  c                   @   s  e Zd Zi ddddddddd	d
dddddddddddddddddddddd d!d"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDi dEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfi dgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddēddƓddȓddʓdd̓i ddΓddГddғddԓdd֓ddؓddړddܓddޓddddddddddddddddi dddddddddddddddddd ddddddddd	d
ddddddi dddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2i d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTi dUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvi dwdxdydzd{d|d}d~ddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi dddddddddÐdēdŐdƓdǐdȓdɐdʓdːd̓d͐dΓdϐdГdѐdғdӐdԓdՐd֓dאdؓdِdړdېdܓdݐdސdߜZedd ZdS (  GeoUtilsr  z46.172.224.0/19rS   z94.200.0.0/13r  z149.54.0.0/17r  z209.59.64.0/18r  z204.14.248.0/21r  z46.99.0.0/16r  z46.70.0.0/15r  z105.168.0.0/13r]	  z182.50.184.0/21r  z23.154.160.0/24r  z181.0.0.0/12r  z202.70.112.0/20r  z77.116.0.0/14r  z1.128.0.0/11r  z181.41.0.0/18r  z185.217.4.0/22r  z5.197.0.0/16r  z31.176.128.0/17r  z65.48.128.0/17r  z114.130.0.0/16r  z
57.0.0.0/8r  z102.178.0.0/15r   z95.42.0.0/15r  z37.131.0.0/17r  z154.117.192.0/18r  z137.255.0.0/16r  z185.212.72.0/23r  z196.12.64.0/18r  z156.31.0.0/16r  z161.56.0.0/16r  z161.0.80.0/20r  z191.128.0.0/12r  z24.51.64.0/18r  z119.2.96.0/19r  z168.167.0.0/16r  z178.120.0.0/13r  z179.42.192.0/18r  z99.224.0.0/11r  z41.243.0.0/16r  z197.242.176.0/21r  z160.113.0.0/16r+	  z85.0.0.0/13r  z102.136.0.0/14r  z202.65.32.0/19r  z152.172.0.0/14r  z102.244.0.0/14r  z36.128.0.0/10r  z181.240.0.0/12r  z201.192.0.0/12r!  z152.206.0.0/15r
  z165.90.96.0/19r#  z190.88.128.0/17r$  z31.153.0.0/16r&  z88.100.0.0/14rK  z
53.0.0.0/8r)  z197.241.0.0/17r'  z87.48.0.0/12r+  z192.243.48.0/20r-  z152.166.0.0/15r  z41.96.0.0/12r.  z186.68.0.0/15r6  z90.190.0.0/15r0  z156.160.0.0/11r4  z196.200.96.0/20r	  z88.0.0.0/11r8  z196.188.0.0/14r^	  z2.16.0.0/13r>  z91.152.0.0/13r<  z144.120.0.0/16r:  z80.73.208.0/21r  z119.252.112.0/20r;  z88.85.32.0/19r@  z
90.0.0.0/9rE  z41.158.0.0/15r  z
25.0.0.0/8rU  z74.122.88.0/21rI  z31.146.0.0/16rB  z161.22.64.0/18r]  z62.68.160.0/19rM  z154.160.0.0/12rO  z95.164.0.0/16rS  z88.83.0.0/19rG  z160.182.0.0/15r_  z197.149.192.0/18rW  z104.250.0.0/19r3  z105.235.224.0/20rQ  z94.64.0.0/13r[  z168.234.0.0/16rY  z168.123.0.0/16ra  z197.214.80.0/20rb  z181.41.64.0/18rj  z113.252.0.0/14rh  z181.210.0.0/16r  z93.136.0.0/13rd  z148.102.128.0/17rk  z84.0.0.0/14rq  z39.192.0.0/10rv  z87.32.0.0/12ry  z79.176.0.0/13rx  z5.62.80.0/20ro  z117.192.0.0/10r  z203.83.48.0/21rt  z37.236.0.0/14rs  z2.176.0.0/12rm  z82.221.0.0/16r{  z79.0.0.0/10r  z87.244.64.0/18r}  z72.27.0.0/17r  z176.29.0.0/16r  z133.0.0.0/8r  z105.48.0.0/12r  z158.181.128.0/17r  z36.37.128.0/17r  z103.25.140.0/22r  z197.255.224.0/20r	  z198.167.192.0/19r  z175.45.176.0/22r  z175.192.0.0/10r  z37.36.0.0/14r  z64.96.0.0/15r  z2.72.0.0/13r  z115.84.64.0/18r  z178.135.0.0/16r	  z24.92.144.0/20r  z82.117.0.0/19r!	  z112.134.0.0/15r  z102.183.0.0/16r  z129.232.0.0/17r  z78.56.0.0/13r  z188.42.0.0/16r  z46.109.0.0/16r  z41.252.0.0/14r  z105.128.0.0/11r  z88.209.64.0/18r  z37.246.0.0/16r  z178.175.0.0/17r	  z74.112.232.0/21r  z154.126.0.0/17r  z117.103.88.0/21r  z77.28.0.0/15r  z154.118.128.0/18r  z37.111.0.0/17r  z49.0.128.0/17r  z60.246.0.0/16r  z202.88.64.0/20r  z109.203.224.0/19r  z41.188.64.0/18r  z208.90.112.0/22r  z46.11.0.0/16r  z105.16.0.0/12r  z27.114.128.0/18r  z102.70.0.0/15r  z187.192.0.0/11r  z175.136.0.0/13r  z197.218.0.0/15r  z41.182.0.0/16r  z101.101.0.0/18r  z197.214.0.0/18r  z203.17.240.0/22r  z105.112.0.0/12r  z186.76.0.0/15r  z145.96.0.0/11r  z84.208.0.0/13r  z36.252.0.0/15r  z203.98.224.0/19r  z49.156.48.0/22r  z49.224.0.0/14r  z5.36.0.0/15r  z186.72.0.0/15r  z186.160.0.0/14rC  z123.50.64.0/18r  z124.240.192.0/19r  z49.144.0.0/13r  z39.32.0.0/11r  z83.0.0.0/11r	  z70.36.0.0/20r  z66.50.0.0/16r  z188.161.0.0/16r  z85.240.0.0/13r  z202.124.224.0/20r  z181.120.0.0/14r  z37.210.0.0/15r  z102.35.0.0/16r  z79.112.0.0/13r	  z93.86.0.0/15r  z5.136.0.0/13r  z41.186.0.0/16r
	  z188.48.0.0/13r	  z202.1.160.0/19r	  z154.192.0.0/11r"	  z102.120.0.0/13r)	  z78.64.0.0/12r	  z8.128.0.0/10r	  z188.196.0.0/14r	  z78.98.0.0/15r	  z102.143.0.0/17r	  z89.186.32.0/19r	  z41.82.0.0/15r	  z154.115.192.0/18r$	  z186.179.128.0/17r	  z105.235.208.0/21r		  z197.159.160.0/19r2  z168.243.0.0/16r	  z190.102.0.0/20r-	  z
5.0.0.0/16r'	  z41.84.224.0/19rA	  z65.255.48.0/20r  z154.68.128.0/19r4	  z196.168.0.0/14rW   z171.96.0.0/13r/	  z85.9.128.0/18r6	  z27.96.24.0/21r3	  z180.189.160.0/20r?	  z95.85.96.0/19r;	  z197.0.0.0/11r8	  z175.176.144.0/21r=	  z78.160.0.0/11r:	  z186.44.0.0/15rB	  z202.2.96.0/19r.	  z120.96.0.0/11r1	  z156.156.0.0/14rF	  z37.52.0.0/14rD	  z102.80.0.0/13rH	  z	6.0.0.0/8rJ	  z167.56.0.0/13rR	  z84.54.64.0/18rg  z212.77.0.0/19r	  z207.191.240.0/21rT	  z186.88.0.0/13rV	  z66.81.192.0/20rW	  z146.226.0.0/16rU	  z14.160.0.0/11rS	  z202.80.32.0/20rX	  z117.20.32.0/21r	  z202.4.32.0/19rZ	  z134.35.0.0/16r  z41.242.116.0/22r	  z41.0.0.0/11z102.144.0.0/13z102.177.192.0/18)r[	  r\	  c              
   C   s|   t |dkr| j| }|sd S n|}|d\}}tdt|d }|dt	|? B }t
ttdt||S )Nr   r   z!Lr   r   )r   _country_ip_mapr  r  r   structunpacksocket	inet_atonr  r   	inet_ntoapackr  randint)r  code_or_blockrh  addrpreflenaddr_minaddr_maxr   r   r   random_ipv4  s   zGeoUtils.random_ipv4N)r   r   r   rb	  r  ro	  r   r   r   r   ra	    s   	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                 	  
                                               !  "  #  $  %  &  '  (  )  *  +  ,  -  .  /  0  1  2  3  4  5  6  7  8  9  :  ;  <  =  >  ?  @  A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z  [  \  ]  ^  _  `  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p 
 tra	  c                 C   s   d}t | } | dkrtd| d@ | }| d? } | dks
tt|D ]
}|| dkr, nq"d}d}||d }|dkrMt|| rM|t||  d | }|S )a  long_to_bytes(n:long, blocksize:int) : string
    Convert a long integer to a byte string.

    If optional blocksize is given and greater than zero, pad the front of the
    byte string with binary zeros so that the length is a multiple of
    blocksize.
    r  r   >Ir   r      N)r  rc	  rh	  r[  r   )r   	blocksizera  r  r   r   r   long_to_bytes  s    	rs	  c              	   C   sn   d}t | }|d rd|d  }d| |  } || }td|dD ]}|d> td| ||d  d  }q |S )zbytes_to_long(string) : long
    Convert a byte string to a long integer.

    This is (essentially) the inverse of long_to_bytes().
    r   r  rq	  r  rp	  )r   r[  rc	  rd	  )ra  accr  extrar  r   r   r   bytes_to_long%  s   &rv	  c                 C   s.   t t| ddd d}t|||}|dS )a0  
    Implement OHDave's RSA algorithm. See http://www.ohdave.com/rsa/

    Input:
        data: data to encrypt, bytes-like object
        exponent, modulus: parameter e and N of RSA algorithm, both integer
    Output: hex string of encrypted data

    Limitation: supports one block encryption only
    NrR  r  r   )r  binasciihexlifypow)rp  r  moduluspayload	encryptedr   r   r   ohdave_rsa_encrypt6  s   r}	  c                 C   sJ   t | |d krtddd t|t |  d D }ddg|d| S )z
    Padding input data with PKCS#1 scheme

    @param {int[]} data        input data
    @param {int}   length      target length
    @returns {int[]}           padded data
       z&Input data too long for PKCS#1 paddingc                 S   s   g | ]}t d dqS )r      )r  ri	  )r   r   r   r   r   r   R  r  zpkcs1pad.<locals>.<listcomp>r  r   r   )r   r#  r[  )rp  r  pseudo_randomr   r   r   pkcs1padG  s   r	  c                 C   sL   |s| st d|pdd |  }| r$| t|kr$t d|  dt| |S )Nz#Either table or n must be specified>0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZzbase z exceeds table length )r#  r   )r   r  r   r   r   _base_n_tableV  s   r	  c                 C   sH   t ||}| s|d S dt|}}| r"|| |  | }| | } | s|S )z$Convert given int to a base-n stringr   r   )r	  r   )r  r   r  r  r  r   r   r   encode_base_n`  s   
r	  c                 C   sD   dd t t||D }dt|}}| D ]
}|| ||  }q|S )z"Convert given base-n string to intc                 S   s   i | ]\}}||qS r   r   )r   r"  r  r   r   r   r  o  r   z!decode_base_n.<locals>.<dictcomp>r   )r  r	  r   )r~  r   r  r  r  r  r   r   r   decode_base_nm  s
   r	  c                    sz   t t| }| \}}}}t|}t|}|d}i  |r2|d8 }t||}|| p-| |< |st d fdd|S )Nr  r   z	\b(\w+)\bc                    s     | d| dS r   )r  r  r  symbol_tabler   r   r    r  z%decode_packed_codes.<locals>.<lambda>)r   r  PACKED_CODES_REr  r  r   r	  r  )r  r  obfuscated_coder  rg  symbolsbase_n_countr   r	  r   decode_packed_codesv  s   

r	  c                    s0   dkr| S t  d fdd| D S )Nr   r   c                 3   s2    | ]}| v r   |   n|V  qd S r   )r"  r   alphabetlshiftr   r   rA    s
     
zcaesar.<locals>.<genexpr>)r   r   )ra  r	  r	  r   r	  r   caesar  s   r	  c                 C   s   t | ddS )Nz^!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~/   )r	  r  r   r   r   rot47  r  r	  c                 C   s<   i }t d| D ]\}}|dr|dd }|||< q|S )Nz2(?P<key>[A-Z0-9-]+)=(?P<val>"[^"]+"|[^",]+)(?:,|$)r  r   rR  )r   r@  rV  )r   r  r   r   r   r   r   parse_m3u8_attributes  s   

r	  c                 C   s   | dkr| |? S | d |? S )Nr   l        r   )r   r   r   r   r   urshift  r  r	  c           
   
   C   s  t jdkrKd|vsJ t j| sJ z$t|  d| d}|| W d    W d S 1 s0w   Y  W d S  tyJ } zt|j|j	d }~ww d }t
tt dd rYt j}nttdd dkrlttjdkrktj}ntrqtj}|rz	|| || W d S  ty } zt|j|j	d }~ww tdd	grdn	td
dgrd
nd }|stdtjdkrd d | }z#tj|d
kr|d||| gn|d|d|| gdtjtjtjd\}}}	W n ty } zt|j|j	d }~ww |	rt|	|d S )Nr  r   r=  setxattr_yt_dlp__identifierpyxattr)r   r  r   setfattrr3  r	   z-hzfCouldn't find a tool to set the xattrs. Install either the "xattr" or "pyxattr" Python modules or the linuxz"xattr" binaryz7GNU "attr" package (which contains the "setfattr" tool)z-wz-nz-vT)r   rm  r  r*  )rx   r   ry   existsrs  r  r   rz  rt  strerrorcallablerQ  r	  r	   r   __version__r   r)  r  r~   r   r^  r  r  r  r'  )
ry   r   r   r  rc  r	  r(  r   r  r  r   r   r   write_xattr  sp   
$
r	  c                 C   s^   t ddd}t ddd}td|| j}|t | }| t|j|t|j|t|j	iS )Ni  r   i  r     r   )
r  r  r  ri	  r  r  r   r  r  r  )
year_fieldmonth_field	day_field
start_dateend_dater/  random_dater   r   r   random_birthday  s   


r	  r   c                 C   s`   z%t   }|| df | d W  d    W S 1 sw   Y  W d S  ty/   Y d S w rd  )re	  bindgetsocknamer   )	interfacesockr   r   r   find_available_port  s   

(r	  z[InternetShortcut]
URL=%(url)s
z<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>URL</key>
	<string>%(url)s</string>
</dict>
</plist>
zV[Desktop Entry]
Encoding=UTF-8
Name=%(filename)s
Type=Link
URL=%(url)s
Icon=text-html
)r  desktopweblocc                 C   s   t j| }d|jv rtdd}|jr5|t jj|jdd7 }|jdur1|dt jj|jdd 7 }|d7 }||j	d	
 7 }|jdurR|jd
krR|dt|j 7 }t j|j|t jj|jddt jj|jddt jj|jddt jj|jddfS )a}  
    Converts an IRI (Internationalized Resource Identifier, allowing Unicode characters) to a URI (Uniform Resource Identifier, ASCII-only).

    The function doesn't add an additional layer of escaping; e.g., it doesn't escape `%3C` as `%253C`. Instead, it percent-escapes characters with an underlying UTF-8 encoding *besides* those already escaped, leaving the URI intact.
    [z"IPv6 URIs are not, yet, supported.r   z!$%&'()*+,~)safeNr   @idnaP   z!$%&'()*+,/:;=@|~z!$%&'()*+,/:;=?@{|}~z!#$%&'()*+,/:;=?@{|}~)r  r  r   r  r#  r  r  r  r  rg   r^  r  r   r  r  
quote_plusry   r  r  fragment)iri	iri_partsnet_locationr   r   r   
iri_to_uri  s*   

r	  c                 C   s   t jdv rdtj|  S | S )N)rt   cygwin\\?\)r~   r   rx   ry   abspath)ry   r   r   r   to_high_limit_path9  s   
r	  z%sc                 C   sB   t j| gt|R  }|tu r|s|S |t|v r|S ||| S r   )r   r\  rh  r   )r   fieldtemplater  r   r   r   r   r   r   rH  A  s   rH  c                 C   s   t dd| } t dd| S )Na  (?x)
        (?:
            (?:
                chtbl\.com/track|
                media\.blubrry\.com| # https://create.blubrry.com/resources/podcast-media-download-statistics/getting-started/
                play\.podtrac\.com|
                chrt\.fm/track|
                mgln\.ai/e
            )(?:/[^/.]+)?|
            (?:dts|www)\.podtrac\.com/(?:pts/)?redirect\.[0-9a-z]{3,4}| # http://analytics.podtrac.com/how-to-measure
            flex\.acast\.com|
            pd(?:
                cn\.co| # https://podcorn.com/analytics-prefix/
                st\.fm # https://podsights.com/docs/
            )/e|
            [0-9]\.gum\.fm|
            pscrb\.fm/rss/p
        )/r   z^\w+://(\w+://)r  r  r  r   r   r   clean_podcast_urlI  s   r	  0123456789abcdefc                   C   s   t ddd dS )Nz[xy]c                 S   s   t tdd S )Nr   r  )
_HEX_TABLEr  ri	  r   r   r   r   r  c  r  zrandom_uuidv4.<locals>.<lambda>z$xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxxr  r   r   r   r   random_uuidv4b  r>  r	  c              
   C   sf   zt j| }|rt j|dd W dS  ty2 } zt|d ur'|d|  W Y d }~dS d }~ww )NT)exist_okzunable to create directory F)rx   ry   r{   makedirsr   r	  )ry   r
  dnrX  r   r   r   make_dirf  s   r	  c                  C   s&   ddl m}  tjtj|  d S )Nr    _get_variant_and_executable_pathr   )r6  r	  rx   ry   r{   r	  r	  r   r   r   get_executable_pathr  s   r	  c                 c   s`    t dp	td}t j|| V  t d}|r!t j|| V  t jtdd|  V  d S )NXDG_CONFIG_HOMEz	~/.configappdata~r   )rx   getenvr   ry   r   )package_namexdg_config_homeappdata_dirr   r   r   get_user_config_dirsx  s   
r	  c                 c   s    t jd| V  d S )Nz/etc)rx   ry   r   )r	  r   r   r   get_system_config_dirs  s   r	  c                  K   s   t   tjdi |   S )zQ
    Returns TZ-aware time in seconds since the epoch (1970-01-01T00:00:00Z)
    Nr   )r1  r  r  r  )r   r   r   r   time_seconds  s   r	  HS256)algr  c                C   s   |dv sJ d| ddd }dd }|dd	}|r+d
|v r&d|v r&|}n| | |||}||| }t| |d | tj}	||	 }
|d | d |
  S )N)r	  zUnsupported algorithm "r  c                 S   s   t j| dd S )N)rQ  r   )
separators)r|   ro  rg   )r   r   r   r   jwt_json_bytes  r>  z"jwt_encode.<locals>.jwt_json_bytesc                 S   s   t | dS )N   =)r  urlsafe_b64encoder7  )
bytestringr   r   r   jwt_b64encode  r  z!jwt_encode.<locals>.jwt_b64encodeJWT)r	  typr	  r	     .)r6  hmacnewrg   hashlibsha256digestr^  )payload_datar   r	  r  r	  r	  header_data
header_b64payload_b64r  signature_b64r   r   r   
jwt_encode  s   
r	  c                 C   s&   |  d\}}}tt| dS )Nr   z===)r   r|   ru  r  urlsafe_b64decode)jwt_header_b64r	  _signature_b64r   r   r   jwt_decode_hs256  s   r	  c                 C   sD   t jdkrtjs
dS nt dsdS z|  W S  ty!   Y dS w )Nr  FTERM)rx   r   r   r   r	  isattyr  )ry  r   r   r   r    s   


r  c               	   C   s   t  dk rdS ddl} ddl} ddl}d}| jddd}tdtj}z7| j	|
|}| j }||| |}|sAtd	||| j|j|B }|sTtd
W t| nt| w dt_t  dS )z(Ref: https://bugs.python.org/issue30075 )rZ  r   iZ)  Nr   r  r  F)use_last_errorzCONOUT$zGetConsoleMode failedzSetConsoleMode failedT)r  r  ctypes.wintypesri  WinDLLrx   rs  rO  r  r  r$  r  GetConsoleModebyrefrh   SetConsoleModer   r  r   r  cache_clear)r  ri  "ENABLE_VIRTUAL_TERMINAL_PROCESSINGdllr.  h_outdw_original_modesuccessr   r   r   windows_enable_vt_mode  s.   

r	  z	\[[^m]+mc                 C   s   t d| S r  )_terminal_sequences_rer  r  r   r   r   r    r  r  c                 C   s   t d|  S )Nr/  r  )numberr   r   r   number_of_digits  r  r
  rf  )r0  	from_dictc                    s0    d ur fdd|D }|  tttd |S )Nc                 3   s     | ]}t  t|V  qd S r   )r   r\  rh  r  r
  r   r   rA        z join_nonempty.<locals>.<genexpr>)r   r  r   r  )r0  r
  r   r   r
  r   rK    s   rK  c                    s@   d t  fdd| D ddd s|S  fdd|D S )	a3  
    Find the largest format dimensions in terms of video width and, for each thumbnail:
    * Modify the URL: Match the width with the provided regex and replace with the former width
    * Update dimensions

    This function is useful with video services that scale the provided thumbnails on demand
    r  c                 3   s&    | ] t  fd dD V  qdS )c                 3   s    | ]
}  |p
d V  qdS r  rR  r  r  r   r   rA     r  zAscale_thumbnails_to_max_format_width.<locals>.<genexpr>.<genexpr>N)r  )r   )_keysr
  r   rA     s   $ z7scale_thumbnails_to_max_format_width.<locals>.<genexpr>)r   r   r  r   c              
      s@   g | ]}t d ttd |d  itt dd|qS )r  r   Tr`   )r  r   r  r   r6  rz  )r   r
  r
  max_dimensionsurl_width_rer   r   r     s    z8scale_thumbnails_to_max_format_width.<locals>.<listcomp>r  )formats
thumbnailsr	
  r   r
  r   $scale_thumbnails_to_max_format_width  s   r
  c                 C   sD   | sdS t d| }|sdS t|dt|dt|dfS )zC Parse value of "Range" or "Content-Range" HTTP header into tuple. )NNNz bytes[ =](\d+)-(\d+)?(?:/(\d+))?r   r   r  )r   r  r  r  r  )r[  crgr   r   r   parse_http_range  s   (r
  c                 C   s2   | rt jdkr	dnd}td|  d| d tjS )Nr  zCtrl+ZzCtrl+DzReading z from STDIN - EOF (z
) to end:
)rx   r   r
  r~   r*  )whateofr   r   r   
read_stdin  s   r
  c                 C   s^   t D ]\}}| |r|t|f  S q| dd} td| }|r+|d dfS ddfS )zN
    Detect the text encoding used
    @returns (encoding, bytes to skip)
    rq	  r  s   (?m)^#\s*coding\s*:\s*(\S+)\s*$r   Nr   )r  rV  r   r  r   r   r  r^  )rp  r  r	  r  r   r   r   determine_file_encoding  s   
r
  c                   @   s   e Zd ZdZdZdZdZdddZdddZdd Z	d	d
 Z
eg fddZedd ZddddZedd Zdd Zdd ZdS )ConfigNFc                 C   s"   ||| _ | _t g | _| _d S r   )r  labelr   _loaded_pathsconfigs)r  r  r
  r   r   r   r  5  r  zConfig.__init__c                 C   s    | j rJ ||| _| _|  S r   )_Config__initializedown_argsrw  load_configs)r  r   rw  r   r   r   init9  s   
zConfig.initc                 C   s  d}| j rtj| j }tj|}|| jv rdS | j| d| _| j	| j
\}}| j
| _|jp3g D ]P}|dkrU|| jv r@q4| j| | jtjtddddd q4tj|t|}tj|rktj|d	}tj|s{| jd
| d | | || q4dS )Nr   FTrf  optionscommentsr*  r
  zyt-dlp.confzconfig location z does not exist)rw  rx   ry   realpathr{   r
  r  r
  r  parse_known_argsr
  parsed_argsconfig_locationsappend_configri  r   r
  r   r  isdirr	  error	read_file)r  	directorylocationoptsr   r   r   r   r
  >  s0   

zConfig.load_configsc                 C   sx   t | jd| jrd| j dnddd}t | jd uo-|d   |dd   d| | j gd	d
 | jD R ddiS )Nconfigr  r   rD  rJ  r   r   rg  c                 s   s*    | ]}d |  d ddd V  qdS )rE  z
| r   Nr  r   r   r   r   rA  _  s   ( z!Config.__str__.<locals>.<genexpr>r0  rE  )rK  r
  rw  r
  r  hide_login_infor
  )r  r
  r   r   r   r  Y  s   2zConfig.__str__c              
   C   s   zt | d}W n ty   | Y S w zt|d\}}||tj W n ty0   d }Y nw z1z| |p;t }t	j
|dd}W n ty[ } z
td|  d| d }~ww W |  |S |  w )Nr<  i   Tr
  zUnable to parse "z": )rs  r   r
  readseekrj  SEEK_SETr^  rj   ri  r   rh   r#  r  )rw  r   optionfr	  skipcontentsresrX  r   r   r   r&
  b  s,   
zConfig.read_filec                    s~   h d}t dddd |D  d   fdd}tt|| } t| D ]\}}||v r<|d	 t| k r<d
| |d	 < q&| S )N>   -p-u
--password
--username--ap-password--ap-username--video-passwordz	^(?P<key>r  c                 s   r  r   r  )r   por   r   r   rA  z  r  z)Config.hide_login_info.<locals>.<genexpr>z)=.+$c                    s      | }|r|dd S | S )Nr   z=PRIVATE)r   r  )or	  eqrer   r   	_scrub_eq|  s   
z)Config.hide_login_info.<locals>._scrub_eqr   PRIVATE)r   r  r   r  r  r  r   )r)
  PRIVATE_OPTSr>
  rG  optr   r<
  r   r+
  w  s   "zConfig.hide_login_infor
  c                G   s6   t | | j|}| j|_|j| r| j| d S d S r   )r`  r  r
  r
  r
  r   )r  r
  r   r*
  r   r   r   r#
    s
   
zConfig.append_configc                 c   s2    t | jD ]}|jE d H  q| jpg E d H  d S r   )r2  r
  all_argsr!
  )r  r*
  r   r   r   rB
    s   zConfig.all_argsc                 K   s   | j j| jfi |S r   )r  r 
  rB
  )r  r   r   r   r   r 
    ru  zConfig.parse_known_argsc                 C   s   | j | jS r   )r  
parse_argsrB
  r  r   r   r   rC
       zConfig.parse_argsr   r  )r   r   r   r
  r!
  rw  r
  r  r
  r
  r  rd  r&
  r+
  r#
  rR  rB
  r 
  rC
  r   r   r   r   r
  /  s$    

	

r
  c                  G   s   dd t jttj| D S )zLMerge dicts of http headers case insensitively, prioritizing the latter onesc                 S   s   i | ]	\}}|  |qS r   )r8  r  r   r   r   r    r  z!merge_headers.<locals>.<dictcomp>)rE  chainfrom_iterabler  r6  r:  )r  r   r   r   merge_headers  s   rG
  c                    s&   t  t  fdd}|S )zCache a methodc                    sz   j | g|R i |}|  t|j dd  }t| di  ji }||vr9 | g|R i |||< || S )Nr   _cached_method__cache)r	  apply_defaultsr  	argumentsr   r  r  r   )r  r   r   
bound_argsr   cacher  r   r   r   wrapper  s   zcached_method.<locals>.wrapper)r   r   r   r   )r  rN
  r   rM
  r   cached_method  s   
	rO
  c                       s8   e Zd ZdZd fdd	ZddddZd	d
 Z  ZS )classpropertyz7property access for class methods with optional cachingNc                    s(   |st j| g|R i |S t | S r   )r   r   rN  __new__)r  r   r   r   rO  r   r   rQ
    s   zclassproperty.__new__F)rL
  c                C   s*   t | | || _|ri | _d S d | _d S r   )r   update_wrapperr   r  )r  r   rL
  r   r   r   r    s   zclassproperty.__init__c                 C   s8   | j d u r
| |S || j vr| || j |< | j | S r   )r  r   )r  r   r  r   r   r   __get__  s
   



zclassproperty.__get__r   )r   r   r   r   rQ
  r  rS
  re  r   r   rO  r   rP
    s
    rP
  c                   @   s2   e Zd Zd
ddZdd Zedd Zdd	 ZdS )r  Nc                 C   s   t | | ||| _| _d S r   )r   rR
  r   _function_with_repr__repr)r  r   r  r   r   r   r    s   zfunction_with_repr.__init__c                 O   s   | j |i |S r   )r   r  r   r   r   r    r  zfunction_with_repr.__call__c                 C   s   t j| |dS )N)r  )r   r   )r  r  r   r   r   r    s   zfunction_with_repr.set_reprc                 C   s"   | j r| j S | jj d| jj S r  )rT
  r   r   r   r  r   r   r   r    s   zfunction_with_repr.__repr__r   )r   r   r   r  r  r  r  r  r   r   r   r   r    s    

r  c                   @   s$   e Zd ZdZdd Zedd ZdS )	NamespacezImmutable namespacec                 C   s   t | j S r   )r\  __dict__r   r  r   r   r   r]    rD
  zNamespace.__iter__c                 C   r4  r   )rV
  r:  r  r   r   r   items_     
zNamespace.items_N)r   r   r   r   r]  rR  rW
  r   r   r   r   rU
    s
    rU
  )r5  r/  r1  r+  r&  r,  )	3g2r#  f4vmk3ddivxmpgr.  r0  r4  )	aiffalacr?  r9  r;  r:  rB  r{  rC  )r>  aper3  f4af4br  r  ogaogxspxr|  wmar  )rJ  rK  rP  )mhtml)rX  vttasslrc)f4fr7  r)  smilr6  )common_videor  common_audioaudior
  storyboards	subtitles	manifestsc                       s  e Zd ZdZeg dddddddd	d
ejdddddddddddddddddddddd d!ejd"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3ejd4d5d6d7d8d9d:d;d<d=d>d?d@dAdBej	dCdDdEdFdGdHdIdJdKdLdMdNdOej
ejdPdQdRdSdTdUZ fdVdWZedXdYdZd[Z  ZS )\r"  z
    Mitigation exception for uncommon/malicious file extensions
    This should be caught in YoutubeDL.py alongside a warning

    Ref: https://github.com/yt-dlp/yt-dlp/security/advisories/GHSA-79w7-vh3h-8g4j
    r  r|   metar  r  tempuncutr  ytdlasxr  m2tm2tsm2vm4sr2  mp2vrp  mper'  mpeg1mpeg2mpeg4mxfogmqtrZ  swfr%  vidvobr-  3gaac3adtsaifaudtsr  r  rA  modmpgamp1mp2rz  mparE  shnxmrF  rG  rH  heicrQ  imagejfifrR  jperI  jxlrL  rN  rM  rO  rU  rS  ismtjson3rW  sccsrv1srv2srv3ssarT  rV  rZ  r	  r8  r<  sbvr  r	  c                   s   t  d| || _d S )Nzunsafe file extension: )rN  r  	extension)r  r
  rO  r   r   r  b  s   
z_UnsafeExtensionError.__init__Fr  c               C   sb   |d u rd S d|v sd|v r| ||s/| d\}}}|dkr$d }}| | jvr/| ||S )Nr   r  r   binr  )r  r  ALLOWED_EXTENSIONS)r  r
  r   r   lastr   r   r   r#  f  s   z(_UnsafeExtensionError.sanitize_extension)r   r   r   r   	frozensetMEDIA_EXTENSIONSr  ro
  r
  rq
  rr
  rp
  r
  r  r  r#  re  r   r   rO  r   r"    st   	
 !"#$'()*+,-./0123456789<=>?@ABCDEFGHIJKNOPQRSTUVWXYZ[^_`abcdehr"  c                   @   s^   e Zd ZdZd\ZZdd Zdd Zedd Z	e	j
d	d Z	d
d ZedddddZdS )RetryManagerzUsage:
        for retry in RetryManager(...):
            try:
                ...
            except SomeException as err:
                retry.error = err
                continue
    r  c                 K   s"   |pd| _ tj|fi || _d S r   )retriesr   r   error_callback)r  _retries_error_callbackr   r   r   r   r    s   
zRetryManager.__init__c                 C   s   | j tuo
| j| jkS r   )_errorr   rb  r
  r  r   r   r   _should_retry  ru  zRetryManager._should_retryc                 C   s   | j tu rd S | j S r   )r
  r   r  r   r   r   r%
    s   
zRetryManager.errorc                 C   
   || _ d S r   )r
  )r  r   r   r   r   r%
    rX
  c                 c   sN    |   r%t| _|  jd7  _| V  | jr| | j| j| j |   sd S d S r=  )r
  r   r%
  rb  r
  r
  r  r   r   r   r]    s   zRetryManager.__iter__N)r%
  ro   c          	   	   C   s   ||kr|r|dkr||  d|d  dS |t | S | |s$|| S t| tr4tt| jp1| jd} ||  dt|dd d| d	| d
 t|rUt	||d dn|}|ri|d|dd t
| dS dS )z&Utility function for reporting retriesr   z. Giving up after z retriesr   z
. RetryingNz %sz (r   z)...)r   z	Sleeping z.2fz seconds ...)r   r   r   r  r  rC  r@  rH  r	  r  r1  sleep)	rc  rg  r
  
sleep_funcr  r  r%
  ro   delayr   r   r   report_retry  s   ,
(zRetryManager.report_retry)r   r   r   r   rb  r
  r  r
  rR  r%
  setterr]  rd  r
  r   r   r   r   r
  x  s    

r
  c                 C   s(   t | tr| n|  }|  d| S )NrD  )r   r   ie_keyr  )rE  rD  r
  r   r   r   make_archive_id  s   r
  c                 C   s`   |dkr|dks
J | d u st | || kr| S | d |d   d|r,| | d   S d S )Nr  r   r  r   r  )ra  leftrightr   r   r   truncate_string  s   0r
  )	use_regexr  c          	      C   s   d|v sJ dt |pg }| D ]f}|d}|r|dd  }||v r:|s)|| ndd || D }t|||d}q|rItt|tjj|d n
||d v rR|gnd }|d u r\t||rq|D ]}||v ro|	| ||v sfq`q|
| qt|S )Nr  z"all" alias is requiredrf  r   c                 S   s,   g | ]}| d r|dd nd | qS )rf  r   Nr  )r   r  r   r   r   r     s     z+orderedSet_from_options.<locals>.<listcomp>)r  )r  rV  orderedSet_from_optionsr  r   r  Ir  r#  r   rA  r  )	r
  
alias_dictr
  r  	requestedr   discardcurrentr@  r   r   r   r
    s4   

r
  c                
   @   s|  e Zd ZdZdZdZdZi dddg dd	d
ddg dd	ddddg ddddddg dddddddddddddddddddd d!d"ddd#d$d%d& d'd(ddd)d*ddd+d,d-d.d
d+d,d/d0d1d2d3d4d5d1d3d6d7d8d9id:d9d;d<d=d>d?d<d@d8dAii dBd8dAidCd8dAidDdAdEd<dFd8dAidGd8dAidHd8dAidId8dAidJd1dKd3d4dLdMd$dNdOd#dPdAdQd& dRdSd#dTd9dUd& dRdVdMdWdNdXd#dYdZd& d[d?d\d=dNd]d\d(dNd2d\d0dNdKd\dJdNi dd\ddNd;d\d:dNdEd\dDdNd^d\dXdd_d`d\dXdd_dad\dVdd_dbd\dOdd_dcd\dFdd_ddd\dGdd_ded\dHdd_dfd\dCdd_dgd\dSdd_dhd\dIdd_dd\ddd_dd\ddd_did\ddd_djd\d
dd_d\d*dd_d\d*dd_d\d.dd_d\d.dd_d\d(dd_d\d(dd_dkZdldm Zdndo Z	ddpdqZ
drds Zdtdu Zdvdw Zdxdy Zedzd{ Zd|d} Zd~S )FormatSorterzT *((?P<reverse>\+)?(?P<field>[a-zA-Z0-9_]+)((?P<separator>[~:])(?P<limit>.*?))?)? *$)hidden
aud_or_vidhasvidie_prefr  qualityr2
  fpshdr:12r  channelsr  sizer  asrprotor$  hasaudsourcer   )r
  r
  r
  r
  r  r
  r2
  r
  r
  zvcodec:vp9.2r
  r  r
  r  r
  r
  r$  r
  r
  r   )r
  r  r
  tbrfilesizevbrr  r  r
  vextabraextr
  	fs_approxr
  r   r  orderedT)zav0?1z
vp0?9\.0?2zvp0?9[hx]265|he?vc?z[hx]264|avczvp0?8z	mp4v|h263rs  r   Nr  )r`  r  orderr  )z[af]laczwav|aiffr{  z
vorbis|oggr>  zmp?4a?r:  zac-?4z	e-?a?c-?3zac-?3r
  r   Nr  r  r  )r  z(hdr)?12z
(hdr)?10\+z(hdr)?10hlgr   sdrN)r`  r  r	  r
  r
  r  )
z	(ht|f)tpsz	(ht|f)tp$zm3u8.*z.*dashwebsocket_fragzrtmpe?r   zmms|rtspzws|websocketf4r
  	video_ext)r&  r+  r,  r/  r   r  )r,  r&  r+  r/  r   r  )r`  r	  r
  
order_freer
  	audio_ext)r9  r>  r:  rB  r{  web[am]r   r  )rB  r{  r
  r:  r9  r>  r   r  )r`  r  r	  r
  r
  r
  F	extractori)visibleforcedr`  r  r
  multipler  c                 C   s   t tdd | D S )Nc                 s   s    | ]}|d kV  qdS )r  Nr   r  r   r   r   rA    rB  z(FormatSorter.<lambda>.<locals>.<genexpr>)r  rG  r  r   r   r   r    r   zFormatSorter.<lambda>)r
  r
  r`  r	  functionr
  )priorityr`  r
  boolean)r  )r
  r	  r`  not_in_listr
  )r	  r`  r
  r  r  language_preferencerR  )convertr	  r   r
  )r
  r   r
  r
  r  r
  filesize_approx)r
  r	  r   r~  	format_idr  
float_noner  r
  r
  audio_channelsr
  r
  r
  r
  r
  source_preferencecodeccombined)r`  r	  r  )r
  r
  r
  c                 C      t td | d S r   nextr  r
  r   r   r   r    r  )r`  r	  r
  r
  r
  )r
  r
  c                 C   r
  r   r
  r
  r   r   r   r    r  r$  )r
  r
  r2
  )r  r  c                 C   s   t td | ddS )Nr   r  )r  r  r
  r   r   r   r    r  )r`  r	  r
  alias
preference	dimension)r`  r	  
deprecated
resolutionr
  bitratetotal_bitratevideo_bitrateaudio_bitrate	frameratefilesize_estimate
sampleratevideo_codecaudio_codec)r  	has_videoro
  	has_audior
  extractor_preferencec                 C   s>   || _ g | _| | j j| |jdr| | j j d S d S )Nverbose)ru  _orderevaluate_paramsr  r  print_verbose_infowrite_debug)r  ru  field_preferencer   r   r   r  8  s   zFormatSorter.__init__c                 C   s   || j vr|dv rdS | jd| d i | j |< | j | }||vr[|d}|dkr<|dkr2dn|d	v r9|fn|}n|d
krM|dkrFdn|rJdnd}n
ddg dd|}|||< || S )N)r
  r
  FzUsing arbitrary fields (zI) for format sorting is deprecated and may be removed in a future versionr`  r	  r
  r
  )r
  r
  r
  r
  r
  float_stringr  Tr   )r`  r
  r
  r
  )settingsru  deprecated_featurer  )r  r	  r   prop_objtype_r   r   r   r   _get_field_setting?  s   



 zFormatSorter._get_field_settingc                 C   s2  |d u r	|sd S n|  }| |d}|dkrd S |dkr|S |dkr't|S |dkr/t|S |dkr| jr<| |dpA| |d}| |d}t|}d	|v rU|d	n|d
 }|rz|d urzt|D ]\}	}
|
rut	|
|ru||	   S qc|| S |||v r|| S | S |
 rt|S d| j| d< |S )Nr
  r  r~  r
  r  r
  r
  r  r   r   )r  r  r  r  _use_free_orderr   r"  r  r   r   	isnumericr  r  )r  r	  r   convert_none
conversion
order_listr
  list_length	empty_posr  r  r   r   r   _resolve_field_valueR  s<   z!FormatSorter._resolve_field_valuec                    s  | dd _| dg  _| _ fdd}t fdd jD | ddr+t nt fd	d jD  t j t|  j }|D ]}t j|}|d u r[t	d
| d|
d}|d u reqF |ddkr| |d}} |dr jd| d| d |
dd u}	|
ddk}
|
d}|d u} |ddk}|o|o |d }|r |dn|f}|r|dn|r|fnt }t|}t|D ]\}}|||	|
||k r|| n	|r|s|d nd  qqFd S )Nprefer_free_formatsFformat_sortc                    st   |   } |  jv rd S  j|   | |}||d u rdn|||d}|  jv r3 j|  | d S | j| < d S )NF)r<  closest
limit_textr  )r  r  r   r  r  r6  )r	  r<  r  r  r  rp  r  r   r   add_itemy  s   

z.FormatSorter.evaluate_params.<locals>.add_itemc                 3        | ]}  |d r|V  qdS )r
  Nr  r   r	  r  r   r   rA    r
  z/FormatSorter.evaluate_params.<locals>.<genexpr>format_sort_forcec                 3   r  )r
  Nr   r!  r  r   r   rA    r
  zInvalid format sort string "z" given by extractorr	  r`  r
  r
  zFormat sorting alias zB is deprecated and may be removed in a future version. Please use z insteadr<  rM  r	  r  r
  
same_limitr   r   )r  r  
_sort_user_sort_extractorr  r   r   r   r  r   r  r  ru  r  r   r   r  )r  r  sort_extractorr  	sort_listr@  r   r	  r
  r<  r  r  	has_limithas_multiple_fieldshas_multiple_limitsfieldslimitslimit_countr  r  r   r  r   r  t  sZ   


zFormatSorter.evaluate_paramsc                    s`    j r|dd j   jr|dd j |dd fdd jD  d S )NzSort order given by user: {}r  z!Sort order given by extractor: {}zFormats sorted by: {}c                    st   g | ]6}  |d rd  |drdnd|  |ddur5d  |dr(d	nd
  |d  |dndqS )r
  z{}{}{}r<  r  r   r  Nz{}{}({})r  r	  r   r  )r  r  r!  r  r   r   r     s    

z3FormatSorter.print_verbose_info.<locals>.<listcomp>)r$  r  r   r%  r  )r  r
  r   r  r   r	    s   zFormatSorter.print_verbose_infoc                 C   s~  |  |d}|  |d}|  |d}|dkr+|  |d}|d u s(|d ur*||kr*d}n0|dkrP|  |d}	|  |d	}
|	d u sC||	v rM|
d u sK||
vrMd
nd}n|dkr[| ||d}t||  |dd}|  |ddkop|d u}|ru|}|d u r{dS |sd|d
fS |rd
t||  |r|| fS || fS |s|d u s||krd
|d
fS |d u s|r||ks||krd
| d
fS d|d
fS )Nr<  r  r  r
  r  rR  r
  in_listr
  r   r
  Tr   r  r
  r~  )ir   r   )r  r  r  abs)r  format_r	  r  r   r<  r  r  maximumr.  r
  val_numis_numr   r   r   &_calculate_field_preference_from_value  s>   *&z3FormatSorter._calculate_field_preference_from_valuec                    sj    |d} fdd|dkr)d} |d} |dfdd|D }n|} |||S )	Nr`  c                    s     | dS )Nr	  )r  r  r  )r0  r  r   r   r    r  z:FormatSorter._calculate_field_preference.<locals>.<lambda>r
  r	  r
  c                 3   r  r   r   r?  )	get_valuer   r   rA    rB  z;FormatSorter._calculate_field_preference.<locals>.<genexpr>)r  r4  )r  r0  r	  r  actual_fieldsr   r   )r0  r5  r  r   _calculate_field_preference  s    z(FormatSorter._calculate_field_preferencec                    sv    dst  d<   dsd v rt d   d<   ddkr9  ddkr0 d nd d< d d< n
 d  d< d d<   d	d u r`  dd
kr`td  dpZdr`d d	<   ddkrkd d<   ddkrvd d<   ds  ddkrt fddpd  d<   ds  ddkrt fddpd  d<   dst fddpd  d< d S d S )Nr  r$  r  r  r  r  r
  r
  r
  r/  r
  r   ir   r
  r
  c                          d  d  S )Nr
  r
  r   r   r  r   r   r     r  z3FormatSorter._fill_sorting_fields.<locals>.<lambda>c                      r8  )Nr
  r
  r   r   r9  r   r   r    r  r
  c                      s    d  d  S )Nr
  r
  r   r   r9  r   r   r    r  )r  r  r  r  r   r   r  r9  r   r9  r   _fill_sorting_fields  s,   

2
z!FormatSorter._fill_sorting_fieldsc                    s$      t fddjD S )Nc                 3   s    | ]	}  |V  qd S r   )r7  r!  r  r  r   r   rA    r  z4FormatSorter.calculate_preference.<locals>.<genexpr>)r:  r  r  )r  r  r   r;  r   calculate_preference  s   
z!FormatSorter.calculate_preferenceNrr  )r   r   r   r  r   _prefer_vp9_sortytdl_defaultr  r  r  r  r  r	  r4  r7  rd  r:  r<  r   r   r   r   r
    s(   	




 !"#
%&(
*+
/
0
1
2
3
4
589:;<=>?@ABCDE
F




N
"8
#r
  c                 C   s$   | du s|du r
dS t ||  d S )z
    @param tbr:      Total bitrate in kbps (1000 bits/sec)
    @param duration: Duration in seconds
    @returns         Filesize in bytes
    Ng     @_@)r  )r
  r  r   r   r   filesize_from_tbr  s   r?  c                 C   s   |d urt | }t||| dd}|pd}t||kr4dt |   }|d |t|  | }t| ddd}tjdkrStj	
|}t|d	krSd
| }|S )Nr   rJ     ___z.dumpT)r  r  i  r	  )r	  md5	hexdigestrK  r   rg   r  rx   r   ry   r	  )r  rD  rp  trim_lengthbasenr  rw  absfilepathr   r   r   _request_dump_filename  s   

rG  c                   @   sR   e Zd ZdddZdd Zdd Zdd	d
dZddddZdd Zdd Z	dS )
_YDLLoggerNc                 C   r
  r   )_ydl)r  ru  r   r   r   r  *  r   z_YDLLogger.__init__c                 C      | j r| j | d S d S r   )rI  r
  r  messager   r   r   debug-     z_YDLLogger.debugc                 C   rJ  r   )rI  r
  rK  r   r   r   r  1  rN  z_YDLLogger.infoF)oncec                C   s   | j r| j || d S d S r   )rI  r  )r  rL  rO  r   r   r   r  5  s   z_YDLLogger.warningTis_errorc                C   s   | j r| j j||d d S d S )NrP  )rI  report_error)r  rL  rQ  r   r   r   r%
  9  s   z_YDLLogger.errorc                 C   rJ  r   )rI  	to_stdoutrK  r   r   r   rm  =  rN  z_YDLLogger.stdoutc                 C   rJ  r   )rI  	to_stderrrK  r   r   r   r  A  rN  z_YDLLogger.stderrr   )
r   r   r   r  rM  r  r  r%
  rm  r  r   r   r   r   rH  )  s    
rH  c                   @   s:   e Zd ZdZdZdZdZdZdZe	dd Z
dd
dZd	S )_ProgressStatez
    Represents a state for a progress bar.

    See: https://conemu.github.io/en/AnsiEscapeCodes.html#ConEmu_specific_OSC
    r   r  r   r  r   c                C   s>   |d dkr	| j S |d dkr| jS |dd u r| j S | jS )Nstatusfinishedr%
  _percent)INDETERMINATEERRORr  VISIBLE)r  ra  r   r   r   r
  S  s
   z_ProgressState.from_dictNc                C   s(   |d u rdnt |}d| j d| dS )Nr   z]9;4;r  )r  r   )r  percentr   r   r   get_ansi_escape^  s   z_ProgressState.get_ansi_escaper   )r   r   r   r   HIDDENrY  r[  WARNINGrZ  r  r
  r^  r   r   r   r   rU  F  s    

rU  r   rr  )r   F)r  )r  Nre  )Tr   )r  )r  rc   )rc   F)r  r  )rx  )r=   )r   NNr   N)r   r   N)rc   N)Nr.  )r   Nr   )Fr   F)r  r  N)r   )r   ({  r  rw	  r  r  r  collections.abcr   r  r  email.headerr|  email.utilsenumrt  r   r	  r	  html.entitiesr   html.parserr   rj  rE  r|   re   r  rc  netrcrI  rx   r   r  r   ri  re	  r  rc	  r  r~   rv   r1  rA  typesr  urllib.errorr  urllib.parseurllib.requestxml.etree.ElementTreerZ  r   r   compatr   r   r   r   dependenciesr	   globalsr
   r   r   r]  r   r   r  r  r  r6  rz  rE
  r  DATE_FORMATSr  r  rA  r  r	  
JSON_LD_REr  rL
  rj   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r  r3  r9  r@  rB  rG  JSONDecoderrH  r{  r  r  r  rv  r  r  r  r  r  r  r  r  r  r   
namedtupler)  r.  r3  r:  rh   r;  r   rS  rW  rZ  r]  r_  ra  rd  rk  rl  rn  ro  rp  rq  rs  rv  rx  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r   r  r   rq  r  r	  ri  	Structurer  r	  r  r#  r  r  r  POINTERargtypesBOOLrestyper-  r%  r&  r,  r/  r0  r  rr  r_  r   	maketransrk  rj  r   rs  rm  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   prepend_extensionr  r)  r-  r2  r5  r8  r  Sequencer9  rU  rf  rl  rs  r  r  rt  r  r  r  r  r  r  Iterabler  rh  r  r  r  r  r  r  r  r  r  r  r  POSTPROCESS_WHENDEFAULT_OUTTMPLOUTTMPL_TYPESSTR_FORMAT_RE_TMPLSTR_FORMAT_TYPESr  r   r  r  r   r!  rb  rf  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rK  rN  rQ  rT  r[  r_  r`  r  ra	  rs	  rv	  r}	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  DOT_URL_LINK_TEMPLATEDOT_WEBLOC_LINK_TEMPLATEDOT_DESKTOP_LINK_TEMPLATELINK_TEMPLATESr	  r	  rH  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r  r	  r  r	  r  r
  rK  r
  r
  r
  r
  r
  rG
  rO
  rP
  r  SimpleNamespacerU
  r
  r  rm
  ro
  rn
  rr
  r  r"  r
  r
  r
  r
  r
  r?  rG  rH  EnumrU  r   r   r   r   <module>   sp   
-

+#	('	7	T,	""*	
&


	


	A

	G
		8

Y+) 	





R



	`+)	P* ) O  	  

			5


, 	
m

& 8  0 