
    g2                    .   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Z	 d dl	Z	dZ
d dlmZ d dlmZ d dlm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 dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z  d dlm!Z! d dlm"Z" d dlm#Z# d dlm$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Z,dZ-dZ.dZ/dZ0da1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:da; ejx                         Z= ej|                         Z? ejx                         Z@daAdaBdaCdZDdaEdaFdZGdZHdaIdaJdZKdaLdZMdZNdaOdZPdZQdZRdZSdZTdZUdZVdZWdaXdZYdZZdZ[dZ\d Z]d Z^d Z_d Z`d-d Zad! Zbd" Zcd.d#Zdd$ Zed% Zfd/d&Zgd' Zhd( Zid) Zjd* Zkd+ Zld0d,Zmy# e$ r dZ
Y gw xY w)1    NFT)BackgroundScheduler)IntervalTrigger)GtagMP)activity_handler)activity_pinger)common)database)datafactory)exporter)helpers)	libraries)logger)
mobile_app)newsletters)newsletter_handler)notification_handler)	notifiers)plex)plextv)users)versioncheck)
web_socket)webstart)configc                     t         5  	 t        j                  |       a| at        J t        r
	 d d d        yt        rt        j                  d   }t        j                  j                  |d      }t        j                  j                  |t              t        _        t        j                   j                  |t              t        _        t        j"                  j                  |t              t        _        t        j$                  j                  |t              t        _        t        j&                  j                  |t              t        _        t        j(                  j                  |t              t        _        t        j*                  j                  |t              t        _        t        j,                  j                  |t              t        _        t        j.                  dk  st        j.                  dkD  r/t1        j2                  dt        j.                         d	t        _        t        j                  s-t        j                  j                  t        d
      t        _        t        j"                  s-t        j                  j                  t        d      t        _        t5        t        j$                  t        j                  j                  t        d      d      \  t        _        }|s%t6        st8        j:                  j=                  d       t>        xs tA        t        jB                        at1        jD                  t6         |rt        j$                  nd t>               t        j                  j                  t        d      t        j                  d<   t        j                  j                  t        j$                  d      t        j                  d<   dt        j                  d<   tG        jH                          tJ        rd}ntL        rd}ntN        rd}nd}t1        jP                  djS                  tT        jV                               t1        jP                  djS                  |tT        jX                  tT        jZ                  tT        j\                  tT        j^                  rdjS                  tT        j^                        nd             t1        jP                  djS                  ta        tb              td                     t1        jP                  djS                  tf        t        jh                  rdt        jh                   dndtj                     t1        jP                  d jS                  t8        jl                  j                  d!d                   t1        jP                  d"jS                  tn        jp                               t1        jP                  d#jS                  tr                     t1        jP                  d$jS                  t                     t1        jP                  d%jS                  tt                     tJ        rtv        st1        j2                  d&       t5        t        j&                  t        j                  j                  t        d'      d'      \  t        _        }t5        t        j(                  t        j                  j                  t        d(      d(      \  t        _        }t5        t        j*                  t        j                  j                  t        d)      d)      \  t        _        }t5        t        j,                  t        j                  j                  t        d*      d*      \  t        _        }t1        jP                  d+       	 ty                t1        jP                  d-       	 t                t        j                          t        j                          t        j                          t        j                  dk(  st        j                  s<t1        j                  d/       t               t        _D        t        j=                          t        j                  dk(  r<t1        j                  d0       t               t        _G        t        j=                          t        j                  dk(  s t        j                  rt        j                  rGt1        j                  d1       t               t        _H        dt        _I        t        j=                          t        j                  j                  t        d2      }d }t        j                  j                  |      r&	 t        |d3      5 }	|	j                         }d d d        t        j                         \  aPt        _Q        t        _R        t        r+	 t        |d6      5 }	|	j=                  t               d d d        t        j                  r(t        j                  r	 t        j                  d89       nt        aWt        j                  j                  t        d;      }
tT        jV                  aXt        j                  j                  |
      r&	 t        |
d3      5 }	|	j                         aXd d d        tT        jV                  t        k7  r!d=t        _Y        t        j=                          d8aZ	 t        |
d6      5 }	|	j=                  tT        jV                         d d d        t        j                  d?      a\t        j                  t               d8a	 d d d        y8#  t	        d| z         t        d      xY w# tz        $ r#}t1        j|                  d,|z         Y d }~d }~ww xY w# tz        $ r#}t1        j|                  d.|z         Y d }~d }~ww xY w# 1 sw Y   ?xY w# t        $ r&}t1        j|                  d4|d5|       Y d }~ld }~ww xY w# 1 sw Y   #xY w# t        $ r&}t1        j|                  d7|d5|       Y d }~Pd }~ww xY w#  t1        j                  d:       t        aWY :xY w# 1 sw Y   xY w# t        $ r&}t1        j|                  d<|
d5|       Y d }~d }~ww xY w# 1 sw Y   xY w# t        $ r&}t1        j|                  d>|
d5|       Y d }~d }~ww xY w# 1 sw Y   y xY w)@Nz7Failed to start Tautulli: Config file is corrupted.

%szHUnable to initialize Tautulli due to a corrupted config file. Exiting...FSNAP_COMMONTautulli   i  z(HTTP_PORT out of bounds: 21 < %s < 65535i  z
server.crtz
server.keylogsz<Unable to create the log directory. Logging to screen only.
)consolelog_dirverbosezplexapi.config.iniPLEXAPI_CONFIG_PATHzplexapi.logPLEXAPI_LOG_PATHDEBUGPLEXAPI_LOG_LEVELz	[Docker] z[Snap] z	[Bundle]  zStarting Tautulli {}z{}{} {} ({}{})z - {}z
{} (UTC{})zLanguage {}{} / Encoding {}z (override )z	Python {}
z	SQLite {}zProgram Dir: {}zConfig File: {}zDatabase File: {}zDocker /config volume not mounted. Using a Docker volume instead. All data may be cleared when the container is recreated or updated.backupscacheexportsr   z1Checking if the database upgrades are required...z!Can't connect to the database: %sz2Checking if configuration upgrades are required...zCould not perform upgrades: %szGenerating UUID...zGenerating API key...zGenerating JWT secret...zversion.lockrz+Unable to read previous version from file '': wz)Unable to write current version to file 'T)	use_cachezUnhandled exceptionzrelease.lockz+Unable to read previous release from file '   z)Unable to write current release to file 'r   )]	INIT_LOCKr   ConfigCONFIGalert_message
SystemExitCONFIG_FILE_INITIALIZEDSNAP_MIGRATEosenvironpathjoin
HTTPS_CERTreplaceDATA_DIRHTTPS_CERT_CHAIN	HTTPS_KEYLOG_DIR
BACKUP_DIR	CACHE_DIR
EXPORT_DIRNEWSLETTER_DIR	HTTP_PORTr   warncheck_folder_writableQUIETsysstderrwriteVERBOSEboolVERBOSE_LOGS
initLoggerr   initialize_plexapiDOCKERSNAPFROZENinfoformatr   RELEASEPLATFORMPLATFORM_RELEASEPLATFORM_VERSIONPLATFORM_LINUX_DISTROstrSYS_TIMEZONESYS_UTC_OFFSETSYS_LANGUAGEPMS_LANGUAGESYS_ENCODINGversionsqlite3sqlite_versionPROG_DIRDB_FILEDOCKER_MOUNTdbcheck	Exceptionerrorupgrader   blacklist_loggerr   r   PMS_UUIDdebuggenerate_uuidAPI_KEY
JWT_SECRETJWT_UPDATE_SECRETisfileopenreadIOErrorr   get_versionCURRENT_VERSION
GIT_REMOTE
GIT_BRANCHCHECK_GITHUB_ON_STARTUPCHECK_GITHUBcheck_update	exceptionLATEST_VERSIONPREV_RELEASEUPDATE_SHOW_CHANGELOG_UPDATEumaskUMASK)config_filesnap_commonold_data_dirlog_writablebuild_eversion_lock_fileprev_versionfprelease_files               /opt/Tautulli/plexpy/__init__.py
initializer      s	   	 \	i]];/F
 "!!!/\ \2 **]3K77<<Z@L & 1 1 9 9, QF&,&=&=&E&ElT\&]F#%//77hOF#^^33L(KFN & 1 1 9 9, QF%//77hOF & 1 1 9 9, QF$*$9$9$A$A,PX$YF!b F$4$4u$<KKBFDTDTU#F   "X| DF!ww||HlCF'<NNBGGLL6:F(D$EJJ\]6T&"5"56 	e)|V^^Y]")	+ -/GGLLCW,X

())+fnnm)T

%&*1

&'!EEEE*11NN
 	 	$++6??F$;$;V=T=T<B<X<XGNN6778^`
 	 	L''~
 	 	188&BUBUK(;(;'<A>[]_k
 	 	K&&KKb)
 	 	K&&""
 	 	%,,
 	 	%,,
 	 	'..
 	 ,KKV
  5rww||Hi@) M13bggll8W=wH!4rww||Hi@) M1#8!!277<<-#H-$Y q 	GH	BI
 	HI	?I
 	$$&""$##% ??b LL-.+oFOLLN >>RLL01*_FNLLN "&*;*;v?W?WLL34 -F',F$LLN GGLL>B77>>+,5+S1 -R#%779L- AM@X@X@Z=*F,=
 5+S1 .RHH_-. ))f.A.A1))D9
 -N ww||Hn=~~77>>,'0,, -#%779L- >>\)+,F(LLNG	,lC( )B() 
y\ \	iUXccdghhP  	BLL<q@AA	B  	?LL9A=>>	?@- - 5/4 5 55. . 5/4 5 551  !67!0- - 0*A/ 0 00) ) 	,LL&+ , ,	,g\ \s  s4ms4].s4'
m71s4
n&F)s4;o"oo" 0s4p!p3p!; s4q2As4rq6*r28s4+s7 r5s1s4m44s47	n# ns4n##s4&	o/os4os4o	o""	p+ps4ps4p	p!!	q*qs4qs4q30s46r 	;r	r2r-'s4-r22s45r?	:s	s1s,&s4,s11s44s=c                     t        j                         dk7  r(t        j                  dt        j                                t
        j                  j                          t
        j                  j                          	 t        j                         } | dk7  rt        j                  d       t        j                           t        j"                  d      }t        j"                  |xr t%        dd             	 t        j                         } | dk7  rt        j                  d       t'        dd	      }t        j(                  |j+                         t
        j,                  j+                                t'        dd	      }t'        dd
      }t'        dd
      }t        j(                  |j+                         t
        j,                  j+                                t        j(                  |j+                         t
        j                  j+                                t        j(                  |j+                         t
        j                  j+                                t        j.                         } t        j0                  d|        t2        rIt        j0                  d| t4               t'        t4        d      5 }|j7                  d| z         d d d        y y # t        $ r&}t        d|j                  |j                        d }~ww xY w# t        $ r&}t        d|j                  |j                        d }~ww xY w# 1 sw Y   y xY w)Nr1   zDThere are %r active threads. Daemonizing may cause strange behavior.r   z1st fork failed: %s [%d]077   z2nd fork failed: %s [%d]z	/dev/nullr-   za+zDaemonized to PID: %dzWriting PID %d to %sr/   z%s
)	threadingactiveCountr   rI   	enumeraterL   stdoutflushrM   r:   forkexitOSErrorRuntimeErrorstrerrorerrnosetsidr   intrv   dup2filenostdingetpidrW   	CREATEPIDPIDFILErN   )pidr   prevdev_nullsisoser   s           r   	daemonizer   b  s@   !#!!	#
 JJJJLggi!8HHQK IIK 88A;DHHT#c%m$Lggi!8HHQK K%HGGHOOsyy//12	k3	B	k4	 B	k4	 BGGBIIK))+,GGBIIK**,-GGBIIK**,-
))+C
KK'-*C9'3 	#2HHVc\"	# 	# ?  L5qzz177KKL  L5qzz177KKL&	# 	#s<   =.K 8.L 1L4	K?!K::K?	L1!L,,L14L=c                     t         s9| dv rd} t        j                  rd}nd}	 t        j                  d|| ||fz         y y # t
        $ r"}t        j                  d|z         Y d }~y d }~ww xY w)N)z0.0.0.0z::	localhosthttpshttpz%s://%s:%i%szCould not launch browser: %s)
no_browserr4   ENABLE_HTTPS
webbrowserrv   rk   r   rl   )hostportrootprotocolr   s        r   launch_browserr     sq    $$DHH	=OONhdD-IIJ   	=LL7!;<<	=s   A 	A,
A''A,c                     t         5  t        t        j                                } t        j
                  r t        j                  rt        j
                  nd}dt        j                  k  rt        j                  nd}t        t        j                  d|ddd       dt        j                  cxk  rdk  rn nt        j                  nd}t        t        j                  dddd	       t        t        j                  d
|ddd       t        t        j                  d|ddd       t         rt        j"                  rqt        j$                  r`t        t&        j(                  ddt+        t        j,                         z  dd	       t        t.        j0                  d|t+        t        j2                        z  dd	       dt        j4                  cxk  rdk  rn nt        j4                  nd}dt        j6                  cxk  rdk  rn nt        j6                  nd}t        t8        j:                  d|dd	       t        t<        j>                  d|dd	       t        t.        j@                  dddd	       t        tB        jD                  ddddt+        t        jF                        z  	       nt        t&        j(                  dddd	       t        t.        j0                  dddd	       t        t8        j:                  dddd	       t        t<        j>                  dddd	       t        t.        j@                  ddddd       t        tB        jD                  dddd	       | r2t        t        j                               r	 t        jI                          ddd       y# tJ        $ r}tM        jN                  |       Y d}~,d}~ww xY w# 1 sw Y   yxY w)zY
    Start the scheduled background tasks. Re-schedule if interval settings changed.
    r   r1      zCheck GitHub for updates)TT)hoursminutessecondsargs   zOptimize Tautulli database)r   r   r   zBackup Tautulli databasezBackup Tautulli configzRefresh Plex server URLs   zCheck for Plex updateszRefresh users listzRefresh libraries listzCheck for server responsezWebsocket ping
      )FN)(
SCHED_LOCKlenSCHEDget_jobsr4   CHECK_GITHUB_INTERVALr~   PMS_UPDATE_CHECK_INTERVALschedule_jobr   r   BACKUP_INTERVALr	   optimize_dbmake_backupr   WS_CONNECTEDPMS_IP	PMS_TOKENr   get_server_resourcesrP   PMS_URL_MANUALr   check_server_updatesMONITOR_PMS_UPDATESREFRESH_USERS_INTERVALREFRESH_LIBRARIES_INTERVALr   refresh_usersr   refresh_librariesconnect_serverr   	send_pingWEBSOCKET_MONITOR_PING_PONGstartrk   r   rl   )
start_jobsgithub_hourspms_update_check_hoursbackup_hours
user_hourslibrary_hoursr   s          r   initialize_schedulerr     s)   
 
 B  U^^-..
 8>7S7SX^XkXkv33qrEF&JjJjEj!A!Apr\..0J'AL	R 23f6L6L1RPR1Rv--XYX))+Gq!	5X))+E'AL	RV'')A'AL	R FMMf.>.>446P!f.C.C)D%DEqZ[] ==?W5V=W=W8XXbcmnp ;<v?\?\:b`b:b66hjJABfFgFgAmkmAmF==suM,,.B)1aA446N,aD 779T !Q8--/? !R$v?a?a:b5bd
 446P !Q8 ==?W !Q8 ,,.B !Q8446N !Q8 779T !RhH--/? !Q8 #enn./ AB  B B   Q CB  B s0   M<ON!!	O	*O?OO		OOc           
      P   t         j                  |      }|r|dk(  r6|dk(  r1|dk(  r,t         j                  |       t        j                  d|       y|j
                  j                  t        j                  ||      k7  rJt         j                  |t        |||t        j                        |       t        j                  d|       yy|dkD  s
|dkD  s|dkD  rLt         j                  | |t        |||t        j                        |d       t        j                  d	|       yy)
z
    Start scheduled job if starting or restarting plexpy.
    Reschedule job if Interval Settings have changed.
    Remove job if if Interval Settings changed to 0

    r   zRemoved background task: %s)r   r   )r   r   r   timezone)triggerr   z Re-scheduled background task: %sN)idr   r   misfire_grace_timezScheduled background task: %s)r   get_job
remove_jobr   rW   r   intervaldatetime	timedeltareschedule_jobr   pytzUTCadd_job)funcnamer   r   r   r   jobs          r   r   r     s    --
C
A:'Q,7a<T"KK5t<[[!!X%7%7eW%UU  o'DHHV !  KK:DA V 
gkWq[T?Wg$R$ 	 	0 	3T: &1    c                  2   t         rt        j                          t        j                  t
              j                          t        t        j                        a
t        t        j                        t        _        t        t        j                        t        _        t        j                  j                          t        j                   t"        j$                         t'        j(                          t        j                  j                          t        j*                          t-        j.                          t"        j0                  rEt3               at"        j6                  st9        d       nt:        rt9        d       t9        d       day y )	N)target)r   )num_threadsinstallr   updater   T)r8   r   filter_usernamesr   Threadstartup_refreshr   r   r   r   r   r   ACTIVITY_SCHEDr   NEWSLETTER_SCHEDr   start_threadsr4   NOTIFICATION_THREADSr   check_browser_enabledschedule_newslettersr   cancel_exportsSYSTEM_ANALYTICSinitialize_trackerTRACKERFIRST_RUN_COMPLETEanalytics_eventr   _STARTED r   r   r   r     s    ! 	0668 $TXX6*=txx*P'.A488.T+ 	''--/ 	**v7R7RS'') 	++113//1 	!""(*G ,,Y/X.)M r   c                     t         j                  r4t         j                  r$t         j                  rt	        j
                          t         j                  rt        j                  dd       t         j                  r$t         j                  rt        j                          t         j                  r7t         j                  r&t         j                  rt        j                          y y y y )NT)logstartup)r4   r   r   PMS_PORTr   r   r  r   r   REFRESH_USERS_ON_STARTUPr   r   REFRESH_LIBRARIES_ON_STARTUPr   r   r  r   r   r  r  7  s    FMMfoo##%   &&4> F;; }}))f.Q.Q##% /R)}r   c                 J    | !t        j                  d|        t                y y )Nz'Signal %i caught, saving and exiting...)r   rW   shutdown)signumframes     r   sig_handlerr  I  s!    =vF
 r   c                  t   t        j                  t              } | j                         }|j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d	       |j	                  d
       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d%       	 |j	                  d?       	 |j	                  dB       	 |j	                  dD       	 |j	                  dF       	 |j	                  dH       	 |j	                  dJ       	 |j	                  dL       	 |j	                  dU       	 |j	                  dr       	 |j	                  ds       	 |j	                  dt       	 |j	                  dw       	 |j	                  dz       	 |j	                  d|       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  dë      j                         }t        |      dkD  r&t        j                  dū       |j	                  dƫ       	 |j	                  dȫ      j                         }t        |      dkD  r&t        j                  dɫ       |j	                  dʫ       	 |j	                  d̫       	 |j	                  dϫ       	 |j	                  dѫ       	 |j	                  dӫ       	 |j	                  dի       	 |j	                  dګ       	 |j	                  dݫ       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d      j                         }t        |      dkD  r^t        j                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       	 |j	                  d       	 |j	                  d%       |j	                  d(      j                         }|r|j	                  d)       	 |j	                  d*       	 |j	                  d/       	 |j	                  d2       	 |j	                  d4       	 |j	                  d;       	 |j	                  d>       	 |j	                  d@       	 |j	                  dB       	 |j	                  dD       	 |j	                  dH       	 |j	                  dO       	 |j	                  dQ       	 |j	                  dS       	 |j	                  dU      j                         }|r(t        j                  dV       |j	                  dW       	 |j	                  dX       	 |j	                  d[       	 |j	                  d`       	 |j	                  db       	 |j	                  de       	 |j	                  dg       	 |j	                  dk       	 |j	                  dm       	 |j	                  do       	 |j	                  dr      j                         }ds|d   v r^t        j                  dt       |j	                  du       |j	                  dv       |j	                  dw       |j	                  dx       	 |j	                  d{      j                         }d||d   v r^t        j                  d}       |j	                  d~       |j	                  d       |j	                  d       |j	                  d       	 |j	                  d      j                         }t        |      dkD  r(t        j                  d       |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  dt        j                  g      j                         }|ra|d   r|d   sVt        j                  d       |j	                  dt        j                  t        j                  t        j                  g       	 |j	                  d      j                         }d|d   v r^t        j                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       	 |j	                  d      j                         }d|d   v r:t        j                  d       |j	                  d       |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  dǫ       	 |j	                  d˫       	 |j	                  dЫ       	 |j	                  dի       	 |j	                  dث       |j	                  d۫      j                         }|rLt        j                  dܫ       |j	                  dݫ       |j	                  dޫ       |j	                  d߫       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       	 |j	                  d       |j	                  d      }|j                         s(t        j                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d        |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d	       |j	                  d
       |j	                  d       |j	                  d       |j	                  d      j                         }|s#|j	                  dt        j$                  g       n^t'        j(                  |d         t'        j(                  t        j$                        k  r"|j	                  dt        j$                  g       | j+                          |j-                          	 t/        j0                         }|j3                  d      }|r|j3                  d      }t        j                  d       t5        j6                         }|D ]G  }t9        j:                  |d   ddd      }|j=                  ||d   |d   |d   d       I |j?                  d       y y # t         j
                  $ rn t        j                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       Y !w xY w# t         j
                  $ r t        j                  d       |j	                  d       |j	                  d        |j	                  d!       |j	                  d"       |j	                  d#       |j	                  d$       Y w xY w# t         j
                  $ r t        j                  d       |j	                  d&       |j	                  d'       |j	                  d(       |j	                  d)       |j	                  d*       |j	                  d+       |j	                  d,       |j	                  d-       |j	                  d.       |j	                  d/       |j	                  d0       |j	                  d1       |j	                  d2       |j	                  d3       |j	                  d4       |j	                  d5       |j	                  d6       |j	                  d7       |j	                  d8       |j	                  d9       |j	                  d:       |j	                  d;       |j	                  d<       |j	                  d=       |j	                  d>       Y kw xY w# t         j
                  $ r; t        j                  d       |j	                  d@       |j	                  dA       Y w xY w# t         j
                  $ r* t        j                  d       |j	                  dC       Y w xY w# t         j
                  $ r* t        j                  d       |j	                  dE       Y w xY w# t         j
                  $ r* t        j                  d       |j	                  dG       Y 4w xY w# t         j
                  $ r* t        j                  d       |j	                  dI       Y bw xY w# t         j
                  $ r* t        j                  d       |j	                  dK       Y w xY w# t         j
                  $ r t        j                  d       |j	                  dM       |j	                  dN       |j	                  dO       |j	                  dP       |j	                  dQ       |j	                  dR       |j	                  dS       |j	                  dT       Y 5w xY w# t         j
                  $ r t        j                  d       |j	                  dV       |j	                  dW       |j	                  dX       |j	                  dY       |j	                  dZ       |j	                  d[       |j	                  d\       |j	                  d]       |j	                  d^       |j	                  d_       |j	                  d`       |j	                  da       |j	                  db       |j	                  dc       |j	                  dd       |j	                  de       |j	                  df       |j	                  dg       |j	                  dh       |j	                  di       |j	                  dj       |j	                  dk       |j	                  dl       |j	                  dm       |j	                  dn       |j	                  do       |j	                  dp       |j	                  dq       Y /w xY w# t         j
                  $ r* t        j                  d       |j	                  d\       Y ]w xY w# t         j
                  $ r* t        j                  d       |j	                  dn       Y w xY w# t         j
                  $ r; t        j                  d       |j	                  du       |j	                  dv       Y w xY w# t         j
                  $ r; t        j                  d       |j	                  dx       |j	                  dy       Y 	w xY w# t         j
                  $ r* t        j                  d       |j	                  d{       Y 7w xY w# t         j
                  $ r; t        j                  d       |j	                  d}       |j	                  d~       Y vw xY w# t         j
                  $ r* t        j                  d       |j	                  d       Y w xY w# t         j
                  $ r* t        j                  d       |j	                  d       Y w xY w# t         j
                  $ r; t        j                  d       |j	                  d       |j	                  d       Y w xY w# t         j
                  $ r* t        j                  d       |j	                  d       Y ?w xY w# t         j
                  $ r] t        j                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       Y w xY w# t         j
                  $ r; t        j                  d       |j	                  d       |j	                  d       Y w xY w# t         j
                  $ rL t        j                  d       |j	                  d       |j	                  d       |j	                  d       Y /w xY w# t         j
                  $ r; t        j                  d       |j	                  d       |j	                  d       Y nw xY w# t         j
                  $ r* t        j                  d       |j	                  d       Y w xY w# t         j
                  $ r; t        j                  d       |j	                  d       |j	                  d       Y w xY w# t         j
                  $ r* t        j                  d       |j	                  d       Y 	w xY w# t         j
                  $ r] t        j                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       Y jw xY w# t         j
                  $ r; t        j                  d       |j	                  d       |j	                  d       Y w xY w# t         j
                  $ r; t        j                  d       |j	                  d       |j	                  d       Y w xY w# t         j
                  $ r; t        j                  d       |j	                  d       |j	                  d       Y 'w xY w# t         j
                  $ r* t        j                  d       |j	                  d       Y Uw xY w# t         j
                  $ r* t        j                  d       |j	                  d       Y w xY w# t         j
                  $ rL t        j                  d       |j	                  d       |j	                  d       |j	                  d       Y w xY w# t         j
                  $ r; t        j                  d       |j	                  d       |j	                  d       Y w xY w# t         j
                  $ r t        j                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       Y w xY w# t         j
                  $ r; t        j                  d       |j	                  d       |j	                  d«       Y w xY w# t         j
                  $ r t        j                  dǫ       Y w xY w# t         j
                  $ r t        j                  d˫       Y w xY w# t         j
                  $ r* t        j                  dͫ       |j	                  dΫ       Y w xY w# t         j
                  $ r* t        j                  dͫ       |j	                  dЫ       Y w xY w# t         j
                  $ r* t        j                  dͫ       |j	                  dҫ       Y %w xY w# t         j
                  $ r* t        j                  dͫ       |j	                  dԫ       Y Sw xY w# t         j
                  $ r] t        j                  dͫ       |j	                  d֫       |j	                  d׫       |j	                  dث       |j	                  d٫       Y w xY w# t         j
                  $ r; t        j                  dͫ       |j	                  d۫       |j	                  dܫ       Y w xY w# t         j
                  $ rL t        j                  dͫ       |j	                  dޫ       |j	                  d߫       |j	                  d       Y Cw xY w# t         j
                  $ r; t        j                  d       |j	                  d       |j	                  d       Y w xY w# t         j
                  $ r t        j                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d        |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d	       |j	                  d
       |j	                  d       Y !2w xY w# t         j
                  $ r+ t        j                  d       |j	                  d       Y !`w xY w# t         j
                  $ r= t        j                  d       |j	                  d       |j	                  d       Y !w xY w# t         j
                  $ rO t        j                  d       |j	                  d       |j	                  d       |j	                  d       Y !w xY w# t         j
                  $ r t        j                  d       Y !w xY w# t         j
                  $ r t        j                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d        |j	                  d!       |j	                  d"       |j	                  d#       |j	                  d$       Y "Aw xY w# t         j
                  $ r= t        j                  d       |j	                  d&       |j	                  d'       Y "w xY w# t         j
                  $ ra t        j                  d       |j	                  d+       |j	                  d,       |j	                  d-       |j	                  d.       Y "w xY w# t         j
                  $ r= t        j                  d       |j	                  d0       |j	                  d1       Y "w xY w# t         j
                  $ r+ t        j                  d       |j	                  d3       Y #w xY w# t         j
                  $ r t        j                  d       |j	                  d5       |j	                  d6       |j	                  d7       |j	                  d8       |j	                  d9       |j	                  d:       Y #w xY w# t         j
                  $ r, t        j                  d<       |j	                  d=       Y #w xY w# t         j
                  $ r, t        j                  d<       |j	                  d?       Y $w xY w# t         j
                  $ r, t        j                  d<       |j	                  dA       Y $4w xY w# t         j
                  $ r, t        j                  d<       |j	                  dC       Y $cw xY w# t         j
                  $ rP t        j                  d<       |j	                  dE       |j	                  dF       |j	                  dG       Y $w xY w# t         j
                  $ r t        j                  d<       |j	                  dI       |j	                  dJ       |j	                  dK       |j	                  dL       |j	                  dM       |j	                  dN       Y %?w xY w# t         j
                  $ r, t        j                  d<       |j	                  dP       Y %nw xY w# t         j
                  $ r, t        j                  d<       |j	                  dR       Y %w xY w# t         j
                  $ r, t        j                  d<       |j	                  dT       Y %w xY w# t         j
                  $ r Y %w xY w# t         j
                  $ r, t        j                  dY       |j	                  dZ       Y %w xY w# t         j
                  $ rb t        j                  dY       |j	                  d\       |j	                  d]       |j	                  d^       |j	                  d_       Y &/w xY w# t         j
                  $ r, t        j                  dY       |j	                  da       Y &^w xY w# t         j
                  $ r> t        j                  dY       |j	                  dc       |j	                  dd       Y &w xY w# t         j
                  $ r, t        j                  dY       |j	                  df       Y &w xY w# t         j
                  $ r> t        j                  dh       |j	                  di       |j	                  dj       Y 'w xY w# t         j
                  $ r, t        j                  dh       |j	                  dl       Y '>w xY w# t         j
                  $ r, t        j                  dh       |j	                  dn       Y 'mw xY w# t         j
                  $ r, t        j                  dp       |j	                  dq       Y 'w xY w# t         j
                  $ r5 t        j                  dy       	 |j	                  dz       n#  Y nxY wY '`w xY w# t         j
                  $ r5 t        j                  d       	 |j	                  d       n#  Y nxY wY '$w xY w# t         j
                  $ r t        j                  d       Y &w xY w# t         j
                  $ r, t        j                  d       |j	                  d       Y ',w xY w# t         j
                  $ r, t        j                  d       |j	                  d       Y '[w xY w# t         j
                  $ r, t        j                  d       |j	                  d       Y 'w xY w# t         j
                  $ r Y 'w xY w# t         j
                  $ r5 t        j                  d       	 |j	                  d       n#  Y nxY wY &w xY w# t         j
                  $ r t        j                  d       Y &w xY w# t         j
                  $ r, t        j                  d       |j	                  d       Y &w xY w# t         j
                  $ r{ t        j                  d       |j	                  d       |j	                  d      j                         D ],  \  }|j	                  dt!        j"                  |      |g       . Y 'Nw xY w# t         j
                  $ r, t        j                  d       |j	                  d       Y '}w xY w# t         j
                  $ r{ t        j                  d       |j	                  d       |j	                  d       |j	                  d      j                         D ]  \  }|j	                  dd|g        Y 'w xY w# t         j
                  $ r> t        j                  d       |j	                  d       |j	                  d       Y (<w xY w# t         j
                  $ rP t        j                  d       |j	                  d       |j	                  d       |j	                  d       Y (w xY w# t         j
                  $ rP t        j                  d       |j	                  d       |j	                  d       |j	                  d       Y (w xY w# t         j
                  $ rP t        j                  d       |j	                  d       |j	                  d       |j	                  d       Y )5w xY w# t         j
                  $ r t        j                  d       |j	                  d       |j	                  d«       |j	                  dë       |j	                  dī       |j	                  dū       |j	                  dƫ       Y )w xY w# t         j
                  $ rP t        j                  d       |j	                  dȫ       |j	                  dɫ       |j	                  dʫ       Y *w xY w# t         j
                  $ rP t        j                  d̫       |j	                  dͫ       |j	                  dΫ       |j	                  dϫ       Y *dw xY w# t         j
                  $ rP t        j                  dѫ       |j	                  dҫ       |j	                  dӫ       |j	                  dԫ       Y *w xY w# t         j
                  $ r, t        j                  d֫       |j	                  d׫       Y *w xY w# t         j
                  $ r> t        j                  d֫       |j	                  d٫       |j	                  dګ       Y +'w xY w# t         j
                  $ rb t        j                  d       |j	                  d       |j	                  d       |j	                  d       |j	                  d       Y +w xY w# t         j
                  $ r> t        j                  d       |j	                  d       |j	                  d       Y +_w xY w# t         j
                  $ r> t        j                  d       |j	                  d       |j	                  d       Y +w xY w# t         j
                  $ r, t        j                  d       |j	                  d       Y +w xY w# t         j
                  $ r Y +w xY w# t         j
                  $ r Y +w xY w# t         j
                  $ r Y +w xY w# t         j
                  $ r Y +w xY w# t         j
                  $ r Y +w xY w# t         j
                  $ r Y +w xY w# t         j
                  $ r Y y w xY w(  NzECREATE TABLE IF NOT EXISTS version_info (key TEXT UNIQUE, value TEXT)a  CREATE TABLE IF NOT EXISTS sessions (id INTEGER PRIMARY KEY AUTOINCREMENT, session_key INTEGER, session_id TEXT, transcode_key TEXT, rating_key INTEGER, section_id INTEGER, media_type TEXT, started INTEGER, stopped INTEGER, paused_counter INTEGER DEFAULT 0, state TEXT, user_id INTEGER, user TEXT, friendly_name TEXT, ip_address TEXT, machine_id TEXT, bandwidth INTEGER, location TEXT, player TEXT, product TEXT, platform TEXT, title TEXT, parent_title TEXT, grandparent_title TEXT, original_title TEXT, full_title TEXT, media_index INTEGER, parent_media_index INTEGER, thumb TEXT, parent_thumb TEXT, grandparent_thumb TEXT, year INTEGER, parent_rating_key INTEGER, grandparent_rating_key INTEGER, originally_available_at TEXT, added_at INTEGER, guid TEXT, view_offset INTEGER DEFAULT 0, duration INTEGER, video_decision TEXT, audio_decision TEXT, transcode_decision TEXT, container TEXT, bitrate INTEGER, width INTEGER, height INTEGER, video_codec TEXT, video_bitrate INTEGER, video_resolution TEXT, video_width INTEGER, video_height INTEGER, video_framerate TEXT, video_scan_type TEXT, video_full_resolution TEXT, video_dynamic_range TEXT, aspect_ratio TEXT, audio_codec TEXT, audio_bitrate INTEGER, audio_channels INTEGER, audio_language TEXT, audio_language_code TEXT, subtitle_codec TEXT, subtitle_forced INTEGER, subtitle_language TEXT, stream_bitrate INTEGER, stream_video_resolution TEXT, quality_profile TEXT, stream_container_decision TEXT, stream_container TEXT, stream_video_decision TEXT, stream_video_codec TEXT, stream_video_bitrate INTEGER, stream_video_width INTEGER, stream_video_height INTEGER, stream_video_framerate TEXT, stream_video_scan_type TEXT, stream_video_full_resolution TEXT, stream_video_dynamic_range TEXT, stream_audio_decision TEXT, stream_audio_codec TEXT, stream_audio_bitrate INTEGER, stream_audio_channels INTEGER, stream_audio_language TEXT, stream_audio_language_code TEXT, subtitles INTEGER, stream_subtitle_decision TEXT, stream_subtitle_codec TEXT, stream_subtitle_forced INTEGER, stream_subtitle_language TEXT, transcode_protocol TEXT, transcode_container TEXT, transcode_video_codec TEXT, transcode_audio_codec TEXT, transcode_audio_channels INTEGER,transcode_width INTEGER, transcode_height INTEGER, transcode_hw_decoding INTEGER, transcode_hw_encoding INTEGER, optimized_version INTEGER, optimized_version_profile TEXT, optimized_version_title TEXT, synced_version INTEGER, synced_version_profile TEXT, live INTEGER, live_uuid TEXT, channel_call_sign TEXT, channel_id TEXT, channel_identifier TEXT, channel_title TEXT, channel_thumb TEXT, channel_vcn TEXT, secure INTEGER, relayed INTEGER, buffer_count INTEGER DEFAULT 0, buffer_last_triggered INTEGER, last_paused INTEGER, watched INTEGER DEFAULT 0, intro INTEGER DEFAULT 0, credits INTEGER DEFAULT 0, commercial INTEGER DEFAULT 0, marker INTEGER DEFAULT 0, initial_stream INTEGER DEFAULT 1, write_attempts INTEGER DEFAULT 0, raw_stream_info TEXT, rating_key_websocket TEXT)zCREATE TABLE IF NOT EXISTS sessions_continued (id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER, machine_id TEXT, media_type TEXT, stopped INTEGER)a:  CREATE TABLE IF NOT EXISTS session_history (id INTEGER PRIMARY KEY AUTOINCREMENT, reference_id INTEGER, started INTEGER, stopped INTEGER, rating_key INTEGER, user_id INTEGER, user TEXT, ip_address TEXT, paused_counter INTEGER DEFAULT 0, player TEXT, product TEXT, product_version TEXT, platform TEXT, platform_version TEXT, profile TEXT, machine_id TEXT, bandwidth INTEGER, location TEXT, quality_profile TEXT, secure INTEGER, relayed INTEGER, parent_rating_key INTEGER, grandparent_rating_key INTEGER, media_type TEXT, section_id INTEGER, view_offset INTEGER DEFAULT 0)a  CREATE TABLE IF NOT EXISTS session_history_media_info (id INTEGER PRIMARY KEY, rating_key INTEGER, video_decision TEXT, audio_decision TEXT, transcode_decision TEXT, duration INTEGER DEFAULT 0, container TEXT, bitrate INTEGER, width INTEGER, height INTEGER, video_bitrate INTEGER, video_bit_depth INTEGER, video_codec TEXT, video_codec_level TEXT, video_width INTEGER, video_height INTEGER, video_resolution TEXT, video_framerate TEXT, video_scan_type TEXT, video_full_resolution TEXT, video_dynamic_range TEXT, aspect_ratio TEXT, audio_bitrate INTEGER, audio_codec TEXT, audio_channels INTEGER, audio_language TEXT, audio_language_code TEXT, subtitles INTEGER, subtitle_codec TEXT, subtitle_forced, subtitle_language TEXT,transcode_protocol TEXT, transcode_container TEXT, transcode_video_codec TEXT, transcode_audio_codec TEXT, transcode_audio_channels INTEGER, transcode_width INTEGER, transcode_height INTEGER, transcode_hw_requested INTEGER, transcode_hw_full_pipeline INTEGER, transcode_hw_decode TEXT, transcode_hw_decode_title TEXT, transcode_hw_decoding INTEGER, transcode_hw_encode TEXT, transcode_hw_encode_title TEXT, transcode_hw_encoding INTEGER, stream_container TEXT, stream_container_decision TEXT, stream_bitrate INTEGER, stream_video_decision TEXT, stream_video_bitrate INTEGER, stream_video_codec TEXT, stream_video_codec_level TEXT, stream_video_bit_depth INTEGER, stream_video_height INTEGER, stream_video_width INTEGER, stream_video_resolution TEXT, stream_video_framerate TEXT, stream_video_scan_type TEXT, stream_video_full_resolution TEXT, stream_video_dynamic_range TEXT, stream_audio_decision TEXT, stream_audio_codec TEXT, stream_audio_bitrate INTEGER, stream_audio_channels INTEGER, stream_audio_language TEXT, stream_audio_language_code TEXT, stream_subtitle_decision TEXT, stream_subtitle_codec TEXT, stream_subtitle_container TEXT, stream_subtitle_forced INTEGER, stream_subtitle_language TEXT, synced_version INTEGER, synced_version_profile TEXT, optimized_version INTEGER, optimized_version_profile TEXT, optimized_version_title TEXT)a  CREATE TABLE IF NOT EXISTS session_history_metadata (id INTEGER PRIMARY KEY, rating_key INTEGER, parent_rating_key INTEGER, grandparent_rating_key INTEGER, title TEXT, parent_title TEXT, grandparent_title TEXT, original_title TEXT, full_title TEXT, media_index INTEGER, parent_media_index INTEGER, thumb TEXT, parent_thumb TEXT, grandparent_thumb TEXT, art TEXT, media_type TEXT, year INTEGER, originally_available_at TEXT, added_at INTEGER, updated_at INTEGER, last_viewed_at INTEGER, content_rating TEXT, summary TEXT, tagline TEXT, rating TEXT, duration INTEGER DEFAULT 0, guid TEXT, directors TEXT, writers TEXT, actors TEXT, genres TEXT, studio TEXT, labels TEXT, live INTEGER DEFAULT 0, channel_call_sign TEXT, channel_id TEXT, channel_identifier TEXT, channel_title TEXT, channel_thumb TEXT, channel_vcn TEXT, marker_credits_first INTEGER DEFAULT NULL, marker_credits_final INTEGER DEFAULT NULL)a  CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER DEFAULT NULL UNIQUE, username TEXT NOT NULL, friendly_name TEXT, thumb TEXT, custom_avatar_url TEXT, title TEXT, email TEXT, is_active INTEGER DEFAULT 1, is_admin INTEGER DEFAULT 0, is_home_user INTEGER DEFAULT NULL, is_allow_sync INTEGER DEFAULT NULL, is_restricted INTEGER DEFAULT NULL, do_notify INTEGER DEFAULT 1, keep_history INTEGER DEFAULT 1, deleted_user INTEGER DEFAULT 0, allow_guest INTEGER DEFAULT 0, user_token TEXT, server_token TEXT, shared_libraries TEXT, filter_all TEXT, filter_movies TEXT, filter_tv TEXT, filter_music TEXT, filter_photos TEXT)a  CREATE TABLE IF NOT EXISTS library_sections (id INTEGER PRIMARY KEY AUTOINCREMENT, server_id TEXT, section_id INTEGER, section_name TEXT, section_type TEXT, agent TEXT, thumb TEXT, custom_thumb_url TEXT, art TEXT, custom_art_url TEXT, count INTEGER, parent_count INTEGER, child_count INTEGER, is_active INTEGER DEFAULT 1, do_notify INTEGER DEFAULT 1, do_notify_created INTEGER DEFAULT 1, keep_history INTEGER DEFAULT 1, deleted_section INTEGER DEFAULT 0, UNIQUE(server_id, section_id))zCREATE TABLE IF NOT EXISTS user_login (id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp INTEGER, user_id INTEGER, user TEXT, user_group TEXT, ip_address TEXT, host TEXT, user_agent TEXT, success INTEGER DEFAULT 1,expiry TEXT, jwt_token TEXT)a<  CREATE TABLE IF NOT EXISTS notifiers (id INTEGER PRIMARY KEY AUTOINCREMENT, agent_id INTEGER, agent_name TEXT, agent_label TEXT, friendly_name TEXT, notifier_config TEXT, on_play INTEGER DEFAULT 0, on_stop INTEGER DEFAULT 0, on_pause INTEGER DEFAULT 0, on_resume INTEGER DEFAULT 0, on_change INTEGER DEFAULT 0, on_buffer INTEGER DEFAULT 0, on_error INTEGER DEFAULT 0, on_intro INTEGER DEFAULT 0, on_credits INTEGER DEFAULT 0, on_commercial INTEGER DEFAULT 0, on_watched INTEGER DEFAULT 0, on_created INTEGER DEFAULT 0, on_extdown INTEGER DEFAULT 0, on_intdown INTEGER DEFAULT 0, on_extup INTEGER DEFAULT 0, on_intup INTEGER DEFAULT 0, on_pmsupdate INTEGER DEFAULT 0, on_concurrent INTEGER DEFAULT 0, on_newdevice INTEGER DEFAULT 0, on_plexpyupdate INTEGER DEFAULT 0, on_plexpydbcorrupt INTEGER DEFAULT 0, on_play_subject TEXT, on_stop_subject TEXT, on_pause_subject TEXT, on_resume_subject TEXT, on_change_subject TEXT, on_buffer_subject TEXT, on_error_subject TEXT, on_intro_subject TEXT, on_credits_subject TEXT, on_commercial_subject TEXT,on_watched_subject TEXT, on_created_subject TEXT, on_extdown_subject TEXT, on_intdown_subject TEXT, on_extup_subject TEXT, on_intup_subject TEXT, on_pmsupdate_subject TEXT, on_concurrent_subject TEXT, on_newdevice_subject TEXT, on_plexpyupdate_subject TEXT, on_plexpydbcorrupt_subject TEXT, on_play_body TEXT, on_stop_body TEXT, on_pause_body TEXT, on_resume_body TEXT, on_change_body TEXT, on_buffer_body TEXT, on_error_body TEXT, on_intro_body TEXT, on_credits_body TEXT, on_commercial_body TEXT, on_watched_body TEXT, on_created_body TEXT, on_extdown_body TEXT, on_intdown_body TEXT, on_extup_body TEXT, on_intup_body TEXT, on_pmsupdate_body TEXT, on_concurrent_body TEXT, on_newdevice_body TEXT, on_plexpyupdate_body TEXT, on_plexpydbcorrupt_body TEXT, custom_conditions TEXT, custom_conditions_logic TEXT)a  CREATE TABLE IF NOT EXISTS notify_log (id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp INTEGER, session_key INTEGER, rating_key INTEGER, parent_rating_key INTEGER, grandparent_rating_key INTEGER, user_id INTEGER, user TEXT, notifier_id INTEGER, agent_id INTEGER, agent_name TEXT, notify_action TEXT, subject_text TEXT, body_text TEXT, script_args TEXT, success INTEGER DEFAULT 0, tag TEXT)aA  CREATE TABLE IF NOT EXISTS newsletters (id INTEGER PRIMARY KEY AUTOINCREMENT, agent_id INTEGER, agent_name TEXT, agent_label TEXT, id_name TEXT NOT NULL, friendly_name TEXT, newsletter_config TEXT, email_config TEXT, subject TEXT, body TEXT, message TEXT, cron TEXT NOT NULL DEFAULT '0 0 * * 0', active INTEGER DEFAULT 0)a|  CREATE TABLE IF NOT EXISTS newsletter_log (id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp INTEGER, newsletter_id INTEGER, agent_id INTEGER, agent_name TEXT, notify_action TEXT, subject_text TEXT, body_text TEXT, message_text TEXT, start_date TEXT, end_date TEXT, start_time INTEGER, end_time INTEGER, uuid TEXT UNIQUE, filename TEXT, email_msg_id TEXT, success INTEGER DEFAULT 0)zCREATE TABLE IF NOT EXISTS recently_added (id INTEGER PRIMARY KEY AUTOINCREMENT, added_at INTEGER, pms_identifier TEXT, section_id INTEGER, rating_key INTEGER, parent_rating_key INTEGER, grandparent_rating_key INTEGER, media_type TEXT, media_info TEXT)a  CREATE TABLE IF NOT EXISTS mobile_devices (id INTEGER PRIMARY KEY AUTOINCREMENT, device_id TEXT NOT NULL UNIQUE, device_token TEXT, device_name TEXT, platform TEXT, version TEXT, friendly_name TEXT, onesignal_id TEXT, last_seen INTEGER, official INTEGER DEFAULT 0)zCREATE TABLE IF NOT EXISTS tvmaze_lookup (id INTEGER PRIMARY KEY AUTOINCREMENT, rating_key INTEGER, thetvdb_id INTEGER, imdb_id TEXT, tvmaze_id INTEGER, tvmaze_url TEXT, tvmaze_json TEXT)zCREATE TABLE IF NOT EXISTS themoviedb_lookup (id INTEGER PRIMARY KEY AUTOINCREMENT, rating_key INTEGER, thetvdb_id INTEGER, imdb_id TEXT, themoviedb_id INTEGER, themoviedb_url TEXT, themoviedb_json TEXT)zCREATE TABLE IF NOT EXISTS musicbrainz_lookup (id INTEGER PRIMARY KEY AUTOINCREMENT, rating_key INTEGER, musicbrainz_id INTEGER, musicbrainz_url TEXT, musicbrainz_type TEXT, musicbrainz_json TEXT)zCREATE TABLE IF NOT EXISTS image_hash_lookup (id INTEGER PRIMARY KEY AUTOINCREMENT, img_hash TEXT UNIQUE, img TEXT, rating_key INTEGER, width INTEGER, height INTEGER, opacity INTEGER, background TEXT, blur INTEGER, fallback TEXT)zCREATE TABLE IF NOT EXISTS imgur_lookup (id INTEGER PRIMARY KEY AUTOINCREMENT, img_hash TEXT, imgur_title TEXT, imgur_url TEXT, delete_hash TEXT)zCREATE TABLE IF NOT EXISTS cloudinary_lookup (id INTEGER PRIMARY KEY AUTOINCREMENT, img_hash TEXT, cloudinary_title TEXT, cloudinary_url TEXT)a  CREATE TABLE IF NOT EXISTS exports (id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp INTEGER, section_id INTEGER, user_id INTEGER, rating_key INTEGER, media_type TEXT, title TEXT, file_format TEXT, metadata_level INTEGER, media_info_level INTEGER, thumb_level INTEGER DEFAULT 0, art_level INTEGER DEFAULT 0, logo_level INTEGER DEFAULT 0, custom_fields TEXT, individual_files INTEGER DEFAULT 0, file_size INTEGER DEFAULT 0, complete INTEGER DEFAULT 0, exported_items INTEGER DEFAULT 0, total_items INTEGER DEFAULT 0)zSELECT started FROM sessionsz4Altering database. Updating database table sessions.z/ALTER TABLE sessions ADD COLUMN started INTEGERz@ALTER TABLE sessions ADD COLUMN paused_counter INTEGER DEFAULT 0z*ALTER TABLE sessions ADD COLUMN state TEXTz)ALTER TABLE sessions ADD COLUMN user TEXTz/ALTER TABLE sessions ADD COLUMN machine_id TEXTzSELECT title FROM sessionsz*ALTER TABLE sessions ADD COLUMN title TEXTz1ALTER TABLE sessions ADD COLUMN parent_title TEXTz6ALTER TABLE sessions ADD COLUMN grandparent_title TEXTz2ALTER TABLE sessions ADD COLUMN friendly_name TEXTz+ALTER TABLE sessions ADD COLUMN player TEXTz/ALTER TABLE sessions ADD COLUMN user_id INTEGERzSELECT ip_address FROM sessionsz/ALTER TABLE sessions ADD COLUMN ip_address TEXTz-ALTER TABLE sessions ADD COLUMN platform TEXTz9ALTER TABLE sessions ADD COLUMN parent_rating_key INTEGERz>ALTER TABLE sessions ADD COLUMN grandparent_rating_key INTEGERz=ALTER TABLE sessions ADD COLUMN view_offset INTEGER DEFAULT 0z0ALTER TABLE sessions ADD COLUMN duration INTEGERz3ALTER TABLE sessions ADD COLUMN video_decision TEXTz3ALTER TABLE sessions ADD COLUMN audio_decision TEXTz-ALTER TABLE sessions ADD COLUMN width INTEGERz.ALTER TABLE sessions ADD COLUMN height INTEGERz.ALTER TABLE sessions ADD COLUMN container TEXTz0ALTER TABLE sessions ADD COLUMN video_codec TEXTz0ALTER TABLE sessions ADD COLUMN audio_codec TEXTz/ALTER TABLE sessions ADD COLUMN bitrate INTEGERz5ALTER TABLE sessions ADD COLUMN video_resolution TEXTz4ALTER TABLE sessions ADD COLUMN video_framerate TEXTz1ALTER TABLE sessions ADD COLUMN aspect_ratio TEXTz6ALTER TABLE sessions ADD COLUMN audio_channels INTEGERz7ALTER TABLE sessions ADD COLUMN transcode_protocol TEXTz8ALTER TABLE sessions ADD COLUMN transcode_container TEXTz:ALTER TABLE sessions ADD COLUMN transcode_video_codec TEXTz:ALTER TABLE sessions ADD COLUMN transcode_audio_codec TEXTz@ALTER TABLE sessions ADD COLUMN transcode_audio_channels INTEGERz7ALTER TABLE sessions ADD COLUMN transcode_width INTEGERz8ALTER TABLE sessions ADD COLUMN transcode_height INTEGERz!SELECT buffer_count FROM sessionsz>ALTER TABLE sessions ADD COLUMN buffer_count INTEGER DEFAULT 0z=ALTER TABLE sessions ADD COLUMN buffer_last_triggered INTEGERz SELECT last_paused FROM sessionsz3ALTER TABLE sessions ADD COLUMN last_paused INTEGERzSELECT section_id FROM sessionsz2ALTER TABLE sessions ADD COLUMN section_id INTEGERzSELECT stopped FROM sessionsz/ALTER TABLE sessions ADD COLUMN stopped INTEGERz"SELECT transcode_key FROM sessionsz2ALTER TABLE sessions ADD COLUMN transcode_key TEXTz#SELECT write_attempts FROM sessionsz@ALTER TABLE sessions ADD COLUMN write_attempts INTEGER DEFAULT 0z'SELECT transcode_decision FROM sessionsz7ALTER TABLE sessions ADD COLUMN transcode_decision TEXTz/ALTER TABLE sessions ADD COLUMN full_title TEXTz3ALTER TABLE sessions ADD COLUMN media_index INTEGERz:ALTER TABLE sessions ADD COLUMN parent_media_index INTEGERz*ALTER TABLE sessions ADD COLUMN thumb TEXTz1ALTER TABLE sessions ADD COLUMN parent_thumb TEXTz6ALTER TABLE sessions ADD COLUMN grandparent_thumb TEXTz,ALTER TABLE sessions ADD COLUMN year INTEGERz$SELECT raw_stream_info FROM sessionsz,ALTER TABLE sessions ADD COLUMN product TEXTz9ALTER TABLE sessions ADD COLUMN optimized_version INTEGERz>ALTER TABLE sessions ADD COLUMN optimized_version_profile TEXTz6ALTER TABLE sessions ADD COLUMN synced_version INTEGERz5ALTER TABLE sessions ADD COLUMN video_bitrate INTEGERz3ALTER TABLE sessions ADD COLUMN video_width INTEGERz4ALTER TABLE sessions ADD COLUMN video_height INTEGERz5ALTER TABLE sessions ADD COLUMN audio_bitrate INTEGERz3ALTER TABLE sessions ADD COLUMN subtitle_codec TEXTz6ALTER TABLE sessions ADD COLUMN stream_bitrate INTEGERz<ALTER TABLE sessions ADD COLUMN stream_video_resolution TEXTz4ALTER TABLE sessions ADD COLUMN quality_profile TEXTz>ALTER TABLE sessions ADD COLUMN stream_container_decision TEXTz5ALTER TABLE sessions ADD COLUMN stream_container TEXTz:ALTER TABLE sessions ADD COLUMN stream_video_decision TEXTz7ALTER TABLE sessions ADD COLUMN stream_video_codec TEXTz<ALTER TABLE sessions ADD COLUMN stream_video_bitrate INTEGERz:ALTER TABLE sessions ADD COLUMN stream_video_width INTEGERz;ALTER TABLE sessions ADD COLUMN stream_video_height INTEGERz;ALTER TABLE sessions ADD COLUMN stream_video_framerate TEXTz:ALTER TABLE sessions ADD COLUMN stream_audio_decision TEXTz7ALTER TABLE sessions ADD COLUMN stream_audio_codec TEXTz<ALTER TABLE sessions ADD COLUMN stream_audio_bitrate INTEGERz=ALTER TABLE sessions ADD COLUMN stream_audio_channels INTEGERz1ALTER TABLE sessions ADD COLUMN subtitles INTEGERz=ALTER TABLE sessions ADD COLUMN stream_subtitle_decision TEXTz:ALTER TABLE sessions ADD COLUMN stream_subtitle_codec TEXTz4ALTER TABLE sessions ADD COLUMN raw_stream_info TEXTz!SELECT video_height FROM sessionszSELECT subtitles FROM sessionsz+SELECT synced_version_profile FROM sessionsz;ALTER TABLE sessions ADD COLUMN synced_version_profile TEXTz<ALTER TABLE sessions ADD COLUMN optimized_version_title TEXTz*SELECT transcode_hw_decoding FROM sessionsz=ALTER TABLE sessions ADD COLUMN transcode_hw_decoding INTEGERz=ALTER TABLE sessions ADD COLUMN transcode_hw_encoding INTEGERzSELECT watched FROM sessionsz9ALTER TABLE sessions ADD COLUMN watched INTEGER DEFAULT 0zSELECT live FROM sessionsz,ALTER TABLE sessions ADD COLUMN live INTEGERz.ALTER TABLE sessions ADD COLUMN live_uuid TEXTzSELECT session_id FROM sessionsz/ALTER TABLE sessions ADD COLUMN session_id TEXTz#SELECT original_title FROM sessionsz3ALTER TABLE sessions ADD COLUMN original_title TEXTzSELECT secure FROM sessionsz.ALTER TABLE sessions ADD COLUMN secure INTEGERz/ALTER TABLE sessions ADD COLUMN relayed INTEGERz)SELECT rating_key_websocket FROM sessionsz9ALTER TABLE sessions ADD COLUMN rating_key_websocket TEXTz$SELECT video_scan_type FROM sessionsz4ALTER TABLE sessions ADD COLUMN video_scan_type TEXTz:ALTER TABLE sessions ADD COLUMN video_full_resolution TEXTz;ALTER TABLE sessions ADD COLUMN stream_video_scan_type TEXTzAALTER TABLE sessions ADD COLUMN stream_video_full_resolution TEXTz(SELECT video_dynamic_range FROM sessionsz8ALTER TABLE sessions ADD COLUMN video_dynamic_range TEXTz?ALTER TABLE sessions ADD COLUMN stream_video_dynamic_range TEXTz'SELECT channel_identifier FROM sessionsz6ALTER TABLE sessions ADD COLUMN channel_call_sign TEXTz7ALTER TABLE sessions ADD COLUMN channel_identifier TEXTz2ALTER TABLE sessions ADD COLUMN channel_thumb TEXTz,SELECT originally_available_at FROM sessionsz<ALTER TABLE sessions ADD COLUMN originally_available_at TEXTz0ALTER TABLE sessions ADD COLUMN added_at INTEGERzSELECT guid FROM sessionsz)ALTER TABLE sessions ADD COLUMN guid TEXTzSELECT bandwidth FROM sessionsz1ALTER TABLE sessions ADD COLUMN bandwidth INTEGERz-ALTER TABLE sessions ADD COLUMN location TEXTz#SELECT initial_stream FROM sessionsz@ALTER TABLE sessions ADD COLUMN initial_stream INTEGER DEFAULT 1z#SELECT audio_language FROM sessionsz3ALTER TABLE sessions ADD COLUMN audio_language TEXTz8ALTER TABLE sessions ADD COLUMN audio_language_code TEXTz:ALTER TABLE sessions ADD COLUMN stream_audio_language TEXTz?ALTER TABLE sessions ADD COLUMN stream_audio_language_code TEXTz&SELECT subtitle_language FROM sessionsz6ALTER TABLE sessions ADD COLUMN subtitle_language TEXTz=ALTER TABLE sessions ADD COLUMN stream_subtitle_language TEXTz$SELECT subtitle_forced FROM sessionsz7ALTER TABLE sessions ADD COLUMN subtitle_forced INTEGERz>ALTER TABLE sessions ADD COLUMN stream_subtitle_forced INTEGERzSELECT intro FROM sessionsz7ALTER TABLE sessions ADD COLUMN intro INTEGER DEFAULT 0z9ALTER TABLE sessions ADD COLUMN credits INTEGER DEFAULT 0zSELECT commercial FROM sessionsz<ALTER TABLE sessions ADD COLUMN commercial INTEGER DEFAULT 0zSELECT marker FROM sessionsz8ALTER TABLE sessions ADD COLUMN marker INTEGER DEFAULT 0zSELECT channel_id FROM sessionsz/ALTER TABLE sessions ADD COLUMN channel_id TEXTz2ALTER TABLE sessions ADD COLUMN channel_title TEXTz0ALTER TABLE sessions ADD COLUMN channel_vcn TEXTz(SELECT reference_id FROM session_historyz;Altering database. Updating database table session_history.zEALTER TABLE session_history ADD COLUMN reference_id INTEGER DEFAULT 0a  UPDATE session_history SET reference_id = (SELECT (CASE              WHEN (SELECT MIN(id) FROM session_history WHERE id > (                  SELECT MAX(id) FROM session_history                  WHERE (user_id = t1.user_id AND rating_key <> t1.rating_key AND id < t1.id)) AND user_id = t1.user_id) IS NULL              THEN (SELECT MIN(id) FROM session_history WHERE (user_id = t1.user_id))              ELSE (SELECT MIN(id) FROM session_history WHERE id > (                  SELECT MAX(id) FROM session_history                  WHERE (user_id = t1.user_id AND rating_key <> t1.rating_key AND id < t1.id)) AND user_id = t1.user_id) END) FROM session_history AS t1 WHERE t1.id = session_history.id) z%SELECT bandwidth FROM session_historyz<ALTER TABLE session_history ADD COLUMN platform_version TEXTz3ALTER TABLE session_history ADD COLUMN product TEXTz;ALTER TABLE session_history ADD COLUMN product_version TEXTz3ALTER TABLE session_history ADD COLUMN profile TEXTz8ALTER TABLE session_history ADD COLUMN bandwidth INTEGERz4ALTER TABLE session_history ADD COLUMN location TEXTz;ALTER TABLE session_history ADD COLUMN quality_profile TEXTz"SELECT secure FROM session_historyz5ALTER TABLE session_history ADD COLUMN secure INTEGERz6ALTER TABLE session_history ADD COLUMN relayed INTEGERz?SELECT platform FROM session_history WHERE platform = 'windows'r   zQAltering database. Capitalizing Windows platform values in session_history table.zKUPDATE session_history SET platform = 'Windows' WHERE platform = 'windows' zFUnable to capitalize Windows platform values in session_history table.z=SELECT platform FROM session_history WHERE platform = 'macos'zOAltering database. Capitalizing macOS platform values in session_history table.zGUPDATE session_history SET platform = 'macOS' WHERE platform = 'macos' zDUnable to capitalize macOS platform values in session_history table.z/SELECT full_title FROM session_history_metadatazDAltering database. Updating database table session_history_metadata.z?ALTER TABLE session_history_metadata ADD COLUMN full_title TEXTz,SELECT tagline FROM session_history_metadataz<ALTER TABLE session_history_metadata ADD COLUMN tagline TEXTz+SELECT labels FROM session_history_metadataz;ALTER TABLE session_history_metadata ADD COLUMN labels TEXTz3SELECT original_title FROM session_history_metadatazCALTER TABLE session_history_metadata ADD COLUMN original_title TEXTz)SELECT live FROM session_history_metadatazFALTER TABLE session_history_metadata ADD COLUMN live INTEGER DEFAULT 0zFALTER TABLE session_history_metadata ADD COLUMN channel_call_sign TEXTzGALTER TABLE session_history_metadata ADD COLUMN channel_identifier TEXTzBALTER TABLE session_history_metadata ADD COLUMN channel_thumb TEXTz9SELECT marker_credits_first FROM session_history_metadatazYALTER TABLE session_history_metadata ADD COLUMN marker_credits_first INTEGER DEFAULT NULLzYALTER TABLE session_history_metadata ADD COLUMN marker_credits_final INTEGER DEFAULT NULLz/SELECT channel_id FROM session_history_metadataz?ALTER TABLE session_history_metadata ADD COLUMN channel_id TEXTzBALTER TABLE session_history_metadata ADD COLUMN channel_title TEXTz@ALTER TABLE session_history_metadata ADD COLUMN channel_vcn TEXTz9SELECT transcode_decision FROM session_history_media_infozFAltering database. Updating database table session_history_media_info.zIALTER TABLE session_history_media_info ADD COLUMN transcode_decision TEXTa5  UPDATE session_history_media_info SET transcode_decision = (CASE WHEN video_decision = 'transcode' OR audio_decision = 'transcode' THEN 'transcode' WHEN video_decision = 'copy' OR audio_decision = 'copy' THEN 'copy' WHEN video_decision = 'direct play' OR audio_decision = 'direct play' THEN 'direct play' END)z0SELECT subtitles FROM session_history_media_infozIALTER TABLE session_history_media_info ADD COLUMN video_bit_depth INTEGERzGALTER TABLE session_history_media_info ADD COLUMN video_bitrate INTEGERzHALTER TABLE session_history_media_info ADD COLUMN video_codec_level TEXTzEALTER TABLE session_history_media_info ADD COLUMN video_width INTEGERzFALTER TABLE session_history_media_info ADD COLUMN video_height INTEGERzGALTER TABLE session_history_media_info ADD COLUMN audio_bitrate INTEGERzPALTER TABLE session_history_media_info ADD COLUMN transcode_hw_requested INTEGERzTALTER TABLE session_history_media_info ADD COLUMN transcode_hw_full_pipeline INTEGERzJALTER TABLE session_history_media_info ADD COLUMN transcode_hw_decode TEXTzJALTER TABLE session_history_media_info ADD COLUMN transcode_hw_encode TEXTzPALTER TABLE session_history_media_info ADD COLUMN transcode_hw_decode_title TEXTzPALTER TABLE session_history_media_info ADD COLUMN transcode_hw_encode_title TEXTzGALTER TABLE session_history_media_info ADD COLUMN stream_container TEXTzPALTER TABLE session_history_media_info ADD COLUMN stream_container_decision TEXTzHALTER TABLE session_history_media_info ADD COLUMN stream_bitrate INTEGERzLALTER TABLE session_history_media_info ADD COLUMN stream_video_decision TEXTzNALTER TABLE session_history_media_info ADD COLUMN stream_video_bitrate INTEGERzIALTER TABLE session_history_media_info ADD COLUMN stream_video_codec TEXTzOALTER TABLE session_history_media_info ADD COLUMN stream_video_codec_level TEXTzPALTER TABLE session_history_media_info ADD COLUMN stream_video_bit_depth INTEGERzMALTER TABLE session_history_media_info ADD COLUMN stream_video_height INTEGERzLALTER TABLE session_history_media_info ADD COLUMN stream_video_width INTEGERzNALTER TABLE session_history_media_info ADD COLUMN stream_video_resolution TEXTzMALTER TABLE session_history_media_info ADD COLUMN stream_video_framerate TEXTzLALTER TABLE session_history_media_info ADD COLUMN stream_audio_decision TEXTzIALTER TABLE session_history_media_info ADD COLUMN stream_audio_codec TEXTzNALTER TABLE session_history_media_info ADD COLUMN stream_audio_bitrate INTEGERzOALTER TABLE session_history_media_info ADD COLUMN stream_audio_channels INTEGERzOALTER TABLE session_history_media_info ADD COLUMN stream_subtitle_decision TEXTzLALTER TABLE session_history_media_info ADD COLUMN stream_subtitle_codec TEXTzPALTER TABLE session_history_media_info ADD COLUMN stream_subtitle_container TEXTzPALTER TABLE session_history_media_info ADD COLUMN stream_subtitle_forced INTEGERzCALTER TABLE session_history_media_info ADD COLUMN subtitles INTEGERzHALTER TABLE session_history_media_info ADD COLUMN synced_version INTEGERzKALTER TABLE session_history_media_info ADD COLUMN optimized_version INTEGERzPALTER TABLE session_history_media_info ADD COLUMN optimized_version_profile TEXTzYUPDATE session_history_media_info SET video_resolution=REPLACE(video_resolution, 'p', '')z\UPDATE session_history_media_info SET video_resolution=REPLACE(video_resolution, 'SD', 'sd')z5SELECT subtitle_codec FROM session_history_media_infozEALTER TABLE session_history_media_info ADD COLUMN subtitle_codec TEXTz=SELECT synced_version_profile FROM session_history_media_infozMALTER TABLE session_history_media_info ADD COLUMN synced_version_profile TEXTzNALTER TABLE session_history_media_info ADD COLUMN optimized_version_title TEXTz<SELECT transcode_hw_decoding FROM session_history_media_infozOALTER TABLE session_history_media_info ADD COLUMN transcode_hw_decoding INTEGERzOALTER TABLE session_history_media_info ADD COLUMN transcode_hw_encoding INTEGERzVUPDATE session_history_media_info SET subtitle_codec = '' WHERE subtitle_codec IS NULLzVSELECT stream_container FROM session_history_media_info WHERE stream_container IS NULLzNAltering database. Removing NULL values from session_history_media_info table.zZUPDATE session_history_media_info SET stream_container = '' WHERE stream_container IS NULLz^UPDATE session_history_media_info SET stream_video_codec = '' WHERE stream_video_codec IS NULLz^UPDATE session_history_media_info SET stream_audio_codec = '' WHERE stream_audio_codec IS NULLzdUPDATE session_history_media_info SET stream_subtitle_codec = '' WHERE stream_subtitle_codec IS NULLzCUnable to remove NULL values from session_history_media_info table.z6SELECT video_scan_type FROM session_history_media_infozFALTER TABLE session_history_media_info ADD COLUMN video_scan_type TEXTzLALTER TABLE session_history_media_info ADD COLUMN video_full_resolution TEXTzMALTER TABLE session_history_media_info ADD COLUMN stream_video_scan_type TEXTzSALTER TABLE session_history_media_info ADD COLUMN stream_video_full_resolution TEXTzbUPDATE session_history_media_info SET video_scan_type = 'progressive' WHERE video_resolution != ''zUPDATE session_history_media_info SET stream_video_scan_type = 'progressive' WHERE stream_video_resolution != '' AND stream_video_resolution IS NOT NULLzUPDATE session_history_media_info SET video_full_resolution = (CASE WHEN video_resolution = '' OR video_resolution = 'SD' OR video_resolution = '4k' THEN video_resolution WHEN video_resolution = 'sd' THEN 'SD' ELSE video_resolution || 'p' END)a%  UPDATE session_history_media_info SET stream_video_full_resolution = ( CASE WHEN stream_video_resolution = '' OR stream_video_resolution = 'SD' OR stream_video_resolution = '4k' THEN stream_video_resolution WHEN stream_video_resolution = 'sd' THEN 'SD' ELSE stream_video_resolution || 'p' END)z:SELECT video_dynamic_range FROM session_history_media_infozJALTER TABLE session_history_media_info ADD COLUMN video_dynamic_range TEXTzQALTER TABLE session_history_media_info ADD COLUMN stream_video_dynamic_range TEXTzqSELECT * FROM session_history_media_info WHERE video_dynamic_range = 'SDR' AND stream_video_dynamic_range = 'HDR'zUPDATE session_history_media_info SET stream_video_dynamic_range = 'SDR' WHERE video_dynamic_range = 'SDR' AND stream_video_dynamic_range = 'HDR'z5SELECT audio_language FROM session_history_media_infozEALTER TABLE session_history_media_info ADD COLUMN audio_language TEXTzJALTER TABLE session_history_media_info ADD COLUMN audio_language_code TEXTzLALTER TABLE session_history_media_info ADD COLUMN stream_audio_language TEXTzQALTER TABLE session_history_media_info ADD COLUMN stream_audio_language_code TEXTz8SELECT subtitle_language FROM session_history_media_infozHALTER TABLE session_history_media_info ADD COLUMN subtitle_language TEXTzOALTER TABLE session_history_media_info ADD COLUMN stream_subtitle_language TEXTz6SELECT subtitle_forced FROM session_history_media_infozIALTER TABLE session_history_media_info ADD COLUMN subtitle_forced INTEGERz&SELECT section_id FROM session_historyz9ALTER TABLE session_history ADD COLUMN section_id INTEGERzUPDATE session_history SET section_id = (SELECT section_id FROM session_history_metadata WHERE session_history_metadata.id = session_history.id)a  CREATE TABLE IF NOT EXISTS session_history_metadata_temp (id INTEGER PRIMARY KEY, rating_key INTEGER, parent_rating_key INTEGER, grandparent_rating_key INTEGER, title TEXT, parent_title TEXT, grandparent_title TEXT, original_title TEXT, full_title TEXT, media_index INTEGER, parent_media_index INTEGER, thumb TEXT, parent_thumb TEXT, grandparent_thumb TEXT, art TEXT, media_type TEXT, year INTEGER, originally_available_at TEXT, added_at INTEGER, updated_at INTEGER, last_viewed_at INTEGER, content_rating TEXT, summary TEXT, tagline TEXT, rating TEXT, duration INTEGER DEFAULT 0, guid TEXT, directors TEXT, writers TEXT, actors TEXT, genres TEXT, studio TEXT, labels TEXT, live INTEGER DEFAULT 0, channel_call_sign TEXT, channel_identifier TEXT, channel_thumb TEXT)a  INSERT INTO session_history_metadata_temp (id, rating_key, parent_rating_key, grandparent_rating_key, title, parent_title, grandparent_title, original_title, full_title, media_index, parent_media_index, thumb, parent_thumb, grandparent_thumb, art, media_type, year, originally_available_at, added_at, updated_at, last_viewed_at, content_rating, summary, tagline, rating, duration, guid, directors, writers, actors, genres, studio, labels, live, channel_call_sign, channel_identifier, channel_thumb) SELECT id, rating_key, parent_rating_key, grandparent_rating_key, title, parent_title, grandparent_title, original_title, full_title, media_index, parent_media_index, thumb, parent_thumb, grandparent_thumb, art, media_type, year, originally_available_at, added_at, updated_at, last_viewed_at, content_rating, summary, tagline, rating, duration, guid, directors, writers, actors, genres, studio, labels, live, channel_call_sign, channel_identifier, channel_thumb FROM session_history_metadataz#DROP TABLE session_history_metadatazLALTER TABLE session_history_metadata_temp RENAME TO session_history_metadatazSELECT do_notify FROM usersz1Altering database. Updating database table users.z8ALTER TABLE users ADD COLUMN do_notify INTEGER DEFAULT 1zSELECT keep_history FROM usersz;ALTER TABLE users ADD COLUMN keep_history INTEGER DEFAULT 1z#SELECT custom_avatar_url FROM usersz3ALTER TABLE users ADD COLUMN custom_avatar_url TEXTzSELECT deleted_user FROM usersz;ALTER TABLE users ADD COLUMN deleted_user INTEGER DEFAULT 0zSELECT allow_guest FROM usersz:ALTER TABLE users ADD COLUMN allow_guest INTEGER DEFAULT 0z,ALTER TABLE users ADD COLUMN user_token TEXTz.ALTER TABLE users ADD COLUMN server_token TEXTz"SELECT shared_libraries FROM usersz2ALTER TABLE users ADD COLUMN shared_libraries TEXTz,ALTER TABLE users ADD COLUMN filter_all TEXTz/ALTER TABLE users ADD COLUMN filter_movies TEXTz+ALTER TABLE users ADD COLUMN filter_tv TEXTz.ALTER TABLE users ADD COLUMN filter_music TEXTz/ALTER TABLE users ADD COLUMN filter_photos TEXTzSELECT is_admin FROM usersz7ALTER TABLE users ADD COLUMN is_admin INTEGER DEFAULT 0zSELECT is_active FROM usersz8ALTER TABLE users ADD COLUMN is_active INTEGER DEFAULT 1zSELECT title FROM usersz'ALTER TABLE users ADD COLUMN title TEXTz2SELECT * FROM users WHERE friendly_name = usernamezCAltering database. Resetting user friendly names equal to username.zDUPDATE users SET friendly_name = NULL WHERE friendly_name = usernamez!SELECT poster_url FROM notify_logz6Altering database. Updating database table notify_log.z1ALTER TABLE notify_log ADD COLUMN poster_url TEXTz SELECT timestamp FROM notify_logaa  CREATE TABLE IF NOT EXISTS notify_log_temp (id INTEGER PRIMARY KEY AUTOINCREMENT, timestamp INTEGER, session_key INTEGER, rating_key INTEGER, parent_rating_key INTEGER, grandparent_rating_key INTEGER, user_id INTEGER, user TEXT, agent_id INTEGER, agent_name TEXT, notify_action TEXT, subject_text TEXT, body_text TEXT, script_args TEXT, poster_url TEXT)a  INSERT INTO notify_log_temp (session_key, rating_key, user_id, user, agent_id, agent_name, poster_url, timestamp, notify_action) SELECT session_key, rating_key, user_id, user, agent_id, agent_name, poster_url, timestamp, notify_action FROM notify_log_temp UNION ALL SELECT session_key, rating_key, user_id, user, agent_id, agent_name, poster_url, on_play, 'play' FROM notify_log WHERE on_play UNION ALL SELECT session_key, rating_key, user_id, user, agent_id, agent_name, poster_url, on_stop, 'stop' FROM notify_log WHERE on_stop UNION ALL SELECT session_key, rating_key, user_id, user, agent_id, agent_name, poster_url, on_watched, 'watched' FROM notify_log WHERE on_watched UNION ALL SELECT session_key, rating_key, user_id, user, agent_id, agent_name, poster_url, on_pause, 'pause' FROM notify_log WHERE on_pause UNION ALL SELECT session_key, rating_key, user_id, user, agent_id, agent_name, poster_url, on_resume, 'resume' FROM notify_log WHERE on_resume UNION ALL SELECT session_key, rating_key, user_id, user, agent_id, agent_name, poster_url, on_buffer, 'buffer' FROM notify_log WHERE on_buffer UNION ALL SELECT session_key, rating_key, user_id, user, agent_id, agent_name, poster_url, on_created, 'created' FROM notify_log WHERE on_created ORDER BY timestamp zDROP TABLE notify_logz0ALTER TABLE notify_log_temp RENAME TO notify_logz"SELECT notifier_id FROM notify_logz5ALTER TABLE notify_log ADD COLUMN notifier_id INTEGERzSELECT success FROM notify_logz;ALTER TABLE notify_log ADD COLUMN success INTEGER DEFAULT 0z!UPDATE notify_log SET success = 1zSELECT tag FROM notify_logz*ALTER TABLE notify_log ADD COLUMN tag TEXTz%SELECT start_time FROM newsletter_logz:Altering database. Updating database table newsletter_log.z8ALTER TABLE newsletter_log ADD COLUMN start_time INTEGERz6ALTER TABLE newsletter_log ADD COLUMN end_time INTEGERz#SELECT filename FROM newsletter_logz3ALTER TABLE newsletter_log ADD COLUMN filename TEXTz'SELECT email_msg_id FROM newsletter_logz7ALTER TABLE newsletter_log ADD COLUMN email_msg_id TEXTzSELECT id_name FROM newslettersz7Altering database. Updating database table newsletters.z8ALTER TABLE newsletters ADD COLUMN id_name TEXT NOT NULLzGSELECT SQL FROM sqlite_master WHERE type='table' AND name='newsletters'z!TEXT NOT NULL DEFAULT "0 0 * * 0"zDAltering database. Updating default cron value in newsletters table.a8  CREATE TABLE newsletters_temp (id INTEGER PRIMARY KEY AUTOINCREMENT, agent_id INTEGER, agent_name TEXT, agent_label TEXT, id_name TEXT NOT NULL, friendly_name TEXT, newsletter_config TEXT, email_config TEXT, subject TEXT, body TEXT, message TEXT, cron TEXT NOT NULL DEFAULT '0 0 * * 0', active INTEGER DEFAULT 0)a@  INSERT INTO newsletters_temp (id, agent_id, agent_name, agent_label, id_name, friendly_name, newsletter_config, email_config, subject, body, message, cron, active) SELECT id, agent_id, agent_name, agent_label, id_name, friendly_name, newsletter_config, email_config, subject, body, message, cron, active FROM newsletterszDROP TABLE newslettersz2ALTER TABLE newsletters_temp RENAME TO newslettersz9Unable to update default cron value in newsletters table.zDROP TABLE newsletters_tempzLSELECT SQL FROM sqlite_master WHERE type='table' AND name='library_sections'zsection_id INTEGER UNIQUEzXAltering database. Removing unique constraint on section_id from library_sections table.a  CREATE TABLE library_sections_temp (id INTEGER PRIMARY KEY AUTOINCREMENT, server_id TEXT, section_id INTEGER, section_name TEXT, section_type TEXT, thumb TEXT, custom_thumb_url TEXT, art TEXT, count INTEGER, parent_count INTEGER, child_count INTEGER, do_notify INTEGER DEFAULT 1, do_notify_created INTEGER DEFAULT 1, keep_history INTEGER DEFAULT 1, deleted_section INTEGER DEFAULT 0, UNIQUE(server_id, section_id))a  INSERT INTO library_sections_temp (id, server_id, section_id, section_name, section_type, thumb, custom_thumb_url, art, count, parent_count, child_count, do_notify, do_notify_created, keep_history, deleted_section) SELECT id, server_id, section_id, section_name, section_type, thumb, custom_thumb_url, art, count, parent_count, child_count, do_notify, do_notify_created, keep_history, deleted_section FROM library_sectionszDROP TABLE library_sectionsz<ALTER TABLE library_sections_temp RENAME TO library_sectionszDUnable to remove section_id unique constraint from library_sections.z DROP TABLE library_sections_tempz3SELECT * FROM library_sections WHERE server_id = ''zLAltering database. Removing duplicate libraries from library_sections table.z1DELETE FROM library_sections WHERE server_id = ''zAUnable to remove duplicate libraries from library_sections table.z"SELECT agent FROM library_sectionsz<Altering database. Updating database table library_sections.z2ALTER TABLE library_sections ADD COLUMN agent TEXTz+SELECT custom_art_url FROM library_sectionsz;ALTER TABLE library_sections ADD COLUMN custom_art_url TEXTz&SELECT is_active FROM library_sectionszCALTER TABLE library_sections ADD COLUMN is_active INTEGER DEFAULT 1z<SELECT thumb, art FROM library_sections WHERE section_id = ?r1   zBUPDATE library_sections SET thumb = ?, art =? WHERE section_id = ?zASELECT SQL FROM sqlite_master WHERE type='table' AND name='users'zusername TEXT NOT NULL UNIQUEzKAltering database. Removing unique constraint on username from users table.a  CREATE TABLE users_temp (id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER DEFAULT NULL UNIQUE, username TEXT NOT NULL, friendly_name TEXT, thumb TEXT, custom_avatar_url TEXT, email TEXT, is_home_user INTEGER DEFAULT NULL, is_allow_sync INTEGER DEFAULT NULL, is_restricted INTEGER DEFAULT NULL, do_notify INTEGER DEFAULT 1, keep_history INTEGER DEFAULT 1, deleted_user INTEGER DEFAULT 0)a\  INSERT INTO users_temp (id, user_id, username, friendly_name, thumb, custom_avatar_url, email, is_home_user, is_allow_sync, is_restricted, do_notify, keep_history, deleted_user) SELECT id, user_id, username, friendly_name, thumb, custom_avatar_url, email, is_home_user, is_allow_sync, is_restricted, do_notify, keep_history, deleted_user FROM userszDROP TABLE usersz&ALTER TABLE users_temp RENAME TO usersz7Unable to remove username unique constraint from users.zDROP TABLE users_tempzJSELECT SQL FROM sqlite_master WHERE type='table' AND name='mobile_devices'z!device_token TEXT NOT NULL UNIQUEz@Altering database. Dropping and recreating mobile_devices table.zDROP TABLE mobile_deviceszCREATE TABLE IF NOT EXISTS mobile_devices (id INTEGER PRIMARY KEY AUTOINCREMENT, device_id TEXT NOT NULL UNIQUE, device_token TEXT, device_name TEXT, friendly_name TEXT)z(Failed to recreate mobile_devices table.z$SELECT last_seen FROM mobile_devicesz:Altering database. Updating database table mobile_devices.z7ALTER TABLE mobile_devices ADD COLUMN last_seen INTEGERz#SELECT official FROM mobile_devicesz@ALTER TABLE mobile_devices ADD COLUMN official INTEGER DEFAULT 0z$SELECT device_id FROM mobile_devicesz:UPDATE mobile_devices SET official = ? WHERE device_id = ?z'SELECT onesignal_id FROM mobile_devicesz7ALTER TABLE mobile_devices ADD COLUMN onesignal_id TEXTz#SELECT platform FROM mobile_devicesz3ALTER TABLE mobile_devices ADD COLUMN platform TEXTz2ALTER TABLE mobile_devices ADD COLUMN version TEXTz7SELECT device_id FROM mobile_devices WHERE official > 0z:UPDATE mobile_devices SET platform = ? WHERE device_id = ?androidz'SELECT custom_conditions FROM notifiersz5Altering database. Updating database table notifiers.z7ALTER TABLE notifiers ADD COLUMN custom_conditions TEXTz=ALTER TABLE notifiers ADD COLUMN custom_conditions_logic TEXTzSELECT on_change FROM notifiersz<ALTER TABLE notifiers ADD COLUMN on_change INTEGER DEFAULT 0z7ALTER TABLE notifiers ADD COLUMN on_change_subject TEXTz4ALTER TABLE notifiers ADD COLUMN on_change_body TEXTz(SELECT on_plexpydbcorrupt FROM notifierszEALTER TABLE notifiers ADD COLUMN on_plexpydbcorrupt INTEGER DEFAULT 0z@ALTER TABLE notifiers ADD COLUMN on_plexpydbcorrupt_subject TEXTz=ALTER TABLE notifiers ADD COLUMN on_plexpydbcorrupt_body TEXTzSELECT on_error FROM notifiersz;ALTER TABLE notifiers ADD COLUMN on_error INTEGER DEFAULT 0z6ALTER TABLE notifiers ADD COLUMN on_error_subject TEXTz3ALTER TABLE notifiers ADD COLUMN on_error_body TEXTzSELECT on_intro FROM notifiersz;ALTER TABLE notifiers ADD COLUMN on_intro INTEGER DEFAULT 0z6ALTER TABLE notifiers ADD COLUMN on_intro_subject TEXTz3ALTER TABLE notifiers ADD COLUMN on_intro_body TEXTz=ALTER TABLE notifiers ADD COLUMN on_credits INTEGER DEFAULT 0z8ALTER TABLE notifiers ADD COLUMN on_credits_subject TEXTz5ALTER TABLE notifiers ADD COLUMN on_credits_body TEXTz#SELECT on_commercial FROM notifiersz@ALTER TABLE notifiers ADD COLUMN on_commercial INTEGER DEFAULT 0z;ALTER TABLE notifiers ADD COLUMN on_commercial_subject TEXTz8ALTER TABLE notifiers ADD COLUMN on_commercial_body TEXTz$SELECT rating_key FROM tvmaze_lookupz9Altering database. Updating database table tvmaze_lookup.z7ALTER TABLE tvmaze_lookup ADD COLUMN rating_key INTEGERz1DROP INDEX IF EXISTS idx_tvmaze_lookup_thetvdb_idz.DROP INDEX IF EXISTS idx_tvmaze_lookup_imdb_idz(SELECT rating_key FROM themoviedb_lookupz=Altering database. Updating database table themoviedb_lookup.z;ALTER TABLE themoviedb_lookup ADD COLUMN rating_key INTEGERz5DROP INDEX IF EXISTS idx_themoviedb_lookup_thetvdb_idz2DROP INDEX IF EXISTS idx_themoviedb_lookup_imdb_idzSELECT success FROM user_loginz6Altering database. Updating database table user_login.z;ALTER TABLE user_login ADD COLUMN success INTEGER DEFAULT 1zSELECT expiry FROM user_loginz-ALTER TABLE user_login ADD COLUMN expiry TEXTz0ALTER TABLE user_login ADD COLUMN jwt_token TEXTzwSELECT agent_label FROM notifiers WHERE agent_label = 'XBMC' OR agent_label = 'OSX Notify' OR agent_name = 'androidapp'z&Altering database. Renaming notifiers.zDUPDATE notifiers SET agent_label = 'Kodi' WHERE agent_label = 'XBMC'z_UPDATE notifiers SET agent_label = 'macOS Notification Center' WHERE agent_label = 'OSX Notify'zrUPDATE notifiers SET agent_name = 'remoteapp', agent_label = 'Tautulli Remote App' WHERE agent_name = 'androidapp'zSELECT thumb_level FROM exportsz3Altering database. Updating database table exports.z<ALTER TABLE exports ADD COLUMN thumb_level INTEGER DEFAULT 0z:UPDATE exports SET thumb_level = 9 WHERE include_thumb = 1z:ALTER TABLE exports ADD COLUMN art_level INTEGER DEFAULT 0z6UPDATE exports SET art_level = 9 WHERE include_art = 1zSELECT title FROM exportsz)ALTER TABLE exports ADD COLUMN title TEXTzAALTER TABLE exports ADD COLUMN individual_files INTEGER DEFAULT 0zSELECT total_items FROM exportsz?ALTER TABLE exports ADD COLUMN exported_items INTEGER DEFAULT 0z<ALTER TABLE exports ADD COLUMN total_items INTEGER DEFAULT 0zSELECT logo_level FROM exportsz;ALTER TABLE exports ADD COLUMN logo_level INTEGER DEFAULT 0zaDELETE FROM tvmaze_lookup WHERE id NOT IN (SELECT MIN(id) FROM tvmaze_lookup GROUP BY rating_key)ziDELETE FROM themoviedb_lookup WHERE id NOT IN (SELECT MIN(id) FROM themoviedb_lookup GROUP BY rating_key)zkDELETE FROM musicbrainz_lookup WHERE id NOT IN (SELECT MIN(id) FROM musicbrainz_lookup GROUP BY rating_key)zgDELETE FROM image_hash_lookup WHERE id NOT IN (SELECT MIN(id) FROM image_hash_lookup GROUP BY img_hash)zgDELETE FROM cloudinary_lookup WHERE id NOT IN (SELECT MIN(id) FROM cloudinary_lookup GROUP BY img_hash)z]DELETE FROM imgur_lookup WHERE id NOT IN (SELECT MIN(id) FROM imgur_lookup GROUP BY img_hash)z-SELECT id FROM users WHERE username = 'Local'z)User 'Local' does not exist. Adding user.z9INSERT INTO users (user_id, username) VALUES (0, 'Local')zYCREATE INDEX IF NOT EXISTS idx_session_history_media_type ON session_history (media_type)znCREATE INDEX IF NOT EXISTS idx_session_history_media_type_stopped ON session_history (media_type, stopped ASC)zYCREATE INDEX IF NOT EXISTS idx_session_history_rating_key ON session_history (rating_key)zgCREATE INDEX IF NOT EXISTS idx_session_history_parent_rating_key ON session_history (parent_rating_key)zqCREATE INDEX IF NOT EXISTS idx_session_history_grandparent_rating_key ON session_history (grandparent_rating_key)zMCREATE INDEX IF NOT EXISTS idx_session_history_user ON session_history (user)zSCREATE INDEX IF NOT EXISTS idx_session_history_user_id ON session_history (user_id)zhCREATE INDEX IF NOT EXISTS idx_session_history_user_id_stopped ON session_history (user_id, stopped ASC)zYCREATE INDEX IF NOT EXISTS idx_session_history_section_id ON session_history (section_id)znCREATE INDEX IF NOT EXISTS idx_session_history_section_id_stopped ON session_history (section_id, stopped ASC)zaCREATE INDEX IF NOT EXISTS idx_session_history_reference_id ON session_history (reference_id ASC)zkCREATE INDEX IF NOT EXISTS idx_session_history_metadata_rating_key ON session_history_metadata (rating_key)z_CREATE INDEX IF NOT EXISTS idx_session_history_metadata_guid ON session_history_metadata (guid)z_CREATE INDEX IF NOT EXISTS idx_session_history_metadata_live ON session_history_metadata (live)zCREATE INDEX IF NOT EXISTS idx_session_history_media_info_transcode_decision ON session_history_media_info (transcode_decision)zQCREATE UNIQUE INDEX IF NOT EXISTS idx_tvmaze_lookup ON tvmaze_lookup (rating_key)zYCREATE UNIQUE INDEX IF NOT EXISTS idx_themoviedb_lookup ON themoviedb_lookup (rating_key)z[CREATE UNIQUE INDEX IF NOT EXISTS idx_musicbrainz_lookup ON musicbrainz_lookup (rating_key)zWCREATE UNIQUE INDEX IF NOT EXISTS idx_image_hash_lookup ON image_hash_lookup (img_hash)zWCREATE UNIQUE INDEX IF NOT EXISTS idx_cloudinary_lookup ON cloudinary_lookup (img_hash)zMCREATE UNIQUE INDEX IF NOT EXISTS idx_imgur_lookup ON imgur_lookup (img_hash)zpCREATE UNIQUE INDEX IF NOT EXISTS idx_sessions_continued ON sessions_continued (user_id, machine_id, media_type)z4SELECT value FROM version_info WHERE key = 'version'zFINSERT OR REPLACE INTO version_info (key, value) VALUES ('version', ?)z7UPDATE version_info SET value = ? WHERE key = 'version'zGSELECT SQL FROM sqlite_master WHERE type='table' AND name='poster_urls'zSELECT * FROM poster_urlsz8Altering database. Updating database table imgur_lookup.
rating_keyi  i  poster)r  widthheightfallbackposter_title
poster_urldelete_hashimgur)img_hash	img_titleimg_urlr$  servicezDROP TABLE poster_urls) re   connectrh   cursorexecuteOperationalErrorr   rp   fetchallr   rI   fetchoner   LIVE_TV_SECTION_IDDEFAULT_LIVE_TV_THUMBDEFAULT_LIVE_TV_ART_FULLr   validate_onesignal_idrY   r   version_to_tuplecommitcloser	   MonitorDatabaseselectr
   DataFactoryr   set_hash_image_infoset_img_infoaction)conn_dbc_dbresult	device_iddbdata_factoryrowr&  s           r   rj   rj   O  sl3   oog&G>>D 	LLO
 	LL%	%'T 	LL	N 	LL	) 	LL	c4 	LL
	` 	LL	f	 	LL	L 	LL	' 	LL	@< 	LL	d 	LL	L 	LL	% 	LL	 	LL	L 	LL	@ 	LL	L 	LL	! 	LL	I 	LL	M 	LL	E 	LL	K	
34(
12.N
67`	
89
78
67
34
9:
:;
>?:W
;<r
89
56	
BC	
AB
34	
01
67
:;	
23
@A
;<"	
?@
>?	
CD
01	
56
:;
:;"	
=>	
;<	
12
67
23
67
?@,
<=4	
9:	^ ; <<DHJ 	v;?LLlmLL]	\ 9 ::B(* 	v;?LLjkLLY
FG
CD
BC
JK
@A"	
PQ
FG
PQu
GHn
LM	
TU
ST[ ? @@H
 	v;?LLijLLl LLp LLp LLv$
MNL	
QR \\ e ffnfnfp W	

LM"	
OP
MN/
=>b
23
56
:;
56
45
9:.
12
23
./RS\\^LL^_LL_`

89#
78J
9:	
56
12	
<=
:;
>?
67ghqqs0F1I=LL_`LLT LL# LL( LLD!lmvvx&&)3LLstLLT LL( LL- LLNYST]]_v;?LLghLLC
9:
BC
=>
\%889;;C8: 	6!9F1ILLWXLL] 66 99 3356abkkm*fQi7LLfgLLR LL LL" LL8jkttv.&);LL[\LL+ LLk
;<
S:;
>?1:; 	
>?
67
?@
56
56.
:;
;<
?@
56	
45 \\ 9 : ;C(*  =>R	
 	m	
 	.	

67"	
01	
67
56 _ 	`
 c 	d
 d 	e
 a 	b
 a 	b
 \ 	] \\IJF??@APQ 	LL	* 	LL	7 	LL	* 	LL	1 	LL	6 	LL	$ 	LL	' 	LL	4 	LL	* 	LL	7 	LL	0 	LL	3 	LL	- 	LL	- 	LL	= 	LL	( 	LL	, 	LL	- 	LL	* 	LL	* 	LL	% 	LL	B \\PQZZ\FT^^	
 
	!	!&)	,w/G/G/W	WE^^	

 NNJJL%%'deYY:;FLLST&224L ;/CC"<0TT\^))8s>GZ25l2CQTUbQc29 * ;; II./ _; ## 
KL=	
 	N	
 	8	
 	7	
 	=	

* ## 
KL8	
 	?	
 	D	
 	@	
 	9	
 	=	
#
0 ## L
KL=	
 	;	
 	G	
 	L	
 	K	
 	>	
 	A	
 	A	
 	;	
 	<	
 	<	
 	>	
 	>	
 	=	
 	C	
 	B	
 	?	
 	D	
 	E	
 	F	
 	H	
 	H	
 	N	
 	E	
 	F	
UL
b ## 
KLL	
 	K	

 ## 
KLA	

 ## 
KL@	

 ## 
KL=	

 ## 
KL@	

 ## 
KLN	

 ## 
KLE	
 	=	
 	A	
 	H	
 	8	
 	?	
 	D	
 	:	
/
< ## U
KL:	
 	G	
 	L	
 	D	
 	C	
 	A	
 	B	
 	C	
 	A	
 	D	
 	J	
 	B	
 	L	
 	C	
 	H	
 	E	
 	J	
 	H	
 	I	
 	I	
 	H	
 	E	
 	J	
 	K	
 	?	
 	K	
 	H	
 	B	
gU
t ## 
KLB	

 ## 
KL?	

 ## 
KLI	
 	J	

 ## 
KLK	
 	K	

 ## 
KLG	

 ## 
KL:	
 	<	

 ## 
KL=	

 ## 
KLA	

 ## 
KL<	
 	=	

 ## 
KLG	

 ## 
KLB	
 	H	
 	I	
 	O	

$ ## 
KLF	
 	M	

 ## 

KLD	
 	E	
 	@	


 ## 
KLJ	
 	>	

 ## 
KL7	

 ## 
LM?	
 	;	

 ## 
LMN	

 ## 
LMA	
 	F	
 	H	
 	M	

$ ## 
LMD	
 	K	

 ## 
LME	
 	L	

 ## 
LME	
 	G	

 ## 
LMJ	

 ## 
LMF	

 ## 

KL=	
 	@	
 	>	


 ## 
RSS	
 	
1	

. ## 
RSJ	
 	A	
 	I	
 	A	
 	F	
 	B	
 	I	
)
6 ## 
RSC	
 	D	

$ ## ^\]^ ## \Z[\ ## 
[\M	

 ## 
[\J	

 ## 
[\I	

 ## 
[\Q	

 ## 
[\T	
 	T	
 	U	
 	P	

$ ## 
[\g	
 	g	

 ## 

[\M	
 	P	
 	N	


 ## 

]^W	
 	l	


 ## s
]^W	
 	U	
 	V	
 	S	
 	T	
 	U	
 	^	
 	b	
 	X	
 	X	
 	^	
 	^	
 	U	
 	^	
 	V	
 	Z	
 	\	
 	W	
 	]	
 	^	
 	[	
 	Z	
 	\	
 	[	
 	Z	
 	W	
 	\	
 	]	
 	]	
 	Z	
 	^	
 	^	
 	Q	
 	V	
 	Y	
 	^	
 	g	
 	j	
cs
p ## 
]^S	

 ## 
]^[	
 	\	

 ## 

]^]	
 	]	
 	d	


< ## [YZ[ ## "
]^T	
 	Z	
 	[	
 	a	
 	+	
 	Z	
 	0	
 	7	
9"
N ## 
]^X	
 	_	

( ## 
]^S	
 	X	
 	Z	
 	_	

$ ## 
]^V	
 	]	

 ## 
]^W	

 ## -
RSG	
 	F	

 	x
	
 	,	
& 	1	
 	Z	
W-
d ## 
HIF	

 ## 
HII	

 ## 
HIA	

 ## 
HII	

 ## 

HIH	
 	:	
 	<	


 ## 
HI@	
 	:	
 	=	
 	9	
 	<	
 	=	
#
0 ## 
HIE	

 ## 
HIF	

 ## 
HI5	

 ##  ## 
MN?	

 ## !
MNT	
 	"	#( 	#	
 	>	
?!
L ## 
MNC	

 ## 
MNI	
 	/	

 ## 
MN8	

 ## 
QRF	
 	D	

 ## 
QRA	

 ## 
QRE	

 ## 
NOF	

> ## OP	LL-	H ## Z[	LL2	" ## YWXY ## 
ST@	

 ## 
STI	

 ## 
STQ	

  ## 8 ## MN	LL'	* ## >? ## 
QRE	

 ## SQRN	
 ,,'MNWWY 	SJILLU$::9EyQS	SS ## 
QRE	

 ## 1QRA	
 	@	
 ,,IKKS8:	1JILLU#Y/1	11" ## 
LME	
 	K	

 ## 

LMJ	
 	E	
 	B	


 ## 

LMS	
 	N	
 	K	


 ## 

LMI	
 	D	
 	A	


 ## 
LMI	
 	D	
 	A	
 	K	
 	F	
 	C	
#
0 ## 

LMN	
 	I	
 	F	


 ## 

PQE	
 	?	
 	<	


 ## 

TUI	
 	C	
 	@	


 ## 
MNI	

 ## 
MN;	
 	>	

< ## 
JKJ	
 	H	
 	H	
 	D	

$ ## 
JK7	
 	O	

 ## 
JKM	
 	J	

 ## 
JKI	

 ##  ##  ##  ##  ##  ## V ## s
  !AE 3AG AI, AQ )AR ;AS AT AU 1AV AW AZ 'Ab 9Ac Ad Ae* /Af; Ag; Ai %Aj 7Ak 	Al Am -Ao ?Ap! Ar #As 5At Au% Av% +Ax =Ay) Az: !A| 3A} A~ A- )B@> ;BC$ ABD5 !ABE$ 5BF BG BH +BI =BJ BL !BM 3BN9 BP
 B[ *B\ =B]  BB_ B_5 0Bb4 7Bd 
Be> Bg 0Bh Bj- Bk/ )Bl1 <Bm3 Bn5 "Bp 5Br7 Bs9 Bt; .A
Bu= 9Bv Bw By 2Bz B{' B|) +B}= >B~? C@ $BCA +BCB 2ACC 	CD	 CE /CF BCG BCG) A"CH4  CI$ CJ& &CL7 9CM9 CP
 CQ 2CS CT* CV +CX, >CZ C[8 $C] 7C^  8C_4 Ca, Cc  1Cd Ce Ce0 *Cf
 =Cf$ Cf> #Cg BCCg2 EA=AGGAGGBAI)I(AI)I,GAQQAQQA
ARRARR9ASSASS9ATTATT9AUUAUU9AVVAVV9AWWAWWB0AZ
Z	AZ
ZHAbbAbb9AccAcc9AddAddA
Ae'e&Ae'e*A
Af8f7Af8f;9Ag8g7Ag8g;A
Ai	iAi	i9Aj	jAj	j9Ak	kAk	kA
AllAll9AmmAmmA,AooAooA
AppApp!AAr q?Ar rA
AssAss9AttAttA
Au"u!Au"u%9Av"v!Av"v%A,AxxAxxA
Ay&y%Ay&y)A
Az7z6Az7z:A
A||A||9A}}A}}9A~~A~~AA*)A*-A
B@;@:B@;@>BBC!C BC!C$A
BD2D1BD2D5(BE!E BE!E$(BFFBFF9BGGBGG9BHHBHH9BIIBII9BJJBJJA,BLLBLLA
BMMBMMABN6N5BN6N9A
BPPBPP
J;B[	[B[	[:B\
\	B\
\AB]]B]] AB__B__)B_2_1B_2_5B8Bb1b0Bb1b4ABddBddA0Be;e:Be;e>ABggBgg:BhhBhhBBj*j)Bj*j-;Bk,k+Bk,k/;Bl.l-Bl.l1;Bm0m/Bm0m3;Bn2n1Bn2n5ABppBppBBr4r3Br4r7;Bs6s5Bs6s9;Bt8t7Bt8t;;Bu:u9Bu:u=BvvBvv;BwwBwwA1ByyByy;BzzBzzAB{${#B{${';B|&|%B|&|)AB}:}9B}:}=;B~<~;B~<~?;B>=B>@;CA @?CA A)CBA-CB A?CBB CBBCBB
CBB)CCB8CCC
CCCCCCCCCCCC)CDDCDD	;CEECEE;CF
F	CF
F;CGGCGGCG&G%CG&G))CH1HCH&H%CH1H&CH*H(CH1H0CH1H4)CI!I CI!I$;CJ#J"CJ#J&B
CL4L3CL4L7;CM6M5CM6M9B
CPPCPP
ACQQCQQACSS CSSACT'T&CT'T*ACVVCVVBCX)X(CX)X,ACZZCZZAC[5[4C[5[8AC]]C]];C^^C^^ AC_1_0C_1_4A1Ca)a(Ca)a,ACb=b<Cb=c ACddCdd;CeeCeeCe-e,Ce-e0CffCff
Cf!f Cf!f$Cf;f:Cf;f>CggCggCg/g.Cg/g2ChhChc                      t         j                  dk(  r3t        j                          dt         _        t         j	                          y )Nr   r1   )r4   UPGRADE_FLAGr   revalidate_onesignal_idsrN   r  r   r   rm   rm   
  s0    a++-
r   c                 .   t        j                          t        rt        j                          t
        j                  rt
        j	                  d       t        j                  j                  r t        j                  j	                  d       t        t        j                        D ]  }t        j                  d         t        j                          |r*t        j                   d       	 t#        j$                          |r*t        j                   d       	 t#        j*                          |r*t        j                   d       	 t#        j,                          t.        r4t        j                   d	t0               	 t3        j4                  t0               | rt        j                   d       t8        j:                  }t<        r|g}n|t>        g}|t@        z  }d|vr|dgz  }tB        rt        j                   d       nt        j                   d|       tB        rnhtD        jF                  dv r*tI        jJ                  |t3        jL                                n,t3        jN                  ||       nt        j                   d       t        j                          tP        rtP        j	                          ntR        rtR        j	                          t3        jT                  d       y # t&        $ r#}t        j(                  d|z         Y d }~d }~ww xY w# t&        $ r#}t        j(                  d|z         Y d }~d }~ww xY w# t&        $ r#}t        j(                  d|z         Y d }~d }~ww xY w# t6        $ r t        j(                  d
t0               Y w xY w)NF)waitzTautulli is updating...z*Tautulli failed to update: %s. Restarting.z'Tautulli is switching the git branch...z5Tautulli failed to switch git branch: %s. Restarting.z(Tautulli is resetting the git install...z5Tautulli failed to reset git install: %s. Restarting.zRemoving PID file: %szFailed to remove PID file '%s'zTautulli is restarting...z
--nolaunchz+Running as service, not forking. Exiting...zRestarting Tautulli with %s)WindowsDarwin)cwdzTautulli is shutting down...r   )+r   stop	WEBSOCKETr   r  r   runningr   r  ranger4   r  NOTIFY_QUEUEputrN   r   rW   r   r   rk   rI   checkout_git_branchreset_git_installr   r   r:   remover   rL   
executablerV   	FULL_PATHARGSNOFORKr   rZ   
subprocessPopengetcwdexecvWIN_SYS_TRAY_ICONMAC_SYS_TRAY_ICON_exit)restartr   checkoutresetir   exer   s           r   r  r  
  s   MMO }}E"&&..''00e0< 6../  LLN-.	J! =>	U,,. >?	U**, +W5	CIIg /0nn5D#Dt#\N"D KKEFKK5t< __ 55Tryy{3HHS$ 	23
OO""$	""$HHQK{  	JKKDqHII	J  	UKKORSSTT	U  	UKKORSSTT	U  	CKK8'B	CsZ   .K  L L> ;M-  	L)LL	L;L66L;>	M*M%%M*-#NNc                  >    t        j                         j                  S )N)uuiduuid4hexr  r   r   rq   rq   9  s    ::<r   c                  >    t        ddt        j                        } | S )NCl_LjAKUT26AS22YZwqaPwzG-NH1M4BYM2P)
api_secretmeasurement_id	client_id)r   r4   ro   )trackers    r   r
  r
  =  s     +%//G
 Nr   c                    t         j                  |       }|j                  dt        j                         |j                  dt        j
                         |j                  dt               |j                  dt        j                         |j                  dt        j                         |j                  dt        j                         |j                  dt        j                  d d	        |j                  d
t        j                         |j                  dt        j                         |j                  dt               |j                  dt               |j                  dt!        t"                     |j                  ddt$                |j'                         D ]  \  }}|j                  ||        t)        j*                         }|j-                  d      }|j/                  |      xs i }|j                  d|j1                  dd             |j                  d|j1                  dd             t         r	 t         j3                  |g       y y # t4        $ r%}t7        j8                  d| d|       Y d }~y d }~ww xY w)Nr   r   rd   r   branchplatformplatformReleaseplatformVersiond   linuxDistropythonVersionlanguageencodingr   timezoneUTCOffsetr   text)output_formatcountryUnknowncountryCodecode)eventsz)Failed to send analytics event for name 'r.   )r  create_new_eventset_event_paramr   PRODUCTrY   INSTALL_TYPEr4   r|   rZ   r[   r\   r]   PYTHON_VERSIONra   rc   r^   r_   r`   itemsr   PlexTVget_public_ipget_geoip_lookupgetsendrk   r   rI   )	r   kwargseventkeyvalueplex_tv
ip_addressgeolocationr   s	            r   r  r  F  s   $$$$/E	&&..1	)V^^4	)\2	(F$5$56	*foo6	+V-D-DE	+V-D-DTc-JK	-)E)EF	/6+@+@A	*l3	*l3	*c,&78	-^4D/EFlln *
Uc5)* mmoG&&V&<J**:6<"K	)[__Y	%JK	-)KL	XLLL(   	XKKdTUVWW	Xs   I 	J&JJc           	      >   | s|} t         j                  j                  |       s	 t        j                  |        t        j                  | t         j                        sPt        j                  d|d| d       |r.| |k7  r)t        j                  d|d|d       t        d ||      S | dfS | dfS # t        $ ra}t        j                  d|d| d|       |r3| |k7  r.t        j                  d|d|d       t        d ||      cY d }~S | d fcY d }~S d }~ww xY w)	NzCould not create z dir 'r.   zFalling back to 'zCannot write to FT)r:   r<   existsmakedirsr   r   rl   rI   rJ   accessW_OK)folderr!  r   r   s       r   rJ   rJ   g  s    77>>&!	$KK 99VRWW%dFCD(*KKxHI(x>>5= 4<!  	$LLtVQOPFh.T8LM,T8TBBt|#	$s*   B2 2	D;ADDDDDc                     t         t        j                  t        j                  t
        t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  d
} | S )N)
tautulli_install_typetautulli_versiontautulli_branchtautulli_committautulli_platformtautulli_platform_releasetautulli_platform_versiontautulli_platform_linux_distrotautulli_platform_device_nametautulli_python_version)r  r   rY   r4   r|   rz   rZ   r[   r\   r]   PLATFORM_DEVICE_NAMEr  )tautullis    r   get_tautulli_infor    sZ    !-"NN!,,*"OO%+%<%<%+%<%<*0*F*F)/)D)D#)#8#8H Or   c                    t         j                  dk(  r?t        j                  j                  j                  dt        |       t        |      d       y t         j                  dk(  r"d| d|d}t        j                  d|z         y y )NrI  r   rJ  zdisplay dialog "z" with title "z!"with icon caution buttons {"OK"}zosascript -e '%s')	r   rZ   ctypeswindlluser32MessageBoxWr^   r:   system)msgtitleapplescripts      r   r5   r5     sd    )#((CHc%j!D	H	$<?H
		%34 
%r   )r   r   r   N)NN)FFFF)zTautulli Startup Error)nr  r   r:   queuere   rL   rY  r   rf  r   r   ImportError!apscheduler.schedulers.backgroundr   apscheduler.triggers.intervalr   ga4mpr   r   plexpyr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rg   rV  rW  SIGNALSYS_PLATFORMra   rc   rK   rO   DAEMONr   r   rX  rT   ri   rU   r9   rV   r   Lockr   QueuerP  r2   r8   r  r   r@   r4   r7   rh   r  rz   r   COMMITS_BEHINDr   LATEST_RELEASEUPDATE_AVAILABLEr   rH   	HTTP_ROOTAUTH_ENABLEDDEVrM  r   PLEX_SERVER_UPPLEX_REMOTE_ACCESS_UPr  r]  r^  r_   r`   r   r   r   r   r   r   r  r  rj   rm   r  rq   r
  r  rJ   r  r5   r  r   r   <module>r     s      	   
   J B 9   # "          % '         		
		
			Y^^
u{{}INN	
	
 			 
  ]@1#h= G T;6)X&$H"VDSlXB4 5g[  Js   F	 	FF