
    g                     V   d dl mZ d dlZd dlmZ d dlZd dlZd dlZd dlm	Z	 d dl
mZ d dl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mZ dd iZd Zd Z	 	 	 d dZd Zd!dZd!dZd"dZd!dZd#dZ d$dZ!d Z"d Z#d Z$ G d de%      Z& G d de&      Z'y)%    )OrderedDictN)groupby)TemplateLookup)
exceptions)common)database)helpers)	libraries)logger)newsletter_handler)
pmsconnect)send_notificationEMAILrecently_addedc                  "    ddt         d   dg} | S )NRecently Addedr   )labelnameid)	AGENT_IDS)agentss    #/opt/Tautulli/plexpy/newsletters.pyavailable_newsletter_agentsr   ,   s&     &$,-	
F M    c            	          dddddddddg} | S )	NScheduleon_cronz-Trigger a notification on a certain schedule.Tautulli Newsletter zfa-calendar)
newsletter)r   r   descriptionsubjectbodymessageiconmedia_types )actionss    r   available_notification_actionsr)   8   s-    #!N0-%. 	G Nr   c                     t        |      j                         r4t        |      }| ||||||||	|
|d}|dk(  rt        di |S t	        di |S y )N)newsletter_idnewsletter_id_nameconfigemail_config
start_dateend_dater"   r#   r$   email_msg_idemail_reply_msg_idr   r'   )strisdigitintRecentlyAdded
Newsletter)r+   r,   agent_idr-   r.   r/   r0   r"   r#   r$   r1   r2   kwargss                r   get_agent_classr:   G   sm     8}x=#0(:"". *&$$".(:
< q= *6**'''r   c                  N    t        d t        t               d       D              S )Nc              3   &   K   | ]	  }|d      yw)r   Nr'   ).0as     r   	<genexpr>z(get_newsletter_agents.<locals>.<genexpr>b   s     dq6ds   c                     | d   S )Nr   r'   )ks    r   <lambda>z'get_newsletter_agents.<locals>.<lambda>b   s    XYZaXb r   key)tuplesortedr   r'   r   r   get_newsletter_agentsrG   a   s    dF+F+HNb$cdddr   c                     dx}}g }| r@d}| r|dz  }|j                  |        |dj                  |fD cg c]  }|s|	 c}      z  }t        j                         }|j	                  d|z  |      }|S c c}w )Nr   zWHERE znewsletters.id = ?z AND ar  SELECT newsletters.id, newsletters.agent_id, newsletters.agent_name, newsletters.agent_label, newsletters.friendly_name, newsletters.cron, newsletters.active, MAX(newsletter_log.timestamp) AS last_triggered, newsletter_log.success AS last_success FROM newsletters LEFT OUTER JOIN newsletter_log ON newsletters.id = newsletter_log.newsletter_id %s GROUP BY newsletters.idargs)appendjoinr   MonitorDatabaseselect)r+   wherewhere_idrJ   wdbresults          r   get_newslettersrT   e   s    EHD,,HKK&8*:Qq:;;		!	!	#BYY& 	   
F M ;s
   A5
A5
c                     t        j                         }t        |       j                         r-t	        j
                  d| z         |j                  d| g      }yy)NzDTautulli Newsletters :: Deleting newsletter_id %s from the database.z$DELETE FROM newsletters WHERE id = ?rI   TF)r   rM   r3   r4   r   debugaction)r+   rR   rS   s      r   delete_newsletterrX      sS    		!	!	#B
=!!#[$% 	&AXr   c           
         t        |       j                         rt        |       } nt        j                  d| z         y t        j                         }|j                  d| g      }|sy 	 t        j                  |j                  dd            }t        j                  |j                  dd            }|j                  d      }|j                  d      }|j                  d	      }t        | |d
   |d   |||||      }	|r$t        j                  |	j                        |	_        |	j                   |d<   |	j"                  |d<   |	j$                  |d	<   |	j&                  |d<   |	j                  |d<   |	j)                  |      |d<   |	j+                  |      |d<   |S # t        $ r"}
t        j                  d|
z         Y d }
~
y d }
~
ww xY w)NzWTautulli Newsletters :: Unable to retrieve newsletter config: invalid newsletter_id %s.z&SELECT * FROM newsletters WHERE id = ?rI   newsletter_config{}r.   r"   r#   r$   id_namer8   )r+   r,   r8   r-   r.   r"   r#   r$   zDTautulli Newsletters :: Failed to get newsletter config options: %s.r-   mask_passwordsconfig_optionsemail_config_options)r3   r4   r5   r   errorr   rM   select_singlejsonloadspopr:   	Exceptionr	   mask_config_passwordsr.   r"   r#   r$   r-   return_config_optionsreturn_email_config_options)r+   r^   rR   rS   r-   r.   r"   r#   r$   newsletter_agentes              r   get_newsletter_configrl      s   
=!!#M*n$% 	&		!	!	#BFm_]FFJJ':DABzz&**^T"BC**Y'zz&!**Y'*[abk[l4::4F28|3:wX (/(E(EFVFcFc(d%(00F9%**F6N(00F9'..F8-::F>/EEUcEdF%5%Q%Qao%Q%pF!"M  [^__`s   +BF 	G	'GG	c                     t               j                         rt                nt        j                  d z         yt         fdt               D        d       }|st        j                  d z         yt        |d         }dd i}|d   |d   |d   d	d	t        j                  |j                        t        j                  |j                        |j                  |j                  |j                  d

}t        j                          }	 |j#                  d||       |j%                         }t        j&                  d|d   d|d       t)                |S # t*        $ r"}t        j,                  d|z         Y d }~yd }~ww xY w)NzJTautulli Newsletters :: Unable to add new newsletter: invalid agent_id %s.Fc              3   4   K   | ]  }|d    k(  s|  ywr   Nr'   r=   r>   r8   s     r   r?   z(add_newsletter_config.<locals>.<genexpr>        Rag>Q!R   zUTautulli Newsletters :: Unable to retrieve new newsletter agent: invalid agent_id %s.r   )r8   r   r   r   )
r8   
agent_nameagent_labelr\   friendly_namerZ   r.   r"   r#   r$   newsletters
table_namekey_dict
value_dictz4Tautulli Newsletters :: Added new newsletter agent:  (newsletter_id ).z;Tautulli Newsletters :: Unable to add newsletter agent: %s.)r3   r4   r5   r   ra   nextr   r:   rc   dumpsr-   r.   r"   r#   r$   r   rM   upsertlast_insert_idinfoblacklist_loggerrf   warn)	r8   r9   agentagent_classkeysvaluesrR   r+   rk   s	   `        r   add_newsletter_configr      sc   
8}x=a  	!R8:RTXYEl  	!!5;7K$<D+!&M"7^!#'::k.@.@#A"jj)A)AB$,,!&&$,,
F 
	!	!	#B	
		]Tf	M))+W~}6 	7 QTUUVs   AE 	F&FFc                    t              j                         rt              nt        j                  dz         yt        fdt               D        d       }|st        j                  dz         yd}d}t        |j                               D ci c]1  }|j                  |      r|t        |      d  |j                  |      3 }}t        |j                               D ci c]1  }|j                  |      r|t        |      d  |j                  |      3 }}|j                         D ]'  \  }	}
d|	v s|
dk(  st        | 	      }|d
   |	   ||	<   ) |j                  d      }|j                  d      }|j                  d      }t        |d   |||||      }d| i}|d   |d   |d   |j                  dd      |j                  dd      t!        j"                  |j$                        t!        j"                  |j&                        |j(                  |j*                  |j,                  |j                  d      |j                  d      d}t/        j0                         }	 |j3                  d||       t        j4                  d|d   d| d       t7        j8                  | 	       t;                yc c}w c c}w # t<        $ r"}t        j>                  d|z         Y d }~yd }~ww xY w)NzOTautulli Newsletters :: Unable to set existing newsletter: invalid agent_id %s.Fc              3   4   K   | ]  }|d    k(  s|  ywro   r'   rp   s     r   r?   z(set_newsletter_config.<locals>.<genexpr>   rq   rr   zZTautulli Newsletters :: Unable to retrieve existing newsletter agent: invalid agent_id %s.newsletter_config_newsletter_email_passwordz    r+   r.   r"   r#   r$   r   r8   r-   r.   r"   r#   r$   r   r   r\   r   ru   cronactive)r8   rs   rt   r\   ru   rZ   r.   r"   r#   r$   r   r   rv   rw   z2Tautulli Newsletters :: Updated newsletter agent: r{   r|   Tz>Tautulli Newsletters :: Unable to update newsletter agent: %s.) r3   r4   r5   r   ra   r}   r   listr   
startswithlenre   itemsrl   r:   getrc   r~   r-   r.   r"   r#   r$   r   rM   r   r   r   schedule_newslettersr   rf   r   )r+   r8   r9   r   config_prefixemail_config_prefixrA   rZ   r.   cfgvalold_newsletter_configr"   r#   r$   r   r   r   rR   rk   s    `                  r   set_newsletter_configr      s   
8}x=f  	!R8:RTXYEq  	!(M- #'v{{}"5Vm9T 3}-./A> V V "&++-0WALLAT4U c-./0&**Q-? WL W !&&( KS$9$V! 5n Ec JLK jj#G::fDjj#G!5;):*1gOK - D+!&M"7^Ir2%zz/2>#'::k.@.@#A"jj)A)AB$,,!&&$,,jj(

8,F 
	!	!	#B	
		]Tf	MW~}6 	7//mLUVWR  TWXXYs%   6J>*6K*AK 	K3K..K3c                     t        |       }|r*t        |d   |d   |d   |||      }|j                         S t        j                  d       y )Nr   r8   r-   r.   r   zMTautulli Newsletters :: Notification requested but no newsletter_id received.)rl   r:   sendr   rV   )r+   r"   r#   r$   newsletter_log_idr9   rZ   r   s           r   send_newsletterr   #  sV    -MJ)::)F'8'B->~-N(/%)(/1 zz|der   c                      t        j                         } | j                  d      }|D ]d  }t        j                  |d   xs d      }t        j                  |       t        j                  |d   xs d      }t        j                  |       f y )Nz7SELECT newsletter_config, email_config FROM newslettersrZ   r[   r.   )r   rM   rN   rc   rd   r   blacklist_config)rR   	notifiersnr-   r.   s        r   r   r   1  s{    		!	!	#B		STI .A12:d;'zz!N"3";t<-	.r   c                    t         j                  j                  r0t        j                  d       t         j                  j                  }nt
        j                  j                  t        t         j                        d      }t
        j                  j                  t        |      t         j                  j                        }t         j                  j                  s| j                  dd      } t        |gddg      }	 |j                  |       } |j                  d
i |dfS #  t!        j"                         j                         d	fcY S xY w)NzCTautulli Newsletters :: Using custom newsletter template directory.zdata/interfaces/.htmlz.internal.htmlunicodeh)directoriesdefault_filtersFTr'   )plexpyCONFIGNEWSLETTER_CUSTOM_DIRr   r   ospathrL   r3   PROG_DIRNEWSLETTER_TEMPLATESNEWSLETTER_INLINE_STYLESreplacer   get_templaterenderr   html_error_template)template_namer9   template_dirinterface_dir	_hplookuptemplates         r   serve_templater   <  s    }}**YZ}}::S%9;MNww||C$68Z8Z[}}55)11';KLML>IWZK[\I?))-8x((%//?--/668$>>s    $D% %&Ec                      d} d}t        j                         }| r|r5t        j                         d d } |j	                  d| g      }|d   }| s2|r5| S )Nr   r      zLSELECT EXISTS(SELECT uuid FROM newsletter_log WHERE uuid = ?) as uuid_existsuuid_exists)r   rM   r   generate_uuidrb   )uuidr   rR   rS   s       r   generate_newsletter_uuidr   P  sf    DK		!	!	#Bk##%bq)!!Z]a\bd]+	 k Kr   c            	           e Zd ZdZdddddddddZ e       j                         Zded<   ded	<   dZd
Z	dZ
dZdZ	 	 	 ddZddZddZd Zd Zd dZd dZd Zd Zd Zd Zd Zd Zd Zd dZd Zd dZy)!r7   r   r      days   )custom_cron
time_frametime_frame_units	formattedthreadednotifier_idfilename	save_onlyr   	from_namer   *View the newsletter here: {newsletter_url}z!newsletter_{newsletter_uuid}.htmlNc                 :   | j                  || j                        | _        | j                  || j                        | _        t               | _        |
| _        || _        || _	        |xs d| _
        d | _        d | _        |r-	 t        j                  |dd      j                  d      | _        | j                  t        j"                         | _        |r-	 t        j                  |dd      j%                  d      | _        | j                  | j                  d   dk(  r0| j                  j'                  | j                  d	    
      | _        nq| j                  d   dk(  r0| j                  j'                  | j                  d	          | _        n/| j                  j'                  | j                  d	          | _        | j                  j)                         | _        | j                  j)                         | _        | j/                         | _        |xs | j2                  | _        |xs | j6                  | _        |	xs | j:                  | _        | j                  d   xs | j>                  | _         | j@                  jC                  d      s| xj@                  dz  c_         | jE                         \  | _#        | _$        | _%        | jM                         | _'        i | _(        d | _)        d| _*        d | _+        y # t         $ r Y Xw xY w# t         $ r Y w xY w)Nr-   defaultr   z
YYYY-MM-DDlocal)tzinfodayr   monthsr   )r   r   )r   )hoursr   r   F),
set_config_DEFAULT_CONFIGr-   _DEFAULT_EMAIL_CONFIGr.   r   r   r1   r2   r+   r,   r/   r0   arrowr   ceil
ValueErrornowfloorshift	timestampend_time
start_timebuild_params
parameters_DEFAULT_SUBJECTr"   _DEFAULT_BODYr#   _DEFAULT_MESSAGEr$   _DEFAULT_FILENAMEr   endswith
build_textsubject_formattedbody_formattedmessage_formattedbuild_filenamefilename_formatteddatar    
is_previewtemplate_error)selfr+   r,   r-   r.   r/   r0   r"   r#   r$   r1   r2   s               r   __init__zNewsletter.__init__q  s    ooVT=Q=QoR OO<IcIcOd,.	("4*"4": %		(L Q V VW\ ] == !IIKDM"'))JW"U"["[\a"b ??"{{-.(:"&--"5"5dkk,>W=W"5"X/0F:"&--"5"5DKK<U;U"5"V"&--"5"5T[[=V<V"5"W//1//335++-7$"7"7.D..	7$"7"7J/I43I3I}}%%g.MMW$MNRooN_K 3T5K"&"5"5"7	"O    s$   ,K= ,L =	L
	L
	LLc                 (    | j                  ||      S )Nr   )_validate_config)r   r-   r   s      r   r   zNewsletter.set_config  s    $$FG$DDr   c                 \   ||S i }|j                         D ]  \  }}t        |t              r)t        j                  |j                  ||            ||<   ?t        |t              r/|j                  ||      }t        |t              s|g||<   x|||<   ~|j                  ||      ||<    |S N)r   
isinstancer5   r	   cast_to_intr   r   )r   r-   r   
new_configrA   vcs          r   r   zNewsletter._validate_config  s    >N
MMO 
	1DAq!S! ' 3 3FJJq!4D E
1At$JJq!$!!T*%&CJqM$%JqM &

1a 0
1
	1 r   c                      y r   r'   r   s    r   retrieve_datazNewsletter.retrieve_data  s    r   c                      yNFr'   r  s    r   	_has_datazNewsletter._has_data  s    r   c           	         |rd| _         | j                          ddlm} | j                  j                         D ci c]  \  }}|t        ||      rt        |      n|! }}}| j                  || j                  dS c c}}w )NTr   CustomArrow)titler   r   )
r   r  plexpy.notification_handlerr	  r   r   r   r3   NAMEr   )r   previewr	  rA   r   r   s         r   raw_datazNewsletter.raw_data  sx    "DO 	<QUQ`Q`QfQfQhiAa:a#=Q1Di
i(		# 	# js   $A>c           
         |rd| _         | j                          t        j                  d| j                   rdndz         t	        | j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                         \  }| _        | j                  r|S d|v r|j                  dd      }|S d}t        j                  d	d
|z   |      }|S )NTz0Tautulli Newsletters :: Generating newsletter%s.z previewr   )r   r   r"   r#   r$   r   r   r  z'<!-- FOOTER MESSAGE - DO NOT REMOVE -->zNewsletter generated by <a href="https://tautulli.com" target="_blank" style="text-decoration: underline;color: inherit;font-size: inherit;">Tautulli</a>.a  <div style="text-align: center;padding-top: 100px;padding-bottom: 100px;"><p style="font-family: 'Open Sans', Helvetica, Arial, sans-serif;color: #282A2D;font-size: 18px;line-height: 30px;">The Tautulli newsletter footer was removed from the newsletter template.<br>Please leave the footer in place as it is unobtrusive and supports <a href="https://tautulli.com" target="_blank">Tautulli</a>.<br>Thank you.</p></div>z(<body.*?>)z\1)r   r  r   r   r   	_TEMPLATEr   r   r   r   r   r   r   r   resub)r   r  newsletter_renderedmsgs       r   generate_newsletterzNewsletter.generate_newsletter  s    "DOFX\XgXg*mopq3A..**$$**OO	4
0T0 && 58KK"5"="=9f#  #" C #%&&FY"Z""r   c                 P   | j                         | _        | j                  r#t        j                  d| j
                  z         y| j                         s#t        j                  d| j
                  z         y| j                          | j                  d   ry| j                         S )NzUTautulli Newsletters :: %s newsletter failed to render template. Newsletter not sent.FzGTautulli Newsletters :: %s newsletter has no data. Newsletter not sent.r   T)r  r    r   r   ra   r  r  r   _saver-   _sendr  s    r   r   zNewsletter.send   s    224LLpsws|s||}~~KKadhdmdmmn

;;{#zz|r   c           	         | j                   }t        j                  j                  xs. t        j
                  j                  t        j                  d      }t        j
                  j                  ||      }t        j
                  j                  |      st	        j                  |       	 t        |d      5 }| j                  j                         D ]*  }d|vs|j                  |dz   j                  d             , 	 d d d        t        j                   d| j"                  d|d       y # 1 sw Y   0xY w# t$        $ r2}t        j&                  d	| j"                  d
|d|       Y d }~y d }~ww xY w)Nrv   wbz<!-- IGNORE SAVE -->z
zutf-8zTautulli Newsletters :: z newsletter saved to ''z'Tautulli Newsletters :: Failed to save z newsletter to 'z': )r   r   r   NEWSLETTER_DIRr   r   rL   DATA_DIRexistsmakedirsopenr    
splitlineswriteencoder   r   r  OSErrorra   )r   newsletter_filenewsletter_foldernewsletter_file_fpn_filelinerk   s          r   r  zNewsletter._save  s%   11"MM88hBGGLLZg<hWW\\*;_M ww~~/0KK)*
	<($/ F6 OO668 FD-T9dVm%;%;G%DEFF KKQUQZQZ\klmF F  	<LL II; < <	<s6   ,D< 8"D0%D0.D< 0D95D< <	E7(E22E7c                    | j                   d   r-dj                  d | j                  j                         D              }d}t        j
                  j                  rCt        j
                  j                  r)| | j                  j                  di | j                  z  }| j                   d   r| j                  nd }| j                  d   r2t        | j                  d   | j                  ||| j                  |      S t!        | j                        }|j#                  | j                  ||| j                  |	      S | j                   d   r/t        | j                   d   | j                  | j$                  
      S y )Nr   r   c              3   <   K   | ]  }|j                           y wr   )strip)r=   ls     r   r?   z#Newsletter._send.<locals>.<genexpr>)  s     )Z!''))Zs   z7HTML email support is required to view the newsletter.
r   r   )r   r"   r#   	plaintextmsg_idreply_msg_id)r-   )r"   r#   r.  r/  r0  )r   r"   r#   r'   )r-   rL   r    r!  r   r   NEWSLETTER_SELF_HOSTEDHTTP_BASE_URLr   formatr   r2   r.   r   r   r1   r   notifyr   )r   newsletter_strippedr.  r2   emails        r   r  zNewsletter._send'  sR   ;;{#"$'')ZT__=W=W=Y)Z"ZRI}}338S8S6T//66III	<@KK
<S!8!8Y]  /( $ 1 1- @ 22,',,!3  T%6%67|| 22,',,!3 $   [['$ $M : 22,,  (r   c                 &    | j                         }|S r   )_build_params)r   r   s     r   r   zNewsletter.build_paramsK  s    '')
r   c                    ddl m} t        j                  t        j
                  j                        }t        j
                  j                  rIt        j
                  j                  r/t        j
                  j                  t        j                  z   dz   }nt        j                         dz   }i dt        j                         d || j                  |      d || j                  |      d| j                  j                  d	| j                  j                  d
| j                  j                   d| j                  j"                  d| j                  j$                  d| j                  j&                  d| j                  j)                         d   d| j                  j)                         d   d| j                  j)                         d   d| j*                  d   d| j*                  d   d|| j,                  z   d|dz   | j.                  z   d| j,                  | j0                  | j.                  t        j
                  j2                  d}|S )Nr   r  znewsletter/z/newsletter/server_namer/   r0   current_yearcurrent_monthcurrent_daycurrent_hourcurrent_minutecurrent_secondcurrent_weekday   current_weekr   week_numbernewsletter_time_framer   newsletter_time_frame_unitsr   newsletter_urlnewsletter_static_urlzid/newsletter_uuid)r+   r,   newsletter_password)r  r	  r	   momentjs_to_arrowr   r   DATE_FORMATr1  r2  	HTTP_ROOTget_plexpy_urlpms_namer/   r0   yearmonthr   hourminutesecondisocalendarr-   r   r,   r+   NEWSLETTER_PASSWORD)r   r	  date_formatbase_urlr   s        r   r8  zNewsletter._build_paramsP  s(   ;//0I0IJ==//FMM4O4O}}22V5E5EEUH--/.@H
7++-
+doo{C
 DMM;?
 DOO00	

 T__22
 4??..
 DOO00
 doo44
 doo44
 t::<Q?
 DOO779!<
 4??668;
 $T[[%>
 *4;;7I+J
 h2
  $X%58O8O%O!
" tyy#
$ "//"&"9"9#)==#D#D)

. r   c                    ddl m}  |       }	  |j                  t        | j                        fi | j
                  }	  |j                  t        | j                        fi | j
                  }	  |j                  t        | j                        fi | j
                  }|||fS # t        $ rQ}t        j                  d|z          t        | j                        j                  d	i | j
                  }Y d }~d }~wt        $ rR}t        j                  d|z          t        | j                        j                  d	i | j
                  }Y d }~d }~ww xY w# t        $ rR}t        j                  d|z          t        | j                        j                  d	i | j
                  }Y d }~Bd }~wt        $ rR}t        j                  d|z          t        | j                        j                  d	i | j
                  }Y d }~d }~ww xY w# t        $ rR}t        j                  d|z          t        | j                        j                  d	i | j
                  }Y d }~d }~wt        $ rR}t        j                  d|z          t        | j                        j                  d	i | j
                  }Y d }~!d }~ww xY w)
Nr   CustomFormatterzZTautulli Newsletter :: Unable to parse parameter %s in newsletter subject. Using fallback.UTautulli Newsletter :: Unable to parse custom newsletter subject: %s. Using fallback.zWTautulli Newsletter :: Unable to parse parameter %s in newsletter body. Using fallback.zRTautulli Newsletter :: Unable to parse custom newsletter body: %s. Using fallback.zZTautulli Newsletter :: Unable to parse parameter %s in newsletter message. Using fallback.zUTautulli Newsletter :: Unable to parse custom newsletter message: %s. Using fallback.r'   )r  r[  r3  r3   r"   r   LookupErrorr   ra   r   rf   r#   r   r$   r   )r   r[  custom_formatterr"   rk   r#   r$   s          r   r   zNewsletter.build_texts  s?   ?*,	K-&--c$,,.?S4??SG	E*#**3tyy>MT__MD	K-&--c$,,.?S4??SG g%%3  	KLLuxyyz7c$//077J$//JG 	KLLpsttu7c$//077J$//JG	K  	ELLruvvw13t))*11DDOODD 	ELLmpqqr13t))*11DDOODD	E  	KLLuxyyz7c$//077J$//JG 	KLLpsttu7c$//077J$//JG	Ksq   0B&  0E 10H &	E/AC;;EAEE	H%AF22H>AHH	KAI))K5AKKc                    ddl m}  |       }	  |j                  t        | j                        fi | j
                  }|S # t        $ rR}t        j                  d|z          t        | j                        j                  di | j
                  }Y d }~|S d }~wt        $ rR}t        j                  d|z          t        | j                        j                  di | j
                  }Y d }~|S d }~ww xY w)Nr   rZ  z[Tautulli Newsletter :: Unable to parse parameter %s in newsletter filename. Using fallback.r\  r'   )r  r[  r3  r3   r   r   r]  r   ra   r   rf   )r   r[  r^  r   rk   s        r   r   zNewsletter.build_filename  s    ?*,	M.'..s4==/AUT__UH   	MLLvyzz{9s411299LDOOLH
 	  	MLLpsttu9s411299LDOOLH		Ms%   0A 	C5
ABC5#AC00C5c                 T    | j                         }|rt        j                  |       |S r   )_return_config_optionsr	   rg   )r   r^   r_   s      r   rh   z Newsletter.return_config_options  s)    446 )).9r   c                 
    g }|S r   r'   r   r_   s     r   ra  z!Newsletter._return_config_options  s    r   c                 t    t        | j                        j                  |      }|D ]  }d|d   z   |d<    |S )Nr]   newsletter_r   )r   r.   rh   )r   r^   r_   r   s       r   ri   z&Newsletter.return_email_config_options  sH    t001GGWeGf 	2A%&	1AfI	2r   )NNNNNNNNNNNNN)F)__name__
__module____qualname__r  r   r   return_default_configr   r   r   r   r   r  r   r   r   r  r  r  r  r   r  r  r   r8  r   r   rh   ra  ri   r'   r   r   r7   r7   ^  s    D&'%&+1$%#$&'#%$%'O "G99;)>+&+,-(,@M;I^bRV7;9#vE&#(#T$<*"H
!F&Br   r7   c                       e Zd ZdZdZej                  j                         Zg ed<   dZdZ	dZ
dZdd	Zd
 Zd Zd Zd Zd Zd Zy)r6   z#
    Recently Added Newsletter
    r   incl_librariesz-Recently Added to {server_name}! ({end_date})r   r   zrecently_added.htmlNc                    ddl m} t        j                         }g }d}d}|s~|j	                  t        |      d|      }|d   D cg c])  }| j                  t        j                  |d         k  r|+ }	}t        |	      dk  rd	}n|dz  }|j                  |	       |s~|d
v rjg }
|D ]a  }|d   | j                  d   vr| j                  t        j                  |d         cxk  r| j                  k  sNn Q|
j                  |       c |
}|dk(  rg }g }|D ]  }|d   | j                  d   vr|d   dk(  r|d   }n|d   dk(  r|d   }n|d   dk(  r|d   }|v rG|j                  |d      }|j                  ||d	      }|d   D cg c]<  }| j                  t        j                  |d         cxk  r| j                  k  rn n|> }}|j!                  d        |sg }t#        |d       D ]b  \  \  }}}t%        |      } ||D cg c]  }t        j                  |d          c}      \  }}|j                  |||t        |      |d       d  ||D cg c]  }t        j                  |d          c}      \  }}||d<   t        |      |d<   ||d<   |j                  |       |j                  |        |}|dk(  rXg }g }|D ]L  }|d   | j                  d   vr|d   dk(  r|d   }n|d   dk(  r|d   }n|d   d k(  r|d   }|v rG|j                  |d      }|j                  ||!      }|d   D cg c]<  }| j                  t        j                  |d         cxk  r| j                  k  rn n|> }}|j!                  d"        |sg }|D ]D  }|j                  |d   d      }t        j                  |d#         |d$<   |j                  |       F t        |      |d%<   ||d<   |j                  |       |j                  |       O |}|S c c}w c c}w c c}w c c}w c c}w )&Nr   )format_group_indexF10)startcount
media_typer   added_at
   T)movieother_video
section_idrl  showrr  
rating_keyseasonparent_rating_keyepisodegrandparent_rating_key)
media_info)rr  get_grandchildrenchildren_listc                 2    t        j                  | d         S )Nparent_media_index)r	   r   xs    r   rB   z3RecentlyAdded._get_recently_added.<locals>.<lambda>  s    W5H5HK_I`5a r   rC   c                     | d   | d   fS )Nr  parent_titler'   r  s    r   rB   z3RecentlyAdded._get_recently_added.<locals>.<lambda>   s    qI]G^`abp`qFr r   media_index)r  r
  episode_rangeepisode_countr|  season_rangeseason_countartistalbumtrack)rr  c                     | d   S )Nrs  r'   r  s    r   rB   z3RecentlyAdded._get_recently_added.<locals>.<lambda>+  s
    Qz] r   children_counttrack_countalbum_count)r  rn  r   
PmsConnectget_recently_added_detailsr3   r   r	   r   r   extendr-   r   rK   get_metadata_detailsget_item_childrensortr   r   ) r   rr  rn  pms_connectr   donerp  recent_itemsifiltered_items
movie_listitem
shows_listshow_rating_keysshow_rating_keyshow_metadatachildrenfiltered_childrenseasonsindexr
  episodesdnumnum00artists_listartist_rating_keysartist_rating_keyartist_metadataalbumsr>   album_metadatas                                    r   _get_recently_addedz!RecentlyAdded._get_recently_added  s   B ++-&AAE
Z^kuAvL)56F)G WA!%73F3Fq}3U!U   WN W>"R'!!.1  11J& ,%T[[9I-JJ??W%8%8j9I%JZT]]Z%%d+, (NJ!& +9%T[[9I-JJ%/&*<&8O,'83&*+>&?O,'94&*+C&DO"&66 + @ @]b @ c&88U_sw8x080I %n1(,':M:MaPZm:\(l_c_l_l(l &' %n! %n!&&+a&b(078I<r1t 	:,NUEH#H~H!3dl4m_`W5H5H=IY5Z4m!nJCNN5-25:58]/7	$9 :	: 0`g0h[\1D1DQ}EU1V0hi
U05n-03Gn-*1h'!!-0 ''8W+9Z (N!L!#& "=%T[[9I-JJ%1(,\(:%,'72(,-@(A%,'72(,-E(F%$(::"-"B"BCTaf"B"g&889JWa8b080I %n1(,':M:MaPZm:\(l_c_l_l(l &' %n! %n!&&+B&C(* 2A%0%E%Eaobg%E%hN4;4G4GWgHh4iN=1MM.12
 25V.+1(##O4"))*;<E"=H *NaWR%n 5n 1i>%ns    .P,AP1P6$P;
AQ c                 z   ddl m}m} | j                  d   s"t	        j
                  d| j                  z         t               }| j                         D ]V  }t        |d         | j                  d   v s!|d   dk(  r|d   d	k(  r|j                  d
       C|j                  |d          X i }|D ]  }||vs| j                  |      ||<    |j                  dg       }|j                  dg       }|j                  dg       }	|	D 
cg c]  }
|
d   D ]  }|  }}
}|j                  d
g       }| j                  st        j                  d      dk(  rf||z   |z   |z   D ]W  }|d   dk(  rd}d}nd}d} ||d   d||      |d<   |d   r ||d   dddddd      |d <   nd!|d <   d!|d"<   d!|d#<   |d"   |d$<   Y nt        j                         r||z   |z   |z   D ]  }|d   dk(  rd}d}nd}d} ||d   |d%   |d&   d||'      }|j                  d(      xs t         j"                  |d"<    ||d   |d%   |d&   dddddd)	      }|j                  d(      |d#<   d!|d<   d!|d <   |d"   |d$<    n,||z   |z   |z   D ]  }d!|d<   d!|d <   d!|d"<   d!|d#<   |d"   |d$<     || j$                  d*<   | j$                  S c c}}
w )+Nr   )get_img_infoset_hash_image_inforl  zUTautulli Newsletters :: Failed to retrieve %s newsletter data: no libraries selected.rw  section_typeru  r   com.plexapp.agents.nonerv  rx  r  r  T)include_selfzself-hostedrr     cover   posterthumb)imgwidthheightfallback
thumb_hasharti  i     282828   )r  r  r  opacity
backgroundblurr  art_hashr   	thumb_urlart_url
poster_urlry  r
  )r  ry  r
  r  r  r  img_url)	r  ry  r
  r  r  r  r  r  r  r   )r  r  r  r-   r   r   r  set_get_sectionsr3   addr  r   r   r	   get_img_servicer   ONLINE_POSTER_THUMBr   )r   r  r  r&   sr   rr  moviesshowsartistsr  r>   r  rv  r  r  r  img_infos                     r   r  zRecentlyAdded.retrieve_data@  s{   Q{{+,KKorvr{r{{|e##% 	7A1\?#t{{3C'DD^$/AgJB[4[OOM2OOAn$56	7 % 	RJ/-1-E-Ej-Qz*	R  ##GR0""62. $$Xr2")C6'?Ca!C!CC$((;??g554HMY/+= 7%0 F&H F'H%8WS(&T\" ;': Ks3 "xa%(QD$ (*D$$&[!"$Y%)+%6\")7, $$&/+= 7%0 F&H F'H'W$|2DDQXMfxA %-LL$;$Yv?Y?Y[!'U\0B$w-c2(QR]bd #+,,y"9Y%'\"#%Z %)+%6\"-72 /+= 7%'\"#%Z $&[!"$Y%)+%6\"7 '5		"#yy} Ds   
J7c                     | j                   j                  d      }|rE|j                  d      s3|j                  d      s"|j                  d      s|j                  d      ryy)Nr   ru  rx  r  rv  TF)r   r   )r   r   s     r   r  zRecentlyAdded._has_data  sV    '78""7+""6*""8,""=1r   c                 F    t        j                         j                         S r   )r
   	Librariesget_sectionsr  s    r   r  zRecentlyAdded._get_sections  s    ""$1133r   c           	         i }| j                         D ]T  }|d   dk7  s|d   dk(  r|d   dk(  rd}n|d   }|j                  |g       }|j                  |d   |d   d	       |||<   V t        d
|j                  d      fd|j                  d      fd|j                  d      fd|j                  d      ffD cg c]  \  }}|||f c}}      }|S c c}}w )Nr  photoru  r   r  rv  rw  section_name)valuetextzMovie LibrarieszTV Show Librariesrx  zMusic Librariesr  zOther Video Libraries)r  r   rK   r   )r   sectionsr  library_typegrouprA   r   groupss           r   _get_sections_optionsz#RecentlyAdded._get_sections_options  s   ##% 		/A G+^$/AgJB[4[#0L#$^#4L \26q&'&79 :).&		/ W 56 (,,v"67X 67$hll=&AB	2
 A
 ]  !!f   s   <C
c                 f   | j                         }g }| j                         D ]4  }t        |d         | j                  d   v s!|j	                  |d          6 dj                  t        |            |d<   t        j                  j                  |d<   t        j                  j                  |d<   |S )Nrw  rl  r  z, newsletter_librariespms_identifierpms_web_url)r8  r  r3   r-   rK   rL   rF   r   r   PMS_IDENTIFIERPMS_WEB_URL)r   r   r  r  s       r   r   zRecentlyAdded.build_params  s    '')
!##% 	?A1\?#t{{3C'DD$++An,=>	? .2YYv>R7S-T
)*'-}}'C'C
#$$*MM$=$=
=!r   c                 R    d| j                   d   ddd| j                         ddg}|S )NzIncluded Librariesrl  z2Select the libraries to include in the newsletter. newsletter_config_incl_libraries	selectizeT)r   r  r!   r   
input_typeselect_options
select_all)r-   r  rc  s     r   ra  z$RecentlyAdded._return_config_options  s>    *kk"23P7&#99;	
 r   r   )rg  rh  ri  __doc__r  r7   r   copyr   r   r   r  r  r  r  r  r  r   ra  r'   r   r   r6   r6     sj     D 00557O(*O$%F@M%I{zTl	4,r   r6   )NNNNNNNNNNNNr   r  rf  )NNNNN)(collectionsr   rc   	itertoolsr   r   r  r   mako.lookupr   makor   r   r   r   r	   r
   r   r   r   plexpy.notifiersr   r   r   r   r)   r:   rG   rT   rX   rl   r   r   r   r   r   r   objectr7   r6   r'   r   r   <module>r     s   $ $   	 	  &        %  5 a	
	 koUY:>4e6	'T(V?Df.?(V Vr
]J ]r   