
    ֝Dj                     Z   S r SSKrSSKrSSKrSSKrSSKrSSKJrJ	r	J
r
JrJr  \" \SS9rSrSrSr\R$                  R'                  S5      r\R+                  S	5      \R+                  S
5      SS j5       5       r\R+                  S5      S 5       r\R+                  S5      S 5       r\R+                  S5      S 5       r\R+                  S5      S 5       r\R+                  S5      S 5       r\R+                  S5      S 5       r\S:X  a"  \" S5        \" S5        \R=                  SSSS9  gg) z]
Ultimate Player - Flask backend serving SanuFlix frontend.
Runs at http://192.168.1.50:8800
    N)FlaskResponserequestjsonifysend_from_directory)static_folder 7e4d48e68abb9a4f2c86a1cc143cd8b5z	127.0.0.1i  z~/addon-audit/sanuflix/dist/z/<path:path>c                 6   U (       a$  [         R                  R                  [        U 5      O#[         R                  R                  [        S5      nU (       a4  [         R                  R	                  U5      (       a  [        [        U 5      $ [        [        S5      $ )N
index.html)ospathjoinDISTisfiler   )r   	file_paths     0/home/rurouni/addon-audit/ultimate-player/app.pyserve_frontendr      sZ     -1T4(bggll46VIy))"4..t\22    z/api/searchc                     [         R                  R                  SS5      n U (       d  [        / 5      $ S[         S[
        R                  R                  U 5       3n [
        R                   R                  USS9n[        R                  " UR                  5       5      n[        UR                  S/ 5      S S  Vs/ s Hr  nUS	   UR                  S
S5      UR                  S5      =(       d    SS S UR                  S5      (       a  SUS    3OSUR                  S5      =(       d    SS S S.PMt     sn5      $ s  snf !   [        / 5      s $ = f)Nq z2https://api.themoviedb.org/3/search/movie?api_key=z&query=
   timeoutresults   idtitlerelease_date   poster_pathzhttps://image.tmdb.org/t/p/w342overview   )r   r   yearposterr#   )r   argsgetr   TMDB_KEYurllibparsequoteurlopenjsonloadsread)r   urlrdatams        r   
api_searchr5      s>   b!AWR[ >xjPVP\P\PbPbcdPeOf
gCNN""3"3zz!&&(#AE)TVAWX[Y[A\^A\A  gaeeGB.?nH]HcacegfgGhMNUUS`MaMa6q7G6HIgij)/R#68A\^ _ 	_ ^ 72;s    AE  ;A9D;4E  ;E   Ez/api/movie/<tmdb_id>c                    SU  S[          S3n [        R                  R                  USS9n[        R
                  " UR                  5       5      n[        R
                  " [        R                  R                  SU  S[          3SS9R                  5       5      n[        XR                  SS	5      UR                  S
5      =(       d    S	S S UR                  SS5      UR                  S/ 5       Vs/ s H  oUS   PM	     snUR                  SS	5      UR                  S5      (       a  SUS    3OS	UR                  SS5      UR                  SS	5      S.	5      $ s  snf !   [        SS05      S4s $ = f)Nz#https://api.themoviedb.org/3/movie/z	?api_key=z0&append_to_response=credits,release_dates,videosr   r   z/external_ids?api_key=   r   r   r    r!   runtimer   genresnamer#   r"   zhttps://image.tmdb.org/t/p/w500vote_averageimdb_id)	r   r   r%   r8   r9   r#   r&   ratingr<   errorz	not foundi  )	r)   r*   r   r-   r.   r/   r0   r   r(   )tmdb_idr1   r2   r4   extgs         r   	api_movierB   (   s   /y	(K{
|C7NN""3"3AFFH9MQjj//2UV]U^^tu}t~0  IJ/  K  P  P  R  SWUU72->quu^G\Gb`bdfefFgrsrwrw  yB  CD  sE)*x);<);Ai);<jY[H\MNUUS`MaMa6q7G6HIgistsxsx  zH  IJ  tK  VY  V]  V]  ^g  hj  Vkl m 	m<67GK01366s   C#E  2E AE  E   E3z/api/torrentsc                    ^ [         R                  R                  SS5      n U (       d  [        / 5      $ / n[	        5       n [
        R                   R                  [
        R                   R                  S[
        R                  R                  U 5       S3SS0S9SS	9n[        R                  " UR                  5       5       GH  nUR                  S
S5      R                  5       R                  5       n[        UR                  SS5      5      nU(       a  US:X  d  US:X  a  Mb  XR;   a  Mi  UR!                  U5        UR                  SS5      R                  5       m[#        U4S jS 5       5      (       a  SOST;   a  SO	ST;   a  SOSnUR%                  XTR                  SS5      Xg[        UR                  SS5      5      SS.5        GM
      [
        R                   R                  [
        R                   R                  S[
        R                  R                  U 5       S3SS0S9SS	9nUR                  5       R'                  SSS9n[(        R*                  " S U5       Hq  n	U	R-                  S!5      R                  5       n[        U	R-                  S"5      5      nUS:X  d  XR;   a  MI  UR!                  U5        UR%                  XPUSSS#S.5        Ms     UR/                  S$ S%S&9  [	        5       n
/ nU H3  nUS'   U
;  d  M  U
R!                  US'   5        UR%                  U5        M5     [        US S( 5      $ !    GNq= f!    Np= f))Nr   r   zhttps://apibay.org/q.php?q=z&cat=0z
User-AgentzMozilla/5.0)headersr   r   	info_hashseedersr   (0000000000000000000000000000000000000000r:   Unknownc              3   ,   >#    U  H	  oT;   v   M     g 7f)N ).0xns     r   	<genexpr>api_torrents.<locals>.<genexpr>E   s     @,?qF,?s   )21604kuhd4K10801080p720720pSDsizeTPB)hashr   seedsqualityrY   sourcezhttps://bitsearch.to/search?q=z&category=1zutf-8replace)errorsz`infohash["\']?\s*[:=]\s*["\']?([a-fA-F0-9]{40})["\']?.*?seeders["\']?\s*[:=]\s*["\']?(\d+)["\']?      	BitSearchc                     U S   $ )Nr\   rJ   r2   s    r   <lambda>api_torrents.<locals>.<lambda>U   s    qzr   Tkeyreverser[   2   )r   r'   r(   r   setr*   r-   Requestr+   r,   r.   r/   r0   striplowerintaddanyappenddecoderefinditergroupsort)r   r   seenr2   dihr\   r   bodyr4   seen2dedupedrM   s               @r   api_torrentsr   4   s!   LLWb)E$G5D
NN""6>>#9#9<WX^XdXdXjXjkpXqWrrx:y  DP  Q^  C_#9  $`  ik"  lAFFH%A{2&,,.446BAEE)TUDV@WIIUVWZYaz8HHRLfY'--/A@,?@@@RX\]R]wnswxnxdj  CANN2eeF2.>u`cdedidijpqrds`t  D  E  F &NN""6>>#9#9<Z[a[g[g[m[mns[tZu  vA  ;B  LX  Yf  Kg#9  $h  qs"  tvvxwy9  A  CG  HA!!#BS_UzRZHHRLNN2EDXYcnop	 H LL)4L8EEGV9E!IIai NN1 
 73B<  - D Ds   FL: DM :L?Mz/stream/<hash>c                   ^^
 U (       a  [        U 5      S:  a  g [        R                  R                  [        R                  R	                  S[
         S[         S3[        R                  " SSU  3SS	.5      R                  5       S
S0S9SS9  Sn [        R                  R                  [        R                  R	                  S[
         S[         S3[        R                  " SU S.5      R                  5       S
S0S9SS9n[        R                  " UR                  5       5      n[        U[        5      (       a  U(       a  US   O0 nUR                  S/ 5      nU(       aQ  U V^s/ s H!  m[        U4S jS 5       5      (       d  M  TPM#     nnU(       a  [!        [#        US SS9S   S   5      n [        R                  R                  S[
         S[         SU  SU 3SS9m
U
4S jn[%        T
R&                  5      n[)        U" 5       SUR                  S
S5      UR                  SS 5      S!S"S#S$.5      $ !    GN= fs  snf !    N= f! [*         a  n	S%U	 3S&4s S n	A	$ S n	A	ff = f)'Nr   )zInvalid hash  http://:	/torrentsrq   zmagnet:?xt=urn:btih:T)actionlink
save_to_dbContent-Typeapplication/jsonr3   rD   r   1r(   r   r[   r7   r   
file_statsc              3      >#    U  H4  nTR                  S S5      R                  5       R                  U5      v   M6     g7f)r   r   N)r(   ro   endswith)rK   efs     r   rN   !stream_torrent.<locals>.<genexpr>q   s@       &B  UAqaeeF2&6&<&<&>&G&G&J&J  UAs   <?)z.mp4z.mkvz.aviz.movz.webmz.m4vc                 &    U R                  SS5      $ )Nlengthr   )r(   )r   s    r   rf    stream_torrent.<locals>.<lambda>r   s    155!3Dr   rh   r   z/play/r
   <   c               3   L   >#     TR                  S5      n U (       d  g U v   M  7f)Ni   )r0   )ctss    r   rA   stream_torrent.<locals>.gw   s%     GGEN% s   !$r$   z	video/mp4Content-Lengthr   bytes*inline)r   r   zAccept-RangeszAccess-Control-Allow-OriginzContent-DispositionzStream error:   )lenr*   r   r-   rm   TS_HOSTTS_PORTr.   dumpsencoder/   r0   
isinstancelistr(   rr   strsorteddictrD   r   	Exception)r[   fidr2   rz   fsr   vrA   hr   r   s        `    @r   stream_torrentr   `   st   3t9r>*=v~~55y'R[6\e5I$3P^bcdkkm  xF  GY  wZ  6  [ df 	 	g C	NN""6>>#9#9GG9AgYV_:`e489@@BN[mKn $: $pxy # {JJqvvx aAAaD2UU<#  CBq#  &B  UA  &B  #BBA  CF1)DTRSTUVZ[\#	<^^##ggYaytfAcU$S\^#_	
 Cn[0Qcdchchiyz|c}  OV  ux  OW  !X  Y  	Y- D CD ;N1#"6";;;sP   A5H; CI )II$I 6BI ;I I I
I*I%I*%I*z/api/ts_statusc                       [         R                  R                  S[         S[         S3SS9n [        S[        U R                  5       5      05      $ !   [        SS05      s $ = f)Nr   r   z/echorb   r   aliveF)r*   r   r-   r   r   r   boolr0   re   s    r   	ts_statusr      s\    ,NN""WWIQwiu#Ea"PQVVX/00+7GE?++s   AA A$z/api/torrent_statusc            
         [         R                  R                  SS5      n U (       d  [        SS05      S4$  [        R                   R                  [        R                   R                  S[         S[         S3[        R                  " S	U S
.5      R                  5       SS0S9SS9n[        R                  " UR                  5       5      n[        U[        5      (       a  U(       a  US   O0 n[        UR                  SS5      UR                  SS5      [!        UR                  S/ 5      5      UR                  SS5      S.5      $ !   [        SS05      S4s $ = f)Nr[   r   r>   zno hashr   r   r   r   r(   r   r   r   r   r7   r   r   statstat_stringr   total_peers)r   r   filespeersfailedr   )r   r'   r(   r   r*   r-   rm   r   r   r.   r   r   r/   r0   r   r   r   )r   r2   rz   s      r   torrent_statusr      sS   #AWgi01#553NN""6>>#9#9GG9AgYV_:`e156==?XjHk $: $muv # xJJqvvx a11Q4"qquuVAQUU=QS=T]`abafafgstvaw]x  BC  BG  BG  HU  VW  BX  Y  Z  	Z27GH-.s22s   DE	 	E__main__u(   
  🎬 Ultimate Player with SanuFlix UIz  http://192.168.1.50:8800Fz0.0.0.0i`"  )debughostport)r   )__doc__r   r.   urllib.requestr*   urllib.parseru   flaskr   r   r   r   r   __name__appr)   r   r   r   
expanduserr   router   r5   rB   r   r   r   r   printrunrJ   r   r   <module>r      s`   2 1 1 H HHD) .

	ww78 3>3  3 =
 
 !"7 #7 ?(! (!V < <> , ,  !	3 "	3 z	57	&(GG%idG3 r   