
    gW                         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 d dlm	Z	 d dlm
Z
 d dlmZ d Zd Zd Zdd	Zdd
Zd Zd Zd ZddZddZd Zy)    N)common)helpers)logger)requestc                 p   t         j                  j                  r"dt         j                  j                  z   dz   g}ndg}t        j                         j                         dk(  r|j                  d       d x}}|D ]  }|dz   | z   }	 t        j                  d|z   dz   t         j                  z          t        j                  |t        j                  t        j                  dt         j                  	      }|j                         \  }}|j                         j!                         }t        j                  d
|z          d|v sd|v rt        j                  d|z          d }d|v s|rt        j$                  d       d }|s ||fS  ||fS # t"        $ r t        j                  d|       Y 8w xY w)N"gitdarwinz/usr/local/git/bin/git zTrying to execute: "z" with shell in T)stdoutstderrshellcwdzGit output: zCommand failed: %sz	not foundz1not recognized as an internal or external commandz Unable to find git with command zfatal:z?Git returned bad info. Are you sure this is a git installation?)plexpyCONFIGGIT_PATHplatformsystemlowerappendr   debugPROG_DIR
subprocessPopenPIPESTDOUTcommunicatestripdecodeOSErrorerror)argsgit_locationsoutputerrcur_gitcmdps          $/opt/Tautulli/plexpy/versioncheck.pyrunGitr*   !   s   }}v}}555;< H,56FS  md"		LL/#58JJV__\]  Z__ZEVEV^bhnhwhwxA--/KFC\\^**,FLL&01
 & $W[a$aLL;cABF3LLZ[F3;/. 3;  	LL-s3	s   	B9FF54F5c                  <   t         j                  r0t        j                  dk(  rdt         _        t               \  } }| d|fS t         j                  r0t        j                  dk(  rdt         _        t               \  } }| d|fS t        j                  j                  t        j                  j                  t         j                  d            rdt         _        t        d      \  }}|st        j                  d	       d }n8t        |      }t        j                   d
|      st        j                  d       d }t         j"                  j$                  r8t         j"                  j&                  rd }t         j"                  j&                  }n:t        d      \  }}|r|j)                  dd      ng }t+        |      dk(  r|\  }}nd x}}|sdt         j"                  j,                  rJt        j                  dt         j"                  j,                  z         t         j"                  j,                  }|st        j                  d       d}|sdt         j"                  j&                  rJt        j                  dt         j"                  j&                  z         t         j"                  j&                  }|st        j                  d       d}|||fS t         j.                  rdt         _        n't         j0                  rdt         _        ndt         _        t               \  } }| d|fS )NWindowswindowsoriginDarwinmacosz.gitr	   zrev-parse HEADz(Could not find latest installed version.z^[a-z0-9]+$z/Output does not look like a hash, not using it.z0rev-parse --abbrev-ref --symbolic-full-name @{u}/      z<Could not retrieve remote name from git. Falling back to %s.z>Could not retrieve remote name from git. Defaulting to origin.z<Could not retrieve branch name from git. Falling back to %s.z>Could not retrieve branch name from git. Defaulting to master.masterdockersnapsource)r   FROZENr   PLATFORMINSTALL_TYPEget_version_from_fileospathisdirjoinr   r*   r   r!   strrematchr   DO_NOT_OVERRIDE_GIT_BRANCH
GIT_BRANCHrsplitlen
GIT_REMOTEDOCKERSNAP)current_versioncurrent_branchr$   r%   cur_commit_hashremote_namebranch_nameremote_branchs           r)   get_versionrP   G   sK   }}I5'*?*A'.88	6??h6%*?*A'.88	rww||FOOV<	=#-.LLCD"O!&kO88M?;NO"&==338P8PK --22K "((Z![M3<IM00a8rM=!Q&+8([,00k6==#;#;[^d^k^k^v^vvw$mm66]^&6==#;#;[^d^k^k^v^vvw$mm66]^&[88 =="*F[["(F"*F*?*A'.88    c                  r   t         j                  j                  t        j                  d      } t         j                  j                  t        j                  d      }t         j                  j                  |       r5t        | d      5 }|j                         j                  d      }d d d        nd }t         j                  j                  |      r8t        |d      5 }|j                         j                  d      }d d d        |fS t        j                  }|fS # 1 sw Y   txY w# 1 sw Y   fS xY w)Nversion.txtz
branch.txtrz 
)r<   r=   r?   r   r   isfileopenreadr   r   BRANCH)version_filebranch_filefrJ   rK   s        r)   r;   r;      s    77<<?L'',,v=K	ww~~l#,$ 	6ffhnnW5O	6 	6 	ww~~k"+s# 	5qVVX^^G4N	5
 N**  N**	6 	6	5
 N**s    D D*D'*D6c                    t        | ||       t        j                  sd t        _        nt        j                  dkD  rst        j
                  j                  dv s t        j                  st        j                  r7t        j
                  j                  t        j                  k7  rdt        _        nkt        j                  dkD  rMt        j                  s=t        j                  s-t        j                  t        j                  k7  rdt        _        ndt        _        t        j                  rt        j                  j                          y t        j                  rt        j                  j                          y y )N	schedulernotify	use_cacher   r4   betareleasecommitF)check_githubr   CURRENT_VERSIONUPDATE_AVAILABLECOMMITS_BEHINDr   rX   rI   r8   RELEASELATEST_RELEASELATEST_VERSIONWIN_SYS_TRAY_ICONchange_tray_update_iconMAC_SYS_TRAY_ICONr]   s      r)   check_updatero      s    9VyI!!"&				"]]!!%776;;&--MM!!V%:%::"+				"FMM""f&;&;;"*"'  88:		!	!  88: 
"rQ   c                    dt         _        t         j                  j                  r,ddj	                  t         j                  j                        i}ni }t        d|      }|st        j                  d       dt         j                  j                  dt         j                  j                  d	t         j                  j                  }t        j                  ||d
d       }t        d|       |%t        j                  d       t         j                  S |d   t         _        t        j                   dt         j                         t         j                  s%t        j                  d       t         j                  S t         j                  t         j                  k(  r%t        j                  d       t         j                  S t        d|      }|st        j                  d       dt         j                  j                  dt         j                  j                  dt         j                  dt         j                  }t        j                  ||d
dd       }t        d|       |%t        j                  d       t         j                  S 	 t#        |d         }t        j                   d|       t         j$                  st         j&                  rzt         j                  j                  dk(  r]t)        |d         D ]!  }d|d   d    vr|d   t         _         n|d!z  }# t         j$                  rd"nd#}	t        j                   d$|	|       |t         _        t         j                  dkD  rt        j                  d&t         j                  z         t        d'|      }
|
s`dt         j                  j                  dt         j                  j                  d(}t        j                  |d
dd) *      }
t        d'|
       |
%t        j                  d+       t         j                  S t         j                  j                  d,k(  rt-        d- |
D        |
d         }nmt         j                  j                  d.k(  rt-        d/ |
D        |
d         }n9t         j                  j                  dk(  rt-        d0 |
D        |
d         }n|
d   }|d1   t         _        t         j                  j                  d2v r;|d3   t         j                  k(  r%t        j                  d       t         j                  S |r@t         j0                  j3                  d4|t         j                  t         j                  d5       | rvt         j                  j4                  r\t         j$                  sLt         j&                  s<t         j6                  s,t        j                  d6       t        j8                  d7d78       t         j                  S t         j                  dk(  rt        j                  d       t         j                  S # t*        $ r$ t        j                  d%       dt         _        Y w xY w)9Nr   Authorizationztoken {}version)r`   z1Retrieving latest version information from GitHubzhttps://api.github.com/repos/r1   z	/commits/   c                 &    t        |       t        k(  S Ntypedictxs    r)   <lambda>zcheck_github.<locals>.<lambda>       47d? rQ   )headerstimeout	validator)github_datazZCould not get the latest version from GitHub. Are you running a local development version?shazLatest version is %szXYou are running an unknown version of Tautulli. Run the updater to identify your versionzTautulli is up to datecommitsz@Comparing currently installed version with latest GitHub versionz	/compare/z...i  c                 &    t        |       t        k(  S ru   rv   ry   s    r)   r{   zcheck_github.<locals>.<lambda>   r|   rQ   )r}   r~   whitelist_status_coder   z)Could not get commits behind from GitHub.ahead_byzIn total, %d commits behindnightlyz	[skip ci]rd   messager2   zDocker containerzSnap packagez%s %d commits behindzECannot compare versions. Are you running a local development version?z3New version is available. You are %s commits behindreleasesz	/releasesc                 &    t        |       t        k(  S ru   )rw   listry   s    r)   r{   zcheck_github.<locals>.<lambda>   s    Q4 rQ   )r~   r   r   z#Could not get releases from GitHub.r4   c              3   ,   K   | ]  }|d    r	|  yw)
prereleaseN .0rT   s     r)   	<genexpr>zcheck_github.<locals>.<genexpr>  s     G!qAGs   
rb   c              3   J   K   | ]  }|d    j                  d      r|  yw)tag_namez-nightlyN)endswithr   s     r)   r   zcheck_github.<locals>.<genexpr>
  s!     Z!q}7M7Mj7YAZs   ##c              3       K   | ]  }|  y wru   r   r   s     r)   r   zcheck_github.<locals>.<genexpr>  s     0!A0s   r   ra   target_commitishon_plexpyupdate)notify_actionplexpy_download_infoplexpy_update_commitplexpy_update_behindzRunning automatic update.T)restartupdate)r   rh   r   	GIT_TOKENformatgithub_cacher   infoGIT_USERGIT_REPOrD   r   request_jsonwarnrf   rk   r   intrH   rI   reversedKeyErrornextrj   NOTIFY_QUEUEputPLEXPY_AUTO_UPDATEr8   shutdown)r^   r_   r`   r}   rr   urlr   r   rd   installr   rc   s               r)   re   re      s   F}}"J$5$5fmm6M6M$NO9	:GGHAGAWAWAGAWAWAGAYAY[ &&sGR1JLYG4pq%%%#ENF
LL')>)>? !!no$$$ 6 66,-$$$9	:GVWFLmmF\F\FLmmF\F\FLF\F\FLF[F[] &&sGR_b1JLYG4?@$$$"wz*+2H= MMV[[fmm.F.F).S"79#56 fX&6y&AA,25MF)A	
 -3MM(~GLL/(C (
 q IFLaLaab
i@CI==CYCYCI==CYCY[C++CSV6OQH:KK=>(((==##x/GxGRSUG]]%%/ZxZ\def\ghG]]%%20x0(1+>GqkG '
 3==##'99gFX>Y]c]s]s>sKK01)))##6G=D=C=R=R=C=R=R%T U
 99MM&++fmmKK34OOD6
     
		!	#,-   a  "[\ !"s   C	X5 5)Y"!Y"c            	      :
   t         j                  sy t         j                  dv ry t         j                  dk(  rt        dj	                  t         j
                  j                  t         j
                  j                              \  } }| st        j                  d       y | j                  d      D ]L  }d|v sd|v rt        j                  d        y |j                  d	      s4t        j                  d
|z           y  t                y t         j                  dk(  rdj	                  t         j
                  j                  t         j
                  j                  t         j
                  j                        }t         j"                  j%                  t         j&                  d      }t         j"                  j%                  t         j(                  d      }t        j                  d|z          t+        j,                  |      }|st        j                  d|       y t         j
                  j                  dz   }t         j"                  j%                  t         j&                  |      }t/        |d      5 }	|	j1                  |       d d d        t        j                  d|z          t3        j.                  |      }
|
j5                  |       |
j7                          t        j                  d|z          t!        j8                  |       t!        j:                  |      D cg c]B  }t         j"                  j=                  t         j"                  j%                  ||            sA|D }}t?        |      dk7  r"t        j                  dtA        |      z          y t         j"                  j%                  ||d         }t!        jB                  |      D ]  \  }}}|t?        |      dz   d  }|D ]  }t         j"                  j%                  |||      }t         j"                  j%                  t         j(                  ||      }t         j"                  jE                  |      rt!        j8                  |       t!        jF                  ||         	 t/        |d      5 }	|	j1                  tA        t         jH                               d d d        t                y y # 1 sw Y   RxY wc c}w # 1 sw Y   'xY w# tJ        $ r }t        j                  d|       Y d }~y d }~ww xY w)N)r5   r6   r-   r0   r	   zpull --ff-only {} {}z!Unable to download latest version
Already up-to-date.Already up to date.z!No update available, not updatingAbortingz	Aborting.zUnable to update from git: r7   z#https://github.com/{}/{}/tarball/{}r   rS   zDownloading update from: z6Unable to retrieve new version from '%s', can't updatez-githubwbzExtracting file: zDeleting file: r2   z$Invalid update data, update failed: r   wzGUnable to write current version to version.txt, update not complete: %s)&r   rg   r:   r*   r   r   rG   rD   r   r!   splitr   r   	clean_pycr   r   r<   r=   r?   DATA_DIRr   r   request_contentrV   writetarfile
extractallcloseremovelistdirr>   rF   r@   walkrU   renamesrk   IOError)r$   r%   linetar_download_url
update_dirversion_pathdatadownload_nametar_download_pathr[   tarrz   update_dir_contentscontent_dirdirnamedirnames	filenamescurfileold_pathnew_pathes                        r)   r   r   '  s   ""DD				%3::6==;S;S;A==;S;SU V LL<=LL& 	D$,0E0M?@89:TAB	 					(@GGH^H^HNH^H^HNH`H`b WW\\&//8<
ww||FOO]C/2BBC&&'78LLQScd009<GGLL-H #T* 	aGGDM	 	'*;;<ll,-z"		 	%(99:
		#$ +-**Z*@oQBGGMMRTRYRYR^R^_iklRmDnqoo"#q(LL?#FYBZZ[ggll:/B1/EF -/GGK,@ 	/(GXyc+.234G$ /77<<WgF77<<'J77>>(+IIh'

8X./	/	lC( 4AF11234 	y 
)$	 	 p&4 4 	LLY 	sI   1SAS  S 
S1 )S%?S1 S%S.*S1 1	T:TTc                     t         j                  dk(  r5t        j                  dj	                  t         j
                  j                  t         j
                  j                  t        j                               t        dj	                  t         j
                  j                  t         j
                  j                  t         j
                  j                              \  } }t        dj	                  t         j
                  j                              \  } }t        dj	                  t         j
                  j                              \  } }t        dj	                  t         j
                  j                  t         j
                  j                              \  } }t        dj	                  t        j                              \  } }t        d      \  }}| st        j                  d	       y
| j                  d      D ]L  }d|v sd|v rt        j                  d        y|j                  d      s4t        j                  d|z           y
 y y )Nr	   z-Attempting to reset git install to "{}/{}/{}"z.remote set-url {} https://github.com/{}/{}.gitfetch {}checkout {}zbranch -u {}/{}zreset --hard {}z	clean -fdz&Unable to reset Tautulli installation.Fr   r   r   z)Tautulli installation reset successfully.Tr   z'Unable to reset Tautulli installation: )r   r:   r   r   r   r   rG   rD   r   ri   r*   r   r   r!   r   r   )r$   r%   _r   s       r)   reset_git_installr     s   e#CJJ6==KcKcKQ==KcKcKQ>>[ 	\ MTTU[UbUbUmUmU[UbUbUkUkU[UbUbUkUkm n Z..v}}/G/GHI]11&--2J2JKL.55fmm6N6N6<mm6N6NP Q.55fnnEFk"1LLABLL& 	D$,0E0MGH89FMN	' $rQ   c                     t         j                  dk(  rgt        j                  dj	                  t         j
                  j                  t         j
                  j                               t        dj	                  t         j
                  j                              \  } }t        dj	                  t         j
                  j                              \  } }| st        j                  d       y | j                  d      D ]-  }|j                  d      st        j                  d|z           y  t        d	j	                  t         j
                  j                  t         j
                  j                              \  } }y y )
Nr	   z)Attempting to checkout git branch "{}/{}"r   r   zUnable to change git branch.r   r   zUnable to checkout from git: z
pull {} {})r   r:   r   r   r   r   rG   rD   r*   r!   r   r   )r$   r%   r   s      r)   checkout_git_branchr     s   e#?FFv}}G_G_GM}}G_G_a 	b Z..v}}/G/GHI]11&--2J2JKLLL78LL& 	D}}67<tCD	
 \001I1I171I1IK L! $rQ   c                    t        j                         }t        j                  j	                  t
        j                  j                  dj                  |             }|rD||t        j                  d}	 t        |dd      5 }t        j                  ||       d d d        y y |sy 	 t        |dd      5 }t        j                  |      }d d d        |d   z
  t
        j                  j                  k  r2|d   t        j                  k(  rt!        j"                  d	|        |d
   S y y # 1 sw Y   xY w#  Y y xY w# 1 sw Y   rxY w#  Y y xY w)Nzgithub_{}.json)r   _cache_time_release_versionr   zutf-8)encodingrT   r   r   zUsing cached GitHub %s datar   )r   	timestampr<   r=   r?   r   r   	CACHE_DIRr   r   ri   rV   jsondumploadCHECK_GITHUB_CACHE_SECONDSr   r   )cacher   r`   r   cache_filepath
cache_data
cache_files          r)   r   r     s3   !!#IWW\\&--"9"9;K;R;RSX;YZN%0%.*0..:
	ncG< 2
		*j12 2
 
	ncG< 3
!YYz2
3 J}558`8``-.&..@:EB!-00 A a2 2	
3 3	sI   3D4 D(D4 &E 4D;
AE (D1-D4 4D8;E E Ec           	         t         j                  j                  t        j                  d      }t         j                  j                  |      sy	 dg}d}d}t        j                  d      }t        j                  d      }d}t        t        j                        }	t        |d      5 }
|
D ]  }t        j                  ||      }t        j                  ||      }|rt        t        |j                  d	                  }|j                  d
      }|j                         dk(  rz|r nF| rd}nW|rU|	j                  d      r&|s$|	dz   |v r n"|	j!                  dd      dz   |v r!d}n|	j                  d      r|r n|	dz   |v r n|dxx   d|z   dz   |z   dz   |z   dz   z  cc<   |rt        |j                  d	            d
z  }|j                  d
      }||kD  r|dxx   d||z
  z  dz   |z   dz   z  cc<   n5||k  r|dxx   d||z
  z  dz   |z   dz   z  cc<   n|dxx   d|z   dz   z  cc<   |}|j#                         dk(  s|s|dxx   d|z  z  cc<   |j%                  d       d} d d d        |r|j'                          dj                  |      S # 1 sw Y   ,xY w# t(        $ r"}t+        j,                  d|z         Y d }~yd }~ww xY w)NzCHANGELOG.mdz<h4>Missing changelog file</h4> r   Fz(^#+)\s(.+)z(^[ \t]*\*\s)(.+)rT   r2   r3   	changelogTz-betar   z<h>z</hz<ul>z<li>z</li>z</ul>z=Tautulli Version Checker :: Unable to open changelog file. %sz&<h4>Unable to open changelog file</h4>)r<   r=   r?   r   r   rU   rA   compiler@   PREV_RELEASErV   searchrF   groupr   r   replacer   r   reverser   r   r!   )latest_onlysince_prev_releasechangelog_filer$   
prev_levellatest_version_foundheader_patternlist_patternbeta_releaseprev_releaselogfiler   line_header_matchline_list_matchheader_levelheader_text
line_level	line_textr   s                      r)   read_changelogr    s   WW\\&//>BN77>>.)0C8
$N3zz"676../.#& .	#' -#$&IInd$C!"$))L$"?$#&s+<+B+B1+E'F#GL"3"9"9!"<K"((*k9 +$/3,+'009,+c1[@ %!-!5!5gr!BS!HK!W/3)227;!)C/;>!2J$"5";k"IE"QT`"`cf"ffJ$!$_%:%:1%=!>!!CJ / 5 5a 8I!J.r
f
Z0G&H6&QT]&]`g&gg
#j0r
gj1H&IF&RU^&^ah&hh
r
fy&87&BB
!+JZZ\R'J2J'Z"88JMM"%!"J[-#.	#` NNwwvg.	# .	#j  8TWXXY78s>   AJ' (FJJ
&J0*J' J$ J' '	K0KKc                     t        j                  d       t        j                  t        j
                        D ]  \  } }}|D ]L  }|j                         dk(  st        j                  j                  | |      }	 t        j                  |       N |D ]X  }|j                         j                  d      s#t        j                  j                  | |      }	 t        j                  |       Z  y # t        $ r!}t        j                  d||       Y d }~d }~ww xY w# t        $ r!}t        j                  d||       Y d }~d }~ww xY w)Nz$Cleaning __pycache__ and .pyc files.__pycache__z!Failed to remove directory %s: %sz.pyczFailed to remove file %s: %s)r   r   r<   r   r   r   r   r=   r?   shutilrmtreer    r!   r   r   )rootdirsfiles_dirdirpathr   _filefilepaths           r)   r   r     s   
LL78WWV__5 NdE 	RDzz|},'',,tT2RMM'*		R  	NE{{}%%f-77<<e4NIIh'		NN  RLL!DgqQQR  NLL!?1MMNs0   :C1D1	D:DD	E'EE)FFF)NT)FF)r   r<   r   rA   r  r   r   r   r   r   r   r   r*   rP   r;   ro   re   r   r   r   r   r  r   r   rQ   r)   <module>r     sl   $  	  	        #L?9D+&;,r!jUp:L*:I8XNrQ   