U
    g                    @   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l0m1Z1 ddl2m3Z3 ddl2m4Z4m5Z5m6Z6m7Z7 ddl8m9Z9 e:;ddd  Z:e<e=d	Z>G d
d dZ?dd Z@ddddddddddddgZAeAddddddd d!d"d#d$d%gd&d'd(d)d*d+d,d-d.d/d0d1gd2ZBd d d d d3d4d5d3d6d5d7d6d8d7d9ZCeDeEd:eFd;d<gd=d>gd?d@dAgdBdCgdDdEgdFdGgdHZGdIZHeIeHZJeJKdJdKdLdMdNdOdPdQg eIeHZLeLKdRdSdTdUdVg dWZMdXZNdYZOe3jPdZd[ ZQd\d] ZRdd^d_ZSd`da ZTddbe?fdcddZUddbe?fdedfZVddbe?fdgdhZWdidj ZXdkdl ZYdmdn ZZdodp Z[dqdr Z\dsdt Z]dudv Z^dwdx Z_dydz Z`d{d| Zad}d~dddZbG dd dejcjdZedd ZfG dd dejcjdZgG dd dejcjdZhdd Zidd Zjdd ZkG dd dejlZmdd Zndd Zodbe?fddZpdd ZqdddZrddddZsdd Ztdd ZudbdddZvdd Zwdd Zxdd ZyG dd dejZzG dd de#j{Z{dd Z|e}ddZ~dd ZdddZddd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dddZdddZdddZdddZdddZdddZdddZdddZdddZdd Zdd dZdd ZG dd dZe3jPdd Ze3jPdd	 Zdd
dZdd dddZe e_dd Zdd ZG dd deZe$jdkrd dlZd dlZd dlZG dd dejZedZejZejjejjejjejjejjeege_ejje_ejZejjejjejjejjeege_ejje_dZdZdd Zdd ZnTz$d dlZÐdd Zd d ZW n. ek
r`   d!d Zd"d ZY nX G d#d$ d$Ze3jPd%d& ZeǠȐd'd(iZeǠȐd)d*d*d+d,Zdbd-d.d/Zːd0d1 Z̐dd2d3Z͐dd5d6d7d8Zΐd9d: Zϐdd;d<ZАd=d> Zѐd?d@ ZҐdAdB ZdbdCdDdEZԐdFdG ZՐddIdJZ֐dKdL ZאdMdN ZؐdOdP ZِdQdR ZڐdSdT ZېdUdV ZܐdWdX ZݐdYdZ Zސd[d\ Zߐd]d^ Zd_d` ZeddadbZddcddZdedf ZeddgdhZddidjZddkdlZdmdn ZddodpZdqdr ZddsdtZe3ed~Ze3edbZg fdudvZdwdx Zddzd{Zd|gdd}fd~dZdddZG dd dejjZG dd dZG dd deZG dd deZG dd dZdd Zdd Zdd Zdd Zdd ZddddZ dd Zdd ZdddZejje?fddZe?fddZdg i dddZdddZdd fddZ	dd Z
eQ df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db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Є Zddѐd҄ZdӐdԄ ZdՐdք Zdאd؄ Ze?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#dddddgZ$dd Z%dd Z&d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Z0dddZ1dd	d
Z2g d~fddZ3dg d~fddZ4G dd dZ5G dd dZ6G dd dZ7dddZ8dd Z9dd Z:dd Z;dd Z<ddd Z=dd!d"Z>d#d$ Z?d%d& Z@d'd( ZAd)d* ZBd+d, ZCd-d. ZDd/d0 ZEdd1d2ZFd3ZGd4ZHd5ZIeGeIeHd6ZJd7d8 ZKd9d: ZLdd;e?d	e@fd<d=ZMd>d? ZNd@ZOdAdB ZPddCdDZQdEdF ZRdGdH ZSdIdJ ZTdKdL ZUi fdMdNZVdOdP ZWe7dQkrpdbndaXe3jPdRdS ZYdTdU ZZe=dVZ[dWdX Z\dYdZ Z]d[dd\d]d^Z^d_d` Z_dadb Z`dcdd Zadedf ZbG dgdh dhZcdidj Zddkdl ZeG dmdn dnZfG dodp dpZgG dqdr dre(jhZieidsdtdudvdwdxdydzd{Zjej jkejjl7  _kej jmejjn7  _mejjkejjmejjoZpG d|d} d}eZqG d~d dZrdd ZsdddZtdbddddZuG dd dZvdd ZwG dd dZxdS (      N   )	traversal   )	functools)compat_etree_fromstringcompat_expandusercompat_HTMLParseErrorcompat_os_name)xattr. c                   @   s   e Zd ZdS )
NO_DEFAULTN__name__
__module____qualname__ r   r   7/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/utils/_utils.pyr   >   s   r   c                 C   s   | S Nr   xr   r   r   IDENTITYB   s    r   JanuaryFebruaryZMarchZAprilMayZJuneZJulyZAugustZ	SeptemberZOctoberZNovemberZDecemberZjanvieru   févrierZmarsZavrilmaiZjuinZjuilletu   aoûtZ	septembreZoctobreZnovembreu	   décembreZstyczniaZlutegoZmarcaZkwietniaZmajaZczerwcaZlipcaZsierpniau	   wrześniau   październikaZ	listopadaZgrudnia)enfrpliii)UTUTCGMTZASTADTESTEDTCSTCDTMSTMDTPSTPDTu   ÂÃÄÀÁÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖŐØŒÙÚÛÜŰÝÞßàáâãäåæçèéêëìíîïðñòóôõöőøœùúûüűýþÿZAAAAAAAEZCEEEEIIIIDNOOOOOOOZOEZUUUUUYTHssZaaaaaaaeZceeeeiiiionoooooooZoeZuuuuuythy)*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-%Yz%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/%Yz%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   s4   zt  } d|  W n tk
r.   d} Y nX | S )zGet preferred encoding.

    Returns the best encoding scheme for the system, based on
    locale.getpreferredencoding() and some further tweaks.
    ZTESTzUTF-8)localegetpreferredencodingencode	Exception)Zprefr   r   r   preferredencoding   s    
r<   c                 C   s  t jtj| dtj|ddddd}z| tj| |dd W 5 Q R X tj	dkrxt
t t| W 5 Q R X t
t. td	}t| t|jd
| @  W 5 Q R X t|j| W n8 tk
r   t
t t|j W 5 Q R X  Y nX dS )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_asciiwin32r     N)tempfileNamedTemporaryFileospathbasenamedirnamejsondumpsysplatform
contextlibsuppressOSErrorunlinkumaskchmodnamerenamer;   remove)objfntfmaskr   r   r   write_json_file   s.     
   


r_   c                 C   sD   t d|st||dkr&d| dnd| d| d }| |S )z  Find the xpath xpath[@key=val] z^[a-zA-Z_-]+$N[@]z='z'])rematchAssertionErrorfind)nodexpathkeyvalexprr   r   r   find_xpath_attr   s    *rk   c                 C   sj   dd |  dD }g }|D ]B}t|dkr<||d  q|\}}|d||  d|  qd|S )Nc                 S   s   g | ]}| d qS ):)split.0cr   r   r   
<listcomp>   s     z!xpath_with_ns.<locals>.<listcomp>/r   r   {})rm   lenappendjoin)rK   ns_map
componentsZreplacedrp   nstagr   r   r   xpath_with_ns   s    r|   Fc                    s~    fdd}t |tr ||}n|D ]}||}|d k	r$ q>q$|d krz|tk	rR|S |rv|d krb|n|}td| nd S |S )Nc                    s
     | S r   )re   )rg   rf   r   r   _find_xpath   s    z"xpath_element.<locals>._find_xpathzCould not find XML element )
isinstancestrr   ExtractorError)rf   rg   rX   fataldefaultr~   nZxpr   r}   r   xpath_element   s    

r   c                 C   sj   t | ||||d}|d ks"||kr&|S |jd krd|tk	r<|S |r`|d krL|n|}td| nd S |jS )N)r   r   z"Could not find XML element's text )r   textr   r   )rf   rg   rX   r   r   r   r   r   r   
xpath_text  s    
r   c                 C   s^   t | ||}|d krT|tk	r |S |rP|d kr<| d| dn|}td| nd S |j| S )Nr`   ra   zCould not find XML attribute )rk   r   r   attrib)rf   rg   rh   rX   r   r   r   r   r   r   
xpath_attr  s    r   c                 K   s   t d| |f|S )zOReturn the content of the tag with the specified ID in the passed HTML documentid)get_element_by_attributer   htmlkwargsr   r   r   get_element_by_id   s    r   c                 K   s   t d| |f|S )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_id%  s    r   c                 C   s   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*  s    
r   c                 C   s   t | |}|r|d S dS )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_class0  s    
r   c                 K   s    t | ||f|}|r|d S d S Nr   )get_elements_by_attribute)	attributevaluer   r   r   r   r   r   r   6  s    r   c                 K   s    t | ||f|}|r|d S d S r   )get_elements_html_by_attribute)r   r   r   kargsr   r   r   r   r   ;  s    r   c                 K   s   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   rb   escape)r   r   r   r   r   r   r   @  s      r   c                 C   s   t ddt|  d|ddS )zZReturn the html of all tags with the specified class in the passed HTML document as a listr   r   r   Fr   )r   rb   r   )r   r   r   r   r   r   G  s      r   c                  O   s   dd t | |D S )zVReturn the content of the tag with the specified attribute in the passed HTML documentc                 S   s   g | ]\}}|qS r   r   )ro   content_r   r   r   rq   P  s     z-get_elements_by_attribute.<locals>.<listcomp>'get_elements_text_and_html_by_attributeargsr   r   r   r   r   N  s    r   c                  O   s   dd t | |D S )zSReturn the html of the tag with the specified attribute in the passed HTML documentc                 S   s   g | ]\}}|qS r   r   )ro   r   wholer   r   r   rq   U  s     z2get_elements_html_by_attribute.<locals>.<listcomp>r   r   r   r   r   r   S  s    r   z[\w:.-]+T)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 ]B}t|d
|| d \}}	tt jdd|t j	d|	fV  q^dS )z
    Return the text (content) and the html (whole) of the tag with the specified
    attribute in the passed HTML document
    Nz
[\s"'`=<>]r   ?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)
rb   rc   r   finditer get_element_text_and_html_by_taggroupstartunescapeHTMLsubDOTALL)
r   r   r   r{   r   quoteZpartial_element_remr   r   r   r   r   r   X  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                   @   s   e Zd ZdS )z:HTMLBreakOnClosingTagParser.HTMLBreakOnClosingTagExceptionNr   r   r   r   r   HTMLBreakOnClosingTagExceptionz  s   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   s   | S r   r   r   r   r   r   	__enter__  s    z%HTMLBreakOnClosingTagParser.__enter__c                 G   s   |    d S r   )closer   r   r   r   r   __exit__  s    z$HTMLBreakOnClosingTagParser.__exit__c                 C   s   d S r   r   r   r   r   r   r     s    z!HTMLBreakOnClosingTagParser.closec                 C   s   | j | d S r   )r   rv   )r   r{   r   r   r   r   handle_starttag  s    z+HTMLBreakOnClosingTagParser.handle_starttagc                 C   sJ   | j std| j r*| j  }||krq:qtd| d| j sF| jd S )Nzno tags in the stackz!matching opening tag for closing  tag not found)r   r   popr   )r   r{   Z	inner_tagr   r   r   handle_endtag  s    
z)HTMLBreakOnClosingTagParser.handle_endtagN)r   r   r   __doc__r;   r   r   r   r   r   r   r   r   r   r   r   r   s  s   r   c           
   
   C   sZ  dd }d|  d}||d|  t d|  d}|||d dt d	|  d
}||d 7 }t }||||  |jr|jd | krt d|  d
|}|t|k rD|||d |t d|  d}|t| }	z"|||||	   ||	7 }W q tjk
r@   ||||  ||||	  f Y W  5 Q R  S X qt dW 5 Q R X 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k
r$   |Y nX d S r   index
ValueError)Z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   ru   r   )
r{   r   r   Zclosing_tagZwhole_startZcontent_startr   offsetZnext_closing_tag_startZnext_closing_tag_endr   r   r   r     sB      
  
 r   c                   @   s    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d S )Ndone)dictr   r   r   r{   r   r   r   r   r     s    
z#HTMLAttributeParser.handle_starttagN)r   r   r   r   r   r   r   r   r   r   r     s   r   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   rv   r   r   r   r   r   r     s    z#HTMLListAttrsParser.handle_starttagc                 C   s   |  j d8  _ d S Nr   )r   )r   r{   r   r   r   r     s    z!HTMLListAttrsParser.handle_endtagN)r   r   r   r   r   r   r   r   r   r   r   r     s   r   c              	   C   s4   t  }tt ||  |  W 5 Q R X |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': '''
    }.
    )r   rR   rS   r   r   r   r   )Z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)r   r   r   r   )Zwebpager   r   r   r   
parse_list  s    
r   c                 C   sT   | dk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   )rb   r   r   strip)r   r   r   r   
clean_html  s    r   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|| d S Nr   )r   r   _close_attemptssuperr   )r   r   r   r   r   r   	__class__r   r   r     s    
zLenientJSONDecoder.__init__c                 C   sn   | j d | j }| jdr$|d S |ds2d S | jdrN|d d d S | jdrj|d d d S d S )NzExpecting ',',zExpecting property namert   zExpecting valuera   )docposmsg
startswithendswith)errr   r   r   r   _close_object  s    
z LenientJSONDecoder._close_objectc                    s   | j r|  |}t| jd D ]}z0| jrB| | d W   S t |W   S  tj	k
r } zh|j
d krt n$|| jk r| |}|d k	rW Y 8qt||j d||j
d |j
d  ||j
W 5 d }~X Y qX qdstdd S )Nr   r   z in 
   Fz Too many attempts to decode JSON)r   ranger   r   
raw_decodelstripr   decoderN   JSONDecodeErrorr   r   typer   rd   )r   sattempter   r   r   r   !  s     



FzLenientJSONDecoder.decode)r   r   r   r   staticmethodr   r   __classcell__r   r   r   r   r     s   
r   c                 C   s  | dkrdt jdkrFddl}ttj |t j	 t
j W 5 Q R X tt jdrZt jjnt j| fS tdD ]}zRz$t jdkrtt| |dd }W n tk
r   t| |}Y nX || fW   S  tk
r } z2|s|jtjfkr | t|  }} || kr W 5 d}~X Y qlX qld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).
    -rF   r   Nbufferr   F)block)rP   rQ   msvcrtrR   rS   ioUnsupportedOperationZsetmodestdoutfilenorJ   O_BINARYhasattrr  r   LockingUnsupportedErrorlocked_filer   rT   openerrnoEACCESsanitize_path)filenameZ	open_moder  r   streamr   Zold_filenamer   r   r   sanitize_open4  s*    



r  c                 C   s(   d}t j| }|dk	r$t j|}|S )z:Convert RFC 2822 defined time string into system timestampN)emailutilsparsedate_tz	mktime_tz)Ztimestr	timestamp	timetupler   r   r   timeconvert[  s
    r  c                    s  | dkrdS  fdd}r6 t ks* s6td| } tddd | } dt|| } t krtdd	|}d
}td| d| dd|}|ddpd} sd|kr|dd}q|d}r|	dr|dd }|	drd|t
dd  }|d}|sd}|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 krt |  S s$| dkr$dS  tkrVsV| dkrVddd| tt| d S | dksvt| d	k svt| d
krzdS | dkrrdS dS | dkrrdS dS | dkrdS r| dks|  st| d
krt| d dkrdS dS | S )Nr   z  z	"*:<>?|/\u   ⧸u   ⧹)rr   \i  r          r   "'rl   z _ -z   -z\/|*<>z _z!&'()[]{}$;`^,#r   CM)ACCENT_CHARSr   getchrordisspaceunicodedatacategory)charis_id
restrictedr   r   replace_insanem  s"      z)sanitize_filename.<locals>.replace_insaneNFKCz[0-9]+(?::[0-9]+)+c                 S   s   |  dddS )Nr   rl   r   )r   replacer   r   r   r   <lambda>      z#sanitize_filename.<locals>.<lambda>z(\0.)(?:(?=\1)..)+\1z(?:\0.|[ _-])*z^ .|z .$ r   __z-_r   Nr  r   )r   r)  	normalizerb   r   rw   mapr1  r   r   ru   r   )r   r.  r-  r/  resultZSTRIP_REr   r,  r   sanitize_filenamed  s0    


r<  c                 C   sf   g }| D ]X}|r|dkrqn,|dkrH|r<|d dkr<|   |d qtdd|}|| q|S )Nr   z..r   z[/<>:"\|\\?\*]|[\s.]$#)r   rv   rb   r   )partsZsanitized_partspartZ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 | dd}|dr|d}d|dd d }|dd }nj|dd	 d
kr|d	d dkrdnd	}|d| }||d d}n"|dd dkrdnd}|d}|dt| S )z(Sanitizes and normalizes path on WindowsrF   rr   r   r  z\\N   r   r   rl      )rP   rQ   r   rw   r@  rm   r1  )r   forcerootnormedr>  r   r   r   r   r    s"    



r  http)schemec                C   sX   | d krd S |  dr$| d|  S d}|D ]&\}}t|| r,t|||   S q,| S )N//rl   ))z
^httpss://zhttps://)z^rmtp([es]?)://z	rtmp\1://)r   rb   rc   r   )urlrG  ZCOMMON_TYPOSZmistakefixupr   r   r   sanitize_url  s    
rK  c                 C   s   t j| }|jd kr| d fS t j|j|jd kr8|jn|j d|j d} t	d
|j|jpdd }| d|  fS )Nrl   )netlocz{}:{}r   zBasic )urllibparseurlsplitusername
urlunsplit_replaceporthostnamebase64	b64encodeformatpasswordr:   r   )rI  r>  Zauth_payloadr   r   r   extract_basic_auth  s    

rY  c                 C   s   t jt| S )zExpand shell variables and ~)rJ   rK   
expandvarsr   r   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 ]}|| kr|  | |V  qd S r   )rv   )seenr   iterabler   r   _iter  s
    
zorderedSet.<locals>._iter)list)r`  r]  ra  r   r_  r   
orderedSet  s    rc  c              
   C   s   | dd }|t jjkr(tt jj| S | t jjkr@t jj|  S td|}|dk	r|d}|drxd}d| }nd}t	
t tt||W  5 Q R  S Q R X d	| d
S )z)Transforms an HTML entity to a character.Nr   z#(x[0-9a-fA-F]+|[0-9]+)r   r      0r   &;)r   entitiesname2codepointr&  html5rb   rc   r   r   rR   rS   r   int)Zentity_with_semicolonentitymobjZnumstrbaser   r   r   _htmlentity_transform  s    

 ro  c                 C   s,   | d krd S t | tsttddd | S )Nz
&([^&;]+;)c                 S   s   t | dS r   )ro  r   r2  r   r   r   r3    r4  zunescapeHTML.<locals>.<lambda>)r   r   rd   rb   r   r[  r   r   r   r     s      r   c                 C   s,   |  dd dd dd dd d	d
S )Nrf  &amp;r   z&lt;r   z&gt;r!  z&quot;r"  z&#39;r1  )r   r   r   r   
escapeHTML!  s"         rr  c                   @   s   e Zd Zdd ZdS )netrc_from_contentc              	   C   s6   i i  | _ | _t|}| d|d W 5 Q R X d S )Nr  F)hostsmacrosr  StringIO_parse)r   r   r  r   r   r   r   -  s    znetrc_from_content.__init__N)r   r   r   r   r   r   r   r   rs  ,  s   rs  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 )PopenrF   Nc                    s6   t tdsd S d d<  fdd}|d |d d S )NZ_MEIPASS1ZPYINSTALLER_RESET_ENVIRONMENTc                    s2     |  d}|d kr& | d  n| | < d S )NZ_ORIG)r%  r   )rh   origenvr   r   _fixG  s    z+Popen._fix_pyinstaller_issues.<locals>._fixZLD_LIBRARY_PATHZDYLD_LIBRARY_PATH)r  rP   )r|  r}  r   r{  r   _fix_pyinstaller_issues:  s    
zPopen._fix_pyinstaller_issuesF)r|  r   shellc                   s   |d krt j }| | |dp<|dp<|p<|d| _|dkrhd|d< |dd |dd |rtdkr|dd krt|t	st
|dd	}d
}d|d< |   d| d}t j|f|||d|d| ji d S )NrD   errorsuniversal_newlinesTr>   r1  nt
executabler  Fz"^

"=z /Q /S /D /V:OFF /E:ON /C "r!  )r|  r  startupinfo)rJ   environcopyr~  r%  _Popen__text_mode
setdefaultr	   r   r   shell_quote_Popen__comspecr   r   _startupinfo)r   r   r|  r   r  	remainingr   r   r   r   r   Q  s    

$
zPopen.__init__c                 C   sB   t jdp$t jt jdddd}t j|r6|S tdd S )NZComSpecZ
SystemRootr   ZSystem32zcmd.exez:shell not found: neither %ComSpec% nor %SystemRoot% is set)rJ   r  r%  rK   rw   isabsFileNotFoundError)r   Zcomspecr   r   r   Z	__comspecf  s      zPopen.__comspecc                 O   s6   z| j ||W S  tk
r0   | jd d  Y nX d S )Ntimeout)communicateBaseExceptionkillr   r   r   r   r   r   communicate_or_killm  s
    zPopen.communicate_or_killr   r  c                   s"   t    |dkr| j|d d S )Nr   r  )r   r  wait)r   r  r   r   r   r  t  s    
z
Popen.killc             
   O   sT   | ||@}|j rdnd}|j|d\}}|p0||p6||jfW  5 Q R  S Q R X d S )Nr   r4  r  )r  r  
returncode)clsr  r   r   procr   r
  stderrr   r   r   runy  s    z	Popen.run)r   r   r   rP   rQ   
subprocessZSTARTUPINFOr  ZdwFlagsZSTARTF_USESHOWWINDOWr  r~  r   r  r  r  classmethodr  r  r   r   r   r   rx  3  s   

rx  c                 C   s   t | tr| S | dS Nascii)r   r   r   r[  r   r   r   encodeArgument  s    r  ZTime)hoursminutessecondsmillisecondsc                 C   s8   t | d\}} t |d\}}t |d\}}t|||| S )N  <   )divmod
_timetuple)msecsecsminsZhrsr   r   r   timetuple_from_msec  s    r  rl   c                 C   sf   t | d }|jr,d|j||j||jf }n$|jrFd|j||jf }n
d|j }|rbd||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    
r  rg  c                 C   sZ   ddl m} d| d}|  } | r.| drF|d  |dd   }| rR| d n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   r   r   )updater  rstripr   title)beforer  r   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 k	r|| _ n| j d kr&t| j| _ t | j  d S r   )r   r   r   r   r   )r   r   r   r   r   r     s
    
zYoutubeDLError.__init__)Nr   r   r   r   r   r   r  r   r   r   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 |kr d}t|| _|| _|| _|| _|| _	|| _
t | _t| jd trp| 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)Znetworking.exceptionsr  rP   exc_infor   orig_msg	tracebackexpectedcausevideo_idier   r   r   r   _ExtractorError__msg)r   r   tbr  r  r  r  r  r   r   r   r     s    

zExtractorError.__init__c              	   C   s@   d t| jd dt| jd d| jt| jd d| jr6dnt fS )Nr   z[%s] z%s: z (caused by %r))rw   format_fieldr  r  r  r  r  r  r   r   r   r   Z__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pHd S )Nr   r   r   r  )join_nonemptyr  rw   	format_tbr  format_exception__traceback__r   r   r   r   format_traceback  s    &zExtractorError.format_tracebackc                    sB   t  || t| dd r>|dkr>| jp0t| j| _| jf| _d S )Nr   )r   r   )r   __setattr__getattrr  r   r   r   r   )r   rX   r   r   r   r   r    s    zExtractorError.__setattr__)NFNNN)
r   r   r   r   r   propertyr  r  r  r  r   r   r   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r  )r   r   rI  )r   rI  r   r   r   r     s
     zUnsupportedError.__init__r   r   r   r   r  r   r   r   r   r    s   r  c                   @   s   e Zd ZdZdS )RegexNotFoundErrorzError when a regex didn't matchNr   r   r   r   r   r   r   r   r    s   r  c                       s"   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| || _d S )NTr  )r   r   	countries)r   r   r  r   r   r   r   r     s    zGeoRestrictedError.__init__)Nr   r   r   r   r   r  r   r   r   r   r    s   r  c                       s"   e Zd ZdZd fdd	Z  ZS )UserNotLivez%Error when a channel/user is not liveNc                    s    d|d< t  j|pdf| d S )NTr  z!The channel is not currently live)r   r   )r   r   r   r   r   r   r     s    zUserNotLive.__init__)Nr  r   r   r   r   r    s   r  c                       s"   e Zd ZdZd fdd	Z  ZS )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)r   r   r  )r   r   r  r   r   r   r     s    zDownloadError.__init__)Nr  r   r   r   r   r    s   r  c                   @   s   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   r   r   r   r   r   r    s   r  c                       s&   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                    s.   |d k	r|  j d| 7  _ t | j  d S N: r   r   r   )r   r  r   r   r   r   "  s    zSameFileError.__init__)Nr  r   r   r   r   r    s   r  c                   @   s   e Zd ZdZdS )PostProcessingErrorzPost Processing exception.

    This exception may be raised by PostProcessor's .run() method to
    indicate an error in the postprocessing task.
    Nr  r   r   r   r   r  (  s   r  c                   @   s   e Zd ZdZdZdS )DownloadCancelledz@ Exception raised when the download queue should be interrupted zThe download was cancelledNr  r   r   r   r   r  0  s   r  c                   @   s   e Zd ZdZdZdS )ExistingVideoReachedz --break-on-existing triggered zWEncountered a video that is already in the archive, stopping due to --break-on-existingNr  r   r   r   r   r  5  s   r  c                   @   s   e Zd ZdZdZdS )RejectedVideoReachedz  --break-match-filter triggered zSEncountered a video that did not match filter, stopping due to --break-match-filterNr  r   r   r   r   r  :  s   r  c                   @   s   e Zd ZdZdZdS )MaxDownloadsReachedz) --max-downloads limit has been reached. zDMaximum number of downloads reached, stopping due to --max-downloadsNr  r   r   r   r   r  ?  s   r  c                       s"   e Zd ZdZd fdd	Z  ZS )ReExtractInfoz& Video info needs to be re-extracted. Fc                    s   t  | || _d S r   )r   r   r  )r   r   r  r   r   r   r   G  s    zReExtractInfo.__init__)Fr  r   r   r   r   r  D  s   r  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 )NFr  r   r   r   r   r   r   r   r   P  s    zThrottledDownload.__init__r  r   r   r   r   r  L  s   r  c                       s&   e Zd ZdZdZd fdd	Z  ZS )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                    s.   |d k	r|  j d| 7  _ t | j  d S r  r  )r   r   r   r   r   r   \  s    zUnavailableVideoError.__init__)Nr  r   r   r   r   r  T  s   r  c                       s    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)r   r   
downloadedr  )r   r  r  r   r   r   r   j  s    zContentTooShortError.__init__r  r   r   r   r   r  b  s   r  c                       s   e Zd Zd fdd	Z  ZS )XAttrMetadataErrorNUnknown errorc                    sn   t  | || _|| _| jtjtjfks>d| jks>d| jkrFd| _n$| jtjks\d| jkrdd| _nd| _d S )NzNo space leftzDisk quota exceededZNO_SPACEzArgument list too longZVALUE_TOO_LONGZNOT_SUPPORTED)	r   r   coder   r  ENOSPCZEDQUOTreasonZE2BIG)r   r  r   r   r   r   r   r  s    zXAttrMetadataError.__init__)Nr  r  r   r   r   r   r  q  s   r  c                   @   s   e Zd ZdS )XAttrUnavailableErrorNr   r   r   r   r   r    s   r  c                 C   s   t | tttjfS r   )r   r   bytesrJ   PathLikefr   r   r   is_path_like  s    r  c                 C   s   t d| }d }|sft d| }t|o4|d }|d k	r| d t|d  } tj|d}nb| d t|d  } |dr|ddkrdnd}tj|t	|d	 |t	|d
 d}|d kr|t
k	r|pt }|| 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   r   r  r  )r  r  )rb   searchTIMEZONE_NAMESr%  r   r   ru   dt	timedeltark  r   )date_strr   r   timezoner  r   r   r   extract_timezone  s*    	
r  Tc              
   C   sx   | dkrdS t dd| } t| |\}} ttt: d| d}tj	| || }t
| W  5 Q R  S Q R X dS )z- Return a UNIX timestamp from the given date Nz\.[0-9]+r   r6   z%H:%M:%S)rb   r   r  rR   rS   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  s    r  c              
   C   s   | dkrdS d}|  dd} tdd| } t| \}} t|D ].}tt tj	
| |d}W 5 Q R X q>|dkrtj| }|rtt tj	|dd  d}W 5 Q R X |dk	rt|S dS )z4Return a string with the date in the format YYYYMMDDNr   r   (?i)\s*(?:AM|PM)(?:\s+[A-Z]+)?r   r7      )r1  rb   r   r  r  rR   rS   r   r  r  r  strftimer  r  r  r   )r   r  Zupload_dater   
expressionr  r   r   r   unified_strdate  s      "r  c                 C   s"  t | tsd S tddtdd| } td| r6dnd}t| \}} tdd| } td	| }|r|| d t|d
  } td| }|r|d} t|D ]R}t	
t> tj| || tj|d }t| W  5 Q R    S Q R X qtj| }|rt||d  |  S d S )Nr   r   z>(?i)[,|]|(mon|tues?|wed(nes)?|thu(rs)?|fri|sat(ur)?|sun)(day)?r   z(?i)PM   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   rb   r   r  r  ru   r   r  rR   rS   r   r  r  r  r  r  r  r  r  r  r  total_seconds)r   r  Zpm_deltar  r   r  r  r  r   r   r   unified_timestamp  s.    
  
&r  unknown_videoc                 C   s\   | d ksd| kr|S |  dd dd }td|r<|S |dtkrT|dS |S d S )Nr   r   r   r   z^[A-Za-z0-9]+$rr   )	partition
rpartitionrb   rc   r  KNOWN_EXTENSIONS)rI  default_extguessr   r   r   determine_ext  s    
r   c                 C   s   t | |d | |S Nr   )replace_extension)r  Zsub_langZ
sub_formatexpected_real_extr   r   r   subtitles_filename  s    r$  autor7   c                 C   s,  d}|dkrd}d}t tjtjj|}| dkr6|S | dkrN|tjdd S td	| }|d
k	rt	|
d||}t|
d|
ddkrdnd }|
d}|dks|dkrt||dkr|d n|}	d}n0|dkrd}|d9 }tjf |d |i}
||
 }	|rt |	|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todayZ	yesterdayr   )dayszf(?P<start>.+)(?P<sign>[+-])(?P<time>\d+)(?P<unit>microsecond|second|minute|hour|day|week|month|year)s?Nr   r  r  r  r   unitmonthyearr  dayweek   r   )datetime_roundr  r  r'  r  utcr  rb   rc   datetime_from_strr   rk  datetime_add_monthsr  )r   	precisionrW  Zauto_precisionr(  rc   
start_timer  r*  Znew_datedeltar   r   r   r2  	  s:    

$

r2  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&  )r4  rW  )rb   	fullmatchr   r2  date)r   rW  strictr   r   r   date_from_str3  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  
monthranger1  )r  monthsr+  r,  r-  r   r   r   r3  ?  s
    r3  r-  c                 C   sL   |dkr| S ddddd}dd }|t |  || }tj|tjjS )	z@
    Round a datetime object's time to a specific precision
    r&  Q r  r  r   )r-  hourminutesecondc                 S   s   | |d  | | S r   r   )r   r   r   r   r   r3  U  r4  z datetime_round.<locals>.<lambda>)r  r  r  r  r  fromtimestampr  r1  )r  r4  Zunit_secondsZroundtor  r   r   r   r0  H  s    r0  c                 C   s*   t d| }|dk	r"d| S | S dS )z?
    Convert a date in 'YYYYMMDD' format to 'YYYY-MM-DD' formatz^(\d\d\d\d)(\d\d)(\d\d)$Nr  )rb   rc   rw   groups)r   rc   r   r   r   hyphenate_dateZ  s    rD  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k	rt |dd| _ntjj | _|dk	r>t |dd| _ntjj | _| j| jkrhtd|  ddS )z<start and end must be strings in the format accepted by dateNTr9  zDate range: "z." , the start date must be before the end date)	r:  r   r  r  r;  r8  endmaxr   r   r   rG  r   r   r   r   g  s    zDateRange.__init__c                 C   s
   | ||S )z0Returns a range that only contains the given dayr   )r  r-  r   r   r   r-  t  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  r8  r:  r   rG  )r   r8  r   r   r   __contains__y  s    zDateRange.__contains__c                 C   s.   t  dt| j  d| j d| j dS Nr   (, ))r   r   r   	isoformatrG  r   r   r   r   __repr__  s    zDateRange.__repr__c                 C   s   | j  d| j S )Nz to )r   rG  r   r   r   r   __str__  s    zDateRange.__str__c                 C   s"   t |to | j|jko | j|jkS r   )r   rE  r   rG  r   otherr   r   r   __eq__  s
    


zDateRange.__eq__)NN)r   r   r   r   r   r  r-  rJ  rP  rQ  rT  r   r   r   r   rE  d  s   

rE  c                  C   s   t  } | dkr0ttdr0| dtjd d  7 } g }tt t  }W 5 Q R X d	t 
 | t  t  d t   tjtt|ddid d	S )
NPyPypypy_version_infoz version %d.%d.%drB  z Python {} ({} {} {}) - {} ({}{})r   r  r   z, %s)rQ   python_implementationr  rP   rV  rR   rS   rT   libc_verrW  python_versionmachinearchitecturesslOPENSSL_VERSIONr  r  )rW  rX  r   r   r   system_identifier  s    
r^  c                   C   s    t dkrtt d S dS dS )z@ Get Windows version. returns () if it's not running on Windows r  r   r   N)r	   version_tuplerQ   	win32_verr   r   r   r   get_windows_version  s    ra  c                 C   s   t | tst|ptj}|s d S tdkr>t|r>tdd| } d | }}dt	|dd pXdkrh|pdt
 }n&t|dr|j}|pt	|dd pt
 }||r| |d	n|  |  d S )
Nr  z	([\r\n]+)z \1brC   r   r  rD   ignore)r   r   rd   rP   r  r	   supports_terminal_sequencesrb   r   r  r<   r  r  writer:   flush)r   outrD   encr  r   r   r   write_string  s    


ri  )printer
stacklevelc                K   s   ddl m} |r^| tjkrd S tj|  |rD||  t  f|S td|  t  df|S dd l}|jt	| |d d d S )Nr   )_IN_CLIzERROR: r   r   rB  )rk  )
r   rl  deprecation_warning_cacheaddr  ri  warningswarnDeprecationWarning)r   rj  rk  r   rl  rp  r   r   r   rm    s    
rm  c                 C   s0   | sg S t | d trt| S dd | D S d S )Nr   c                 S   s   g | ]}t |qS r   )r'  rn   r   r   r   rq     s     z$bytes_to_intlist.<locals>.<listcomp>)r   rk  rb  )bsr   r   r   bytes_to_intlist  s
    rt  c                 C   s    | sdS t jdt|  f|  S )Nr4  z%dB)structpackru   )xsr   r   r   intlist_to_bytes  s    rx  c                       s    e Zd ZdZ fddZ  ZS )r  zFile locking is not supportedc                    s   t  | j d S r   r  r   r   r   r   r     s    z LockingUnsupportedError.__init__)r   r   r   r   r   r  r   r   r   r   r    s   r  rF   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 )
OVERLAPPEDZInternalZInternalHighOffset
OffsetHighhEventN)	r   r   r   ctypeswintypesZLPVOIDDWORDHANDLE_fields_r   r   r   r   ry    s   




ry  kernel32    ic                 C   sr   t  }d|_d|_d|_t|| _tt	| 
 |r:dnd|rDdndB dtt| jsntdtt d S )Nr   r   r   zLocking file failed: )ry  rz  r{  r|  r}  pointer_lock_file_overlapped_p
LockFileExr  get_osfhandler  	whole_low
whole_highBlockingIOErrorFormatErrorZGetLastError)r  	exclusiver  Z
overlappedr   r   r   
_lock_file  s       r  c                 C   s@   | j s
tt|  }t|dtt| j s<tdt	
 d S )Nr   zUnlocking file failed: )r  rd   r  r  r  UnlockFileExr  r  rT   r}  r  )r  handler   r   r   _unlock_file  s    
r  c                 C   sh   |r
t jnt j}|s|t jO }zt | | W n4 tk
rD    Y n  tk
rb   t | | Y nX d S r   )fcntlZLOCK_EXZLOCK_SHLOCK_NBflockr  rT   lockf)r  r  r  r   r   r   r   r  "  s    
c              
   C   sl   t t t| tjW  5 Q R  S Q R X t t t| tjW  5 Q R  S Q R X t| tjtjB S r   )rR   rS   rT   r  r  ZLOCK_UNr  r  r  r   r   r   r  -  s
      c                 C   s   t d S r   r  )r  r  r  r   r   r   r  6  s    c                 C   s   t d S r   r  r  r   r   r   r  9  s    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 )r  FTNc              
      s    dk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|rzt	j
ndd krt	jndd krt	jnd|st	jn|rt	jnt	jf}t	jt	||d |d| _d S )N>   rbabar=   wbrc                 3   s   | ]}| kV  qd S r   r   ro   r  rC   r   r   	<genexpr>E  s     z'locked_file.__init__.<locals>.<genexpr>zwax+c                 3   s   | ]}| kV  qd S r   r   r  r  r   r   r  F  s     zr+	O_CLOEXECr   r  ZO_NOINHERITr  r   rG   rD   )NotImplementedErrorrC   r  anyr   reduceoperatoriorr  rJ   O_CREATO_APPENDO_EXCLO_RDONLYO_RDWRO_WRONLYfdopenr  r  )r   r  rC   r  rD   writablereadabler   r   r  r   r   @  s    



zlocked_file.__init__c              
   C   s   d| j k}zt| j|| j d| _W n  tk
rD   | j   Y nX d| j krz| j  W n6 tk
r } z|jtj	tj
fkr W 5 d }~X Y nX | S )Nr  Tr=   )rC   r  r  r  lockedrT   r   truncater  ZESPIPEEINVAL)r   r  r  r   r   r   r   S  s"    



zlocked_file.__enter__c                 C   s&   | j s
d S zt| j W 5 d| _ X d S NF)r  r  r  r   r   r   r   unlockf  s
    zlocked_file.unlockc                 G   s   z|   W 5 | j   X d S r   )r  r   r  r   r   r   r   r   n  s    zlocked_file.__exit__c                 C   s   t | j|S r   )r  r  )r   attrr   r   r   __getattr__w  s    zlocked_file.__getattr__c                 C   s
   t | jS r   )iterr  r   r   r   r   __iter__z  s    zlocked_file.__iter__)TN)r   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| S dS )Nr>   )rP   getfilesystemencodingr  r   r   r   get_filesystem_encoding~  s    r  r!  z\"""z%=%z%%cd:~,%)r!  r   %r  c                   sB   t t| } tdkrt| S |r&tnt d fdd| D S )Nr  r   c                 3   s<   | ]4}t d |t jr|nt dd| dV  qdS )z[\w#$*\-+./:?@\\]+z
(\\+)("|$)z\1\1\2r  N)rb   r7  ASCIIr   	translaterw   ro   r   Ztransr   r   r    s   zshell_quote.<locals>.<genexpr>)rb  variadicr	   shlexrw   _CMD_QUOTE_TRANS_WINDOWS_QUOTE_TRANS)r   r  r   r  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_urlr  rM  rN  	urlencoderN   dumps)rI  dataZidatasdatar   r   r   smuggle_url  s    
r  c                 C   sF   d| kr| |fS |  d\}}}tj|d d }t|}||fS )Nz#__youtubedl_smuggler=  r  r   )r  rM  rN  parse_qsrN   loads)Zsmug_urlr   rI  r   r  Zjsondr  r   r   r   r    s    
r  %d%sr  factorc                C   s   t | t| } }| dks"| dk r&dS d}| dkr6dnttt| |t|}d	|| }|dkr|ddd|| d}| ||  }|||f S )
z5 Formats numbers with decimal sufixes like K, M, etc Nr   ZkMGTPEZYr      ZKi)kr   i)r   )float_or_nonefloatr;  rk  mathlogru   r%  )numfmtr  ZPOSSIBLE_SUFFIXESexponentrA   Z	convertedr   r   r   format_decimal_suffix  s    &r  c                 C   s   t | dddpdS )Nz%.2f%sBr  r  zN/A)r  )r  r   r   r   format_bytes  s    r  c                 C   s   |rt n
t dd}ddd | D }|r2tjntjd| d| d|}|sTd S t|d	d
d}| |d }t|| S )Nz\.z[,.]r6  c                 s   s   | ]}t |V  qd S r   rb   r   )ro   ur   r   r   r    s     z$lookup_unit_table.<locals>.<genexpr>z(?P<num>z)\s*(?P<unit>z)\br  r   r   r*  )		NUMBER_REr1  rw   rb   r7  rc   r  r   round)Z
unit_tabler   r9  Znum_reZunits_rer   r  multr   r   r   lookup_unit_table  s     r  c                 C   s$   t dd tddD |  ddS )z9Parse a string indicating a byte quantity into an integerc                 S   s   i | ]\}}|d | qS )r  r   )ro   r  r  r   r   r   
<dictcomp>  s      zparse_bytes.<locals>.<dictcomp>r   ZKMGTPEZYTrF  )r   )r  	enumerateupperr[  r   r   r   parse_bytes  s
     r  c              <   C   s   | d krd S 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dddddddddddd;}t || S )Nr   r  r  i   @B i   @ ʚ;l        l    J)l           l     I5 l            l     NZol            l     @=7M.cl               l      B3v^!< );Brb  r  ZKiBZKBZkBZKbkbZ	kilobytesZ	kibibytesZMiBZMBZmBZMbmbZ	megabytesZ	mebibytesZGiBGBZgBZGbgbZ	gigabytesZ	gibibytesZTiBZTBZtBZTbr  Z	terabytesZ	tebibytesZPiBZPBZpBZPbZpbZ	petabytesZ	pebibytesZEiBZEBZeBZEbZebZexabytesZ	exbibytesZZiBZZBZzBZZbZzbZ
zettabytesZ	zebibytesZYiBZYBZyBZYbZybZ
yottabytesZ	yobibytes)r  )r   _UNIT_TABLEr   r   r   parse_filesize  s~    >r  c              	   C   s   | d krd S t dd|  } t d| r2t| S ddddddddd}t|| }|d k	r^|S t d| }|r|t|d	S d S )
Nz	^[^\d]+\sr   z	^[\d,.]+$r  r  r  )r  Kr   MkkZKKrb  r  z([\d,.]+)(?:$|\s)r   )rb   r   r   rc   
str_to_intr  r   )r   r  r  rm  r   r   r   parse_count  s(    
r  )lenientc                C   s   | d kri S |rt d| }nt d| }|rLt|dt|ddS t d| }|rndt|diS t d	| }|rdt|d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])r=   hwidthheightz*(?<![a-zA-Z0-9])(\d+)[pPiI](?![a-zA-Z0-9])r  r   z\b([48])[kK]\bi  )rb   r  rk  r   )r   r  rm  r   r   r   parse_resolution<  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   rb   r  rk  r   )r   rm  r   r   r   parse_bitrateU  s
    
r  r   c                 C   s<   t |t d }z|| d W S  tk
r6   Y dS X dS )zE Return the number of a month by (locale-independently) English name r   r   N)MONTH_NAMESr%  r   r   )rX   langZmonth_namesr   r   r   month_by_name]  s
    r  c                 C   s6   zdd t D | d W S  tk
r0   Y dS X dS )zV Return the number of a month by (locale-independently) English
        abbreviations c                 S   s   g | ]}|d d qS )NrB  r   r  r   r   r   rq   m  s     z)month_by_abbreviation.<locals>.<listcomp>r   N)ENGLISH_MONTH_NAMESr   r   )Zabbrevr   r   r   month_by_abbreviationh  s    r  c                 C   s   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};)rp  rb   r   )Zxml_strr   r   r   fix_xml_ampersandsr  s
    r  c                 C   s   t | tstzdd l}W n tk
r0   Y d S X z|jd}W n* tk
rX   Y d S  tk
rl   Y d S X | 	 }|
t|}||_z|d|ddd W n tk
r   Y d S X d S )Nr   z	libc.so.6   )r   r   rd   r}  ImportErrorcdllLoadLibraryrT   r  r:   create_string_bufferru   r   ZprctlAttributeError)r  r}  libcZtitle_bytesbufr   r   r   setproctitlez  s$    r
  c                 C   s&   | d k	r"|  |r"| t|d  S | S r   )r   ru   )r   r   r   r   r   remove_start  s    r  c                 C   s(   | d k	r$|  |r$| d t|  S | S r   )r   ru   )r   rG  r   r   r   
remove_end  s    r  c                 C   sN   | d kst | dk r| S dD ],}| d |kr| d |kr| dd   S q| S )Nr   )r!  r"  r   r   r   ru   )r   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  rM  rN  urlparserL  rI  r   r   r   
get_domain  s    r  c                 C   s"   t j| j}|ddd S )Nrr   r   )rM  rN  r  rK   r   rm   )rI  rK   r   r   r   url_basename  s    r  c                 C   s   t d|  S )Nzhttps?://[^?#]+/)rb   rc   r   r  r   r   r   base_url  s    r  c                 C   sn   t |tr| }t |tr |s$d S td|r4|S t | trF|  } t | tr\td| s`d S tj| |S )Nz(?:[a-zA-Z][a-zA-Z0-9+-.]*:)?//z^(?:https?:)?//)	r   r  r   r   rb   rc   rM  rN  urljoin)rn  rK   r   r   r   r    s    

 r  c                    s&   t  t  fdd}|S )Nc                     sF   zj | | W n& tk
r6   tj f| | Y S X  | |S d S r   )bindr  r   partialr   funcsigr   r   wrapped  s
    z$partial_application.<locals>.wrappedinspect	signaturer   wraps)r  r  r   r  r   partial_application  s    
r  c              
   C   s   |r| d k	rt | |d } |dkr8|dk r8td| }d}z&|d krJt| n
t| |d| | W S  tttfk
r|   | Y S X d S )Nr   )rn  )r  rk  r   r  OverflowError)vscaler   Zget_attrinvscalern  r   r   r   int_or_none  s    &r$  c                 C   s   | d kr|S t | S r   r   r!  r   r   r   r   str_or_none  s    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   rk  r   rb   r   r$  )Zint_strr   r   r   r    s
    

r  c              	   C   s`   | d kr|S |dkr,|dk r,t d| }d}zt| | | W S  ttfk
rZ   | Y S X d S r   )rk  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  s    r*  c                 C   s   t | tr|  S |S r   )r   r   r   r&  r   r   r   strip_or_none  s    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?):)?//)r   r   r   rb   rc   r  r   r   r   url_or_none  s    r,  c              
   C   s   d }znt | ttfr4tjdtjjtj| d }nt | t	rLtj
| d}tddt|  |}||W S  tttfk
r   | Y S X d S )Nr   r  r7   z(?<!%)(%%)*%s\g<1>)r   rk  r  r  r  rB  r  r1  r  r   r  rb   r   r  r  r   r  r  )r  r
  r   Z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| }|r`|ddddd\}}}}}nFtd| }|r| \}}}}}n"td	| }|r| \}}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?$rl   r   c                 s   s"   | ]\}}t |pd | V  qdS r   N)r  )ro   r?  r  r   r   r   r  S  s     z!parse_duration.<locals>.<genexpr>r>  r  r  r   )	r   r   r   rb   rc   r   rC  r1  sum)r   r)  r  r  r  r1  r   r   r   r   parse_duration  s<    
    r4  c                 C   sd   t j|\}}|r$|dd  |krP|}| rP|rPtj|dd | d| | S | dt| S )Nr   Tprependr   )rJ   rK   splitext_UnsafeExtensionErrorsanitize_extension)r6  r  extr#  rX   Zreal_extr   r   r   _change_extensionW  s    r;  c                 C   s:   zt j| f|tjtjd W n tk
r4   Y dS X | S )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) )r
  r  F)rx  r  r  PIPErT   )exer   r   r   r   check_executableg  s
    r>  c                 C   sT   z8t jt| f|dtjtjtjd\}}}|r6W d S W n tk
rN   Y dS X |S )NT)r   stdinr
  r  F)rx  r  r  r  r<  STDOUTrT   )r=  r   r
  r   r  r   r   r   _get_exe_version_outputq  s      
rA  presentc                 C   s<   t | tst|d krd}t|| }|r4|dS |S d S )Nzversion\s+([-0-9._a-zA-Z]+)r   )r   r   rd   rb   r  r   )output
version_reunrecognizedr   r   r   r   detect_exe_version  s    
rF  	--version)rB  brokenc                 C   sF   t |}t|dkstt| |}|dkr2|d S |oDt|||d S )z` Returns the version of the specified executable,
    or False if the executable is not present )r   r   Nr   r   )r  ru   rd   rA  rF  )r=  r   rD  rE  rg  r   r   r   get_exe_version  s    
rI  c                 c   sN   |dkrd|  } }|r&ddg|dk nd}||  || k rJ| V  | |7 } q*dS )zFloat rangeNr   r   r   r   )r   stopstepr  r   r   r   frange  s    
rL  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                   @   s   e Zd ZdS )zLazyList.IndexErrorNr   r   r   r   r   
IndexError  s   rN  FNreversern  c                C   s&   t || _|d krg n|| _|| _d S r   )r  	_iterablern  	_reversed)r   r`  rP  rn  r   r   r   r     s    
zLazyList.__init__c                 c   sF   | j r|  E d H  d S | jE d H  | jD ]}| j| |V  q*d S r   )rR  exhaustrn  rQ  rv   )r   itemr   r   r   r    s    
zLazyList.__iter__c                 C   s   | j | j g | _| j S r   )rn  extendrQ  r   r   r   r   _exhaust  s    zLazyList._exhaustc                 C   s   |   dd| jrdnd S )zEvaluate the entire iterableNr   r   )rV  rR  r   r   r   r   rS    s    zLazyList.exhaustc                 C   s   | d krd S |  S r   r   r   r   r   r   _reverse_index  s    zLazyList._reverse_indexc              
   C   s  t |trP| jr4t| |j| |j|jp.d }|j|j|jpDd  }}}n4t |tr|| jrj| |}||d  }}}ntd|pddk s|pddk s|d kr|dk s|d kr|dkr| 	  z| j
| W S  tk
r } z| ||W 5 d }~X Y nX t|pd|pdt| j
 d }|dkrJ| j
t| j| z| j
| W S  tk
r } z| ||W 5 d }~X Y nX d S )Nr   r   z"indices must be integers or slices)r   slicerR  rW  r   rJ  rK  rk  r  rV  rn  rN  rH  ru   rU  	itertoolsislicerQ  )r   idxr   rJ  rK  r  r   r   r   r   __getitem__  s<    
$

$
zLazyList.__getitem__c                 C   s8   z| j r| d n| d  W n | jk
r2   Y dS X dS )Nr   r   FT)rR  rN  r   r   r   r   __bool__  s
    zLazyList.__bool__c                 C   s   |    t| jS r   )rV  ru   rn  r   r   r   r   __len__  s    zLazyList.__len__c                 C   s   t | | j| j | jdS NrO  r   rQ  rR  rn  r   r   r   r   __reversed__  s    zLazyList.__reversed__c                 C   s   t | | j| j| jdS r_  r`  r   r   r   r   __copy__  s    zLazyList.__copy__c                 C   s   t |  S r   reprrS  r   r   r   r   rP    s    zLazyList.__repr__c                 C   s   t |  S r   rc  r   r   r   r   rQ    s    zLazyList.__str__)r   r   r   r   rN  r   r  rV  rS  r  rW  r\  r]  r^  ra  rb  rP  rQ  r   r   r   r   rM    s   

rM  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                   @   s   e Zd ZdS )zPagedList.IndexErrorNr   r   r   r   r   rN    s   rN  c                 C   s   t |  S r   )ru   getslicer   r   r   r   r^    s    zPagedList.__len__Tc                 C   s&   || _ || _td| _|| _i | _d S )Ninf)	_pagefunc	_pagesizer  
_pagecount
_use_cachern  )r   pagefuncpagesizeZ	use_cacher   r   r   r   	  s
    
zPagedList.__init__c                 C   sD   | j |}|d kr0|| jkr"g nt| |}| jr@|| j |< |S r   )rn  r%  rj  rb  rh  rk  )r   pagenumpage_resultsr   r   r   getpage		  s    
zPagedList.getpager   Nc                 C   s   t | ||S r   )rb  	_getslicerI  r   r   r   rf  	  s    zPagedList.getslicec                 C   s   t dd S )Nz-This method must be implemented by subclasses)r  rI  r   r   r   rq  	  s    zPagedList._getslicec                 C   sJ   | j stdt|tr |dk r(td| ||d }|sB| j|d S )Nz!Indexing PagedList requires cacher   z%indices must be non-negative integersr   )rk  rd   r   rk  r  rf  rN  )r   r[  entriesr   r   r   r\  	  s    zPagedList.__getitem__c                 C   s   t | ddS Nr   r   )r)  rf  r   r   r   r   r]   	  s    zPagedList.__bool__)T)r   N)r   r   r   rN  r^  r   rp  rf  rq  r\  r]  r   r   r   r   re    s   

	re  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rN|k r\n n
|| j nd}|d k	r||  kr||krn n|d | j d nd }z| |}W n  tk
r   |d | _ Y nX |dks|d k	r||| }|E d H  t|| | jk r q||kr qqd S rs  )rY  countri  rp  r;   rj  ru   )	r   r   rG  rn  ZfirstidZnextfirstidZstartvZendvro  r   r   r   rq  '	  sB    
  

zOnDemandPagedList._getsliceN)r   r   r   r   rq  r   r   r   r   rt  $	  s   rt  c                   @   s    e Zd ZdZdd Zdd ZdS )InAdvancePagedListz5PagedList with total number of pages known in advancec                 C   s   t | ||d || _d S NT)re  r   rj  )r   rl  Z	pagecountrm  r   r   r   r   P	  s    zInAdvancePagedList.__init__c           	      c   s   || j  }|d kr| jnt| j|| j  d }||| j   }|d krHd n|| }t||D ]d}| |}|r|||d  }d }|d k	rt||k r|t|8 }n|d | E d H   q|E d H  qZd S r   )ri  rj  r;  r   rp  ru   )	r   r   rG  Z
start_pageZend_pageZ
skip_elemsZ	only_morern  ro  r   r   r   rq  T	  s    
$
zInAdvancePagedList._getsliceN)r   r   r   r   r   rq  r   r   r   r   rv  M	  s   rv  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 kr"tdnt|tr2d| _|d}|d k	| _| jr| jsVt| jgt	|pfdg | _
t||D ]\}}|| j
|d < qxn"t|tttfr|| _
n
t|| _
d S )Nrr  zThere are no entriesTrequested_entriesr   r   )ydlr%  r  r   rb  is_exhaustedis_incompleterd   MissingEntryrH  _entrieszipre  rM  )r   rz  	info_dictrr  ry  r  entryr   r   r   r   k	  s     





zPlaylistEntries.__init__z(?x)
        (?P<start>[+-]?\d+)?
        (?P<range>[:-]
            (?P<end>[+-]?\d+|inf(?:inite)?)?
            (?::(?P<step>[+-]?\d+))?
        )?c                 c   s   | dD ]}|std| j|}|s8t|d|dddd\}}}}t|dkrltd	|d
|rtt|t|t|nt|V  q
d S )Nr   z'There is two or more consecutive commasz is not a valid specificationr   rG  rK  r   r   zStep in z cannot be zero)	rm   r   PLAYLIST_ITEMS_REr7  r   r$  rX  r  rk  )r  stringsegmentrm  r   rG  rK  Z	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kr8d}|sL| d| }n|dksX|rh| j jdd	d
 | |D ]j}| | D ]\\}}||fV  |sq~z$| j jds| j j|d	d	d W q~ ttfk
r   Y   d S X q~qrd S )Nplaylist_itemsZplayliststartr   Zplaylistend)r   Nr   rl   zFIgnoring playliststart and playlistend because playlistitems was givenT)Z	only_onceZlazy_playlist)
incompleteZsilent)rz  paramsr%  report_warningr  Z_match_entryr  r  )r   r  Zplaylist_startZplaylist_endr   r  r  r   r   r   get_requested_items	  s&    
z#PlaylistEntries.get_requested_itemsc                 C   s8   | j r| jst| S t| jtr4| jjdkr4| jjS d S r   )r{  r|  ru   r   r~  rv  ri  rj  r   r   r   r   get_full_count	  s
    zPlaylistEntries.get_full_countc                    s*   t  jtr fdd}n fdd}|S )Nc                    sX   z j |  }W n& tk
r4    j} js0 jY nX | jkrTtd| d  d|S )NzEntry r   z cannot be found)r~  rN  r}  r|  r  )r  r  r   r   r   	get_entry	  s    
z*PlaylistEntries._getter.<locals>.get_entryc              	      sJ   z"t  j fdd j| W S  tjtjfk
rD    jY nX d S )Nc                    s
    j | S r   )r~  )r   r  r   r   r   r3  	  r4  z<PlaylistEntries._getter.<locals>.get_entry.<locals>.<lambda>)r   rz  Z_handle_extraction_exceptionsrM  rN  re  )r  r   r   r   r  	  s    ")r   r~  rb  )r   r  r   r   r   _getter	  s    zPlaylistEntries._getterc              	   c   s6  t |trt||}|jd kr"dn|j}|jd krL|dkr>dn
t| d }n"|jdkr`|jd nt| |j }|jd kr|dk rdntd}n"|jdkr|jd nt| |j }|ddg|dk 7 }t|||D ]`}|dk rqz| 	|}W n4 | j
k
r    d| _|dkrY  q2Y qY nX |d |fV  qd S )Nr   r   rg  r   T)r   rk  rX  rK  r   ru   rJ  r  rL  r  rN  r{  )r   r[  rK  r   rJ  r  r  r   r   r   r\  	  s*    


"
"

zPlaylistEntries.__getitem__c                 C   s   t t| d d  S r   )ru   tupler   r   r   r   r^  	  s    zPlaylistEntries.__len__c                   @   s   e Zd ZdS )zPlaylistEntries.IndexErrorNr   r   r   r   r   rN  	  s   rN  N)r   r   r   objectr}  r{  r   rb   compiler  r  r  r  r  r   cached_propertyr  r\  r^  rN  r   r   r   r   rx  g	  s   


rx  c                    s    t d td fdd| S )Nunicode_escapez\\U[0-9a-fA-F]{8}c                    s    |  dd S r   r   r2  r  r   r   r3  	  r4  z"uppercase_escape.<locals>.<lambda>codecs
getdecoderrb   r   r[  r   r  r   uppercase_escape	  s    

r  c                    s    t d td fdd| S )Nr  z\\u[0-9a-fA-F]{4}c                    s    |  dd S r   r  r2  r  r   r   r3  	  r4  z"lowercase_escape.<locals>.<lambda>r  r[  r   r  r   lowercase_escape	  s    

r  c                 K   s   t jjt j| jf|S r   )rM  rN  r  r  query)rI  r   r   r   r   r  	  s    r  c              
   C   s>   dd }t | "}dd t||D W  5 Q R  S Q R X d S )Nc                 S   sp   t | ts| dd} d}|D ]}| |r| t|d  } q|  } | rT| drXdS tjd| ddd	  S )
Nr>   r1  )u   ï»¿u   ﻿)r=  rg  ra   Fz\s#r   )maxsplitr   )	r   r   r   r   ru   r   rb   rm   r  )rI  BOM_UTF8bomr   r   r   rJ  
  s    

zread_batch_urls.<locals>.fixupc                 S   s   g | ]}|r|qS r   r   )ro   rI  r   r   r   rq   
  s      z#read_batch_urls.<locals>.<listcomp>)rR   closingr:  )Zbatch_fdrJ  fdr   r   r   read_batch_urls
  s    r  c                  O   s   t jj| |dS r  )rM  rN  r  r:   )r   r   r   r   r   urlencode_postdata
  s    r  query_updatec                K   sj   t | tr"|s|s| S tj| } |rVd|ks6tdtjtj| j|d|d< tj	| j
f |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 timeT)r   r   rM  rN  r  rd   r  r  r  
urlunparserR  )rI  r  r   r   r   r   
update_url
  s    
r  c                 C   s   t | |dS )Nr  )r  )rI  r  r   r   r   update_url_query.
  s    r  c                 C   s   d| }d}|   D ]t\}}|d|d d 7 }t|trF| }t|trX| }d| d | d }|d|krtd||7 }q|d|d d	 7 }||fS )
Nzmultipart/form-data; boundary=r4  s   --r  s   
s&   Content-Disposition: form-data; name="s   "

zBoundary overlaps with datas   --
)r   r:   r   r   r   )r  boundarycontent_typerg  r  r!  r   r   r   r   _multipart_encode_impl2
  s    



r  c                 C   sd   |dk	}|dkr$dt tdd }zt| |\}}W q\W q tk
rX   |rP d}Y qX q||fS )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
    Nz---------------ir  )r   random	randranger  r   )r  r  Zhas_specified_boundaryrg  r  r   r   r   multipart_encodeH
  s    r  c                 C   s,   |t k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_likef
  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   rm  r  )r   r  r   r   r   r  l
  s    r  )expected_typer   r   c                 G   sX   |D ]N}z|||}W n  t tttttfk
r6   Y qX | d ksJt|| r|  S qd S r   )r  KeyErrorr  rN  r   ZeroDivisionErrorr   )r  r   r   funcsr  ri   r   r   r   try_calls
  s    r  c                 C   s   t t|| f|dS )N)r   r  )r  r  )srcgetterr  r   r   r   try_get~
  s    r  c                 C   s   |d k	S r   r   )r   r!  r   r   r   r3  
  r4  r3  c                    s    fdd|   D S )Nc                    s    i | ]\}} ||r||qS r   r   ro   r  r!  cndnr   r   r  
  s     
  zfilter_dict.<locals>.<dictcomp>)r   )dctr  r   r  r   filter_dict
  s    r  c                  G   sR   i }| D ]D}|  D ]6\}}|d k	r,||ksBt|tr|| dkr|||< qq|S Nr   )r   r   r   )dictsmergedZa_dictr  r!  r   r   r   merge_dicts
  s    
r  r9  c                 C   s   t | tr| S t| ||S r   )r   r   )r  rD   r  r   r   r   encode_compat_str
  s    r  r      rd     )GPGzPG-13RNCr/        )zTV-YzTV-Y7zTV-GzTV-PGzTV-14zTV-MAc                 C   s   t | tkr,d|   kr dkr(n n| S d S t| ts:d S td| }|rXt|dS |  } | tkrpt|  S td	d
dd tD | }|rtd	|d
  S d S )Nr      z^(?P<age>\d{1,2})\+?$Zagez^TV[_-]?({})$r6  c                 s   s   | ]}|d d V  qdS )rB  Nr   ro   r  r   r   r   r  
  s     z"parse_age_limit.<locals>.<genexpr>zTV-r   )r   rk  r   r   rb   rc   r   r  
US_RATINGSrW  rw   TV_PARENTAL_GUIDELINES)r   r   r   r   r   parse_age_limit
  s     
"r  c                 C   s   t dd| S )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  rF  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|| } std| dd| } tddd | } tdd| } td d| } td!| d"| d#| d$| d%| d&|| S )'Nz'"`r6  c                 s   s"   | ]}| d | d| V  qdS )z(?:\\.|[^\\z])*Nr   )ro   qr   r   r   r  
  s     zjs_to_json.<locals>.<genexpr>z/\*(?:(?!\*/).)*?\*/|//[^\n]*\nz\s*(?:z)?\s*z(?s)^(0[xX][0-9a-fA-F]+)z:?$rd  z(?s)^(0+[0-7]+)   c                 S   sF   d}|  dp|  d}||kr*d| S |dkr6dS |dkrBdS |S )	Nz"\bfnrtur   r   r  r   z\u00r   r   r  )rc   ZJSON_PASSTHROUGH_ESCAPESr   r   r   r   process_escape
  s    z"js_to_json.<locals>.process_escapec                    s.   t | d d}|d dkr*t|S |S )Nr   rF  r   r!  )
js_to_jsonr   rN   r  )rc   Z	evaluated)r9  varsr   r   template_substitute
  s    
z'js_to_json.<locals>.template_substitutec                    sP  |  d}|dkr|S |dkr"dS |ds4|dkr8dS |d kr|d dkrftd	|d
d n
|d
d }td|}d| dS  D ]J\}}t||}|rt| d
|}|drd| dnt|  S q|kr,zst	|  W n& tj
k
r"   t|  Y S X | S s>d| dS td| d S )Nr   )truefalsenull)Z	undefinedzvoid 0r  )z/*rH  r  r   r   `z(?s)\${([^}]+)}r   r   z(?s)(")|\\(.)r!  rl   z":zUnknown value: )r   r   rb   r   rc   rk  r   r   rN   r  r   r  r   )r   r!  escapedregexrn  Zimr  ZINTEGER_TABLEZSTRING_QUOTESr  r9  r  r  r   r   fix_kv
  s4    
.$
zjs_to_json.<locals>.fix_kvc              	      s&   t tt t| dpd dS )Nr   z[]r  )rN   r  r   r  r  r   rm  r  r   r   
create_map
  s    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   )rN   r  r   r2  r   r   r   r3    r4  zjs_to_json.<locals>.<lambda>zparseInt\([^\d]+(\d+)[^\d]+\)r5  zB\(function\([^)]*\)\s*\{[^}]*\}\s*\)\s*\(\s*(["\'][^)]*["\'])\s*\)z(?sx)
        z
|
        z|,(?=zw[\]}])|
        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:)|
        !+
        )rw   rb   r   )r  r  r9  Z	STRING_RE
COMMENT_REZ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k
r"   Y dS X d S )Nr   r   )Zqidquality_idsr   r   r    s    zqualities.<locals>.qr   )r  r  r   r  r   	qualities  s    r  )Zpre_processZafter_filtervideoZ	before_dlZpost_processZ
after_moveZafter_videoZ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  Zsubtitle	thumbnailr  
annotationZinfojsonlinkZpl_videoZpl_thumbnailZpl_descriptionZ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
    )
ZdiouxXeEfFgGcrsac                 C   s8   | dkrdS d}t | |kr4| d|t |  | S | S )z% Add ellipses to overly long strings N...r  )r   lengthZELLIPSESr   r   r   limit_lengthG  s    r  c                 C   s   t dd td| D S )Nc                 s   s   | ]}t |V  qd S r   rk  )ro   r  r   r   r   r  R  s     z version_tuple.<locals>.<genexpr>z[-.])r  rb   rm   r!  r   r   r   r_  Q  s    r_  c                 C   s<   | s
| S zt | t |k W S  tk
r6   |  Y S X d S r   )r_  r   )versionlimitZ
assume_newr   r   r   is_outdated_versionU  s    r  c                  C   s   ddl m}  |   S )z* Returns if yt-dlp can be updated with -U r   is_non_updateable)r  r  r  r   r   r   ytdl_is_updateable^  s    r  c                 C   s   t | S r   )r  )r   r   r   r   args_to_strf  s    r  c                 C   s   t | j d|  S r  )r   r   )r   r   r   r   error_to_strk  s    r  c              <   C   s   t | ts|tk	r|S d S 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'd(dd)d*d+d,d-d.d/d0d1d2;}| d3d4   }|d5\}}}t||||	d6d7 }|r|S |tk	r|S |
d6d8S )9N3gptsmp4mpegm3u8movwebmvp9ogvflvm4vmkvmngasfwmvavimpdf4mismm4amp3mkam3uaacmidoggwavflacraavifbmpgifjpgpngsvgtifwbmpwebpicojngfsttdfxpttmlsamigzrN   xmlr  );Z3gppZmp2tr  r  ZmpegurlZ	quicktimer   r  z	video/oggzx-flvzx-m4vz
x-matroskazx-mngzx-mp4-fragmentedzx-ms-asfzx-ms-wmvz	x-msvideozdash+xmlzf4m+xmlzhds+xmlzvnd.apple.mpegurlzvnd.ms-sstr+xmlz	x-mpegurlz	audio/mp4z
audio/mpegz
audio/webmzaudio/x-matroskazaudio/x-mpegurlZaacpZmidir  r  Zwavezx-aaczx-flaczx-m4azx-realaudiozx-wavr  r  r  jpegr  zsvg+xmltiffzvnd.wap.wbmpr  zx-iconzx-jngzx-ms-bmpzfilmstrip+jsonzsmptett+xmlzttaf+xmlzttml+xmlz	x-ms-samigziprN   r(  r  rg  r   rr   r  r   r   )r   r   r   r  r   lowerr  r   traverse_objrsplitr1  )mtr   ZMAPmimetyper   subtyper:  r   r   r   mimetype2exto  s    
Kr2  c                 C   s(   | sd S d| krd|  } t | d S )Nr   zfile.r   )	mimetypes
guess_type)Z
ext_or_urlr   r   r   ext2mimetype  s
    
r5  c                 C   sn  | si S t td ttj|  dd}d\}}}}|D ]}tddd |}tdd|d}|d	 d
kr|rzq>|}|d	 dkrd}n:|d	 dkrt	|ddkrd}n|d d ddgkrd}q>|d	 dkr|p|}q>|d	 dkr|p|}q>t
d| d q>|s|s|rJ|p$d|p,d|d|d k	rDd|ini S t|dkrj|d	 |d dS i S )Nr   )NNNNz^([^.]+)c                 S   s   |  d S r   )r   r,  r2  r   r   r   r3    r4  zparse_codecs.<locals>.<lambda>z0+(?=\d)r   r   r   )avc1Zavc2Zavc3Zavc4r  vp8Zhev1Zhev2Zh263h264mp4vZhvc1av1theoradvh1dvhe)r<  r=  ZDVr:  rB  10ZHDR10r   r  2)r  mp4aopusvorbisr  r  ac-4zac-3ec-3Zeac3ZdtscZdtseZdtshZdtsl)ZstppZwvttzWARNING: Unknown codec r   none)vcodecacodecdynamic_rangescodecr   rF  rG  )rb  filterr:  r   r   rm   rb   r   r   r-  ri  ru   )Z
codecs_strZsplit_codecsrF  rG  rI  hdrZ
full_codecr>  r   r   r   parse_codecs  sJ     

rM  )preferencesc              
      s`  t | t |kr t |t |ks$t| p0d|k}|rPtt |t | dkrPdS ddddddd	d
hdddddddhd}tjtdd d}|| || }}	|p| D ]0}
||
t }|
dks|	||	fr|
  S qddddddddddh
dd hf}|p|D ]H}
|
h|| |
dksB |
hksBt
 fd!d"|D r|
  S q|rXdS |d# S )$Nr  r   r:  Zhevcr6  r@  rC  r8  ZaaclrD  r  r7  rA  ZvrbsZvp9xZvp8x)r  r   c                 S   s   | d  dd dd S )Nr   r   re  r   )rm   r1  r,  r   r   r   r   r3    r4  z$get_compatible_ext.<locals>.<lambda>)r  r  r  r  Zm4pm4bm4rr  ismvismar  r   webac                 3   s   | ]}|  V  qd S r   )
issuperset)ro   Zext_setsZcurrent_extsr   r   r  !  s    z%get_compatible_ext.<locals>.<genexpr>r   )ru   rd   rH  r   r  r  keysr%  setrT  r  )ZvcodecsZacodecsZvextsZaextsrN  Z	allow_mkvZCOMPATIBLE_CODECSZsanitize_codecrF  rG  r:  Z	codec_setZCOMPATIBLE_EXTSr   rU  r   get_compatible_ext  sR    $            
"
rX  c                 C   sp   | j j}|d}|r>td|}|r>t|dd d}|r>|S |d}|r`|dd }|r`|S t|d|d	S )
NzContent-Dispositionz,attachment;\s*filename="(?P<filename>[^"]+)"r  )r  zx-amz-meta-namer   r   zContent-Typer   )headersr%  rb   rc   r   r   r  r2  )Z
url_handler   	getheaderZcdr   r  Zmeta_extr   r   r   urlhandle_detect_ext'  s    r\  c                 C   s   d |t| dS )Nzdata:{};base64,{}r  )rW  rU  rV  r   )r  Z	mime_typer   r   r   encode_data_uri;  s    r]  c                 C   s    |dkrdS | dkrdS || k S )z0 Returns True iff the content should be blocked NFr   )Zcontent_limitZ	age_limitr   r   r   age_restricted?  s
    r^  )s   ﻿r>   )s     z	utf-32-be)s     z	utf-32-le)s   z	utf-16-le)s   z	utf-16-bec                 C   sH   d}t D ]*\}}| |r|| t|d  }} qqtd| |dS )zC Detect whether a file contains HTML by examining its first bytes. r>   Nz\s*<r1  )BOMSr   ru   rb   rc   r   )Zfirst_bytesrD   r  rh  r   r   r   is_htmlS  s
    
r`  c                 C   s   |  d}|d k	r|S t| d }|dr0dS |dr>dS |drLdS t|}|dkrn|  drjdS dS |d	krzd	S tj|jS )
NprotocolrI  Zrtmpmmsrtspr  Zis_liveZm3u8_nativer  )r%  rK  r   r   rM  rN  r  rG  )r  ra  rI  r:  r   r   r   determine_protocol^  s     



rd  c           
   	      s2  dd fdd}dd |r(||ng | } fdd|D }| f|}||d	7  r|  fd
dD f|}|d	 d d t    |d	 d< |D ]n}ttt|D ]Z\}}	d|	kr|	dd| |	  d  ||< q|	d| |	    ||< qqd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   )ru   remove_terminal_sequencesr1  r  r   r   r   r  w  s    zrender_table.<locals>.widthc                    s    fddt |  D S )Nc                    s"   g | ]}t  fd d|D qS )c                 3   s   | ]} t |V  qd S r   r%  ro   r!  r  r   r   r  {  s     z@render_table.<locals>.get_max_lens.<locals>.<listcomp>.<genexpr>rH  )ro   colri  r   r   rq   {  s     z6render_table.<locals>.get_max_lens.<locals>.<listcomp>)r  )tableri  r   r   get_max_lensz  s    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   )ro   Ztakerk  r   r   r   rq   ~  s      z;render_table.<locals>.filter_using_list.<locals>.<listcomp>T)	fillvalue)rY  zip_longest)rowZfilter_arrayr   r   r   filter_using_list}  s    z'render_table.<locals>.filter_using_listc                    s   g | ]} |qS r   r   ro   rp  )rq  max_lensr   r   rq     s     z render_table.<locals>.<listcomp>r   c                    s   g | ]} |  qS r   r   )ro   ml)r  	extra_gapr   r   rq     s     r   Nre  r   r   c                 s   s   | ]}d  | V  qdS )r   N)rw   r  rr  r   r   r   r    s     zrender_table.<locals>.<genexpr>)ru   r  r:  r   r1  rw   )
Z
header_rowr  r  ru  Z
hide_emptyrm  rl  rp  r   r   r   )r  ru  rq  rs  r  r   render_tablet  s$    

&*$rv  c              
      st  t jdd dd dd d}|t jt jt jt jt jd}t trR fdd}n fdd}t	
d	d
tt	j| }||  }|r| }||d  |d rfdd}n}|d p|d p|d }	|d r|	d|d |d }	||d }
d }t|
ttfrtzt|	}W nH tk
rr   t|	}|d kr\t|	 d}|d krnt|	}Y nX |d k	r|d |krtd|d |
d kr||d p|d S ||
|d kr|	n|S dd dd d}t	
dd
tt	j| }||  }|rb||d }||d}
||drZ|
d krZdS ||
S td| d S )Nc                 S   s
   |  |S r   r   r  r   r   r   r   r3    r4  z_match_one.<locals>.<lambda>c                 S   s
   |  |S r   )r   rx  r   r   r   r3    r4  c                 S   s   t || S r   )rb   r  rx  r   r   r   r3    r4  )z*=z^=z$=z~=)z<=r   z>=r   r  c                    s    S r   r   )r   r  r   r   r3    r4  c                    s   |  kS r   r   )r  ry  r   r   r3    r4  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>.+?)
        )
        r6  opZnegationc                    s    | | S r   r   rx  )unnegated_opr   r   r3    r4  ZquotedstrvalstrvalZintvalr   z\{}rh   r  z(Operator {} only supports string values!Znone_inclusivec                 S   s   t | tr| dkS | d k	S rw  r(  r  r   r   r   r3    r4  c                 S   s   t | tr| dkS | d kS r  r(  r  r   r   r   r3    r4  )r   r  z3(?x)
        (?P<op>{})\s*(?P<key>[a-z_]+)
        TzInvalid filter part )r  containsleltgegteqr   r)  rb   r  rW  rw   r:  r   rV  r7  r   	groupdictr1  r%  rk  r  r   r  r4  r   )filter_partr  r  ZSTRING_OPERATORSZCOMPARISON_OPERATORSr|  Zoperator_rexr   rz  Zcomparison_valueZactual_valueZnumeric_comparisonZUNARY_OPERATORSr   )r  r{  r   
_match_one  st    	



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\&rf  N)r  r1  )ro   r  r  r  r   r   r    s   zmatch_str.<locals>.<genexpr>z(?<!\\)&)allrb   rm   )
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pFg dkrbd t|d fd	d
	}|S )Nr   rL  rM  rN  c                 S   s   d S r   r   )r   r8  r   r   r   r3    r4  z#match_filter_func.<locals>.<lambda>r  Fc                    s    }|d k	rt |r6t fddD rFrB sBtS d S dp\dp\d}dttj}| d| dS d S )	Nc                 3   s   | ]}t | V  qd S r   )r  r  r  r  r   r   r    s     z9match_filter_func.<locals>._match_func.<locals>.<genexpr>r  r   r  z) | (z does not pass filter (z), skipping ..)r  r  r   r%  rw   r:  r   r   )r  r  r  Zvideo_titler  breaking_filtersfiltersinteractiver  r   _match_func  s    
z&match_filter_func.<locals>._match_func)F)match_filter_funcr   r   rW  r  rZ   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     s    zdownload_range_func.__init__c           	      c   s  | drdnd}| jpg D ]B}t| dp.g D ]*\}}t||d r2d }|d|iV  q2q| jr|r|d|d  d|  | jpg D ]$\}}| ||| ||d	V  q| jr| d
s| dr| d
pd| dpt	dd	V  n| js
| js
i V  d S )Nr  z(There are no chapters matching the regexz>Cannot match chapters since chapter information is unavailabler  r   z[info] r   r  )r5  end_timer5  r  r   rg  )
r%  r  r  rb   r  	to_screenr  _handle_negative_timestampr  r  )	r   r  rz  warningr  r  r  r   rG  r   r   r   __call__  s(    




zdownload_range_func.__call__c                 C   s(   | dr$| dk r$t|d |  dS | S )Ndurationr   )r%  rH  )r  infor   r   r   r  (  s    z.download_range_func._handle_negative_timestampc                 C   s"   t |to | j|jko | j|jkS r   )r   r  r  r  rR  r   r   r   rT  ,  s
    


zdownload_range_func.__eq__c                 C   s&   t  dt| j  d| j d| j dS rK  )r   r   r  r  r   r   r   r   rP  0  s    zdownload_range_func.__repr__N)F)	r   r   r   r   r  r  r  rT  rP  r   r   r   r   r  
  s   

r  c                 C   s|   | sd S t dt d| }|r.t|dS t d| }|rxdt|d dt|d  t|d	d
d S d S )Nz^(?P<time_offset>z)s?$Ztime_offsetz%^(\d+):(\d\d):(\d\d(?:(?:\.|:)\d+)?)$r  r   r  r   rB  rl   r   )rb   rc   r  r  r   rk  r1  )Z	time_exprrm  r   r   r   parse_dfxp_time_expr4  s    r  c                 C   s   dt | d  S )Nz%02d:%02d:%02d,%03dr  )r  r-  r   r   r   srt_subtitles_timecodeA  s    r  c                 C   s(   t | d }d|d d |jd f S )Nr  z%01d:%02d:%02d.%02dr   r   )r  r  )r  r  r   r   r   ass_subtitles_timecodeE  s    r  c              	      sl  ddddgfddgff}ddd	d
ddg t jtdddddi i G  fddd| dd} fdd}|D ]\}}|D ]}| ||} qqzt| }g }|dp|d}|stdd}	|dD ]}
|
dp|
d}|sq|
d}|r.|krd }	q܈|  |<  D ].}|
d!| }|r2|	|i |< q2q|	rvd}	qΐqvqd"D ]R}t
|d#| d$| g}|d%krqz|d}
|
sqz|
 qzt|td&D ]\}}t|jd'}t|jd(}t|jd)}|d%kr$q|s<|s4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/ttmls   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)r(  r%  Ztts)rx   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kr"|  j d7  _ ng }i }|d}rB| |rX||i   D ]"}|d| }|r\|||< q\|rd}t| D ]\}	}
| jr| jd |	|
krq|	dkr|d	|
 d
7 }q|	dkr|d|
 d
7 }q|	dkr
|d|
 d
7 }q|	dkr8|
dkr8|  j d7  _ |d q|	dkrf|
dkrf|  j d7  _ |d q|	dkr|
dkr|  j d7  _ |d q|r|  j d| d 7  _ |d i }| jr|| jd  || | j| | j| d S )Nttml:brbrr   styletts:r   r   r  z color="r!  r  z size="r  z face="r  Zboldz<b>rb  r  Zitalicz<i>r  r  Z	underlinez<u>r  z<fontr   font)_outr%  r  sortedr   _applied_stylesrv   _unclosed_elements)r   r{   r   unclosed_elementsr  Zelement_style_idpropprop_valr  r  r!  Zapplied_styleSUPPORTED_STYLING_xdefault_stylestylesr   r   r   q  sT    





z*dfxp2srt.<locals>.TTMLPElementParser.startc                    sV   | ddfkrR| j  }t|D ]}|  jd| d7  _q"|rR| jrR| j  d S )Nr  r  r   r   )r  r   reversedr  r  )r   r{   r  element)r  r   r   rG    s    

z(dfxp2srt.<locals>.TTMLPElementParser.endc                 S   s   |  j |7  _ d S r   )r  )r   r  r   r   r   r    s    z)dfxp2srt.<locals>.TTMLPElementParser.datac                 S   s
   | j  S r   )r  r   r   r   r   r   r     s    z*dfxp2srt.<locals>.TTMLPElementParser.closeN)
r   r   r   r  r  r  r   rG  r  r   r   r  r   r   TTMLPElementParserl  s   -r  s   encoding='UTF-16's   encoding='UTF-8'c                    s2     }t jjj|d}|t jj|  | S )N)target)r(  etreeElementTree	XMLParserr   tostringr   )rf   r  r   )r  r   r   
parse_node  s    zdfxp2srt.<locals>.parse_nodez	.//ttml:pz.//pzInvalid dfxp/TTML subtitleFz.//ttml:styler   zxml:idr  Tr  )bodydivz.//ttml:z.//Nr   beginrG  durz%d
%s --> %s
%s

r   )r   r  r|   r1  r   findallr   r%  r  r  r   r  r  rY  ru  r  r   rv   r  rw   )Z	dfxp_dataZLEGACY_NAMESPACESr  r  r!  rz   r$  rg  Zparasrepeatr  Zstyle_idZparent_style_idr  r  pZeleparar   Z
begin_timer  r  r   )r  r  r  r  r  r   dfxp2srtJ  s    	
B



r  c                 C   s<   |  |}|d krg S |d kr*|t|gS | | | gS r   )r%  r   )r  command_optionparam	separatorr   r   r   
cli_option  s
    
r  r  r  c                 C   s*   |  |}|dkstt||d|||S )N)TFN)TF)r%  rd   r  )r  r  r  Z
true_valueZfalse_valuer  r   r   r   cli_bool_option  s    
r  c                 C   s   |  ||kr|gS g S r   r%  )r  r  r  Zexpected_valuer   r   r   cli_valueless_option  s    r  c                    s   t  ttfr|r S d   d kr&|S t  ts4tt |ttfsFt|D ]>}ttdd  fddt|D }|rJdd |D   S qJ|S )Nc                 S   s   | d k	S r   r   r   r   r   r   r3    r4  z(cli_configuration_args.<locals>.<lambda>c                    s   g | ]}  | qS r   )r%  r,  )ro   rh   argdictr   r   rq     s     z*cli_configuration_args.<locals>.<listcomp>c                 S   s   g | ]}|D ]}|qqS r   r   )ro   r   argr   r   r   rq     s       )r   rb  r  r   rd   rK  r  )r  rV  r   
use_compatZkey_listarg_listr   r  r   cli_configuration_args  s     r  c                    s   |   |   } }| |kr|n|  d|   fdd|p>dgD } |krn| |krb|| |f |d nd}t||||S )Nr  c                    s   g | ]}  | qS r   r   r  Zroot_keyr   r   rq     s     z'_configuration_args.<locals>.<listcomp>r   r   F)r,  rv   r  )Zmain_keyr  r=  rV  r   r  r   r  r   _configuration_args  s    r  c                   @   s  e Zd Z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/d0d1d2d3d4d5d6d7d8d9d9d:d;d<d=d>d?d@dAdBdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddZedd Zedd ZdS )ISO639UtilsZaarZabkZaveZafrZakaZamhr  ZaraZasmZavaZaymZazeZbakZbelZbulZbihZbisZbamZbenZbodZbreZboscatZcheZchacosZcreZcesZchuZchvZcymZdanZdeur  ZdzoZeweZellZengZepoZspaZestZeusZfasZfulZfinZfijZfaoZfraZfryZgleZglaZglgZgrnZgujZglvZhauZhebZhinZhmoZhrvZhatZhunZhyeZherZinaindZileZiboZiiiZipkZidoZislZitaZikuZjpnZjavZkatZkonZkikZkuaZkazZkalZkhmZkanZkorZkauZkasZkurZkomZcorZkirZlatZltzZlugZlimZlinZlaoZlitZlubZlavZmlgZmahZmriZmkdZmalmonmarZmsaZmltZmyaZnauZnobZndeZnepZndoZnldZnnoZnorZnblnavZnyaZociZojiZormZoriZossZpanZperZpliZpolZpusZporZqueZrohr  ZronZrusZkinsanZsrdZsndZsmeZsagsinZslkZslvZsmoZsnaZsomZsqiZsrpZsswZsotsunZsweZswaZtamtelZtgkZthaZtirZtukZtglZtsnZtonZturZtsoZtatZtwiZtahZuigZukrZurdZuzbZvenZvieZvolZwlnZwolZxhoZyidZyorZzhaZzhoZzul)Zaar  r3   afZakamZanarasavZayazbabebgZbhZbiZbmZbnZbor  rs  caZcechcoZcrcsZcuZcvcydadedvZdzeeelr   eoeseteufafffifjfor   ZfygagdglZgnZgugvZhaheiwhiZhohrZhthuZhyhziar   inr  ZigiiZikr  isitiujaZjvkaZkgZkiZkjr  klkmknkoZkrksZkukvkwkyZlaZlbZlgr   lnlor  ZlulvZmgZmhmimkrt  mnmrr1  r/  ZmynanbZndneZngnlnnnonrnvnyocZojZomorrJ   papepir   ZpsptZqurmZrnrorurwsaZscsdseZsgsiskslsmZsnsosqsrr2   stZsusvswtatetgr4   ZtiZtktltntotrr  r#  ZtwtyZugukuruzveviZvowaZwoxhyiZjiZyoZzazhzuc                 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)rT  r   )r  r  Z
short_nameZ	long_namer   r   r   
long2short  s    zISO639Utils.long2shortN)r   r   r   rT  r  rV  rW  r   r   r   r   r  $  s    @
r  c                   @   s  e Zd Z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/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddZedd ZdS (   ISO3166UtilsZAfghanistanu   Åland IslandsZAlbaniaZAlgeriazAmerican SamoaZAndorraZAngolaZAnguillaZ
AntarcticazAntigua and BarbudaZ	ArgentinaZArmeniaZArubaZ	AustraliaZAustriaZ
AzerbaijanZBahamasZBahrainZ
BangladeshZBarbadosZBelarusZBelgiumZBelizeZBeninZBermudaZBhutanzBolivia, Plurinational State ofz Bonaire, Sint Eustatius and SabazBosnia and HerzegovinaZBotswanazBouvet IslandZBrazilzBritish Indian Ocean TerritoryzBrunei DarussalamZBulgariazBurkina FasoZBurundiZCambodiaZCameroonZCanadaz
Cape VerdezCayman IslandszCentral African RepublicZChadZChileZChinazChristmas IslandzCocos (Keeling) IslandsZColombiaZComorosZCongoz%Congo, the Democratic Republic of thezCook Islandsz
Costa Ricau   Côte d'IvoireZCroatiaZCubau   CuraçaoZCypruszCzech RepublicZDenmarkZDjiboutiZDominicazDominican RepublicZEcuadorZEgyptzEl SalvadorzEquatorial GuineaZEritreaZEstoniaZEthiopiazFalkland Islands (Malvinas)zFaroe IslandsZFijiZFinlandZFrancezFrench GuianazFrench PolynesiazFrench Southern TerritoriesZGabonZGambiaZGeorgiaZGermanyZGhanaZ	GibraltarZGreeceZ	GreenlandZGrenadaZ
GuadeloupeZGuamZ	GuatemalaZGuernseyZGuineazGuinea-BissauZGuyanaZHaitiz!Heard Island and McDonald IslandszHoly See (Vatican City State)ZHondurasz	Hong KongZHungaryZIcelandZIndiaZ	IndonesiazIran, Islamic Republic ofZIraqZIrelandzIsle of ManZIsraelZItalyZJamaicaZJapanZJerseyZJordanZ
KazakhstanZKenyaZKiribatiz&Korea, Democratic People's Republic ofzKorea, Republic ofZKuwaitZ
Kyrgyzstanz Lao People's Democratic RepublicZLatviaZLebanonZLesothoZLiberiaZLibyaZLiechtensteinZ	LithuaniaZ
LuxembourgZMacaoz*Macedonia, the Former Yugoslav Republic ofZ
MadagascarZMalawiZMalaysiaZMaldivesZMaliZMaltazMarshall IslandsZ
MartiniqueZ
MauritaniaZ	MauritiusZMayotteZMexicozMicronesia, Federated States ofzMoldova, Republic ofZMonacoZMongoliaZ
MontenegroZ
MontserratZMoroccoZ
MozambiqueZMyanmarZNamibiaZNauruZNepalZNetherlandszNew CaledoniazNew ZealandZ	NicaraguaZNigerZNigeriaZNiuezNorfolk IslandzNorthern Mariana IslandsZNorwayZOmanZPakistanZPalauzPalestine, State ofZPanamazPapua New GuineaZParaguayZPeruZPhilippinesZPitcairnZPolandZPortugalzPuerto RicoZQataru   RéunionZRomaniazRussian FederationZRwandau   Saint Barthélemyz,Saint Helena, Ascension and Tristan da CunhazSaint Kitts and NeviszSaint LuciazSaint Martin (French part)zSaint Pierre and Miquelonz Saint Vincent and the GrenadinesZSamoaz
San MarinozSao Tome and PrincipezSaudi ArabiaZSenegalZSerbiaZ
SeychelleszSierra LeoneZ	SingaporezSint Maarten (Dutch part)ZSlovakiaZSloveniazSolomon IslandsZSomaliazSouth Africaz,South Georgia and the South Sandwich IslandszSouth SudanZSpainz	Sri LankaZSudanZSurinamezSvalbard and Jan MayenZ	SwazilandZSwedenZSwitzerlandzSyrian Arab RepubliczTaiwan, Province of ChinaZ
TajikistanzTanzania, United Republic ofZThailandzTimor-LesteZTogoZTokelauZTongazTrinidad and TobagoZTunisiaZTurkeyZTurkmenistanzTurks and Caicos IslandsZTuvaluZUgandaZUkrainezUnited Arab EmirateszUnited KingdomzUnited Statesz$United States Minor Outlying IslandsZUruguayZ
UzbekistanZVanuatuz!Venezuela, Bolivarian Republic ofzViet NamzVirgin Islands, BritishzVirgin Islands, U.S.zWallis and FutunazWestern SaharaZYemenZZambiaZZimbabwezAsia/Pacific RegionZEurope)AFAXALDZASADAOAIAQAGARAMAWAUATAZBSBHBDBBBYBEBZBJBMBTBOBQBABWZBVBRIOBNBGBFBIKHr#  CACVKYCFTDCLCNZCXCCCOKMCGCDCKCRCIHRCUCWCYCZDKDJDMDOECEGSVGQEREEETFKFOFJFIFRGFPFZTFGAGMGEDEGHGIGRGLGDGPGUGTGGGNGWGYHTZHMVAHNHKHUISINIDIRIQIEIMILITJMJPJEJOKZKEKIKPKRKWKGLALVLBLSLRLYLILTLUMOMKMGMWMYMVMLMTMHMQMRMUYTMXFMMDMCMNMEMSMAMZMMNANRNPNLr  NZNINENGNUNFMPNOOMPKPWPSPAr  PYPEPHZPNPLPTPRQARERORURWBLZSHKNLCMFPMVCWSSMSTSASNRSSCSLSGSXSKSISBSOZAZGSSSESLKSDSRZSJSZSECHSYTWTJTZr1   TLTGTKTOTTTNTRTMTCTVUGUAr0   r  USZUMUYUZVUVEVNVGVIWFZ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  rU  r   r   r   
short2full  s    zISO3166Utils.short2fullN)r   r   r   rD  r  rE  r   r   r   r   rX    s     rX  c                   @   s  e Zd Z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/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddZedd ZdS )GeoUtilsz46.172.224.0/19z94.200.0.0/13z149.54.0.0/17z209.59.64.0/18z204.14.248.0/21z46.99.0.0/16z46.70.0.0/15z105.168.0.0/13z182.50.184.0/21z23.154.160.0/24z181.0.0.0/12z202.70.112.0/20z77.116.0.0/14z1.128.0.0/11z181.41.0.0/18z185.217.4.0/22z5.197.0.0/16z31.176.128.0/17z65.48.128.0/17z114.130.0.0/16z
57.0.0.0/8z102.178.0.0/15z95.42.0.0/15z37.131.0.0/17z154.117.192.0/18z137.255.0.0/16z185.212.72.0/23z196.12.64.0/18z156.31.0.0/16z161.56.0.0/16z161.0.80.0/20z191.128.0.0/12z24.51.64.0/18z119.2.96.0/19z168.167.0.0/16z178.120.0.0/13z179.42.192.0/18z99.224.0.0/11z41.243.0.0/16z197.242.176.0/21z160.113.0.0/16z85.0.0.0/13z102.136.0.0/14z202.65.32.0/19z152.172.0.0/14z102.244.0.0/14z36.128.0.0/10z181.240.0.0/12z201.192.0.0/12z152.206.0.0/15z165.90.96.0/19z190.88.128.0/17z31.153.0.0/16z88.100.0.0/14z
53.0.0.0/8z197.241.0.0/17z87.48.0.0/12z192.243.48.0/20z152.166.0.0/15z41.96.0.0/12z186.68.0.0/15z90.190.0.0/15z156.160.0.0/11z196.200.96.0/20z88.0.0.0/11z196.188.0.0/14z2.16.0.0/13z91.152.0.0/13z144.120.0.0/16z80.73.208.0/21z119.252.112.0/20z88.85.32.0/19z
90.0.0.0/9z41.158.0.0/15z
25.0.0.0/8z74.122.88.0/21z31.146.0.0/16z161.22.64.0/18z62.68.160.0/19z154.160.0.0/12z95.164.0.0/16z88.83.0.0/19z160.182.0.0/15z197.149.192.0/18z104.250.0.0/19z105.235.224.0/20z94.64.0.0/13z168.234.0.0/16z168.123.0.0/16z197.214.80.0/20z181.41.64.0/18z113.252.0.0/14z181.210.0.0/16z93.136.0.0/13z148.102.128.0/17z84.0.0.0/14z39.192.0.0/10z87.32.0.0/12z79.176.0.0/13z5.62.80.0/20z117.192.0.0/10z203.83.48.0/21z37.236.0.0/14z2.176.0.0/12z82.221.0.0/16z79.0.0.0/10z87.244.64.0/18z72.27.0.0/17z176.29.0.0/16z133.0.0.0/8z105.48.0.0/12z158.181.128.0/17z36.37.128.0/17z103.25.140.0/22z197.255.224.0/20z198.167.192.0/19z175.45.176.0/22z175.192.0.0/10z37.36.0.0/14z64.96.0.0/15z2.72.0.0/13z115.84.64.0/18z178.135.0.0/16z24.92.144.0/20z82.117.0.0/19z112.134.0.0/15z102.183.0.0/16z129.232.0.0/17z78.56.0.0/13z188.42.0.0/16z46.109.0.0/16z41.252.0.0/14z105.128.0.0/11z88.209.64.0/18z37.246.0.0/16z178.175.0.0/17z74.112.232.0/21z154.126.0.0/17z117.103.88.0/21z77.28.0.0/15z154.118.128.0/18z37.111.0.0/17z49.0.128.0/17z60.246.0.0/16z202.88.64.0/20z109.203.224.0/19z41.188.64.0/18z208.90.112.0/22z46.11.0.0/16z105.16.0.0/12z27.114.128.0/18z102.70.0.0/15z187.192.0.0/11z175.136.0.0/13z197.218.0.0/15z41.182.0.0/16z101.101.0.0/18z197.214.0.0/18z203.17.240.0/22z105.112.0.0/12z186.76.0.0/15z145.96.0.0/11z84.208.0.0/13z36.252.0.0/15z203.98.224.0/19z49.156.48.0/22z49.224.0.0/14z5.36.0.0/15z186.72.0.0/15z186.160.0.0/14z123.50.64.0/18z124.240.192.0/19z49.144.0.0/13z39.32.0.0/11z83.0.0.0/11z70.36.0.0/20z66.50.0.0/16z188.161.0.0/16z85.240.0.0/13z202.124.224.0/20z181.120.0.0/14z37.210.0.0/15z102.35.0.0/16z79.112.0.0/13z93.86.0.0/15z5.136.0.0/13z41.186.0.0/16z188.48.0.0/13z202.1.160.0/19z154.192.0.0/11z102.120.0.0/13z78.64.0.0/12z8.128.0.0/10z188.196.0.0/14z78.98.0.0/15z102.143.0.0/17z89.186.32.0/19z41.82.0.0/15z154.115.192.0/18z186.179.128.0/17z105.235.208.0/21z197.159.160.0/19z168.243.0.0/16z190.102.0.0/20z
5.0.0.0/16z41.84.224.0/19z65.255.48.0/20z154.68.128.0/19z196.168.0.0/14z171.96.0.0/13z85.9.128.0/18z27.96.24.0/21z180.189.160.0/20z95.85.96.0/19z197.0.0.0/11z175.176.144.0/21z78.160.0.0/11z186.44.0.0/15z202.2.96.0/19z120.96.0.0/11z156.156.0.0/14z37.52.0.0/14z102.80.0.0/13z	6.0.0.0/8z167.56.0.0/13z84.54.64.0/18z212.77.0.0/19z207.191.240.0/21z186.88.0.0/13z66.81.192.0/20z146.226.0.0/16z14.160.0.0/11z202.80.32.0/20z117.20.32.0/21z202.4.32.0/19z134.35.0.0/16z41.242.116.0/22z41.0.0.0/11z102.144.0.0/13z102.177.192.0/18)r^  r0   rY  rb  r`  r[  rd  r_  rB  ra  rc  r]  rg  rf  re  rZ  rh  ru  rl  rk  rn  r{  rz  rj  r|  rp  r	  rq  ry  rs  rt  rw  ri  rr  rv  rm  ro  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  rC  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rx  r  r  r  r  r  r  r  r  r  r  r}  r  r  r
  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r$  r  r  r  r  r  r  r  r"  r  r  r  r  r&  r#  r2  r  r+  r1   r(  r,  r*  r1  r/  r-  r0  r.  r3  r'  r)  r5  r4  r6  r7  r8  r  r  r:  r<  r=  r;  r9  r>  r  r?  r  r  r@  rA  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   rr   z!Lr   r  )ru   _country_ip_mapr%  r  rm   ru  unpacksocket	inet_atonrk  r   	inet_ntoarv  r  randint)r  Zcode_or_blockr  addrZpreflenZaddr_minZaddr_maxr   r   r   random_ipv4  s    zGeoUtils.random_ipv4N)r   r   r   rG  r  rN  r   r   r   r   rF    s    trF  c                 C   s   d}t | } | dkr2td| d@ | }| d? } qtt|D ]}|| dkr> q\q>d}d}||d }|dkrt|| r|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.
    r4  r   >Ir  r      N)rk  ru  rv  r   ru   )r   	blocksizer   r  r   r   r   long_to_bytes  s    	
rR  c              	   C   sn   d}t | }|d r4d|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   rA  rP  r  rO  )ru   r   ru  rH  )r   accr  extrar  r   r   r   bytes_to_long  s    &rU  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
    Nr   rd  r   )rk  binasciihexlifypow)r  r  moduluspayloadZ	encryptedr   r   r   ohdave_rsa_encrypt0  s    r[  c                 C   sB   t | |d krtddd t|t |  d D }d|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  rL  )ro   r   r   r   r   rq   L  s     zpkcs1pad.<locals>.<listcomp>rB  r   r   )r   r   )r   )ru   r   r   )r  r  Zpseudo_randomr   r   r   pkcs1padA  s    r^  c                 C   sL   |s| st d|pdd |  }| rH| t|krHt d|  dt| |S )Nz#Either table or n must be specifiedZ>0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZzbase z exceeds table length )r   ru   )r   rl  r   r   r   _base_n_tableP  s    r_  c                 C   sF   t ||}| s|d S dt| }}| rB|| |  | }| | } q$|S )z$Convert given int to a base-n stringr   r   )r_  ru   )r  r   rl  r;  rn  r   r   r   encode_base_nZ  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   )ro   r   r+  r   r   r   r  i  s      z!decode_base_n.<locals>.<dictcomp>r   )r  r_  ru   )r  r   rl  r;  rn  r+  r   r   r   decode_base_ng  s
    ra  c                    sx   t t| }| \}}}}t|}t|}|d}i  |rb|d8 }t||}|| pZ| |< q:t d fdd|S )Nr6  r   z	\b(\w+)\bc                    s    |  d S r   r  r  Zsymbol_tabler   r   r3  ~  r4  z%decode_packed_codes.<locals>.<lambda>)rb   r  PACKED_CODES_RErC  rk  rm   r`  r   )r  rm  Zobfuscated_codern  ru  symbolsZbase_n_countr   rb  r   decode_packed_codesp  s    

 
re  c                    s0   dkr| S t  d fdd| D S )Nr   r   c                 3   s0   | ](}| kr$   |   n|V  qd S r   )r   rn   alphabetlshiftr   r   r    s   zcaesar.<locals>.<genexpr>)ru   rw   )r   rg  ri  r   rf  r   caesar  s    rj  c                 C   s   t | ddS )Nz^!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~/   )rj  r[  r   r   r   rot47  s    rl  c                 C   s<   i }t d| D ]&\}}|dr.|dd }|||< q|S )Nz2(?P<key>[A-Z0-9-]+)=(?P<val>"[^"]+"|[^",]+)(?:,|$)r!  r   r   )rb   r  r   )r   r  rh   ri   r   r   r   parse_m3u8_attributes  s    

rm  c                 C   s   | dkr| |? S | d |? S )Nr   l        r   )ri   r   r   r   r   urshift  s    rn  c           
   
   C   s  t dkrd|ksttj| s$tz.t|  d| d}|| W 5 Q R X W n0 tk
r } zt|j	|j
W 5 d }~X Y nX d S d }tttdd rtj}n0ttdd dkrttjdkrtj}n
trtj}|r"z|| || W n2 tk
r } zt|j	|j
W 5 d }~X Y nX d S tdd	gr4dntd
dgrFd
nd }|sltdtjdkrddnd | }zHtj|d
kr|d||| gn|d|d|| gdtjtjtjd\}}}	W n2 tk
r } zt|j	|j
W 5 d }~X Y nX |	r t|	|d S )Nr  rl   r  setxattrZ_yt_dlp__identifierZpyxattr)r   r0  r   ZsetfattrrG  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   r
  r  r?  )r	   rd   rJ   rK   existsr  re  rT   r  r  strerrorcallabler  ro  r
   r_  __version__rW  r>  r  rP   rQ   r   rx  r  r  r<  )
rK   rh   r   r  r  ro  r=  r   r  r  r   r   r   write_xattr  sZ      &    ru  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  r8  r  rL  r)  r  r   r,  r+  r-  )Z
year_fieldZmonth_fieldZ	day_fieldZ
start_dateend_dater   Zrandom_dater   r   r   random_birthday  s       rx  c              
   C   sX   z<t   *}|| df | d W  5 Q R  W S Q R X W n tk
rR   Y d S X d S rs  )rI  r  getsocknamerT   )Z	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
)rI  desktopweblocc                 C   s   t j| }d|jkrtdd}|jrj|t jj|jdd7 }|jdk	rb|dt jj|jdd 7 }|d7 }||j	d	
 7 }|jdk	r|jd
kr|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!$%&'()*+,~)safeNrl   @idnaP   z!$%&'()*+,/:;=@|~z!$%&'()*+,/:;=?@{|}~z!#$%&'()*+,/:;=?@{|}~)rM  rN  r  rL  r   rP  r   rX  rT  r:   r   rS  r   r  rG  
quote_plusrK   r  r  fragment)ZiriZ	iri_partsZnet_locationr   r   r   
iri_to_uri  s*    

r  c                 C   s   t jdkrdtj|  S | S )N)rF   cygwinz\\?\)rP   rQ   rJ   rK   abspath)rK   r   r   r   to_high_limit_path3  s    
r  z%sc                 C   s>   t j| ft| }|tkr"|s2n|t|kr2|S ||| S r   )r   r-  r  r   )r[   fieldtemplaterc  r   r  ri   r   r   r   r  ;  s    r  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+://)r5  r   r  r   r   r   clean_podcast_urlB  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  rL  r   r   r   r   r3  \  r4  zrandom_uuidv4.<locals>.<lambda>z$xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxxr   r   r   r   r   random_uuidv4[  s    r  c              
   C   sl   z$t j| }|r t j|dd W dS  tk
rf } z$t|d k	rP|d|  W Y dS d }~X Y nX d S )NT)exist_okzunable to create directory F)rJ   rK   rM   makedirsrT   rs  )rK   r  dnr   r   r   r   make_dir_  s    r  c                  C   s&   ddl m}  tjtj|  d S )Nr    _get_variant_and_executable_pathr   )r  r  rJ   rK   rM   r  r  r   r   r   get_executable_pathk  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	~/.configZappdata~r   )rJ   getenvr   rK   rw   )package_nameZxdg_config_homeZappdata_dirr   r   r   get_user_config_dirsq  s    
r  c                 c   s   t jd| V  d S )Nz/etc)rJ   rK   rw   )r  r   r   r   get_system_config_dirs  s    r  c                  K   s   t   tjf |   S )zQ
    Returns TZ-aware time in seconds since the epoch (1970-01-01T00:00:00Z)
    )r  r  r  r  )r   r   r   r   time_seconds  s    r  c                 C   s~   ddd}|r| | tt| }tt|  }t| |d | tj	}t|
 }|d | d | S )NZHS256ZJWT)Zalgtyp   .)r  rU  rV  rN   r  r:   hmacnewhashlibsha256digest)Zpayload_datarh   rZ  Zheader_data
header_b64payload_b64r  signature_b64r   r   r   jwt_encode_hs256  s    
r  c                 C   s&   |  d\}}}tt| dS )Nr   z===)rm   rN   r  rU  urlsafe_b64decode)Zjwtr  r  r  r   r   r   jwt_decode_hs256  s    r  r  c                 C   sF   t dkrts dS ntds dS z
|  W S  tk
r@   Y dS X d S )Nr  FTERM)r	   WINDOWS_VT_MODErJ   r  isattyr  )r  r   r   r   rd    s    

rd  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}zd| j	
||}| j	 }||| |}|std	||| j	|j|B }|std
W 5 t| X dat  dS )z(Ref: https://bugs.python.org/issue30075 )r   r   iZ)  Nr   rA  r  F)use_last_errorzCONOUT$zGetConsoleMode failedzSetConsoleMode failedT)ra  r}  ctypes.wintypesr  WinDLLrJ   r  r  r   r~  r  r  r  ZGetConsoleModebyrefr;   ZSetConsoleModer   r  rd  cache_clear)r}  r  Z"ENABLE_VIRTUAL_TERMINAL_PROCESSINGdllr  Zh_outZdw_original_modesuccessr   r   r   windows_enable_vt_mode  s,    

r  z	\[[^m]+mc                 C   s   t d| S r  )_terminal_sequences_rer   rg  r   r   r   rf    s    rf  c                 C   s   t d|  S )Nr  r  )numberr   r   r   number_of_digits  s    r  r  )r  	from_dictc                    s0    d k	r fdd|D }|  tttd |S )Nc                 3   s   | ]}t  t|V  qd S r   )r   r-  r  rh  r  r   r   r    s     z join_nonempty.<locals>.<genexpr>)rw   r:  r   rK  )r  r  valuesr   r  r   r    s    r  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 r2  r  r  r  r   r   r    s     zAscale_thumbnails_to_max_format_width.<locals>.<genexpr>.<genexpr>N)r  )ro   )_keysr  r   r    s     z7scale_thumbnails_to_max_format_width.<locals>.<genexpr>)r   r   rY  r   c              
      s<   g | ]4}t d ttd |d  itt |qS )rI  r   )r  rb   r   r   r   r  )ro   r  r  Zmax_dimensionsurl_width_rer   r   rq     s    z8scale_thumbnails_to_max_format_width.<locals>.<listcomp>rj  )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   rB  )rb   r  rk  r   r$  )r   Zcrgr   r   r   parse_http_range  s    r  c                 C   s0   | r*t 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:
)r	   ri  rP   r?  )whateofr   r   r   
read_stdin  s    r  c                 C   sZ   t D ]"\}}| |r|t|f  S q| dd} td| }|rR|d nddfS )zN
    Detect the text encoding used
    @returns (encoding, bytes to skip)
    rP  r4  s   (?m)^#\s*coding\s*:\s*(\S+)\s*$r   Nr   )r_  r   ru   r1  rb   rc   r   r   )r  r  rh  rm  r   r   r   determine_file_encoding  s    
r  c                   @   s   e Zd 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   labelrW  _loaded_pathsconfigs)r   r   r  r   r   r   r   (  s    zConfig.__init__c                 C   s    | j r
t|| | _| _|  S r   )_Config__initializedrd   own_argsr  load_configs)r   r   r  r   r   r   init,  s    
zConfig.initc                 C   s  d}| j r>tj| j }tj|}|| jkr2dS | j| d| _| j	| j
\}}| j
| _|jpfg D ]}|dkr|| jkrqh| j| | jtjtddddd qhtj|t|}tj|rtj|d	}tj|s| jd
| d | | || qhdS )Nr   FTr  optionscommentsr?  r  zyt-dlp.confzconfig location z does not exist)r  rJ   rK   realpathrM   r  ro  r  r   parse_known_argsr  parsed_argsZconfig_locationsappend_configr  rm   r  rw   r\  isdirrq  error	read_file)r   	directorylocationoptsr   r   r   r   r  1  s0    

zConfig.load_configsc                 C   sv   t | jd| jrd| j dnddd}t | jd k	oZ|d   |dd   d| | j fd	d
 | jD ddiS )Nconfigr!  r   r   r  r   r   r  c                 s   s(   | ] }d |  d ddd V  qdS )r   z
| r   Nrq  rn   r   r   r   r  R  s     z!Config.__str__.<locals>.<genexpr>r  r   )r  r  r  r  r  hide_login_infor  )r   r  r   r   r   rQ  L  s      2zConfig.__str__c              
   C   s   zt | d}W n tk
r&   | Y S X z$t|d\}}||tj W n tk
rd   d }Y nX zbz&| |pzt	 }t
j|dd}W n6 tk
r } ztd|  d| W 5 d }~X Y nX W 5 |  X |S )Nr  i   Tr  zUnable to parse "z": )r  rT   r  readseekr  SEEK_SETr   r   r<   r  rm   r;   r   )r  r   Zoptionfrh  skipcontentsresr   r   r   r   r  U  s     

*
zConfig.read_filec                    s   dddddddh}t dd	d
d |D  d   fdd}tt|| } t| D ],\}}||krV|d t| k rVd| |d < qV| S )Nz-pz
--passwordz-uz
--usernamez--video-passwordz--ap-passwordz--ap-usernamez	^(?P<key>r6  c                 s   s   | ]}t |V  qd S r   r  )ro   Zpor   r   r   r  m  s     z)Config.hide_login_info.<locals>.<genexpr>z)=.+$c                    s$     | }|r|dd S | S d S )Nrh   z=PRIVATE)rc   r   )or   Zeqrer   r   	_scrub_eqo  s    
z)Config.hide_login_info.<locals>._scrub_eqr   ZPRIVATE)rb   r  rw   rb  r:  r  ru   )r  ZPRIVATE_OPTSr  r[  optr   r  r   r  j  s    "zConfig.hide_login_infor  c                G   s2   t | | j|}| j|_|j| r.| j| d S r   )r   r   r  r  r  rv   )r   r  r   r  r   r   r   r  |  s    
zConfig.append_configc                 c   s0   t | jD ]}|jE d H  q
| jp$g E d H  d S r   )r  r  all_argsr  )r   r  r   r   r   r    s    zConfig.all_argsc                 K   s   | j j| jf|S r   )r   r  r  )r   r   r   r   r   r    s    zConfig.parse_known_argsc                 C   s   | j | jS r   )r   
parse_argsr  r   r   r   r   r    s    zConfig.parse_args)N)NN)r   r   r   r  r  r  r  Z_plugin_dirsr   r  r  rQ  r  r  r  r  r  r  r  r  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   )r  r  r   r   r   r    s      z!merge_headers.<locals>.<dictcomp>)rY  chainfrom_iterabler:  r   r   )r  r   r   r   merge_headers  s    r  c                    s&   t  t  fdd}|S )zCache a methodc                    sn   j | f||}|  t|j dd  }t| di  ji }||krf | f||||< || S )Nr   Z_cached_method__cache)r  apply_defaultsr  	argumentsr  r  r  r   )r   r   r   Z
bound_argsrh   cacher  r  r   r   wrapper  s    zcached_method.<locals>.wrapperr  )r  r  r   r  r   cached_method  s    
	r  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| f||S t | S r   )r   r  r   __new__)r  r  r   r   r   r   r   r    s    zclassproperty.__new__F)r  c                C   s$   t | | || _|ri nd | _d S r   )r   update_wrapperr  rn  )r   r  r  r   r   r   r     s    zclassproperty.__init__c                 C   s8   | j d kr| |S || j kr.| || j |< | j | S r   )rn  r  )r   r   r  r   r   r   __get__  s
    


zclassproperty.__get__)N)r   r   r   r   r  r   r  r  r   r   r   r   r    s   r  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   r  r  _function_with_repr__repr)r   r  r  r   r   r   r     s    zfunction_with_repr.__init__c                 O   s   | j ||S r   )r  r  r   r   r   r    s    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!  )r  r  r   r   r   r   r   r   rP    s    zfunction_with_repr.__repr__)N)r   r   r   r   r  r  r  rP  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    s    zNamespace.__iter__c                 C   s
   | j  S r   )r  r   r   r   r   r   items_  s    zNamespace.items_N)r   r   r   r   r  r  r  r   r   r   r   r    s   r  )r	  r  r  r  r  r   )	Z3g2r  Zf4vZmk3dZdivxZmpgr  r  r  )	ZaiffZalacr  r  r  r  r  rA  r  )r  Zaper  Zf4aZf4brO  rP  ZogaZogxZspxrB  ZwmarS  )r  r  r  )Zmhtml)ZsrtZvttZassZlrc)Zf4fr  r  Zsmilr
  )common_videor  common_audioaudior  storyboards	subtitles	manifestsc                       s^   e Zd ZdZedYejdZejd[ejd\ej	d]ej
ejd^Z fdSdTZedUdVdWdXZ  ZS )_r8  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  rN   metarz  r?  tempuncutr  ytdlasxrQ  m2tm2tsm2vm4sr  mp2vr9  mper  mpeg1mpeg2mpeg4mxfogmqtr1  swfr  vobr  3gaac3adtsaifaudtsrR  r  r  modmpgamp1mp2r@  mpar  shnxmr  r  r  heicr   imager!  r)  jxlr  r  r*  r  r$  r"  ismtjson3r&  sccsrv1srv2srv3ssar#  r%  r(  r|  r  r  sbvrI  r}  c                   s   t  d| || _d S )Nzunsafe file extension: )r   r   	extension)r   r-  r   r   r   r   R  s    z_UnsafeExtensionError.__init__Fr5  c               C   sb   |d krd S d|ksd|kr$| ||s^| d\}}}|dkrHd }}| | jkr^| ||S )Nrr   r  r   binr  )r  r,  ALLOWED_EXTENSIONS)r  r-  r6  r   lastr   r   r   r9  V  s    z(_UnsafeExtensionError.sanitize_extension)	r  rN   r  rz  r?  r  r  r  r  )r  rQ  r  r  r	  r
  r  r  r9  r  r  r  r  r  r  r  r  r1  r  r  r  r  )r  r  r  r  r  r  rR  r  r  r  r  r  r  r@  r  r  r   r!  )r  r  r  r"  r   r#  r!  r)  r$  r  r  r*  r  )r$  r"  r%  r&  r&  r'  r(  r)  r*  r+  r#  r%  r(  )r|  r  r  r,  rI  r}  )r   r   r   r   	frozensetMEDIA_EXTENSIONSr  r  r  r   r  r  r/  r   r  r9  r  r   r   r   r   r8    s                                  &                  ;             K             [      er8  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
    r2  c                 K   s   |pd| _ tj|f|| _d S r   )retriesr   r  error_callback)r   Z_retriesZ_error_callbackr   r   r   r   r   s  s    
zRetryManager.__init__c                 C   s   | j tk	o| j| jkS r   )_errorr   r   r4  r   r   r   r   _should_retryw  s    zRetryManager._should_retryc                 C   s   | j tkrd S | j S r   )r6  r   r   r   r   r   r  z  s    
zRetryManager.errorc                 C   s
   || _ d S r   )r6  )r   r   r   r   r   r    s    c                 c   sB   |   r>t| _|  jd7  _| V  | jr | | j| j| j q d S r   )r7  r   r  r   r5  r4  r   r   r   r   r    s    zRetryManager.__iter__N)r  rA   c          	   	   C   s   ||kr<|r8|dkr,||  d|d  dS |t | S | |sH|| S t| trhtt| jpb| jd} ||  dt|dd d| d	| d
 t|rt	||d dn|}|r|d|dd t
| dS )z&Utility function for reporting retriesr   z. Giving up after z retriesr   z
. RetryingNz %sz (rr   z)...)r   z	Sleeping z.2fz seconds ...)r   r   r   r  r'  r  r  r  rs  r  r  sleep)	r  ru  r4  Z
sleep_funcr  rq  r  rA   delayr   r   r   report_retry  s    ,
(zRetryManager.report_retry)r   r   r   r   r   r6  r   r7  r  r  setterr  r  r:  r   r   r   r   r3  h  s   

r3  c                 C   s(   t | tr| n|  }|  d| S )Nr   )r   r   ie_keyr,  )r  r  r<  r   r   r   make_archive_id  s    r=  c                 C   s\   |dkr|dkst | d ks,t| || kr0| S | d |d   d|rT| | d  nd S )NrB  r   r  r   )rd   ru   )r   leftrightr   r   r   truncate_string  s    r@  )	use_regexr   c          	      C   s   d|kst dt|pg }| D ]}|d}|r>|dd  }||krt|sR|| ndd || D }t|||d}q |rtt|tjj|d n||d kr|gnd }|d krt	||r|D ]}||kr|
| qqq || q t|S )Nr  z"all" alias is requiredr  r   c                 S   s,   g | ]$}| d r|dd nd | qS )r  r   Nrw  )ro   r  r   r   r   rq     s    z+orderedSet_from_options.<locals>.<listcomp>)r   )rd   rb  r   orderedSet_from_optionsrK  rb   r  Ir7  r   rZ   rU  rc  )	r  Z
alias_dictrA  r   	requestedri   discardcurrentrT  r   r   r   rB    s.    
rB  c                <   @   s  e Zd ZdZdZdZdddddd	d
ddddddgdddddddddddddddddgddddddd d!d"dd#dgd$ddd%d&d'd(d)d*d+dd,d-d.g
d$dd/d0d1d2ddd3d4d5d6d7dd8d9d:d7dd;d<d=d> d?dd8d@ddAdBdCdDdEdBdCdFdGdHdIdJdGdIdKdLdMidMdNdOdPdQdOdLdRidLdRidLdRidRdSdOdLdRidLdRidLdRidLdRidGdTdIdJdUd<dVd;dWdRdXd> dYd;dZdMd[d> dYdUd\dVd;d]d^d> d_d`dadVd`dbdVd`dcdVd`dddVd`dedVd`dfdVd`dgdVd`dhddid`dhddid`djddid`dkddid`dlddid`dmddid`dnddid`doddid`dpddid`dqddid`drddid`dsddid`dAddid`dEddid`dtddid`dtddid`duddid`duddid`dbddid`dbddidv9Zdwdx Zdydz Zdd{d|Z	d}d~ Z
dd Zdd Zdd Zdd ZdS )FormatSorterzT *((?P<reverse>\+)?(?P<field>[a-zA-Z0-9_]+)((?P<separator>[~:])(?P<limit>.*?))?)? *$)hidden
aud_or_vidhasvidie_prefr  qualityr  fpszhdr:12zvcodec:vp9.2channelsrG  sizer  asrprotor:  hasaudsourcer   )rR  r  rL  tbrfilesizevbrr  r  rQ  vextabraextrM  	fs_approxrS  r   orderedTzav0?1z	vp0?9.0?2zvp0?9[hx]265|he?vc?z[hx]264|avczvp0?8z	mp4v|h263r;  r   NrE  )r   r  orderz[af]laczwav|aiffrA  z
vorbis|oggr  zmp?4a?r  zac-?4z	e-?a?c-?3zac-?3r  rH  r  z(hdr)?12z
(hdr)?10\+z(hdr)?10ZhlgZsdr)r   r  r  r]  ra  z	(ht|f)tpsz	(ht|f)tp$zm3u8.*z.*dashZwebsocket_fragzrtmpe?zmms|rtspzws|websocketZf4	video_ext)r  r  r   r  r   rE  )r   r  r  r  r   rE  )r   r  r]  
order_free	audio_ext)r  r  r  r  rA  web[am]r   rE  )r  rA  ra  r  r  r  r   rE  )r   r  r  r]  r_  F	extractori)visibleforcedr   rH  multiplerJ  c                 C   s   t tdd | D S )Nc                 s   s   | ]}|d kV  qdS )rE  Nr   rh  r   r   r   r    s     z(FormatSorter.<lambda>.<locals>.<genexpr>)rk  r  r  r   r   r   r3    r4  zFormatSorter.<lambda>)rc  rd  r   r  function)priorityr   rF  boolean)rE  )rh  r  r   not_in_listrG  )r  r   rj  r  language_preferencer   )convertr  r   )rl  r   rl  r  filesize_approx)rl  r  r  	format_id
float_noneaudio_channelssource_preferencecombined)r   r  )rT  rV  rX  c                 C   s   t td | d S r   nextrK  rf  r   r   r   r3    r4  )r   r  rl  rg  )rU  rZ  c                 C   s   t td | d S r   rs  rf  r   r   r   r3    r4  )rW  rY  )r  r  c                 C   s   t td | ddS )Nr   rY  )r;  rK  rf  r   r   r   r3    r4  )r   r  rg  aliasr   rK  r  rS  rQ  rZ  rN  r  )r   r  
deprecatedr:  r  rT  rV  rX  rM  rO  rP  rW  rY  rJ  rR  )9rF  rG  rL  rQ  rW  rY  rH  rI  rK  rJ  rR  r  rL  rU  rZ  r   r  r  rM  rN  rT  rV  rX  rP  rS  codecr  rO  r:  r  rn  
preferencerk  rq  ra  rm  rp  Z	dimension
resolutionr-  ZbitrateZtotal_bitrateZvideo_bitrateZaudio_bitrateZ	framerateZfilesize_estimateZ
samplerater^  r`  Zvideo_codecZaudio_codecr  Z	has_videor  Z	has_audiorb  Zextractor_preferencec                 C   s:   || _ g | _| | j j| |jdr6| | j j d S )Nverbose)rz  _orderevaluate_paramsr  r%  print_verbose_infowrite_debug)r   rz  Zfield_preferencer   r   r   r   #  s
    zFormatSorter.__init__c                 C   s   || j kr4|dkrdS | jd| d i | j |< | j | }||kr|d}|dkrx|dkrddn|d	krr|fn|}n6|d
kr|dkrdn
|rdnd}nddg dd|}|||< || S )N)rd  rh  FzUsing arbitrary fields (zI) for format sorting is deprecated and may be removed in a future versionr   r  rb  rx  )rr  re  rl  r[  r]  Zfloat_stringrc  Tr   )r   rc  r]  rj  )settingsrz  deprecated_featurer%  )r   r  rh   Zprop_objtype_r   r   r   r   _get_field_setting*  s    



 zFormatSorter._get_field_settingc                 C   s@  |d kr|sd S n|  }| |d}|dkr2d S |dkr>|S |dkrNt|S |dkr^t|S |dkr| jrz| |dp| |d}| |d}t|}d	|kr|d	n|d
 }| r|d k	 rt|D ]$\}	}
|
rt	|
|r||	   S q|| S |||kr||n| S n$|
 r*t|S d| j| d< |S d S )Nrl  rc  r  ro  r  r]  r_  r  r   r   )r,  r  r  r  _use_free_orderru   r   r  rb   rc   	isnumericr  r  )r   r  r   Zconvert_none
conversionZ
order_listrA  Zlist_lengthZ	empty_posr  r  r   r   r   _resolve_field_value=  s8    

z!FormatSorter._resolve_field_valuec                    s   | dd _| dg  _| _ fdd}t fdd jD | ddrVt nt fd	d jD  t j t|  j }|D ]l}t j|}|d krt	d
| d|
d}|d krq |ddkr| |d }} |dr jd| d| d |
dd k	}	|
ddk}
|
d}|d k	} |ddk}|on|on |d }|r |dn|f}|r|dn|r|fnt }t|}t|D ]>\}}|||	|
||k r|| n|r|s|d nd  qqd S )NZprefer_free_formatsFZformat_sortc                    sr   |   } |  jkrd S  j|   | |}||d kr<dn|||d}|  jkrd j|  | n
| j| < d S )NF)rP  closest
limit_textr  )r,  r{  rv   r  r  r  )r  rP  r  r  r  r  r   r   r   add_itemd  s    

z.FormatSorter.evaluate_params.<locals>.add_itemc                 3   s   | ]}  |d r|V  qdS )rd  Nr  ro   r  r   r   r   r  u  s      z/FormatSorter.evaluate_params.<locals>.<genexpr>Zformat_sort_forcec                 3   s   | ]}  |d r|V  qdS )rh  Nr  r  r   r   r   r  w  s      zInvalid format sort string "z" given by extractorr  r   ru  rv  zFormat sorting alias zB is deprecated and may be removed in a future version. Please use z insteadrP  r  r  r  rr  Z
same_limitrl   r   )r%  r  
_sort_user_sort_extractorr  r   rb   rc   r  r   r   r  rz  r  rm   ru   r  )r   r  Zsort_extractorr  Z	sort_listrT  rc   r  ru  rP  r  r  Z	has_limitZhas_multiple_fieldsZhas_multiple_limitsfieldsZlimitsZlimit_countr  r  r   r   r   r|  _  sR    


"zFormatSorter.evaluate_paramsc                    s`    j r|dd j   jr8|dd j |dd fdd jD  d S )NzSort order given by user: {}rM  z!Sort order given by extractor: {}zFormats sorted by: {}c                    st   g | ]l}  |d rd  |dr(dnd|  |ddk	rjd  |drPd	nd
  |d  |dndqS )rc  z{}{}{}rP  r  r   r  Nz{}{}({})r  r  rl   r  )r  rW  r  r   r   r   rq     s     

z3FormatSorter.print_verbose_info.<locals>.<listcomp>)r  rW  rw   r  r{  )r   r~  r   r   r   r}    s    zFormatSorter.print_verbose_infoc                 C   s  |  |d}|  |d}|  |d}|dkrV|  |d}|d ksP|d k	r||krd}n`|dkr|  |d}	|  |d	}
|	d ks||	kr|
d ks||
krd
nd}n|dkr| ||d}t||  |dd}|  |ddko|d k	}|r|}|d krdS |sd|d
fS |r2d
t||  |r(|| n|| fS |sV|d ksL||krVd
|d
fS |d ksz|rp||ksz||krd
| d
fS d|d
fS )NrP  r  r  rb  rH  r   ri  in_listrj  r   r[  Tr   rY  rl  r  )ir   r   )r  r  r  abs)r   format_r  r  r   rP  r  r  maximumr  rj  Zval_numZis_numr   r   r   &_calculate_field_preference_from_value  s0    *,$0z3FormatSorter._calculate_field_preference_from_valuec                    sj    |d} fdd|dkrRd} |d} |dfdd|D }n|} |||S )	Nr   c                    s     | dS )Nr  )r%  r  r  )r  r   r   r   r3    r4  z:FormatSorter._calculate_field_preference.<locals>.<lambda>re  r  rg  c                 3   s   | ]} |V  qd S r   r   r  )	get_valuer   r   r    s     z;FormatSorter._calculate_field_preference.<locals>.<genexpr>)r  r  )r   r  r  r  Zactual_fieldsr   r   )r  r  r   r   _calculate_field_preference  s     z(FormatSorter._calculate_field_preferencec                    s    dst  d<   ds8d kr8t d  d<   ddkrn  ddkr\ d nd d< d d< n d  d< d d<   d	d kr  dd
krtd  dpdrd d	<   ddkrd d<   ddkrd d<   ds  ddkrt fddpd  d<   dsT  ddkrTt fddpNd  d<   dszt fddptd  d< t fddjD S )Nra  r:  rI  rF  rE  rG  r`  r^  rx  r  r\  r   ir   rV  rX  c                      s    d  d  S )NrT  rX  r   r   rW  r   r   r3    r4  z3FormatSorter.calculate_preference.<locals>.<lambda>c                      s    d  d  S )NrT  rV  r   r   r  r   r   r3    r4  rT  c                      s    d  d  S )NrV  rX  r   r   r  r   r   r3    r4  c                 3   s   | ]}  |V  qd S r   )r  r  rW  r   r   r   r    s     z4FormatSorter.calculate_preference.<locals>.<genexpr>)r%  rd  r   rb   rc   r  r  r{  )r   rW  r   r  r   calculate_preference  s,    

2z!FormatSorter.calculate_preference)F)r   r   r   r  r   Zytdl_defaultr  r   r  r  r|  r}  r  r  r  r   r   r   r   rG    s   






















N
"8rG  c                 C   s$   | dks|dk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  )rT  r  r   r   r   filesize_from_tbr  s    r  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   s
   || _ d S r   )_ydl)r   rz  r   r   r   r      s    z_YDLLogger.__init__c                 C   s   | j r| j | d S r   )r  r~  r   messager   r   r   debug  s    z_YDLLogger.debugc                 C   s   | j r| j | d S r   )r  r  r  r   r   r   r    s    z_YDLLogger.infoF)oncec                C   s   | j r| j || d S r   )r  r  )r   r  r  r   r   r   r    s    z_YDLLogger.warningTis_errorc                C   s   | j r| j j||d d S )Nr  )r  Zreport_error)r   r  r  r   r   r   r    s    z_YDLLogger.errorc                 C   s   | j r| j | d S r   )r  Z	to_stdoutr  r   r   r   r
    s    z_YDLLogger.stdoutc                 C   s   | j r| j | d S r   )r  Z	to_stderrr  r   r   r   r    s    z_YDLLogger.stderr)N)
r   r   r   r   r  r  r  r  r
  r  r   r   r   r   r    s   
r  )N)F)rl   F)rg  )N)r  N)T)T)T)r  )N)r%  r7   )r7   F)r-  )NN)N)r  )F)r   )r   NNr   N)N)r   r   N)N)N)r7   N)N)NrB  )r   Nr   )N)N)T)Fr   F)F)N)N)r  r  N)T)r   )NN)NN)r   )N)r   (y  rU  rV  r  r  r   collections.abcrR   r  r  Zemail.headerr  email.utilsr  r  r  html.entitiesr   html.parserr  r  rY  rN   r8   r  r3  netrcr  rJ   rQ   r  rb   r  rI  r\  ru  r  rP   rH   r  r  typesr)  urllib.errorrM  urllib.parseurllib.requestxml.etree.ElementTreer(  r   r   compatr   r   r   r   r	   Zdependenciesr
   r   r.  r   r  Zcompiled_regex_typer   r   r  r  r  r   r  r  r$  ZDATE_FORMATSrb  r  rU  r  rc  Z
JSON_LD_REr  r  r<   r_   rk   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   JSONDecoderr   r  r  r<  r@  r  rK  rY  r\  rc  ro  r   rr  rs  rx  r  
namedtupler  r  r  r  r;   r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r$  r2  r:  r3  r0  rD  rE  r^  ra  ri  rm  rW  rn  rt  rx  rT   r  r}  r  r  	Structurery  r  r  r  r~  r  r  POINTERargtypesZBOOLrestyper  r  r  r  r  r  r  r  r  r   	maketransr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  r  r  r  r$  r'  r  r  r*  r+  r,  r/  r4  r;  r  Zprepend_extensionr"  r>  rA  rF  rI  rL  r  SequencerM  re  rt  rv  rx  r  r  r  r  r  r  r  r  r  Iterabler  r  r  r  r  r  r  r  r  r  r  r  r  ZPOSTPROCESS_WHENZDEFAULT_OUTTMPLZOUTTMPL_TYPESZSTR_FORMAT_RE_TMPLZSTR_FORMAT_TYPESr  r_  r  r  r  r  r2  r5  rM  rX  r\  r]  r^  r_  r`  rd  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rX  rF  rR  rU  r[  r^  r_  r`  ra  re  rj  rl  rm  rn  ru  rx  r{  ZDOT_URL_LINK_TEMPLATEZDOT_WEBLOC_LINK_TEMPLATEZDOT_DESKTOP_LINK_TEMPLATEZLINK_TEMPLATESr  r  r  r  r  r  r  r  r  r  r  r  r  r  rd  r  r  rf  r  r  r  r  r  r  r  r  r  r  r  SimpleNamespacer  r2  r  r  r  r  r  r  r8  r3  r=  r@  rB  rG  r  r  r   r   r   r   <module>   s                                   
      -

+#	('	7	N,	"!*	
&		

A

	G
		8
 
Y+) 	





Q



	\+)	P* ) O  	  

			5


, 
q

 8  *