
    g:                    (   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ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  G d de      Z G d de      Zd Zd Zd Zd ZddZd Zd ZddZ d Z!ddZ"ddZ#d Z$y)    N)partialreduce)open)Pool)database)
datatables)helpers)logger)users)Plexc                   p   e Zd ZdddddddddddddZdddd	d
dddddddddZg dgdgg dgdgg g dg g dgdgdZg dZdZdZdZ	dZ
dZ	 	 	 	 d>d Zd?d!Zd?d"Zd@d#Zd$ Zd% Zd& Zd' Zd( Zd) ZdAd*Zd+ Zd, ZdBd-Zd. Zd/ Zd0 Zd1 Zed2        Zed3        Z d4 Z!d5 Z"d6 Z#d7 Z$d8 Z%d9 Z&d: Z'd; Z(d< Z)d= Z*y)CExport)TTT)FFT)TTF)FFFmovieshowseasonepisodeartistalbumtrack
photoalbumphotoclip
collectionplaylistmoviesshowsseasonsepisodesartistsalbumstracksphotoalbumsphotosclipscollections	playlistsitems)r   r   r   r   r   r   r   r   r   r   r   r   itemr   r   r   r   )r   r   r   r)   ))r   r   r   )r   r   r   )r   r   )r   r   )r)   r   )r)   r   )r            	   )r   r*   r+   r-   )csvjsonxmlm3u)allr   r   Nc                    t        j                  |      xs d | _        t        j                  |      xs d | _        t        j                  |      xs d | _        t        |      j                         | _        t        j                  |      | _        t        j                  |      | _	        t        j                  |      | _
        t        j                  |      | _        t        j                  |	      | _        |
j                  dd      | _        i | _        t        |      j                         xs d| _        || _        t        j$                         | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _         d| _!        | j                  dk(  r+d| _        d| _	        d| _
        d| _        d| _        d| _        y y )N  r2   r   Fr1   r*   )"r	   cast_to_int
section_iduser_id
rating_keystrlowerfile_formatmetadata_levelmedia_info_levelthumb_level	art_level
logo_levelreplacecustom_fields_custom_fieldsexport_typeindividual_files	timestamp
media_typeobj	obj_title	directoryfilenametitle	export_id	file_sizeexported_thumbexported_artexported_logo_reload_check_filestotal_itemsexported_itemssuccess)selfr7   r8   r9   r<   r=   r>   r?   r@   rA   rC   rE   rF   s                 /opt/Tautulli/plexpy/exporter.py__init__zExport.__init__a   s    "--j9AT**73;t!--j9AT{+113%11.A ' 3 34D E"..{; ,,Y7!--j9*223; {+113<u 0 **,
#!"#(  u$"#D$%D! DDNDO!#D %    c                       fd} fd} fd} fd} fd} fd}d }	 fd}
d	 } fd
} fd}|||||||	|
||||d} ||          }|rt        j                  |      d   }|S )Nc                     i dt         j                  dd dd dfddfddd d	d d
d d d d d d ddd dd d ddd dd d ddd d ddd dd dd dd i dd d ddd d ddd ddd idd dd dd d d d!d d dd"d d#t         j                  d$t         j                  d%d d&d d'd d(d d)d* i d+fd,d-fd.d/d d d d d d d0d1i d2d d3d d4d d5d d6d d7d dd d8d dd d9d d:d dd d;d d<d d=d d>d d?d d d d d fd@i dAd d5d d7d dBd dd dCd dDd d:d dd dEd dd dFd d d d;d dGd dHd dId dJ d d d i d6d dKd dLd dMd dNd dd dOd d d dPd dQd dRd dHd dSd dTd d>d dUd dVd i dWd dXd dYd dZd d[d d\d d]d d^d d_d d`d dad dbd dcd ddd ded dfd dgd i dhd did dd djd dkd dld dmdn d8d dod dpd dqd drd dsd dtd dud dvd i d6d dKd dLd dMd dNd dd dOd d d dPd dQd dRd dHd dSd dTd d>d dUd dwd d d d d d d d dxi dyd dKd dLd dMd dNd dd dOd d d dPd dQd dRd dHd dSd dTd d>d dUd d7d d d d d d d d d dzd{d|d}d d~t        t         j                  d      dd dd d ddd dd dd dd d d d ddd dd dd dd dd d d fdfdd d d t         j                  d d d d d d dd d} | S )NaddedAtartartBlurHashartFilec                 (    j                  | d      S Nr^   	get_imageorW   s    rX   <lambda>z:Export.return_attrs.<locals>.movie_attrs.<locals>.<lambda>       T^^Au%= rZ   artProviderc                 (    j                  | d      S rb   get_image_providerre   s    rX   rg   z:Export.return_attrs.<locals>.movie_attrs.<locals>.<lambda>       )@)@E)J rZ   audienceRatingaudienceRatingImagechaptersidtagindexstartendthumbchapterSourcer&   rr   rs   contentRating	countries	directorsdurationdurationHumanc                 B    t        j                  t        | dd            S Nr}   r   r	   human_durationgetattrrf   s    rX   rg   z:Export.return_attrs.<locals>.movie_attrs.<locals>.<lambda>       7+A+A'!ZYZB[+\ rZ   editionTitleenableCreditsMarkerGenerationfieldsnamelockedgenresguidguidsrr   hasCreditsMarkerhasPreviewThumbnailshasVoiceActivitykeylabelslanguageOverridelastRatedAtlastViewedAtlibrarySectionIDlibrarySectionKeylibrarySectionTitle	locationslogoc                 <    t        d | j                  D        d       S )Nc              3   T   K   | ]   }|j                   d k(  s|j                   " yw	clearLogoNtypeurl.0is     rX   	<genexpr>zMExport.return_attrs.<locals>.movie_attrs.<locals>.<lambda>.<locals>.<genexpr>        'Y!166[CX'Y   ((nextimagesr   s    rX   rg   z:Export.return_attrs.<locals>.movie_attrs.<locals>.<lambda>       $'Yqxx'Y[_"` rZ   logoFilec                 (    j                  | d      S Nr   rc   re   s    rX   rg   z:Export.return_attrs.<locals>.movie_attrs.<locals>.<lambda>       dnnQ&? rZ   logoProviderc                 (    j                  | d      S r   rk   re   s    rX   rg   z:Export.return_attrs.<locals>.movie_attrs.<locals>.<lambda>       $*A*A!V*L rZ   markersrv   finalfirstrr   ru   r   mediaaspectRatioaudioChannels
audioCodecaudioProfilebitrate	containerheightisOptimizedVersionhas64bitOffsetsoptimizedForStreaming	proxyTypetargetrM   
videoCodecc                 (    j                  | d      S )Nr   get_any_hdrre   s    rX   rg   z:Export.return_attrs.<locals>.movie_attrs.<locals>.<lambda>   s    T%5%5a%A rZ   
accessibledeepAnalysisVersionexistsfilehasThumbnailindexespacketLengthrequiredBandwidthssizec                 B    t        j                  t        | dd            S Nr   r   r	   human_file_sizer   r   s    rX   rg   z:Export.return_attrs.<locals>.movie_attrs.<locals>.<lambda>      w/F/FwqRXZ[G\/] rZ   codecdefaultdisplayTitleextendedDisplayTitlert   languagelanguageCodelanguageTagselected
streamTyper   
anamorphicbitDepthcabacchromaLocationchromaSubsamplingcodecIDcodedHeight
codedWidthcolorPrimaries
colorRange
colorSpacecolorTrcDOVIBLCompatIDDOVIBLPresentDOVIELPresent	DOVILevelDOVIPresentDOVIProfileDOVIRPUPresentDOVIVersion	frameRateframeRateModehasScalingMatrixhdrc                 Z    t        j                  t        | dd      t        | dd            S Nr   r   r   r5   r	   is_hdrr   r   s    rX   rg   z:Export.return_attrs.<locals>.movie_attrs.<locals>.<lambda>3  (    W^^GAzST<UW^_`bnprWs-t rZ   levelpixelAspectRatiopixelFormatprofile	refFramesscanTypestreamIdentifierwidthaudioChannelLayoutr   bitrateModechannelsr}   r   samplingRater  canAutoSyncforcedformatheaderCompressionproviderTitlescore	sourceKey	transientuserID	sizeHuman
syncItemId	syncStatevideoProfilevideoStreamsaudioStreamssubtitleStreamsvideoFrameRater  videoResolutionr  r   partsmetadataDirectoryoriginallyAvailableAtTto_dateoriginalTitle	producersratingratingImage	ratingKeyrolesrr   rs   rolerw   slugstudiosummarytaglinethemec                 (    j                  | d      S Nrw   rc   re   s    rX   rg   z:Export.return_attrs.<locals>.movie_attrs.<locals>.<lambda>      t~~a'A rZ   c                 (    j                  | d      S r2  rk   re   s    rX   rg   z:Export.return_attrs.<locals>.movie_attrs.<locals>.<lambda>      4+B+B1g+N rZ   )rw   thumbBlurHash	thumbFilethumbProviderrM   	titleSortr   	updatedAtuseOriginalTitle
userRating	viewCount
viewOffsetwritersyearr	   datetime_to_isor   )_movie_attrsrW   s    rX   movie_attrsz(Export.return_attrs.<locals>.movie_attrs   s
   F722FtF tF =	F
 JF !$F &tF !!!F   !F"  #F*  +F, -F4 5F< D=F>  !\?F@ AFB 0CFD  "EFL MFT UFV $WF\ #D]F^ '_F` #DaFb tcFd eFl #DmFn w66oFp  7 7qFr #DsFt $TuFv &twFx TyFz `{F| ?}F~  LF@ !!! AFP  W!4W#TW !$W #D	W
 tW  W W dW $W )$W &tW 'W ,TW  W dW  T!W" !$#W$ '+$('+!A$d& $T .t	
 #D !$  *4 / ' d "4 t 0 '  -d!" #$ &^&*%)(,3)%t3)#T3) &t3) +D	3)
 3D3) !$3) $T3) "43) '3) +D3) *43) 1$3) '3) )$3) $T3)  #D!3)" )$#3)$ '%3)& $T'3)( -d)3)* 0+3), &t-3). *4/3)0 )$13)2 -d33)4 )$53)6 )$73)8 '93): -d;3)< ,T=3)> ,T?3)@ (A3)B *4C3)D *4E3)F -dG3)H *4I3)J 'K3)L (M3)N ,TO3)P /Q3)R "#tS3)T %dU3)V $TW3)X /Y3)Z *4[3)\ &t]3)^ (_3)` 'a3)b /c3)d $Te3)h)%t)#T) &t) +D	)
 3D) !$) $T) "4) ') +D) *4) 1$) ') )$) $T)  #D!)" 1$#)$ )-+/(,(,'+,0041)4,)4,#T, &t, +D	,
 3D, !$, $T, "4, ', +D, *4, 1$, ', )$, $T,  #D!," (#,$ '+&*15-1%))-)-&*3,I/WQF@ $TAFB (1H1HRV)WCFD  EFF GFN $OFP tQFR TSFT  !	UF` aFb $cFd 4eFf 4gFh iFj !%A!N!$44$("!" KFLN  rZ   c                  `   i dt         j                  dd dd dfddfddd d	d d
d dd dd dd dd d ddd dd dd dd dd i dd d ddd dd d ddd ddd idd dd dd d dd d d!t         j                  d"t         j                  d#d d$d d%d d&d d'd d(d) i d*fd+d,fd-d.d d/d d0t        t         j                  d12      d3d d4d d5d d6d d d d d7d8d d9d d:d d;d d<d d=d d>d d?d d d d fd@fdAd d d t         j                  d d d d d fdBdC} | S )DNr]   r^   r_   r`   c                 (    j                  | d      S rb   rc   re   s    rX   rg   z9Export.return_attrs.<locals>.show_attrs.<locals>.<lambda>  rh   rZ   ri   c                 (    j                  | d      S rb   rk   re   s    rX   rg   z9Export.return_attrs.<locals>.show_attrs.<locals>.<lambda>  rm   rZ   rn   ro   audioLanguage&autoDeletionItemPolicyUnwatchedLibrary$autoDeletionItemPolicyWatchedLibrary
childCountr&   ry   rz   r}   r~   c                 B    t        j                  t        | dd            S r   r   r   s    rX   rg   z9Export.return_attrs.<locals>.show_attrs.<locals>.<lambda>  r   rZ   r   episodeSortr   r   flattenSeasonsr   r   r   rr   rt   r   r   r   r   r   	leafCountr   r   r   r   r   c                 <    t        d | j                  D        d       S )Nc              3   T   K   | ]   }|j                   d k(  s|j                   " ywr   r   r   s     rX   r   zLExport.return_attrs.<locals>.show_attrs.<locals>.<lambda>.<locals>.<genexpr>  r   r   r   r   s    rX   rg   z9Export.return_attrs.<locals>.show_attrs.<locals>.<lambda>  r   rZ   r   c                 (    j                  | d      S r   rc   re   s    rX   rg   z9Export.return_attrs.<locals>.show_attrs.<locals>.<lambda>  r   rZ   r   c                 (    j                  | d      S r   rk   re   s    rX   rg   z9Export.return_attrs.<locals>.show_attrs.<locals>.<lambda>  r   rZ   r   networkr!  Tr"  r$  r&  r(  r)  r*  seasonCountshowOrderingr,  r-  subtitleLanguagesubtitleModer.  r/  c                 (    j                  | d      S r2  rc   re   s    rX   rg   z9Export.return_attrs.<locals>.show_attrs.<locals>.<lambda>  r3  rZ   c                 (    j                  | d      S r2  rk   re   s    rX   rg   z9Export.return_attrs.<locals>.show_attrs.<locals>.<lambda>  r5  rZ   c                 &    j                  |       S N
export_objerW   s    rX   rg   z9Export.return_attrs.<locals>.show_attrs.<locals>.<lambda>  s    T__Q%7 rZ   )r0  rw   r6  r7  r8  rM   r9  r   r:  r;  r<  r=  viewedLeafCountr@  r   rA  )_show_attrsrW   s    rX   
show_attrsz'Export.return_attrs.<locals>.show_attrs  s   V722VtV tV =	V
 JV !$V &tV  V 9$V 7V dV  V   !V" D#V$  !\%V& 0'V( t)V*  "+V2 !$3V4 5V< =V> $?VD EVF tGVH IVP #DQVR w66SVT  7 7UVV TWVX #DYVZ $T[V\ &t]V^ T_V` `aVb ?cVd  LeVf $TgVh 4iVj (1H1HRV)WkVl  mVn $oVp TqVr  !	sV~ tV@ AVB CVD $EVF #DGVH IVJ 4KVL 4MVN !%A!N!$44$("!#'7kVKn rZ   c                     i dt         j                  dd dd dfddfddd d	d d d
dd d ddd ddd idd dd dd d d
dt         j                  dt         j                  dd dd i dd dd dd dfddfddd d d d!d d"d d#d d$d d%d d&d d'd d(d d)d d*d i d+d d,d d-d d.d d/d d0fd1d2fd3d4d d5d d6d d7t         j                  d8d d9d d:d d;d d<fd=} | S )>Nr]   r^   r_   r`   c                 (    j                  | d      S rb   rc   re   s    rX   rg   z;Export.return_attrs.<locals>.season_attrs.<locals>.<lambda>  rh   rZ   ri   c                 (    j                  | d      S rb   rk   re   s    rX   rg   z;Export.return_attrs.<locals>.season_attrs.<locals>.<lambda>  rm   rZ   rH  r&   ry   r   r   r   r   rr   rt   r   r   r   r   rO  r   r   r   r   c                 <    t        d | j                  D        d       S )Nc              3   T   K   | ]   }|j                   d k(  s|j                   " ywr   r   r   s     rX   r   zNExport.return_attrs.<locals>.season_attrs.<locals>.<lambda>.<locals>.<genexpr>  r   r   r   r   s    rX   rg   z;Export.return_attrs.<locals>.season_attrs.<locals>.<lambda>  r   rZ   r   c                 (    j                  | d      S r   rc   re   s    rX   rg   z;Export.return_attrs.<locals>.season_attrs.<locals>.<lambda>  r   rZ   r   c                 (    j                  | d      S r   rk   re   s    rX   rg   z;Export.return_attrs.<locals>.season_attrs.<locals>.<lambda>  r   rZ   r   
parentGuidparentIndex	parentKeyparentRatingKeyparentStudioparentThemeparentThumbparentTitler(  seasonNumberr,  rW  rX  r.  rw   r6  r7  c                 (    j                  | d      S r2  rc   re   s    rX   rg   z;Export.return_attrs.<locals>.season_attrs.<locals>.<lambda>,  r3  rZ   r8  c                 (    j                  | d      S r2  rk   re   s    rX   rg   z;Export.return_attrs.<locals>.season_attrs.<locals>.<lambda>-  r5  rZ   rM   r9  r   r:  r<  r=  ra  r@  r   c                 &    j                  |       S r\  r]  r_  s    rX   rg   z;Export.return_attrs.<locals>.season_attrs.<locals>.<lambda>6  s    dooa&8 rZ   r	   rB  )_season_attrsrW   s    rX   season_attrsz)Export.return_attrs.<locals>.season_attrs  s   >722>t> t> =	>
 J>  >  >  "> >  $!>& '>( t)>* +>2 w663>4  7 75>6 T7>8 #D9>: $T;>< &t=>> `?>@ ?A>B  LC>D $TE>F dG>H tI>J TK>L "4M>N O>P tQ>R tS>T tU>V TW>X Y>Z [>\ #D]>^ _>` 4a>b c>d  e>f Ag>h  !Ni>j k>l Tm>n o>p W44q>r ds>t Tu>v "4w>x y>z 8{>M~ ! rZ   c                      i dt         j                  dd dd dfddfddd d	d d
d d d d d d ddd dd d ddd dd d ddd dd dd dd d ddd i dd dd dd dd dd dd dd dd d id!d d"d d#d d$d d%d d&d d'd d(d d dd)t         j                  i d*t         j                  d+d d,d d-d d.d d/d0 d1fd2d3fd4d5d d d d d d d6d7i d8d d9d d:d d;d d<d d=d dd d>d d d d?d d@d d%d dAd dBd dCd dDd dEd d d d d fdFi dGd d;d d=d dHd dd dId dJd d@d d$d dKd d d dLd d'd dAd dMd dNd dOd dP d d d i d<d dQd dRd dSd dTd d d d&d d'd dUd dVd dWd dNd dXd dYd dDd dZd d[d i d\d d]d d^d d_d d`d dad dbd dcd ddd ded dfd dgd dhd did djd dkd dld i dmd dnd dd dod dpd dqd drds d>d dtd dud dvd dwd dxd dyd dzd d{d i d<d dQd dRd dSd dTd d d d&d d'd dUd dVd dWd dNd dXd dYd dDd dZd d|d d d d d d d d d}i d~d dQd dRd dSd dTd d d d&d d'd dUd dVd dWd dNd dXd dYd dDd dZd d=d d d d d d d d d ddddd dt        t         j                  d      dd dd dd dd dd i dd dd dd d ddd dd dd d d d ddd dd dd dd dd dd dfddfddDd dd dZd t         j                  d d d d d dd d} | S )Nr]   r^   r_   r`   c                 (    j                  | d      S rb   rc   re   s    rX   rg   z<Export.return_attrs.<locals>.episode_attrs.<locals>.<lambda>?  rh   rZ   ri   c                 (    j                  | d      S rb   rk   re   s    rX   rg   z<Export.return_attrs.<locals>.episode_attrs.<locals>.<lambda>@  rm   rZ   rn   ro   rp   rq   rx   r&   ry   rz   r|   r}   r~   c                 B    t        j                  t        | dd            S r   r   r   s    rX   rg   z<Export.return_attrs.<locals>.episode_attrs.<locals>.<lambda>V  r   rZ   episodeNumberr   r   grandparentArtgrandparentGuidgrandparentKeygrandparentRatingKeygrandparentThemegrandparentThumbgrandparentTitler   r   rr   hasCommercialMarkerr   hasIntroMarkerr   r   rt   r   r   r   r   r   r   r   r   r   c                 <    t        d | j                  D        d       S )Nc              3   T   K   | ]   }|j                   d k(  s|j                   " ywr   r   r   s     rX   r   zOExport.return_attrs.<locals>.episode_attrs.<locals>.<lambda>.<locals>.<genexpr>x  r   r   r   r   s    rX   rg   z<Export.return_attrs.<locals>.episode_attrs.<locals>.<lambda>x  r   rZ   r   c                 (    j                  | d      S r   rc   re   s    rX   rg   z<Export.return_attrs.<locals>.episode_attrs.<locals>.<lambda>y  r   rZ   r   c                 (    j                  | d      S r   rk   re   s    rX   rg   z<Export.return_attrs.<locals>.episode_attrs.<locals>.<lambda>z  r   rZ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rM   r   c                 (    j                  | d      S )Nr   r   re   s    rX   rg   z<Export.return_attrs.<locals>.episode_attrs.<locals>.<lambda>  s    T%5%5a%C rZ   r   r   r   r   r   r   r   r   r   c                 B    t        j                  t        | dd            S r   r   r   s    rX   rg   z<Export.return_attrs.<locals>.episode_attrs.<locals>.<lambda>  r   rZ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c                 Z    t        j                  t        | dd      t        | dd            S r   r   r   s    rX   rg   z<Export.return_attrs.<locals>.episode_attrs.<locals>.<lambda>  r   rZ   r   r   r   r   r  r  r  r  r  r  r
  r  r  r  r   r!  Tr"  rk  rl  rm  rn  rq  rr  
parentYearr%  r&  r(  r)  r*  seasonEpisoders  r,  r.  rw   r6  r7  c                 (    j                  | d      S r2  rc   re   s    rX   rg   z<Export.return_attrs.<locals>.episode_attrs.<locals>.<lambda>6  r3  rZ   r8  c                 (    j                  | d      S r2  rk   re   s    rX   rg   z<Export.return_attrs.<locals>.episode_attrs.<locals>.<lambda>7  r5  rZ   r9  )r:  r<  r=  r>  r?  r@  rA  )_episode_attrsrW   s    rX   episode_attrsz*Export.return_attrs.<locals>.episode_attrs:  s
   I722ItI tI =	I
 JI !$I &tI !!!I   !I"  #I*  +I, -I4 D5I6  !\7I8  9I:  ";IB !$CID "4EIF !$GIH 'IIJ #DKIL #DMIN #DOIP QIR $SIX &tYIZ #D[I\ !$]I^ '_I` #DaIb cId teIf gIn w66oIp  7 7qIr #DsIt $TuIv &twIx TyIz `{I| ?}I~  LI@ !!! AIP  W!4W#TW !$W #D	W
 tW  W W dW $W )$W &tW 'W ,TW  W dW  T!W" !$#W$ '+$('+!C$d& $T .t	
 #D !$  *4 / ' d "4 t 0 '  -d!" #$ &^&*%)(,3)%t3)#T3) &t3) +D	3)
 3D3) !$3) $T3) "43) '3) +D3) *43) 1$3) '3) )$3) $T3)  #D!3)" )$#3)$ '%3)& $T'3)( -d)3)* 0+3), &t-3). *4/3)0 )$13)2 -d33)4 )$53)6 )$73)8 '93): -d;3)< ,T=3)> ,T?3)@ (A3)B *4C3)D *4E3)F -dG3)H *4I3)J 'K3)L (M3)N ,TO3)P /Q3)R "#tS3)T %dU3)V $TW3)X /Y3)Z *4[3)\ &t]3)^ (_3)` 'a3)b /c3)d $Te3)h)%t)#T) &t) +D	)
 3D) !$) $T) "4) ') +D) *4) 1$) ') )$) $T)  #D!)" 1$#)$ )-+/(,(,'+,0041)4,)4,#T, &t, +D	,
 3D, !$, $T, "4, ', +D, *4, 1$, ', )$, $T,  #D!," (#,$ '+&*15-1%))-)-&*3,I/WQI@ $TAIB (1H1HRV)WCID dEIF tGIH TIIJ "4KIL tMIN tOIP dQIR SIZ $[I\ T]I^  !	_Ij  kIl mIn oIp 4qIr sIt  uIv AwIx  !NyIz {I| T}I~ I@ %44"!" QINT "!rZ   c                     i dt         j                  dd dd dd dfddfdd	d d d
dd d d
dd d ddd d d
dd ddd idd dd dd d d
dt         j                  dt         j                  i dd dd dd dd dd dd d d
dd dd dd d d
d d d d
d!d d"d d#d d$d d%fd&d'fd(d)d d d t         j                  d d fd*d+} | S ),Nr]   	albumSortr^   r_   r`   c                 (    j                  | d      S rb   rc   re   s    rX   rg   z;Export.return_attrs.<locals>.artist_attrs.<locals>.<lambda>M  rh   rZ   ri   c                 (    j                  | d      S rb   rk   re   s    rX   rg   z;Export.return_attrs.<locals>.artist_attrs.<locals>.<lambda>N  rm   rZ   r&   ry   r{   r   r   r   r   r   rr   rt   r   r   r   r   r   r   r   r   r   moodsr&  r(  similarstylesr.  r0  rw   r6  r7  c                 (    j                  | d      S r2  rc   re   s    rX   rg   z;Export.return_attrs.<locals>.artist_attrs.<locals>.<lambda>  r3  rZ   r8  c                 (    j                  | d      S r2  rk   re   s    rX   rg   z;Export.return_attrs.<locals>.artist_attrs.<locals>.<lambda>  r5  rZ   rM   c                 &    j                  |       S r\  r]  r_  s    rX   rg   z;Export.return_attrs.<locals>.artist_attrs.<locals>.<lambda>      DOOA$6 rZ   )r9  r   r:  r<  r=  r!   rw  )_artist_attrsrW   s    rX   artist_attrsz)Export.return_attrs.<locals>.artist_attrsG  sx   C722CTC tC t	C
 =C JC  C C  "C& 'C. /C0 $1C6 7C8 t9C: ;CB w66CCD  7 7ECF #DGCH $TICJ &tKCL TMCN $TOCP QCX $YCZ T[C\ ]Cd eCl 4mCn oCp qCr  sCt AuCv  !NwCx yCz "$44"!6ECMH ! rZ   c                  :   i dt         j                  dd dd dfddfddd d d	d
d d ddd d d	dd d d	dd ddd idd dd dd dd d d	dt         j                  dt         j                  i dd dd dd dd dd dd dd d d	dd dt        t         j                  d !      d"d d#d d$d d%d d&d d'd d(d d)d i d*d d+d d d	d,d d d	d-d d.d d/d d0fd1d2fd3d4d d5d d6d d7t         j                  d8d d9d d:d d;d d<fd=} | S )>Nr]   r^   r_   r`   c                 (    j                  | d      S rb   rc   re   s    rX   rg   z:Export.return_attrs.<locals>.album_attrs.<locals>.<lambda>  rh   rZ   ri   c                 (    j                  | d      S rb   rk   re   s    rX   rg   z:Export.return_attrs.<locals>.album_attrs.<locals>.<lambda>  rm   rZ   r&   ry   r   r   formatsr   r   r   rr   hasSonicAnalysisrt   r   r   r   r   rO  r   r   r   loudnessAnalysisVersionr   r  musicAnalysisVersionr!  Tr"  rk  rm  rn  rp  rq  rr  r&  r(  r-  r  
subformatsr.  rw   r6  r7  c                 (    j                  | d      S r2  rc   re   s    rX   rg   z:Export.return_attrs.<locals>.album_attrs.<locals>.<lambda>  r3  rZ   r8  c                 (    j                  | d      S r2  rk   re   s    rX   rg   z:Export.return_attrs.<locals>.album_attrs.<locals>.<lambda>  r5  rZ   rM   r9  r   r:  r<  r=  ra  r@  r"   c                 &    j                  |       S r\  r]  r_  s    rX   rg   z:Export.return_attrs.<locals>.album_attrs.<locals>.<lambda>  r  rZ   rA  )_album_attrsrW   s    rX   album_attrsz(Export.return_attrs.<locals>.album_attrs  sj   N722NtN tN =	N
 JN  N  "N N$ %N, -N. $/N4 #D5N6 7N8 t9N: ;NB w66CND  7 7ENF TGNH #DINJ $TKNL &tMNN *4ONP $TQNR SNZ '[N\ (1H1HRV)W]N^ d_N` TaNb "4cNd teNf tgNh tiNj $kNl TmNn $oNp qNx yN@ 4ANB CND  ENF AGNH  !NINJ KNL TMNN ONP W44QNR dSNT TUNV "4WNX YNZ 6[NL^  rZ   c                  j   i dt         j                  dd dd dd d d d d d ddd dd d dd	d d
d dd d ddd d ddd dd dd dd dd dd dd i dd ddd idd dd dd dd d ddt         j                  dt         j                  dd d d d!d d"d d#d d d d d d d d i d$d d%d d&d d'd d	d d(d d)d d*d dd dd d+d d,d d-d. d/d d0d d1i d2d d3d d4d d5d d6d dd dd dd d7d d8d d9d d+d d:d d;d d<d d=d d>d d d d d d d d d d d d d d d d d?d@i d3d d4d d5d d6d dd dd dd d7d d8d d9d d+d d:d d;d d<d d=d dAd dBd d d dCdD	dEd dFd d ddGd dHd i dId dJd dKd dLd dMd dNd dOd dPd dQd dRd dSd dTd d<d dUd dVd d=d dWt         j                  d d d d dX} | S )YNr]   r^   r_   rp   rq   rx   r&   ry   r}   r~   c                 B    t        j                  t        | dd            S r   r   r   s    rX   rg   z:Export.return_attrs.<locals>.track_attrs.<locals>.<lambda>  r   rZ   r   r   r   r  r  r  r  r  r  r  r   r   rr   r  rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  c                 B    t        j                  t        | dd            S r   r   r   s    rX   rg   z:Export.return_attrs.<locals>.track_attrs.<locals>.<lambda>*  r   rZ   r  r  r  r   r   r   r   r   r   r   r   r   r   rM   r   	albumGain)	albumPeak
albumRanger  r   r  r  r}   endRampgainloudnesslrapeakr   r	  	startRamplyricStreamsr  minLines)providertimed)	r   r   r   r   r   r}   rr   rM   r  r   r  r  r$  rk  rl  rm  rn  rq  rr  ratingCountr(  	skipCountr.  rw   r6  r9  trackNumberr:  )r<  r=  r>  r@  rw  )_track_attrss    rX   track_attrsz(Export.return_attrs.<locals>.track_attrs  s=   a722ata ta !!!	a  a  a" D#a$  !\%a&  "'a. /a6 !$7a8 "49a: !$;a< '=a> #D?a@ #DAaB #DCaD EaF $GaL #DMaN OaP tQaR SaZ w66[a\  7 7]a^ #D_a` $Taab &tcad Teaf %)"&$(#!% $!G$dG&G $TG .t	G
 #DG !$G G 'G dG tG -dG G $%]G %dG $TG  ' !)%t!)#T!) &t!) +D	!)
 3D!) !$!) $T!) "4!) '!) +D!) *4!) 1$!) '!) )$!) $T!)  #D!!)" (#!)$ *.*.26(,+/(,(,'+$((,#'$('+,0)-A!)!Gd ' )#T)%t) +D) 3D	)
 !$) $T) "4) ') +D) *4) 1$) ') )$) $T) #D)  %d!)" '#)$ )-%)')eGQgaJ $TKaL MaT 'UaV  WaX dYaZ t[a\ T]a^ "4_a` taab tcad teaf Tgah Tiaj 4kal man  oap qar Tsat tuav wax W44yaz #!"AaLD  rZ   c                      i dt         j                  dd dd dd d ddd dd dd d	t         j                  d
d dd dd dd dd dd dd dd dd d t         j                  d fdfdfdd} | S )Nr]   r^   	compositer   r   r   rt   r   r   r   r   r   r   r(  r.  rw   rM   r9  c                     | dk(  rdS | S )Nr   r    )r`  s    rX   rg   z@Export.return_attrs.<locals>.photo_album_attrs.<locals>.<lambda>  s    !w,, A rZ   c                 j     t        | d             D cg c]  }j                  |       c}S c c}w )Nr!   )r   r^  )rf   r`  rW   s     rX   rg   z@Export.return_attrs.<locals>.photo_album_attrs.<locals>.<lambda>  s,    FZgaQYFZF\)]$//!*<)] )]s   0c                 &    j                  |       S r\  r]  r_  s    rX   rg   z@Export.return_attrs.<locals>.photo_album_attrs.<locals>.<lambda>  r  rZ   c                 &    j                  |       S r\  r]  r_  s    rX   rg   z@Export.return_attrs.<locals>.photo_album_attrs.<locals>.<lambda>      4??1#5 rZ   )r   r:  r<  r#   r$   r%   rw  )_photo_album_attrsrW   s    rX   photo_album_attrsz.Export.return_attrs.<locals>.photo_album_attrs  s   "722"t" T"  "	" " " t" w66" #D" $T" &t" $T"  T!"" 4#"$ %"& '"( T)"* F$44"]655"8 &%rZ   c            !      T   i dt         j                  dd dd dd d ddd dd dd d	t         j                  d
d dd dd dd dd dt        t         j                  d      dd dd dd d d d d d d d d d t         j                  d d d d d d d d d d d d d d d d d d d d d ddd d d dd} | S )Nr]   createdAtAccuracycreatedAtTZOffsetr   r   r   rt   r   r   r   r   r   r   r   r!  Tr"  rk  rl  rm  c                 B    t        j                  t        | dd            S r   r   r   s    rX   rg   z:Export.return_attrs.<locals>.photo_attrs.<locals>.<lambda>  r   rZ   )r   r   r   r   rr   r   r   r  )aperturer   r   exposurer   rr   isolensmakemodelr  r  )rr   rs   rM   )rn  rq  rr  r(  r.  rw   rM   r9  r   r:  r<  r@  r   rs   rA  )_photo_attrss    rX   photo_attrsz(Export.return_attrs.<locals>.photo_attrs  s   =722=#T= $T=  "	= = = t= w66= #D= $T= &t= T=  $T!=" (1H1HRV)W#=$ d%=& t'=( T)=* $(##!!$44" $#'!% $"  !!&*%)"& $"# $%]	0 !q=L|  rZ   c                  d   i dt         j                  dd dd dfddfddd d	d d
d dd dd dd d ddd dd dd dd d ddt         j                  dd i dd dd dd dd dd dd dd dd dd dd d d d!fd"d#fd$d%d d&d d'd d(t         j                  d fd)d*} | S )+Nr]   r^   r_   r`   c                 (    j                  | d      S rb   rc   re   s    rX   rg   z?Export.return_attrs.<locals>.collection_attrs.<locals>.<lambda>  rh   rZ   ri   c                 (    j                  | d      S rb   rk   re   s    rX   rg   z?Export.return_attrs.<locals>.collection_attrs.<locals>.<lambda>  rm   rZ   rK  collectionFilterBasedOnUsercollectionModecollectionSortrz   r   r   r   rt   r   r   ry   r   r   r   r   maxYearr   minYearr(  subtyper.  r0  rw   r6  r7  c                 (    j                  | d      S r2  rc   re   s    rX   rg   z?Export.return_attrs.<locals>.collection_attrs.<locals>.<lambda>	  r3  rZ   r8  c                 (    j                  | d      S )Nposterrk   re   s    rX   rg   z?Export.return_attrs.<locals>.collection_attrs.<locals>.<lambda>
  s    4+B+B1h+O rZ   rM   r9  r   r:  c                 &    j                  |       S r\  r]  r_  s    rX   rg   z?Export.return_attrs.<locals>.collection_attrs.<locals>.<lambda>  r  rZ   )r<  r(   rw  )_collection_attrsrW   s    rX   collection_attrsz-Export.return_attrs.<locals>.collection_attrs  s   +!722+!t+! t+! =	+!
 J+! d+! .t+! !$+! !$+!  +!  "+! +!  !+!" t#+!$ %+!, w66-+!. #D/+!0 $T1+!2 &t3+!4 45+!6 $T7+!8 49+!: T;+!< 4=+!> 4?+!@ A+!B C+!D  E+!F AG+!H  !OI+!J K+!L TM+!N O+!P W44Q+!R #5U+!X %$rZ   c                      i dt         j                  dd dd dd dd dd dd d	d d
d dd dd dd dd dd dd dd dd t         j                  fdd} | S )Nr]   r  contentr}   r~   c                 B    t        j                  t        | dd            S r   r   r   s    rX   rg   z=Export.return_attrs.<locals>.playlist_attrs.<locals>.<lambda>  r   rZ   r   iconr   rO  r   playlistTyper(  smart	sourceURIr.  rM   r   c                 &    j                  |       S r\  r]  r_  s    rX   rg   z=Export.return_attrs.<locals>.playlist_attrs.<locals>.<lambda>(  r  rZ   )r:  r(   rw  )_playlist_attrsrW   s    rX   playlist_attrsz+Export.return_attrs.<locals>.playlist_attrs  s    722T 4 D	
  !\   t T $T  T  T 4  !" #$ %445'O* #"rZ   r   r   )r	   flatten_dict)rW   rH   flattenrD  rc  ry  r  r  r  r  r  r  r  r  _media_typesmedia_attrss   `               rX   return_attrszExport.return_attrs   s    H	 TX	t@	!DK	"ZE	!NP	 dc	 J	&>?	 B-	%^	#2 !"$"  + !*&
 /l:.0!..{;A>KrZ   c                      fd} fd} fd} fd} fd} fd} fd}	 fd}
 fd	} fd
} fd}|||||||	|
||||d} ||          \  }}|r|t        t        |j                                     D ci c]  \  }}|D ]  }||  }}}}t        t        |j                                     D ci c]  \  }}|D ]  }||  }}}}||fS c c}}}w c c}}}w )Nc                  f    d} g dg dg dj                  |       d}g dg dg dd	d
gd}||fS )Nr   )r(  rM   r9  r$  r   r!  r@  r]   r&  r'  rn   ro   r<  rz   r-  r/  r.  r   r}   r~   r   r   )directors.tagwriters.tagproducers.tag	roles.tag
roles.rolecountries.tag
genres.tagcollections.tag
labels.tagfields.namefields.lockedguids.idmarkers.typemarkers.startmarkers.endmarkers.firstmarkers.final)r^   rw   r   rx   chapters.tagchapters.indexchapters.startchapters.endchapters.thumbr:  r   r=  r   r   r   r*   r+   r,   r-   r   media.aspectRatiomedia.audioChannelsmedia.audioCodecmedia.audioProfilemedia.bitratemedia.containermedia.durationmedia.heightmedia.widthzmedia.videoCodeczmedia.videoFrameRatezmedia.videoProfilezmedia.videoResolutionzmedia.isOptimizedVersionz	media.hdrmedia.parts.filemedia.parts.durationmedia.parts.containerzmedia.parts.indexesmedia.parts.sizemedia.parts.sizeHumanmedia.parts.audioProfilezmedia.parts.videoProfilez!media.parts.optimizedForStreamingmedia.parts.deepAnalysisVersionz media.parts.hasPreviewThumbnails)zmedia.parts.videoStreams.codecz media.parts.videoStreams.bitratez!media.parts.videoStreams.languagez%media.parts.videoStreams.languageCodezmedia.parts.videoStreams.titlez%media.parts.videoStreams.displayTitlez-media.parts.videoStreams.extendedDisplayTitlezmedia.parts.videoStreams.hdrz!media.parts.videoStreams.bitDepthz#media.parts.videoStreams.colorSpacez"media.parts.videoStreams.frameRatezmedia.parts.videoStreams.levelz media.parts.videoStreams.profilez"media.parts.videoStreams.refFramesz!media.parts.videoStreams.scanTypez media.parts.videoStreams.defaultzmedia.parts.videoStreams.heightzmedia.parts.videoStreams.widthmedia.parts.audioStreams.codec media.parts.audioStreams.bitratez!media.parts.audioStreams.languagez%media.parts.audioStreams.languageCodemedia.parts.audioStreams.title%media.parts.audioStreams.displayTitle-media.parts.audioStreams.extendedDisplayTitlez!media.parts.audioStreams.bitDepth!media.parts.audioStreams.channels+media.parts.audioStreams.audioChannelLayoutz media.parts.audioStreams.profile%media.parts.audioStreams.samplingRate media.parts.audioStreams.defaultz!media.parts.subtitleStreams.codecz"media.parts.subtitleStreams.formatz$media.parts.subtitleStreams.languagez(media.parts.subtitleStreams.languageCodez!media.parts.subtitleStreams.titlez(media.parts.subtitleStreams.displayTitlez0media.parts.subtitleStreams.extendedDisplayTitlez"media.parts.subtitleStreams.forcedz#media.parts.subtitleStreams.defaultz%media.parts.subtitleStreams.containerr   r   _get_all_metadata_attrs_media_type_metadata_levels_media_info_levelsrW   s      rX   movie_levelsz*Export.return_levels.<locals>.movie_levelsC  sb    !K
 //<% *0  K("R $%777rZ   c                  L    d} g dg dg dj                  |       d}i }||fS )Nr   )r(  rM   r9  r!  r$  r@  r]   r&  rn   ro   r<  rz   rT  r-  r/  r.  r   r}   r~   r   rK  rU  r   )r  r  r   r  r  r  r  r  )r^   rw   r0  r   r:  r   r=  r   r  r-  r/  s      rX   show_levelsz)Export.return_levels.<locals>.show_levels  sC     K
 //<! $ "$#%777rZ   c                  L    d} g dg dg dj                  |       d}i }||fS )Nr   )r(  rM   r9  r]   r@  r<  r.  r   r   rs  rr  rn  rk  r   )r  r  r  r  )
r^   rw   r   r:  r   r=  r   rm  rp  rq  r  r-  r/  s      rX   season_levelsz+Export.return_levels.<locals>.season_levels  sC    "K
 //<# & "$#%777rZ   c                  f    d} g dg dg dj                  |       d}g dg dg dd	d
gd}||fS )Nr   )r(  rM   r9  r!  r@  r]   r&  rn   ro   r<  rz   r.  r   r}   r~   r   r~  r  rr  rn  rk  r  rs  r  r  r  r  r   r  )r  r  r  r  r  r  r  r  r  r  r  r  r	  r
  )r^   rw   r   rx   r  r  r  r  r  r:  r   r=  r   r   r   rq  rm  r  r  r  r  r  r  r  r#  r   r   r-  r/  s      rX   episode_levelsz,Export.return_levels.<locals>.episode_levels  sb    #K
 //<+ 00  K("R $%777rZ   c                  L    d} g dg dg dj                  |       d}i }||fS )Nr   )
r(  rM   r9  r]   r&  r<  r.  r   r   r!   )	r  r   r  	moods.tagzsimilar.tag
styles.tagr  r  r  )r^   rw   r   r:  r   r=  r   r  r-  r/  s      rX   artist_levelsz+Export.return_levels.<locals>.artist_levels  sC    "K //< " "$#%777rZ   c                  L    d} g dg dg dj                  |       d}i }||fS )Nr   )r(  rM   r9  r!  r]   r&  r<  r-  r@  r.  r   r   rt   rr  rn  rk  r  r"   )
r  zformats.tagr   r  r;  r<  zsubformats.tagr  r  r  )	r^   rw   r   r:  r   r=  r   rm  rq  r  r-  r/  s      rX   album_levelsz*Export.return_levels.<locals>.album_levels  sC    !K

 //<' * "$#%777rZ   c                  f    d} g dg dg dj                  |       d}g dg dg dd	d
gd}||fS )Nr   )r(  rM   r9  r$  r@  r]   r<  r  r.  r   r}   r~   r   r  rr  rn  rk  rl  r  r  r  r  )r  r   r;  r  r  r  )r^   rw   r   r:  r   r=  r   rq  rm  r  r  r  r  )r   r  r  r  r  r  r  )r  r  r  r  r   r!  r"  zmedia.parts.hasThumbnail)r$  r%  r&  r'  r(  r)  r*  r+  r,  z"media.parts.audioStreams.albumGainz"media.parts.audioStreams.albumPeakz#media.parts.audioStreams.albumRangez!media.parts.audioStreams.loudnesszmedia.parts.audioStreams.gainzmedia.parts.audioStreams.lrazmedia.parts.audioStreams.peakz"media.parts.audioStreams.startRampz media.parts.audioStreams.endRampzmedia.parts.lyricStreams.codeczmedia.parts.lyricStreams.formatzmedia.parts.lyricStreams.titlez%media.parts.lyricStreams.displayTitlez-media.parts.lyricStreams.extendedDisplayTitlez media.parts.lyricStreams.defaultz!media.parts.lyricStreams.minLinesz!media.parts.lyricStreams.providerzmedia.parts.lyricStreams.timedr   r   r-  r/  s      rX   track_levelsz*Export.return_levels.<locals>.track_levels'  sa    !K //<' ,
&  =!"D $%777rZ   c                  L    d} g dddgg dj                  |       d}i }||fS )Nr   )r(  rM   r9  r]   r.  r   r   rt   r<  r#   r$   r%   r  r  r^   rw   r   r:  r   r  r-  r/  s      rX   photo_album_levelsz0Export.return_levels.<locals>.photo_album_levelsb  sJ    &K "? //<  "$#%777rZ   c                  b    d} g dddgg dj                  |       d}g dg dg d	d
gd}||fS )Nr   )r(  rM   r9  r@  r!  r]   r.  r   r   rt   r<  rr  rn  rk  rl  r  r  ztag.tagz	tag.title)rw   r   r:  r   rq  rm  r  )r   r  zmedia.aperturezmedia.exposurer  r  r  z	media.isoz
media.lensz
media.makezmedia.model)r  r  r  r   r   r   r-  r/  s      rX   photo_levelsz*Export.return_levels.<locals>.photo_levelsv  sg    !K {
 //< $
  "  $%777rZ   c                  L    d} g dg dg dj                  |       d}i }||fS )Nr   )r(  rM   r9  r  r  r]   rz   r<  r.  r   r   r  rK  r  r  r(   )r  r  r  rC  r  r-  r/  s      rX   collection_levelsz/Export.return_levels.<locals>.collection_levels  sC    &K //<! $ "$#%777rZ   c                  H    d} g dg g dj                  |       d}i }||fS )Nr   )r(  rM   r]   r.  r   r   r}   r~   r  r  r(   )r  r   r:  r  r-  r/  s      rX   playlist_levelsz-Export.return_levels.<locals>.playlist_levels  sC    $K //<  "$#%777rZ   r   )reversedsortedr(   )rW   rH   reverse_mapr3  r5  r7  r9  r=  r?  rA  rD  rF  rH  rJ  r  metadata_levelsmedia_info_levelsr   attrsattrs   `                   rX   return_levelszExport.return_levelsB  s=   ?	8B	8.	80B	8H	8,	849	8v	8(#	8J	8.	8* "#%#!!,!"+'
 .F\*-E-G**?GOdOdOfHg?h 2 2|ue+02#'  $U{ 2t 2O 2AI&QbQhQhQjJkAl !4 !4-2!4%) "&u !4 !4 !4  1112!4s   =C;Cc                    | j                  |d      }| j                  |d      \  }}| j                  |   D cg c]  }| j                  |    }}i }i }	|D ]  }
|
|v r|j	                  |
| j                  |
      st        | j                        nd       }|j	                  |
| j                  |
      rt        | j                        nd       }|	||||
z   <   |||	||
z   <    ||	fS c c}w )NT)r  )rM  )	r  rR  CHILD_MEDIA_TYPESPLURAL_MEDIA_TYPESgetis_media_info_attrmaxMETADATA_LEVELSMEDIA_INFO_LEVELS)rW   rH   prefixr  rN  rO  mchild_media_typesmetadata_levels_mapmedia_info_levels_maprQ  r=   r>   s                rX   return_attrs_level_mapzExport.return_attrs_level_map  s*   ''
D'A-1-?-?
X\-?-]**AEAWAWXbAcdAT44Q7dd  " 	HD((,00t7N7Nt7Tc$../Z^`N044T5L5LT5Rc$001X\ ^ )5C#FTM2!-7G%ftm4	H #$999) es   C-c                    d}| j                   s| j                  s| j                  sd}n| j                  | j                  vrdj                  | j                        }nr| j                  | j                  vrdj                  | j                        }n=| j                  | j                  vrdj                  | j                        }n| j                  | j                  vrdj                  | j                        }n| j                  | j                  vrdj                  | j                        }n| j                  | j                  vrdj                  | j                        }nl| j                  | j                  vrd	j                  | j                        }n8| j                  r| j                  d
k7  rd}n| j                   r| j                  rd}|rt#        j$                  d|       |S | j                  rRt'        j(                         }|j+                  | j                        }|j-                  | j                        }|d   }nt.        j0                  j2                  }t5        |      }| j                  rt#        j6                  d| j                  | j                  | j                  | j                  | j                  | j                  | j                         |j9                  | j                        | _        | j=                  | j:                        | _        | j>                  d
k7  r| j:                  j@                  | _         | j>                  dv r!| j:                  jC                         | _"        n| j:                  jF                  | _"        n| j                  rt#        j6                  d| j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  	       |jH                  | _        | j                  | _        d   | _"        n| j                   rt#        j6                  d| j                   | j                  | j                  | j                  | j                  | j                  | j                  | j                  	       |jK                  | j                         | _        | j                  dk(  r| j:                  jL                  | _        n| j                  | _        | j:                  jF                  | _"        nd}t#        j$                  d|       |S | j>                  | jN                  vr3dj                  | j>                        }t#        j$                  d|       |S | jN                  | j>                     d   sd| _        | jN                  | j>                     d   sd| _
        | jN                  | j>                     d   sd| _        | jQ                          | jS                  d      | _*        | jS                         | _+        | jS                  d      | _#        | jY                         | _-        | jZ                  s3dj                  | jT                        }t#        j$                  d|       |S t]        j^                  | j`                         jc                          | jZ                  S )!Nr5   zAExport called but no section_id, user_id, or rating_key provided.z/Export called with invalid metadata_level '{}'.z1Export called with invalid media_info_level '{}'.z,Export called with invalid thumb_level '{}'.z*Export called with invalid art_level '{}'.z+Export called with invalid logo_level '{}'.z,Export called with invalid file_format '{}'.z,Export called with invalid export_type '{}'.r   zdExport called with invalid export_type '{}'. Only export_type 'playlist' is allowed for user export.zBIndividual file export is only allowed for library or user export.zTautulli Exporter :: %s)r8   server_token)tokenzTautulli Exporter :: Export called with rating_key %s, metadata_level %d, media_info_level %d, thumb_level %s, art_level %s, logo_level %s, file_format %sr   r   r   r   zTautulli Exporter :: Export called with user_id %s, metadata_level %d, media_info_level %d, thumb_level %s, art_level %s, logo_level %s, export_type %s, file_format %susernamezTautulli Exporter :: Export called with section_id %s, metadata_level %d, media_info_level %d, thumb_level %s, art_level %s, logo_level %s, export_type %s, file_format %sr2   zCannot export media type '{}'.r   r*   r+   T)rK   F)	extensionzFailed to export '{}'.)r   )2r7   r8   r9   r=   rY  r  r>   rZ  r?   IMAGE_LEVELSr@   rA   r<   FILE_FORMATSrE   EXPORT_TYPESrF   r
   errorr   Usersget_details
get_tokensplexpyCONFIG	PMS_TOKENr   debugget_itemrI   r0  rH   r   _defaultSyncTitlerJ   rM   
PlexServerget_libraryr   MEDIA_TYPES_process_custom_fields	_filenamerK   rL   
add_exportrN   	threadingThread_real_exportru   )rW   msg	user_data	user_infouser_tokens
plex_tokenplexs          rX   exportzExport.export  s)   t||DOOUC  (<(<<CJJ4K^K^_C""$*@*@@ELLTMbMbcCT%6%66@GGHXHXYC^^4#4#44>EEdnnUC__D$5$55?FFtWCT%6%66@GGHXHXYCT%6%66@GGHXHXYC\\d..*<LC""tVCLL2C8J<<I!--dll-CI#..t||.DK$^4J00J*%??LL! !4!4d6K6K  $..$//4CSCSU }}T__5DH"..txx8DO*,"&((";";"II!%!;!;!=!%\\LL1 d1143H3H  $..$//4CSCSUYUeUeg DH"..DO&z2DN__LL1 !4!4d6K6K  $..$//4CSCSUYUeUeg ''8DH5("&((--"&"2"2!XX^^DN VCLL2C8J??$"2"22299$//JCLL2C8J03 D03DN03DO##%$7(^^e^4
*~~*11$..ACLL2C8J 1 1288:~~rZ   c           
         | j                   | j                  | j                  | j                  | j                  d}| j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  d	}t        j                         }	 |j!                  d||       |j#                         S # t$        $ r }t'        j(                  d|       Y d }~yd }~ww xY w)N)rG   r7   r8   r9   rH   )	rM   r<   r=   r>   r?   r@   rA   rC   rF   exports
table_namekey_dict
value_dictz:Tautulli Exporter :: Unable to save export to database: %sF)rG   r7   r8   r9   rH   rM   r<   r=   r>   r?   r@   rA   rC   rF   r   MonitorDatabaseupsertlast_insert_id	Exceptionr
   rj  )rW   keysvaluesdbr`  s        rX   ry  zExport.add_exportp  s    //||////
 ZZ++"11 $ 5 5++//!// $ 5 5

 %%'	IITfIM$$&& 	LLUWXY	s   6#C 	D#C>>Dc                     | j                   rd}nd}d| j                  i}| j                  | j                  | j                  || j
                  d}t        j                         }|j                  d||       y )Nr*   rr   )r?   r@   rA   completerO   r  r  )	rV   rN   r?   r@   rA   rO   r   r  r  )rW   r  r  r  r  s        rX   set_export_statezExport.set_export_state  sq    <<HH $..
  ++// 
 %%'
		Y&	IrZ   c                     d| j                   i}| j                  | j                  d}t        j                         }|j                  d||       y )Nrr   )rT   rU   r  r  )rN   rT   rU   r   r  r  )rW   r  r  r  s       rX   set_export_progresszExport.set_export_progress  sO    $..
  ++"11

 %%'
		Y&	IrZ   c                 (   t        j                  d| j                         | j                  r| j                  g}no| j
                  r| j                  j                         }nH| j                  dk7  r| j                  dz   }n| j                  }t        | j                  |      } |       }t        |      | _
        t        j                  d| j                         t        t        j                  j                        }|D cg c]  }t        | |       }}	 |j!                  | j"                  |      }| j$                  rDt'        ||      D ]4  \  }}| j)                  |g|       | j+                  |j                         6 n.| j)                  ||        | j+                  | j                         | j,                  r| j.                  xs dnd| _        | j0                  r| j2                  xs dnd| _        | j4                  r| j6                  xs dnd| _        | xj8                  t;        d	 |D              z  c_        d
| _        t?        | j@                        }t        j                  d|       |jG                          |jI                          | jK                          y c c}w # tB        $ r+}	t        jD                  d| j                  |	       Y d }	~	ed }	~	ww xY w# |jG                          |jI                          | jK                          w xY w)Nz0Tautulli Exporter :: Starting export for '%s'...r2   sz*Tautulli Exporter :: Exporting %d item(s).)	processesrI   
   r   c              3   4   K   | ]  }|j                     y wr\  )rO   )r   r)   s     rX   r   z&Export._real_export.<locals>.<genexpr>  s     !CT$..!Cs   Tz2Tautulli Exporter :: Successfully exported to '%s'z.Tautulli Exporter :: Failed to export '%s': %s)&r
   inforM   r9   rI   r8   r'   rE   r   lenrT   
ThreadPoolrn  ro  EXPORT_THREADSExportObjectmap
_do_exportrF   zip
_save_file_exported_imagesrP   r?   rQ   r@   rR   rA   rO   sumrV   get_export_dirpathrK   r  	exceptionclosejoinr  )
rW   r(   export_methodmethodpoolr)   resultitem_resultdirpathr`  s
             rX   r|  zExport._real_export  sX   F

S??XXJE\\HH&&(E5( $ 0 03 6 $ 0 0TXX}5FHEu:@$BRBRSFMM$@$@A6;<ddD)<<	$XXdoou5F$$),UF); 6%D+OO[MtO<))$**56
 D1%%djj19=9L9Lt//52RSD595F5FT^^1rADN7;7I7Idoo3qDONNc!CU!CCCNDL(8GKKLgV JJLIIK!!#? =2  	^Mtzz[\]]	^ JJLIIK!!#s1   J#EJ( (	K1!KK KK 2Lc                 p    |j                         }| xj                  dz  c_        | j                          |S )Nr*   )_export_objrU   r  )rW   r)   r  s      rX   r  zExport._do_export  s2    !!#q   "rZ   c                     |j                   }t        | j                        }t        j                  j                  ||      }t        j                  j                  |      st        j                  |       | j                  dk(  rt        j                  |      }t         t               j                  | t        j                        }dD ]  }t        j                  ||      } t!        |ddd      5 }	t#        j$                  |	|      }
|
j'                          |
j)                  |       d d d        n| j                  dk(  rTt+        j,                  t        j.                  |      d	d
      }t!        |dd      5 }	|	j1                  |       d d d        n| j                  dk(  r;| j3                  ||      }t!        |dd      5 }	|	j1                  |       d d d        nI| j                  dk(  r:| j5                  ||      }t!        |dd      5 }	|	j1                  |       d d d        | xj6                  t        j                  j9                  |      z  c_        y # 1 sw Y   <xY w# 1 sw Y   HxY w# 1 sw Y   TxY w# 1 sw Y   `xY w)Nr.   r   )r9  rM   r(  wzutf-8r5   )encodingnewliner/      F)indentensure_ascii)r  r0   r1   )rL   r  rK   ospathr  r   makedirsr<   r	   r  rL  setunion
sort_attrsmove_to_frontr   r.   
DictWriterwriteheader	writerowsr/   dumpssort_objwritedata_to_xmldata_to_m3urO   getsize)rW   r  rI   rL   r  filepathcsv_datacsv_headersr   outfilewriter	json_dataxml_datam3u_datas                 rX   r  zExport._save_file  s#   <<$T^^477<<2ww~~g&KK u$++F3H h!7W=O=OPK: F%33KEFhgrB +g=""$  *+ +
 '

7#3#3F#;ATYZIhg6 )'i() ) &''4Hhg6 ('h'( ( &''4Hhg6 ('h'( 	"''//(33)+ +) )
( (
( (s0   68I ?I,	I8J I),I58JJc                    t        | j                        }t        j                  |      D ]T  \  }}}t	        d |D              rd| _        !t	        d |D              rd| _        ;t	        d |D              sNd| _        V y )Nc              3   >   K   | ]  }|j                  d         yw)z
.thumb.jpgNendswithr   fs     rX   r   z*Export._exported_images.<locals>.<genexpr>  s     ;1::l+;   Tc              3   >   K   | ]  }|j                  d         yw)z.art.jpgNr  r  s     rX   r   z*Export._exported_images.<locals>.<genexpr>  s     ;QZZ
+;r  c              3   >   K   | ]  }|j                  d         yw)z	.logo.jpgNr  r  s     rX   r   z*Export._exported_images.<locals>.<genexpr>  s     <QZZ,<r  )r  rK   r  walkanyrP   rQ   rR   )rW   rM   r  rootdirsfiless         rX   r  zExport._exported_images  sq    $T^^4!#!1 	*D$;U;;&*#;U;;$(!<e<<%)"	*rZ   c                 @    | j                  |      rdS |j                  S )Nr   )is_photoalbumr   )rW   rI   s     rX   r0  zExport._media_type  s    #11#6|DCHHDrZ   c                    |r^| j                  |      }|dv r|j                         }n|j                  }dj                  |j	                         ||j
                        }n| j                  r@dj                  | j                  j	                         | j                  | j                        }n| j                  r@dj                  | j                  | j                  j	                         | j                        }nN| j                  r@dj                  | j                  | j                  j	                         | j                        }nd}t        j                  |      }|rt        || j                        S |rt!        || j"                        S |S )Nrd  z{} - {} [{}]zUser - {} - {} [{}]zLibrary - {} - {} [{}]zExport - Unknown)r0  rs  rM   r  
capitalizer(  r9   rH   rJ   r8   rE   r7   r	   clean_filenameformat_export_directoryrG   format_export_filenamer<   )rW   rI   rK   rf  rH   rM   rL   s          rX   rx  zExport._filename  sE   ))#.JDD--/		%,,%%'?H __%,,**,dnndooOH \\,33 0 0 ; ; =t||MH __/66 0 0 ; ; =tPH *H))(3*8T^^DD)(D4D4DEErZ   c                    | j                   r t        j                  d| j                          | j                   j                  d      D ]q  }|j	                         }|s| j                  | j                  |      \  }}|| j                  v r| j                  |   j                  |       b|h| j                  |<   s | j                  D ]w  }t        |d d |dd        D ]`  \  }}|| j                  v s| j                  |   }|| j                  v r| j                  |   j                  |       Q|h| j                  |<   b y y )Nz1Tautulli Exporter :: Processing custom fields: %s,r  r*   )rC   r
   rq  splitstrip_parse_custom_fieldrH   rD   addTREE_MEDIA_TYPESr  rU  )rW   fieldrH   treechild_media_typeparent_media_typeplural_child_media_types          rX   rw  zExport._process_custom_fields:  sF   LLLdN`N`a''--c2 
	:EKKME $ 8 8% PJT000##J/33E:38'##J/
	: )) 	[D7:49d12h7O [3 "3#t':'::.2.E.EFV.W+(D,?,??++,=>BBCZ[BYAZ++,=>[	[rZ   c                     | j                   j                  |g       D ]Q  }| j                  |   }|j                  |dz         s'|j	                  dd      \  }}| j                  ||      \  }}S ||fS )N.r*   )maxsplit)rT  rV  rU  
startswithr  r  )rW   rH   r  r  
plural_keys        rX   r  zExport._parse_custom_fieldS  s     $ 6 6 : ::r J 	V001ABJ
S 01$)KKaK$@!
E$($<$<=Mu$U!
E		V 5  rZ   c                 \    d}| j                  |      }|D cg c]	  }||vs| c}S c c}w )N)r   r   r`   r7  r   )r  )rW   rH   exclude_attrs	all_attrsrQ  s        rX   r.  zExport._get_all_metadata_attrs\  s2    R%%j1	!*Hd-.GHHHs   	))c                    | j                  |      }| j                  |      \  }}g }t               }|j                         D ]&  \  }}|| j                  k  s|j                  |       ( |j                         D ]&  \  }}|| j                  k  s|j                  |       ( | j                  r'd|v r#| j                  |   d   r|j                  d       | j                  r'd|v r#| j                  |   d   r|j                  d       | j                  r'd|v r#| j                  |   d   r|j                  d       || j                  v r|j                  | j                  |          | j                  j                  |      D ]/  }	|	| j                  v s|j                  | j                  |	          1 || j                   k7  rw| j                   dk(  r-d| j                  v r|j                  | j                  d          n;| j                   d	k(  r,d| j                  v r|j                  | j                  d          d
|v sd|v s| j                  dk(  rd| _        |D ]*  }
	 t%        j&                  ||
      }|j1                  |       , t3        t$        j4                  |i       S # t(        t*        f$ r t-        j.                  d|
       Y ow xY w)Nr7  r   r`   r*   r   r+   r   r)   r   zmedia.parts.accessiblezmedia.parts.existsr-   Tz?Tautulli Exporter :: Unknown export attribute '%s', skipping...)r  rR  r  r(   r=   updater>   r?   rv  r  r@   rA   rD   rT  rV  rU  rH   rS   r	   get_dict_value_by_pathKeyError	TypeErrorr
   warnappendr   
dict_merge)rW   rH   r  metadata_level_attrsmedia_info_level_attrsexport_attrs_listexport_attrs_setr   rP  r  rQ  values               rX   _get_export_attrszExport._get_export_attrsa  s   ''
37;7I7I*7U4450668 	/LE5+++ ''.	/ 388: 	/LE5--- ''.	/ k)d.>.>z.J1.M $$[1>>K'D,<,<Z,H,K $$Y/??[(T-=-=j-I!-L $$Z0,,,##D$7$7
$CD $ 6 6 : :: F 	P4#6#66 $$T%<%<=M%NO	P (,.6T=P=P3P ''(;(;F(CDJ.6T=P=P3P ''(;(;F(CD#'77;OSc;c%%*'+D$$ 	,D66{DI
 $$U+	, g((*;R@@ i( ]_cds    J$$%KKc                 2    | j                  d      xs | dk(  S )Nzmedia.r   )r  )rQ  s    rX   rW  zExport.is_media_info_attr  s    x(?DK,??rZ   c                 B    | j                   dk(  xr | j                  dk(  S )Nr   	Directory)r   TAGr  s    rX   r  zExport.is_photoalbum  s    xx7"=sww+'==rZ   c                 F   |j                   t        j                  |      d|j                  d|j                   i}|j                  r|j                  |d<   |j
                  r|j
                  |d<   |j                  r|j                  |d<   t        j                  |dd      S )	NrM   r   r(  r  	sectionIDr  r  )	root_noder  )rH   r	   r  rM   r9   r8   r7   dict_to_xml)rW   datarI   xml_metadatas       rX   r  zExport.data_to_xml  s    (8(8(>TZ\_\j\jk>>(+L%;;%([[L">>(+L%""<8ANNrZ   c                 t   | j                  |      }|j                  |j                  d}|j                  r|j                  |d<   |j                  r|j                  |d<   |j
                  r|j
                  |d<   d}|dj                  |j                  t        j                  |            z  }d}g }|D ]j  }|j                  d	      |j                  d
      |j                  d      t        j                  |      d}	|j                   |j                  di |	       l |dj                  |      z   }|S )N)rM   r   r(  r  r  z#EXTM3U
z"# Playlist: {title}
# {metadata}

)rM   metadataz3# {metadata}
#EXTINF:{duration},{title}
{location}
r}   rM   location)r}   rM   r  r  
r  )_get_m3u_itemsrM   rH   r9   r8   r7   r  r/   r  popr  r  )
rW   r  rI   r(   m3u_metadatar1   m3u_item_template	m3u_itemsr)   
m3u_valuess
             rX   r  zExport.data_to_m3u  s#   ##D)!$CNNC>>(+L%;;%([[L">>(+L%6==CIIX\XbXbcoXp=qqT	 	ED HHZ0'* HHZ0 JJt,	J 5.55C
CD	E DIIi((
rZ   c           	         g }|D ]  }|j                  dg       rvd|v r,dj                  |j                  d      xs |d   |d         }n|d   }|d   |d   |j                  dd	      |d
j                  |d         d}|j                  |       | j                  |d      D ]4  }| j                  || j                  |            }|j                  |       6  |S )Nr   r  z{} - {}r$  rM   r   r(  r}      r  )r   r(  r}   rM   r  )rV  r  r  r  rT  r  rU  extend)rW   r  r(   d
full_titler  r  child_locationss           rX   r  zExport._get_m3u_items  s     	.Auu["%%*!*!1!1!%%2H2aAN`Lacdelcm!nJ!"7JfI!"; !j! 4' $		!K. 9 X&$($:$:1V9$E . "&"5"5a8O8OP`8a6b"c_-.	.& rZ   c                      y r\  r  )rW   s    rX   r  zExport._export_obj  s    rZ   c                     | j                  |      }| j                  |      }t        |d      r,|j                         r|j	                  | j
                        }t        j                  ||      S )NisPartialObject)
checkFiles)rP  )r0  r
  hasattrr'  reloadrS   r	   get_attrs_to_dict)rW   rI   rH   export_attrss       rX   r^  zExport.export_obj  sc    %%c*
--j9 3)*s/B/B/D**(@(@*AC((LAArZ   c                     | j                  |      d   }t        j                  |d      }t        j                  ||      }t	        d |j                  dg       D              S )Nr   zparts.videoStreams.hdrc              3   l   K   | ],  }|j                  d g       D ]  }|j                  d        . yw)r  r   N)rV  )r   pvss      rX   r   z%Export.get_any_hdr.<locals>.<genexpr>  s1     eQ155Q_acKdeR266%=e=es   24r  )r  r	   r  r+  r  rV  )rW   r)   rH   r  rP  r   s         rX   r   zExport.get_any_hdr  sX      ,W5..t5MN))$6e%))GR*@eeerZ   c                 *   |dk(  r.t        |d      s|j                         |_        t        |dg       S |dk(  r.t        |d      s|j	                         |_        t        |dg       S t        |d      s|j                         |_        t        |dg       S )Nr^   _artsr   _logos_posters)r)  artsr2  r   logosr3  postersr4  )rW   r)   images      rX   _get_cached_imageszExport._get_cached_images  s    E>4)!YY[
4"--f_4*"jjl42..4, $4R00rZ   c                 L    | j                  ||      }t        d |D        d       S )Nc              3   :   K   | ]  }|j                   s|  y wr\  )r   )r   ims     rX   r   z-Export._get_selected_image.<locals>.<genexpr>	  s     8BBKKR8s   )r9  r   )rW   r)   r8  r   s       rX   _get_selected_imagezExport._get_selected_image  s'    ((u58&8$??rZ   c                    |j                   }|j                  }d}| j                  dk(  s| j                  dk(  s| j                  dk(  r2| j                  |      }|xr |j                  j                  d      }n{| j                  dk(  s| j                  dk(  s| j                  dk(  rt        fd|j                  D              }n/| j                  dk(  s| j                  dk(  s| j                  dk(  rd}|s+dz   | j                  j                  |t                     v rd}|sy d }dk(  r|j                  }n#d	k(  r|j                  }nd
k(  r|j                  }|sy t        j                  |d      }|j                   dk7  ry |dv r|j#                         }	n|j$                  }	t'        | j(                  | j$                        }
t+        j,                  dj/                  |	|            }t0        j2                  j5                  |
|      }t0        j2                  j7                  |
      st1        j8                  |
       t;        |d      5 }|D ]  }|j=                  |        	 d d d        | xj>                  t0        j2                  jA                  |      z  c_        t0        j2                  j5                  t0        j2                  jC                  |
      |      S # 1 sw Y   xxY w)NTr*   	upload://r+   c              3   X   K   | ]!  }|j                   xr |j                  k(   # y wr\  )r   r   )r   r  r8  s     rX   r   z#Export.get_image.<locals>.<genexpr>	  s.      9#(  %||C

e0CC 9s   '*r-   Filerw   r^   r   )stream   rd  )images_directoryz{} [{}].{}.jpgwb)"r   r(  r?   r@   rA   r=  r  r  r   rD   rV  r  thumbUrlartUrllogoUrlrequestsstatus_coders  rM   r  rK   r	   r  r  r  r  r  r   r  r   r  rO   r  basename)rW   r)   r8  rH   r9   export_imager   	image_urlr
item_titler  rL   r  r  chunks     `            rX   rd   zExport.get_image	  sb   YY
^^
q DNNa$74??a;O//e<H#R(:(:(E(Ek(RL"dnn&9T__PQ=Q 9,0KK9 9L"dnn&9T__PQ=QL$2E2E2I2I*VYV[2\ \L	GIe^If_ILL40==C@@//1JJ$T^^djjQ))*:*A*A*jZ_*`a77<<2ww~~g&KK (D! 	%W %e$%	% 	"''//(33ww||BGG,,W5x@@	% 	%s   K  K)c                 ~    | j                  ||      }|r)|j                  j                  d      rdS |j                  S y )Nr?  upload)r=  r(  r  r  )rW   r)   r8  r   s       rX   rl   zExport.get_image_provider:	  s@    ++D%8'11<<[I8`xO`O`` rZ   )NNNr.   r*   r*   r   r   r   r5   r2   F)F)r5   r\  )NFT)+__name__
__module____qualname__rv  rU  rT  r  rY  rZ  rg  rh  ri  rY   r  rR  r`  r  ry  r  r  r|  r  r  r  r0  rx  rw  r  r.  r
  staticmethodrW  r  r  r  r  r  r^  r   r9  r=  rd   rl   r  rZ   rX   r   r   &   s    $"$'%$&+&%)'K ##  
+)5hH &O'L0L4LSX4589GL-$^pd%[2z:4un:J(
J3$j"4H	*E@[2!I
3Aj @ @ > >	O:0Bf1@5AnarZ   r   c                   $     e Zd Z fdZd Z xZS )r  c                 >   t         t        |           | j                  j	                  |j                         || _        | j
                  j                  | _        | j                  | j
                        | _	        | j                  | j
                  d      | _
        y )Nr  F)rI   rf  )superr  rY   __dict__r  rI   r(  r9   rx  rL   rM   )rW   r  rI   	__class__s      rX   rY   zExportObject.__init__A	  sl    lD*,V__-((,,4884^^E^B
rZ   c                 J    | j                  | j                        }d | _        |S r\  )r^  rI   )rW   r  s     rX   r  zExportObject._export_objJ	  s     *rZ   )rS  rT  rU  rY   r  __classcell__)r[  s   @rX   r  r  @	  s    CrZ   r  c                    t        j                         }|j                  d| g      }|rU|d   rd |d<   t        |d   |d         |d<   |S dj	                  |d   |d         |d<   t        |d   |d   |d         |d<   |S )	Nz~SELECT timestamp, title, file_format, thumb_level, art_level, logo_level, individual_files, complete FROM exports WHERE id = ?rF   rL   rM   rG   r   {}.{}r<   )r   r  select_singlecheck_export_existsr  )rN   r  r  s      rX   
get_exportrb  P	  s    		!	!	#B :  )k+F
 $%!%F:26'?F;DWXF8
 M ")wAV!WF:26'?F;DWY_`jYklF8MrZ   c                    t        |       j                         rd}t        |       }|rRt        |d   |d         r@t	        |d   |d         }t        j                  d|       	 t        j                  |d       |r>t        j                  d	|        t        j                         }|j                  d
| g      }|S y# t        $ r#}t        j                  d||       d}Y d }~jd }~ww xY w)NT)rN   rM   rG   z*Tautulli Exporter :: Deleting export '%s'.ignore_errorsz5Tautulli Exporter :: Failed to delete export '%s': %sFz=Tautulli Exporter :: Deleting export_id %s from the database.z DELETE FROM exports WHERE id = ?)args)r:   isdigitrb  ra  r  r
   r  shutilrmtreeOSErrorrj  r   r  action)rN   deletedr  r  r`  r  s         rX   delete_exportrm  b	  s    
9~i0)&/6+;NO(&:MNGKKDgN gT:
 KKWYbc))+BYYAYTF   TV]_`a s   %B? ?	C+C&&C+c                  |   t        j                  d       t        j                  j                  } 	 t        j                  | d       t        j                  j                  |       st        j                  |        t        j                          y# t        $ r!}t        j                  d| |       Y d }~nd }~ww xY w)NzDTautulli Exporter :: Deleting all exports from the export directory.Trd  z?Tautulli Exporter :: Failed to delete export directory '%s': %s)r
   r  rn  ro  
EXPORT_DIRrh  ri  rj  rj  r  r  r   r  r   delete_exports)
export_dirr`  s     rX   delete_all_exportsrr  z	  s    
KKVW))Jgj5 77>>*%
J  gVXbdeffgs   B 	B;B66B;c                  N    t        j                         } | j                  d       y )Nz3UPDATE exports SET complete = -1 WHERE complete = 0)r   r  rk  )r  s    rX   cancel_exportsrt  	  s    		!	!	#BIICDrZ   c           
      $   dddg d}t        j                         }g }| r|j                  d| g       |r|j                  d|g       |r|j                  d|g       g d}	 |j                  d||g g g g |      }|d
   }
g }|
D ]  }|d   rd }t        |d   |d         }n%t        |d   |d         }t        |d   |d   |      }i d|d   d|d   d|d   d|d   d|d   d|d   d|d   d|d   d|d|d   d|d   d|d   d|d   d|d   d|d   d|d   d|d   |d   |d   |d   |d   |d }|j                  |        |d!   |d"   ||d#   d$}
|
S # t        $ r"}	t        j                  d	|	       |cY d }	~	S d }	~	ww xY w)%Nr   )recordsFilteredrecordsTotaldrawr  exports.section_idexports.user_idexports.rating_key)zexports.id AS export_idzexports.timestampry  rz  r{  zexports.media_typezCASE WHEN exports.media_type = 'photoalbum' THEN 'Photo Album' ELSE UPPER(SUBSTR(exports.media_type, 1, 1)) || SUBSTR(exports.media_type, 2) END AS media_type_titlezexports.titlezexports.file_formatzexports.metadata_levelzexports.media_info_levelzexports.thumb_levelzexports.art_levelzexports.logo_levelzexports.custom_fieldszexports.individual_fileszexports.file_sizezexports.completezexports.total_itemszexports.exported_itemsr  )r  columnscustom_wheregroup_by
join_typesjoin_tables
join_evalskwargszSTautulli Exporter :: Unable to execute database query for get_export_datatable: %s.r  rF   rM   rG   r<   rN   r7   r8   r9   rH   media_type_titlerL   r=   r>   r?   r@   rA   rC   rO   r  rU   rT   )rO   r  rU   rT   r   filteredCount
totalCountrx  )rv  rw  r  rx  )	r   
DataTablesr  	ssp_queryr  r
   r  ra  r  )r7   r8   r9   r  default_returndata_tablesr}  r|  queryr`  r  rowsr)   rL   r   rows                   rX   get_export_datatabler  	  s   )*&' "N
 '')KL1:>?.891:>?G.%%.53?/1132413-3 & 5 8_FD  "#H(g[8IJF-d7mT-=PQH(g[8I8TF{D- D-T,/ $y/ T,/	
 T,/ "4(:#; W 8 d=1  &6!7 "4(:#; d=1 D- T,/ _ 5  "4(:#;!" !-
+!%&6!7"=1+0 	CA D "'!7#L1FmF M_  iklms   "E$ $	F-F
F
Fc                 L    dj                  | t        j                  |            S Nr_  )r  r	   timestamp_to_YMDHMS)rM   rG   s     rX   r  r  	  s    >>%!<!<Y!GHHrZ   c                 &    dj                  | |      S r  )r  )rM   r<   s     rX   r  r  	  s    >>%--rZ   c                     |rt        | |      } t        j                  j                  t        j
                  j                  |       }|r/t        j                  j                  |dj                  |            }|S )Nz	{}.images)r  r  r  r  rn  ro  ro  r  )rM   rG   rD  r  s       rX   r  r  	  sW    'y9ggll6==33U;G'',,w(:(:;K(LMNrZ   c                 Z    t        | |      }t        j                  j                  ||      S r\  )r  r  r  r  )rM   rG   rL   r  s       rX   get_export_filepathr  
  s#     	2G77<<**rZ   c                     |r*t         j                  j                  t        | ||            S t         j                  j	                  t        | |            S r\  )r  r  isfiler  isdirr  )rM   rG   rL   s      rX   ra  ra  
  s=    ww~~1%HMNN77==+E9=>>rZ   c                    g g d}h d}h d}|j                  d      D ch c]   }|j                         j                         " }}t               }| |j                  vr|S | dk(  r|j                  |      s|S | dk(  r|j                  |      s|S t        |j                  |            }| dk(  rd|v r|dd	gz  }n| dk(  rd
|v r|dgz  }n| dk(  r
d|v r|dgz  }|j                  |       \  }}	|D ]  }|j                  |    D ]  }
d}|
s|
dk(  r|}n|
}||j                  |
   z   dz   }|j                  ||      \  }}|j                  |       |	j                  |       |
dk(  re|j                  j                  |      }
|
r|
d   }
|
r  t        |j                               D cg c]  \  }}|r||d c}}|d<   t        |	j                               D cg c]  \  }}|r||d c}}|d<   |S c c}w c c}}w c c}}w )N)metadata_fieldsmedia_info_fields>   r   r   r   r   r   >   audior   videor  r   r   r  r   r   r  r   r   r5   r)   r  )r[  r   r   )r  r   r  r  )r  r  r;   r   rv  issubsetlist
differencer`  rT  rU  r  rV  rL  r(   )rH   sub_media_typerC   collection_sub_media_typesplaylist_sub_media_typesr  r  sub_media_typesr^  r_  r  r[  fields_child_media_typechild_metadata_levels_mapchild_media_info_levels_maprQ  r   s                    rX   get_custom_fieldsr  
  s   M
 "T:1?1E1Ec1JKAaggioo'KNKXF+++	|	#N,C,CD^,_	z	!.*A*ABZ*[>445MNOOZG~$=GY//	z	!g&?G9$	z	!g&?G9$171N1Nz1Z..) ; & 8 8 D 	;F"#v-.<+.>+&";";<L"MMPSSIOIfIf+F Jg J<F)+F $**+DE%,,-HI#|3#)#;#;#?#?@W#X #'7':$) #	;;6 <BBUB[B[B];^(i,7D%bg 37(G (iM#$ >DDYD_D_Da=b*m.9dEfk 595*I *mM%& i L^(i*ms   %G<.H"Hc            	      d   t               d} d}d}dfd}g }j                  j                         D ]O  \  \  }}}dk(  rd}nj                     j	                         }g }	 |      }
j                        \  }}g }t        |j                         t        j                        D ]s  \  }}|r|d	k(  s|r|d
k(  s|r|dk(  rd}||ddddd}n,||dk  rdnd|dk  rdnd|dk  rdnd|dk  rdnd|dk  rdndd}|j                   j                  d!i |       u ||
z  }|j                  d      dj                  |      z   }|	j                  |j                  d|             g }t        |j                         t        j                        D ]R  \  }}||dk  rdnd|dk  rdnd|dk  rdnd|dk  rdnd|dk  rdndd}|j                   j                  d!i |       T ||
z  }|j                  d      dj                  |      z   }|	j                  |j                  d|             | j                  |      dj                  |	      z   }dk(  r|dz  }n
dk(  r|dz  }|j                  |       R d j                  |      }t        j                  |      S )"Nz$### <a id="{anchor}">{section}</a>

zY<details>
<summary><strong>{field_type} Fields</strong></summary><br>

{table}
</details>zz| {field_type} Field | Level 0 | Level 1 | Level 2 | Level 3 | Level 9 |
| :--- | :---: | :---: | :---: | :---: | :---: |
zC| `{attr}` | {level0} | {level1} | {level2} | {level3} | {level9} |c           	      t   g }j                   |    D ]  }j                  |   }|dk(  rd}n|j                         }dj                  ||      }|d|j                  d      |j                  d      |j                  d      |j                  d      d	}|j	                   	j                  d
i |        |S )Nr   Photo Albumsu'   ✓<br>Includes [{}](#{}-{}) Level {{}}r5   r*   r+   r,   r-   rQ  level0level1level2level3level9r  )rT  rU  r  r  r  )
r0  child_table_rowsr  child_plural_media_typechild_section_title
child_text	child_rowr  rH   	table_rows
          rX   _child_rowsz&build_export_docs.<locals>._child_rowsY
  s     & 8 8 E 	C&,&?&?@P&Q#</&4#&=&H&H&J#FMM#Z1ACJ 0$++A.$++A.$++A.$++A.I ##$4I$4$4$Ay$AB!	C"  rZ   r   r  r  r7  r`   r   z'Refer to [Image Exports](#image-export)r5   r  r   u   ✓r*   r+   r,   r-   Metadata)
field_typer  )r  tablez
Media Info)anchorsectionz

r   z

* <a id="collection-item">**Note:**</a> Collection `items` can be [Movies](#movie), [Shows](#show), [Seasons](#season), [Episodes](#episode), [Artists](#artist), [Albums](#album), or [Tracks](#track) depending on the type of collection.r   z

* <a id="playlist-item">**Note:**</a> Playlist `items` can be [Movies](#movie), [Episodes](#episode), [Tracks](#track), or [Photos](#photo) depending on the type of playlist.z


r  )r   rv  r(   rU  r  r`  rL  r	   r  r  r  r  sanitize)section_headsection_details
table_headr  sectionsrw   r^   r   section_titledetailstable_child_rowsr^  r_  
table_rowsrQ  r   textr  metadata_tablemedia_info_tabler  docsr  rH   r  s                         @@@rX   build_export_docsr  L
  s,   XF;L#O
FJUI * H*0*<*<*B*B*D G!&
&UC%*M"55jALLNM&z25;5R5RS]5^22 
!"5";";"=7CUCUV 	7KD%,	8ITVZ^hVh@ "     !+0A:i2+0A:i2+0A:i2+0A:i2+0A:i2 .i..556)	7* 	&&
#**j*ADIIjDYY-->-Z[ 
!"7"="="?WEWEWX 		7KD%',z)r',z)r',z)r',z)r',z)rC .i..556		7 	&&
%,,,E		R\H]]--M]-^_%%Z%ORXR]R]^eRff%7G :%5G 	 OG!R =="DD!!rZ   )NNNN)NNr\  )%r.   r/   r  rI  rh  rz  	functoolsr   r   ior   multiprocessing.dummyr   r  rn  r   r   r	   r
   r   plexpy.plexr   objectr   r  rb  rm  rr  rt  r  r  r  r  r  ra  r  r  r  rZ   rX   <module>r     s   $   	    %  4       W$aV W$atH6  $0 E
_DI.+
?<~n"rZ   