U
    %d~                  
   @   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m	Z	m
Z
mZmZ d dlmZ deee eee
dddZdeeee ee eeeddddZde	eeedddZdeee eee dddZdS )    N)AnyIterableListOptional)tqdm   T)url
start_byte
block_sizeprogress_barreturnc              
   c   s   t jj| dd}t j|}t| dd}W 5 Q R X ||krHdS t j| }|rhd||jd< t j|\}t	dd	d
|| d<}d}	|
|}
|
sq|
V  |	t|
7 }	|t|
 qW 5 Q R X W 5 Q R X dS )aD  Stream url by chunk

    Args:
        url (str): Url.
        start_byte (int or None, optional): Start streaming at that point (Default: ``None``).
        block_size (int, optional): Size of chunks to stream (Default: ``32 * 1024``).
        progress_bar (bool, optional): Display a progress bar (Default: ``True``).
    HEADmethodContent-LengthNz	bytes={}-ZRangeBTi   )unitZ
unit_scaleZunit_divisortotaldisabler   )urllibrequestRequesturlopenintinfogetformatheadersr   readlenupdate)r   r	   r
   r   reqresponseZurl_sizeZupointerZpbar	num_byteschunk r&   =/tmp/pip-unpacked-wheel-lbdmvq91/torchaudio/datasets/utils.py
stream_url   s.    
r(   sha256F)r   download_folderfilename
hash_value	hash_typer   resumer   c              	   C   sb  t d tjj| dd}tj| }|p@| p@tj	
| }tj	||}	|rrtj	|	rrd}
tj	|	}n(|stj	|	rtd|	nd}
d}|r|t|dd	krt|	d
 }t|||rW 5 Q R  dS W 5 Q R X td|	t|	|
&}t| ||dD ]}|| q
W 5 Q R X t|	d
(}|rTt|||sTtd|	W 5 Q R X dS )aP  Download file to disk.

    Args:
        url (str): Url.
        download_folder (str): Folder to download file.
        filename (str or None, optional): Name of downloaded file. If None, it is inferred from the url
            (Default: ``None``).
        hash_value (str or None, optional): Hash for url (Default: ``None``).
        hash_type (str, optional): Hash type, among "sha256" and "md5" (Default: ``"sha256"``).
        progress_bar (bool, optional): Display a progress bar (Default: ``True``).
        resume (bool, optional): Enable resuming download (Default: ``False``).
    zDdownload_url is deprecated and will be removed in the v0.12 release.r   r   abz6{} already exists. Delete the file manually and retry.wbNr   r   rbzBThe hash of {} does not match. Delete the file manually and retry.)r	   r   )warningswarnr   r   r   r   r   get_filenameospathbasenamejoinexistsgetsizeRuntimeErrorr   r   r   openvalidate_filer(   write)r   r*   r+   r,   r-   r   r.   r"   Zreq_infofilepathmodeZ
local_sizefile_objZfpointerr%   r&   r&   r'   download_url7   s.    
rB   )rA   r,   r-   r   c                 C   sP   |dkrt  }n|dkr$t  }nt| d}|s8qD|| q(| |kS )a8  Validate a given file object with its hash.

    Args:
        file_obj: File object to read from.
        hash_value (str): Hash for url.
        hash_type (str, optional): Hash type, among "sha256" and "md5" (Default: ``"sha256"``).

    Returns:
        bool: return True if its a valid file, else False.
    r)   md5i   )hashlibr)   rC   
ValueErrorr   r!   	hexdigest)rA   r,   r-   Z	hash_funcr%   r&   r&   r'   r=   l   s    


r=   )	from_pathto_path	overwriter   c              
   C   sj  |dkrt j| }zt| d}td|  g }|D ]T}t j||j	}|
 r|| t j|rtd| |sq<||| q<|W  5 Q R  W S Q R X W n tjk
r   Y nX zt| dh}td|  | }|D ]D}t j||}t j|r(td| |s(q||| qW 5 Q R X |W S  tjk
r\   Y nX tddS )a  Extract archive.
    Args:
        from_path (str): the path of the archive.
        to_path (str or None, optional): the root path of the extraced files (directory of from_path)
            (Default: ``None``)
        overwrite (bool, optional): overwrite existing files (Default: ``False``)

    Returns:
        List[str]: List of paths to extracted files even if not overwritten.

    Examples:
        >>> url = 'http://www.quest.dcs.shef.ac.uk/wmt16_files_mmt/validation.tar.gz'
        >>> from_path = './validation.tar.gz'
        >>> to_path = './'
        >>> torchaudio.datasets.utils.download_from_url(url, from_path)
        >>> torchaudio.datasets.utils.extract_archive(from_path, to_path)
    NrzOpened tar file {}.z{} already extracted.zOpened zip file {}.z7We currently only support tar.gz, tgz, and zip achives.)r5   r6   dirnametarfiler<   loggingr   r   r8   nameisfileappendr9   extract	ReadErrorzipfileZipFilenamelist
BadZipFileNotImplementedError)rG   rH   rI   tarfilesfile_	file_pathzfiler&   r&   r'   extract_archive   sB    
r]   )Nr   T)NNr)   TF)r)   )NF)rD   rM   r5   rL   r   urllib.requestr2   rS   typingr   r   r   r   Ztorch.utils.model_zoor   strr   boolr(   rB   r=   r]   r&   r&   r&   r'   <module>   sH           ,     5