a
    ==icC                     @   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mZ d dlm	Z	m
Z
 d dlmZ dZdZdd Zeeje dd	 Zd
d Zd'ddZdd Zdd Zdd ZG dd dZedkr:e jddZejdddd ejddd d!d" ejd#d$d d%d" e ZejD ]*Zeer(eee ne d&!e qdS )(    N)
caffe2_pb2)	HTTPErrorURLErrorz3https://s3.amazonaws.com/download.caffe2.ai/models/F   c                 C   s   t d td d S )NzKilling download...r   )printexit)signalframe r
   n/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/caffe2/python/models/download.pysignalHandler   s    r   c                 C   sd   t j| ddD ]F\}}}|D ]}t t j|| q|D ]}t t j|| q:qt |  d S )NF)topdown)oswalkremovepathjoinrmdir)Ztop_dirrootdirsfilesnamer
   r
   r   deleteDirectory"   s    r   c                 C   sR   t t|  d }|d t| d  }tjd| d t|  d  tj  d S )Nd   # z[1000D[z] %)intDOWNLOAD_COLUMNSsysstdoutwritestrflush)
percentagefullbarr
   r
   r   progressBar+   s     r'   Tc           
   
   C   sH  zt dj| d t| }t| d }t|d}t dj|d |r\d}t	d t
|dP}||}|sxq|| |rh|t|7 }t	td	| |  qhW d    n1 s0    Y  t d
 W nr ty }	 z"tdj|	j|	jdW Y d }	~	n@d }	~	0  tyB }	 ztdj|	jdW Y d }	~	n
d }	~	0 0 d S )NzDownloading from {url})urlzContent-Lengthi    zWriting to {filename}filenamer   wbr    z8Could not download model. [HTTP Error] {code}: {reason}.)codereasonz/Could not download model. [URL Error] {reason}.r.   )r   formaturlliburlopenr   infogetstripminr'   openreadr!   lenr   	Exceptionr-   r.   r   )
r(   r*   show_progressresponsesizechunkZdownloaded_size
local_fileZ
data_chunker
   r
   r   downloadFromURLToFile2   s4    



4rA   c                 C   s   dj t| |dS )Nz{base_url}{name}/{filename})base_urlr   r*   )r0   DOWNLOAD_BASE_URL)r   r*   r
   r
   r   getURLFromNameN   s    rD   c                 C   s  dj | d}tjtjt}|jr4dj || d}tj|rvtj|sv|j	s\t
dntdj |d t| tj|r|j	sd}d	}zt|}W n ty   t|}Y n0 | d
ks|std td tdj |d t| t| dD ]v}ztt| |dj ||d W q t
yr } z8tdj t|d td t| td W Y d }~qd }~0 0 q|jrtdj |ddj |d d S )Nz{folder})folderz{dir_path}/{folder})dir_pathrE   zlCannot create folder for storing the model,                            there exists a file of the same name.z'Overwriting existing file! ({filename})r)   r,   z&Model already exists, continue? [y/N] NzCancelling download...r   z)Overwriting existing folder! ({filename}))predict_net.pbinit_net.pbz{folder}/{f})rE   fzAbort: {reason}r/   zCleaning up...z{folder}/__sym_init__.pyz{folder}/__init__.py)r0   r   r   dirnamerealpath__file__installexistsisdirforcer:   r   r   	raw_input	NameErrorinputupperr   r   makedirsrA   rD   r"   symlink)modelargsZmodel_folderrF   r<   queryrJ   r@   r
   r
   r   downloadModelS   sV    



 
r[   c                 C   s&   dg}| |v rdS t d| s"dS dS )N__init__Fz^[/0-9a-zA-Z_-]+$T)rematch)r   invalid_namesr
   r
   r   validModelName   s    r`   c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )ModelDownloaderCAFFE2_MODELSc                 C   s
   || _ d S N)model_env_name)selfrd   r
   r
   r   r\      s    zModelDownloader.__init__c                 C   s:   t jt dd}t | jt j|d}t j||S )NZCAFFE2_HOMEz	~/.caffe2models)r   r   
expandusergetenvrd   r   )re   rX   Zcaffe2_homeZ
models_dirr
   r
   r   
_model_dir   s    zModelDownloader._model_dirc              	   C   s   |  |}tj|rJ t| dD ]f}t||}tj||}zt||dd W q( tyr   t|| Y q( t	y   t
|  Y q(0 q(d S )N)rH   rI   value_info.jsonF)r;   )ri   r   r   rO   rV   rD   r   rA   	TypeErrorr:   r   )re   rX   	model_dirrJ   r(   destr
   r
   r   	_download   s    


zModelDownloader._downloadc                 C   sd  d}|  |}tj|s$| | tj|d}|d| d 7 }t }t|d2}|	|
 }|dt| d 7 }W d    n1 s0    Y  ||_tj|d}|d| d 7 }t }	t|d2}|		|
 }|d	t| d 7 }W d    n1 s0    Y  |d
 |	_ttj|d}t|}
W d    n1 sN0    Y  |	||
|fS )Nzget_c2_model debug:
rH   zc2_predict_pb path: 
rbz c2_predict_pb ParseFromString = rI   zc2_init_pb path: zc2_init_pb ParseFromString = _initrj   )ri   r   r   rO   rn   r   r   ZNetDefr7   ZParseFromStringr8   r"   r   jsonload)re   
model_nameZ	debug_strrl   Zc2_predict_pbZc2_predict_netrJ   Zlen_readZ
c2_init_pbZc2_init_net
value_infor
   r
   r   get_c2_model_dbg   s*    

24
*z ModelDownloader.get_c2_model_dbgc                 C   s   |  |\}}}}|||fS rc   )rv   )re   rt   Zinit_netZpredict_netru   _r
   r
   r   get_c2_model   s    zModelDownloader.get_c2_modelN)rb   )__name__
__module____qualname__r\   ri   rn   rv   rx   r
   r
   r
   r   ra      s
   
ra   __main__z&Download or install pretrained models.)descriptionrX   +zModel to download/install.)nargshelpz-iz	--install
store_truezInstall the model.)actionr   z-fz--forcezForce a download/installation.z'{}' is not a valid model name.)T)"argparser   r   r   r]   rr   Zcaffe2.protor   urllib.errorr   r   Zurllib.requestrequestr1   rC   r   r   SIGINTr   r'   rA   rD   r[   r`   ra   ry   ArgumentParserparseradd_argument
parse_argsrY   rX   r   r0   r
   r
   r
   r   <module>   sJ   	
1=




