
    Jj;                        d dl mZ d dlZd dlZd dlZd dlmZmZ d dlm	Z	 dZ
dZddZddZdd	Zdd
Z G d de      ZddZedk(  r e        yy)    )annotationsN)SimpleHTTPRequestHandlerThreadingHTTPServer)Pathz$bilibili_latest_videos_259655230.csvzapns_device_tokens.txtc                l    t        |       dk\  xr% t        |       dz  dk(  xr t        d | D              S )N@      r   c              3  $   K   | ]  }|d v  
 yw)0123456789abcdefABCDEFN ).0	characters     serve_csv.py	<genexpr>z(is_valid_device_token.<locals>.<genexpr>   s      <?D)	--us   )lenall)tokens    r   is_valid_device_tokenr      s@    u: E
Q! 3  <?D< 9     c                @   g }| j                         rj| j                  d      j                         D cg c]A  }|j                         r/|j	                         j                  d      s|j                         C }}|j                         }||D ch c]  }|j                          c}v ry| j                  dd      5 }| j                         j                  dkD  r|j                  d       |j                  |       d d d        yc c}w c c}w # 1 sw Y   yxY w)	Nutf-8)encoding#Far   
T)exists	read_text
splitlinesstriplstrip
startswithloweropenstatst_sizewrite)tokens_pathr   tokenslinenormalized_tokenexistingfiles          r   save_device_tokenr-      s   F $--w-?JJL
Lzz|DKKM$<$<S$A JJLL 	 
 {{}VDVHNN,VDD			#		0D%%)JJt

#$ 
1 
 E 
1 s   AD
DA DDc                    t               } t        j                         }	 t        j                  |d t        j                        D ]-  }|d   d   }|j                  d      r| j                  |       / 	 	 t        j                  t        j                  t        j                        5 }|j                  d       |j                         d   }|j                  d      s| j                  |       d d d        t        |       S # t        j                  $ r Y w xY w# 1 sw Y   -xY w# t        $ r Y t        |       S w xY w)N   r   z127.)z8.8.8.8P   )setsocketgethostnamegetaddrinfoAF_INETr!   addgaierror
SOCK_DGRAMconnectgetsocknameOSErrorsorted)	addresses	host_nameresultaddressprobes        r   local_ip_addressesrB   )   s
   %I""$I((D&..IFQilG%%f-g& J]]6>>6+<+<=MM/*'')!,G%%f-g&	 > ) ??  >=
  )sC   AD "D 72D( )AD0D( DDD%!D( (	D>=D>c                     t        j                  d      } | j                  ddd       | j                  dt        dd	
       | S )NuI   启动一个本地 HTTP 服务，向 iOS app 提供 B 站最新视频 CSV)descriptionz--hostz0.0.0.0u   监听地址，默认 0.0.0.0)defaulthelpz--porti@  u   监听端口，默认 8000)typerE   rF   )argparseArgumentParseradd_argumentint)parsers    r   build_parserrM   A   sJ    $$_F ):YZ
sD?[\Mr   c                  <     e Zd ZdZd fdZddZddZddZ xZS )CSVServerHandlerzShaanxiUnionCSV/1.0c                    | j                  dd       | j                  dd       | j                  dd       t        | 	          y )NzAccess-Control-Allow-Origin*zAccess-Control-Allow-MethodszGET,POST,OPTIONSzAccess-Control-Allow-HeadersContent-Type)send_headersuperend_headers)self	__class__s    r   rU   zCSVServerHandler.end_headersM   sB    6<79KL7Hr   c                F    | j                  d       | j                          y )N   )send_responserU   )rV   s    r   
do_OPTIONSzCSVServerHandler.do_OPTIONSS   s    3r   c                   | j                   dk7  r| j                  dd       y t        | j                  j	                  dd            }| j
                  j                  |      }	 t        j                  |j                  d            }t        |j	                  dd            j                         }t        |      s| j                  d	d
dd       y t!        | j"                        t$        z  }t'        ||      }| j                  dd|d       y # t        t        j                  f$ r | j                  d	d
dd       Y y w xY w)N/register-tokeni  z	Not FoundContent-Length0r   r    i  Fzinvalid json)okerrorzinvalid device token   T)ra   added)path
send_errorrK   headersgetrfilereadjsonloadsdecodestrr   UnicodeDecodeErrorJSONDecodeError	send_jsonr   r   	directoryTOKENS_FILE_NAMEr-   )rV   content_lengthbodypayloadr   r'   rd   s          r   do_POSTzCSVServerHandler.do_POSTW   s   99))OOC-T\\--.>DEzz~.	jjW!56GGR01779E
 %U+NN3u7M NO4>>*-==!+u5s4%89 #D$8$89 	NN3u~ FG	s   $AD .E Ec                4   t        j                  |d      j                  d      }| j                  |       | j	                  dd       | j	                  dt        t        |                   | j                          | j                  j                  |       y )NF)ensure_asciir   rR   zapplication/json; charset=utf-8r^   )
rk   dumpsencoderZ   rS   rn   r   rU   wfiler&   )rV   status_coderv   datas       r   rq   zCSVServerHandler.send_jsonm   ss    zz'6==gF;')JK)3s4y>:

r   returnNone)r}   rK   rv   zdict[str, object]r   r   )	__name__
__module____qualname__server_versionrU   r[   rw   rq   __classcell__)rW   s   @r   rO   rO   J   s    *N:,r   rO   c            	        t               j                         } t        t              j	                         j
                  t        z  }|j                         st        d|       fd}t        | j                  | j                  f|      }t        d       t        d|        t        dt        z          t        d| j                   dt                t        d| j                   d	       t               D ]$  }t        d
| d| j                   dt                & t        d       	 |j                          |j#                          y # t         $ r t        d       Y 'w xY w# |j#                          w xY w)Nu   找不到 CSV 文件：c                 ,    t        | dt              iS )Nrr   )rO   rn   )handler_argsroots    r   <lambda>zmain.<locals>.<lambda>}   s    $4	%d)%r   u   CSV 服务已启动u   当前 CSV：u   Token 文件：u#   模拟器地址：http://127.0.0.1:/u    Token 注册：http://127.0.0.1:r]   u   真机地址：http://:u   停止服务：按 Ctrl+Cu   
CSV 服务已停止)rM   
parse_argsr   __file__resolveparentCSV_FILE_NAMEr   
SystemExitr   hostportprintrs   rB   serve_foreverKeyboardInterruptserver_close)argscsv_pathhandlerserverr@   r   s        @r   mainr   v   sP   >$$&D>!!#**Dm#H??28*=>>G !$))TYY!7AF	
 	M(
$%	OD#334
56	/		{!M?
KL	,TYYK
GH%'&wiq1]OLM (	
%& 	  '%&' 	s$   2E E*'E- )E**E- -E?__main__)r   rn   r   bool)r'   r   r   rn   r   r   )r   z	list[str])r   zargparse.ArgumentParserr   )
__future__r   rH   rk   r2   http.serverr   r   pathlibr   r   rs   r   r-   rB   rM   rO   r   r   r   r   r   <module>r      s_    "    E  7+ (0)/ )X< zF r   