U
    dC                     @   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
   A/tmp/pip-unpacked-wheel-ua33x9lu/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   s.  zt dj| d t| }t| d }t|d}t dj|d |r\d}t	d t
|dF}||}|sxq|| |rh|t|7 }t	td	| |  qhW 5 Q R X t d
 W nl tk
r }	 ztdj|	j|	jdW 5 d }	~	X Y n6 tk
r( }	 ztdj|	jdW 5 d }	~	X Y nX 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   s6    



  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k
r   t|}Y nX | d
ks|std td tdj |d t| t| dD ]v}ztt| |dj ||d W nP t
k
rr } z0tdj t|d td t| td W 5 d }~X Y nX 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}| |k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tt| dD ]j}t||}tj||}zt||dd W q( t	k
rt   t|| Y q( t
k
r   t|  Y q(X q(d S )N)rH   rI   value_info.jsonF)r;   )ri   r   r   rO   AssertionErrorrV   rD   r   rA   	TypeErrorr:   r   )re   rX   	model_dirrJ   r(   destr
   r
   r   	_download   s    


zModelDownloader._downloadc              	   C   s$  d}|  |}tj|s$| | tj|d}|d| d 7 }t }t|d(}|	|
 }|dt| d 7 }W 5 Q R X ||_tj|d}|d| d 7 }t }	t|d(}|		|
 }|d	t| d 7 }W 5 Q R X |d
 |	_ttj|d}t|}
W 5 Q R X |	||
|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   ro   r   r   ZNetDefr7   ZParseFromStringr8   r"   r   jsonload)re   
model_nameZ	debug_strrm   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*    


z ModelDownloader.get_c2_model_dbgc                 C   s   |  |\}}}}|||fS rc   )rw   )re   ru   Zinit_netZpredict_netrv   _r
   r
   r   get_c2_model   s    zModelDownloader.get_c2_modelN)rb   )__name__
__module____qualname__r\   ri   ro   rw   ry   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]   rs   Zcaffe2.protor   urllib.errorr   r   urllib.requestrequestr1   rC   r   r   SIGINTr   r'   rA   rD   r[   r`   ra   rz   ArgumentParserparseradd_argument
parse_argsrY   rX   r   r0   r
   r
   r
   r   <module>   sJ   	
1=




