
    gz                        d dl Z d dlZd dlZd dlmZmZmZ d dlmZ d dl	Z	d dl	m
Z
 d dl	mZ d dl	mZ d dl	mZ d dl	mZ d d	l	mZ d d
l	mZ d dl	mZ d dl	mZ d Z G d de      Zy)    N)quote
quote_plus	urlencode)Node)activity_processor)common)helpers)http_handler)	libraries)logger)plextv)session)usersc                     t        j                  d       t               j                  d      } | sFt               j	                         }|D ])  }|d   t
        j                  j                  k(  s$|d   }  n | rp| t
        j                  j                  k7  rSt
        j                  j                  d|        t
        j                  j                          t        j                  d       | S )Nz5Tautulli Pmsconnect :: Requesting name from server...FriendlyName)prefmachine_identifiernamePMS_NAMEz-Tautulli Pmsconnect :: Server name retrieved.)r   info
PmsConnectget_server_prefget_servers_infoplexpyCONFIGPMS_IDENTIFIERr   __setattr__write)server_nameservers_infoservers      "/opt/Tautulli/plexpy/pmsconnect.pyget_server_friendly_namer#   $   s    
KKGH,..N.CK !|446" 	F*+v}}/K/KK$Vn	
 {fmm&<&<<!!*k:CD    c                      e Zd ZdZd8dZd9dZd:dZd:dZd:dZd;dZ	d:d	Z
d:d
Zd<dZd=dZd:dZd:dZd9dZd9dZd9dZd9dZ	 	 d>dZ	 	 d?dZd:dZd:dZd9dZd@dZd9dZd Zd9dZd9dZdAdZd9dZdBdZ 	 	 dCd Z!dDd!Z"d9d"Z#dEd#Z$dFd$Z%d@d%Z&dGd&Z'd9d'Z(d( Z)d) Z*dHd*Z+d+ Z,	 	 dId,Z-d- Z.d9d.Z/	 	 dJd/Z0d:d0Z1d:d1Z2d2 Z3d3 Z4d4 Z5d5 Z6e7d6        Z8d7 Z9y)Kr   z(
    Retrieve data from Plex Server
    Nc                 `   || _         || _        | j                   s:t        j                  j                  r t        j                  j                  | _         nT| j                   sHdj                  t        j                  j                  t        j                  j                        | _         t        j                  j                  | _	        | j                  svt        j                         rCt        j                         }|j                  t        j                               }|d   | _        nt        j                  j                  | _        t        j                  j                   | _        t%        j&                  | j                   | j                  | j                  | j"                        | _        y )Nzhttp://{hostname}:{port})hostnameportuser_idserver_token)urlstokentimeout
ssl_verify)urlr-   r   r   PMS_URLformatPMS_IPPMS_PORTPMS_TIMEOUTr.   r   get_session_user_idr   Users
get_tokens	PMS_TOKENVERIFY_SSL_CERTr/   r
   HTTPHandlerrequest_handler)selfr0   r-   	user_datauser_tokenss        r"   __init__zPmsConnect.__init__=   s   
xxFMM11}},,DH188&--BVBV>Dmm>T>T 9 VDH}}00zz**,!KKM	'227;V;V;X2Y(8
#]]44
 --77+77TXX>Bjj@DCG?? Tr$   c                 F    d}| j                   j                  |d|      }|S )
        Return current sessions.

        Optional parameters:    output_format { dict, json }

        Output: array
        z/status/sessionsGETurirequest_typeoutput_formatr<   make_requestr=   rG   rE   requests       r"   get_sessionszPmsConnect.get_sessionsX   s4     !&&33AFBO 4 Q r$   c                 d    d|dt        |      }| j                  j                  |dd      }|S )rB   z%/status/sessions/terminate?sessionId=z&reason=rC   T)rE   rF   return_response)r   r<   rI   )r=   
session_idreasonrE   rK   s        r"   get_sessions_terminatez!PmsConnect.get_sessions_terminateg   sB     FPQ[\bQcd&&33AFDH 4 J r$   c                 R    d|z   dz   }| j                   j                  |d|      }|S )z
        Return metadata for request item.

        Parameters required:    rating_key { Plex ratingKey }
        Optional parameters:    output_format { dict, json }

        Output: array
        /library/metadata/z?includeMarkers=1rC   rD   rH   r=   
rating_keyrG   rE   rK   s        r"   get_metadatazPmsConnect.get_metadatav   s?     #Z/2EE&&33AFBO 4 Q r$   c                 H    |}| j                   j                  |d|d      }|S )z
        Return epg metadata for request item.

        Parameters required:    epg_key { Plex key }
        Optional parameters:    output_format { dict, json }

        Output: array
        rC   F)rE   rF   rG   raise_errorsrH   )r=   epg_keyrG   rE   rK   s        r"   get_epg_metadatazPmsConnect.get_epg_metadata   s7     &&33AFBOAF 4 H
 r$   c                 n    dj                  |rdnd|      }| j                  j                  |d|      }|S )z
        Return metadata for children of the request item.

        Parameters required:    rating_key { Plex ratingKey }
        Optional parameters:    output_format { dict, json }

        Output: array
        z/library/{}/{}/childrencollectionsmetadatarC   rD   )r2   r<   rI   )r=   rU   
collectionrG   rE   rK   s         r"   get_metadata_childrenz PmsConnect.get_metadata_children   sJ     (..'MZ
 &&33AFBO 4 Q r$   c                 R    d|z   dz   }| j                   j                  |d|      }|S )z
        Return metadata for graandchildren of the request item.

        Parameters required:    rating_key { Plex ratingKey }
        Optional parameters:    output_format { dict, json }

        Output: array
        rS   z/grandchildrenrC   rD   rH   rT   s        r"   get_metadata_grandchildrenz%PmsConnect.get_metadata_grandchildren   s?     #Z/2BB&&33AFBO 4 Q r$   c                 R    d|z   dz   }| j                   j                  |d|      }|S )z
        Return metadata for items of the requested playlist.

        Parameters required:    rating_key { Plex ratingKey }
        Optional parameters:    output_format { dict, json }

        Output: array
        z/playlists/z/itemsrC   rD   rH   rT   s        r"   get_playlist_itemszPmsConnect.get_playlist_items   s>     j(83&&33AFBO 4 Q r$   c                 R    d|d|}| j                   j                  |d|      }|S )
        Return list of recently added items.

        Parameters required:    count { number of results to return }
        Optional parameters:    output_format { dict, json }

        Output: array
        z./library/recentlyAdded?X-Plex-Container-Start=&X-Plex-Container-Size=rC   rD   rH   )r=   startcountrG   rE   rK   s         r"   get_recently_addedzPmsConnect.get_recently_added   s<     ^cdij&&33AFBO 4 Q r$   c                 X    d|d|d|}| j                   j                  |d|      }|S )re   /library/sections/z&/recentlyAdded?X-Plex-Container-Start=rf   rC   rD   rH   )r=   
section_idrg   rh   rG   rE   rK   s          r"   get_library_recently_addedz%PmsConnect.get_library_recently_added   sF     jtuz  }B  C&&33AFBO 4 Q r$   c                 R    d|z   dz   }| j                   j                  |d|      }|S )z
        Return list of related children in requested collection item.

        Parameters required:    rating_key { ratingKey of parent }
        Optional parameters:    output_format { dict, json }

        Output: array
        z/hubs/metadata/z/relatedrC   rD   rH   rT   s        r"   get_children_list_relatedz$PmsConnect.get_children_list_related   s>      *,z9&&33AFBO 4 Q r$   c                 R    d|z   dz   }| j                   j                  |d|      }|S )z
        Return list of children in requested library item.

        Parameters required:    rating_key { ratingKey of parent }
        Optional parameters:    output_format { dict, json }

        Output: array
        rS   z
/allLeavesrC   rD   rH   rT   s        r"   get_childrens_listzPmsConnect.get_childrens_list   s>     #Z/,>&&33AFBO 4 Q r$   c                 F    d}| j                   j                  |d|      }|S )z
        Return list of local servers.

        Optional parameters:    output_format { dict, json }

        Output: array
        z/serversrC   rD   rH   rJ   s       r"   get_server_listzPmsConnect.get_server_list	  4     &&33AFBO 4 Q r$   c                 F    d}| j                   j                  |d|      }|S )z
        Return the local servers preferences.

        Optional parameters:    output_format { dict, json }

        Output: array
        z/:/prefsrC   rD   rH   rJ   s       r"   get_server_prefszPmsConnect.get_server_prefs  rt   r$   c                 F    d}| j                   j                  |d|      }|S )z
        Return the local server identity.

        Optional parameters:    output_format { dict, json }

        Output: array
        z	/identityrC   rD   rH   rJ   s       r"   get_local_server_identityz$PmsConnect.get_local_server_identity'  s4     &&33AFBO 4 Q r$   c                 F    d}| j                   j                  |d|      }|S )z
        Return list of libraries on server.

        Optional parameters:    output_format { dict, json }

        Output: array
        z/library/sectionsrC   rD   rH   rJ   s       r"   get_libraries_listzPmsConnect.get_libraries_list6  s4     "&&33AFBO 4 Q r$   c                     dt        |      z   }dt        |      z   }|rd|z   nd}d|z   dz   |z   dz   |z   dz   |z   |z   |z   }| j                  j                  |d	|
      }	|	S )z
        Return list of items in library on server.

        Optional parameters:    output_format { dict, json }

        Output: array
        zX-Plex-Container-Start=zX-Plex-Container-Size=z&label= rk   /?&rC   rD   )strr<   rI   )
r=   rl   	list_typerg   rh   	sort_type	label_keyrG   rE   rK   s
             r"   get_library_listzPmsConnect.get_library_listE  s     *CJ6(3u:5-6I	)B	#j036BSH$%'013<=&&33AFBO 4 Q r$   c           	      v   g }d}|rt        |      nd}		 | j                  t        |      |||	|||      }
	 |
j                  d      }t        t	        j
                  |d   d            }|j                  |       ||	z  }|s||k\  r	 |S v# t        $ r$}t        j                  d|z         |cY d }~S d }~ww xY w)Nr   d   )rl   r   rg   rh   r   r   rG   MediaContainer	totalSizezFTautulli Pmsconnect :: Unable to parse XML for fetch_library_list: %s.)
intr   r   getElementsByTagNamer	   get_xml_attrextend	Exceptionr   warn)r=   rl   r   rh   r   r   rG   xml_headrg   _countlibrary_data	_xml_headlibrary_countes                 r"   fetch_library_listzPmsConnect.fetch_library_listZ  s    $U#00z?###+ 1 L (==>NO	 #G$8$81{$S T	*
 VOE.1    dghhi s   AB 	B8B3-B83B8c                 R    d|z   dz   }| j                   j                  |d|      }|S )z
        Return list of labels for a library on server.

        Optional parameters:    output_format { dict, json }

        Output: array
        rk   z/labelrC   rD   rH   )r=   rl   rG   rE   rK   s        r"   get_library_labelszPmsConnect.get_library_labels{  s>     #Z/(:&&33AFBO 4 Q r$   c                 L    d|z   }| j                   j                  |d|      }|S )z
        Return sync item details.

        Parameters required:    sync_id { unique sync id for item }
        Optional parameters:    output_format { dict, json }

        Output: array
        z/sync/items/rC   rD   rH   )r=   sync_idrG   rE   rK   s        r"   get_sync_itemzPmsConnect.get_sync_item  s9     w&&&33AFBO 4 Q r$   c                 F    d}| j                   j                  |d|      }|S )z
        Return sync transcode queue.

        Optional parameters:    output_format { dict, json }

        Output: array
        z/sync/transcodeQueuerC   rD   rH   rJ   s       r"   get_sync_transcode_queuez#PmsConnect.get_sync_transcode_queue  s4     %&&33AFBO 4 Q r$   c                     dt        |j                  d            z   dz   |z   dz   }| j                  j                  |d|      }|S )z}
        Return search results.

        Optional parameters:    output_format { dict, json }

        Output: array
        z/hubs/search?query=utf8z&limit=z&includeCollections=1rC   rD   )r   encoder<   rI   )r=   querylimitrG   rE   rK   s         r"   
get_searchzPmsConnect.get_search  sX     $eELL,@&AAIMPUUXoo&&33AFBO 4 Q r$   c                 F    d}| j                   j                  |d|      }|S )z~
        Return account details.

        Optional parameters:    output_format { dict, json }

        Output: array
        z/myplex/accountrC   rD   rH   rJ   s       r"   get_accountzPmsConnect.get_account  4      &&33AFBO 4 Q r$   c                 D    d}| j                   j                  |d      }|S )zv
        Refresh Plex remote access port mapping.

        Optional parameters:    None

        Output: None
        z/myplex/refreshReachabilityPUT)rE   rF   rH   )r=   rE   rK   s      r"   put_refresh_reachabilityz#PmsConnect.put_refresh_reachability  s1     ,&&33AF 4 H r$   c                 F    d}| j                   j                  |d|      }|S )z~
        Refresh updater status.

        Optional parameters:    output_format { dict, json }

        Output: array
        z/updater/check?download=0r   rD   rH   rJ   s       r"   put_updaterzPmsConnect.put_updater  s4     *&&33AFBO 4 Q r$   c                 F    d}| j                   j                  |d|      }|S )z}
        Return updater status.

        Optional parameters:    output_format { dict, json }

        Output: array
        z/updater/statusrC   rD   rH   rJ   s       r"   get_updaterzPmsConnect.get_updater  r   r$   c                 h    |rdnd}d|d|d||}| j                   j                  |d|      }|S )aC  
        Return Plex hub recently added.

        Parameters required:    start { item number to start from }
                                count { number of results to return }
                                media_type { str }
        Optional parameters:    output_format { dict, json }

        Output: array
        z&personal=1r|   z0/hubs/home/recentlyAdded?X-Plex-Container-Start=rf   z&type=rC   rD   rH   )	r=   rg   rh   
media_typeother_videorG   personalrE   rK   s	            r"   get_hub_recently_addedz!PmsConnect.get_hub_recently_added  sH     %0=Rz85&&33AFBO 4 Q r$   c                 F    d}| j                   j                  |d|      }|S )z
        Return Plex dvrs.

        Parameters required:
        Optional parameters:    output_format { dict, json }

        Output: array
        z/livetv/dvrsrC   rD   rH   rJ   s       r"   get_dvrszPmsConnect.get_dvrs  s4     &&33AFBO 4 Q r$   c                    d}g }||v r:d}|dk(  rd}n|dk(  rd}n|dk(  rd}n	|d	k(  rd}d
}| j                  ||||d      }nY|r| j                  |||d      }nA|D ]  }| j                  |||      }	||	d   z  } dt        |d d
      dt	        |       i}
|
S 	 |j                  d      }|D ]  }|j                  d      r|j                  d      dk(  rdg i}
|
c S g }|j                  d      r||j                  d      z  }|j                  d      r||j                  d      z  }|D ]|  }g }g }g }g }g }g }g }|j                  d      r;|j                  d      D ]'  }|j                  t        j                  |d             ) |j                  d      r;|j                  d      D ]'  }|j                  t        j                  |d             ) |j                  d      r;|j                  d      D ]'  }|j                  t        j                  |d             ) |j                  d      r;|j                  d      D ]'  }|j                  t        j                  |d             ) |j                  d      r;|j                  d      D ]'  }|j                  t        j                  |d             ) |j                  d      r;|j                  d      D ]'  }|j                  t        j                  |d             ) |j                  d      r;|j                  d      D ]'  }|j                  t        j                  |d             ) i d t        j                  |d!      d"t        j                  |d#      d$t        j                  |d%      d&t        j                  |d'      d(t        j                  |d)      d*t        j                  |d+      d,t        j                  |d,      d-t        j                  |d.      d/t        j                  |d0      d1t        j                  |d2      d3t        j                  |d4      d5t        j                  |d6      d7t        j                  |d8      d9t        j                  |d9      d:t        j                  |d;      d<t        j                  |d<      d=t        j                  |d=      i d>t        j                  |d>      d?t        j                  |d@      dAt        j                  |dB      dCt        j                  |dD      dEt        j                  |dF      dGt        j                  |dG      dHt        j                  |dH      dIt        j                  |dI      dJt        j                  |dK      dLt        j                  |dM      dNt        j                  |dN      dOt        j                  |dO      dPt        j                  |dQ      dRt        j                  |dS      dTt        j                  |dU      dVt        j                  |dW      dXt        j                  |dX      |||||||t        j                  |d,      t        j                  |dY      dZ	}|j                  |         dt        |d[ d
      i}
|
S # t        $ r&}t        j                  d|z         dg icY d}~S d}~ww xY w)\z
        Return processed and validated list of recently added items.

        Parameters required:    count { number of results to return }

        Output: array
        )movieshowartistr   Fr   1r   2r   8r   TxmlrG   recently_addedc                     | d   S Nadded_at ks    r"   <lambda>z7PmsConnect.get_recently_added_details.<locals>.<lambda>5  s
    1Z= r$   )keyreverseNr   zFTautulli Pmsconnect :: Unable to parse XML for get_recently_added: %s.size0	DirectoryVideoDirectortagWriterRoleGenreLabel
CollectionGuididr   typerl   librarySectionIDlibrary_namelibrarySectionTitlerU   	ratingKeyparent_rating_keyparentRatingKeygrandparent_rating_keygrandparentRatingKeytitleparent_titleparentTitlegrandparent_titlegrandparentTitleoriginal_titleoriginalTitle
sort_title	titleSortmedia_indexindexparent_media_indexparentIndexstudiocontent_ratingcontentRatingsummarytaglineratingrating_imageratingImageaudience_ratingaudienceRatingaudience_rating_imageaudienceRatingImageuser_rating
userRatingdurationyearthumbparent_thumbparentThumbgrandparent_thumbgrandparentThumbartbanneroriginally_available_atoriginallyAvailableAtr   addedAt
updated_at	updatedAtlast_viewed_atlastViewedAtguid
childCount)		directorswritersactorsgenreslabelsr\   guids
full_titlechild_countc                     | d   S r   r   r   s    r"   r   z7PmsConnect.get_recently_added_details.<locals>.<lambda>  s
    q} r$   )r   rm   get_recently_added_detailssortedr   r   r   r   r   getAttributeappendr	   r   )r=   rg   rh   r   rl   media_typesrecents_listr   recentrecentsoutputr   r   arecents_mainmr
  r  r  r  r  r\   r  directorwriteractorgenrelabelr^   r  recent_items                                  r"   r  z%PmsConnect.get_recently_added_details  s    A$KW$ 
v% 
x' 
}, 
"00z;fk0lF44Z]b4cF) :
99%
S(8 99: '|AXbf(ghsilmris(tuFM	*223CDH
  ^	1A~~f%>>&)S0.3F!ML%%k2 6 6{ CC%%g. 6 6w ??! R1	 ))*5$%$:$::$F P!(()=)=h)NOP ))(3"#"8"8"B Lw';';FE'JKL ))&1!"!7!7!? Jg&:&:5%&HIJ ))'2!"!7!7!@ Jg&:&:5%&HIJ ))'2!"!7!7!@ Jg&:&:5%&HIJ )),7&'&<&<\&J T
#**7+?+?
E+RST ))&1 ! 6 6v > GW%9%9$%EFG+!|W-A-A!V-L +!+W-A-A!EW-X+!-w/C/CAG\/]+!  ,W-A-A![-Q+!  3G4H4HL]4^	+!
  89M9MaQg9h+!  '(<(<Q(H+!  .w/C/CA}/U+!  3G4H4HL^4_+!  01E1Ea1Y+!  ,W-A-A![-Q+!  -g.B.B1g.N+!  4W5I5I!]5[+!  ()=)=a)J+!  01E1Ea1Y+!  )'*>*>q)*L+!   )'*>*>q)*L!+!"  ()=)=a)J#+!$  .w/C/CA}/U%+!&  1'2F2FqJZ2['+!(  78L8LQPe8f)+!*  -g.B.B1l.S++!,  *7+?+?:+N-+!.  &w';';Av'F/+!0  '(<(<Q(H1+!2  .w/C/CA}/U3+!4  3G4H4HL^4_5+!6  %g&:&:1e&D7+!8  ()=)=a)J9+!:  9':N:NqRi:j;+!<  *7+?+?9+M=+!>  ,W-A-A![-Q?+!@  01E1Ea1XA+!B  &w';';Av'FC+!D -6*1)/)/)/.9(--4-A-A!W-M.5.B.B1l.SU+!Z ##K0eR1^	1@ #F<=T^b$cdM  	*KK`cdde$b))	*s   [ 	[4[/)[4/[4c
                 Č  Q i }
|s|rt         j                  j                  t        j                  j
                  d      }t         j                  j                  |d|z        }t         j                  j                  |      st        j                  |       	 t        |d      5 }t        j                  |      }
ddd       |
rH|
j                  dd      }|s2t        j                         |z
  t        j                  j                   k  r|
S |r| j#                  t%        |      d      }n|r| j'                  t%        |      d      }nw|j)                  d	      rN|j+                  d
d      d   }t-        dt        j                  j.                        }|j#                  |d      }n|r| j1                  |d      }n|
S 	 |j3                  d      }|D ]  }|j;                  d      r|j;                  d      dk(  r|
c S |j3                  d      r|j3                  d      }n|j3                  d      r|j3                  d      }n|j3                  d      r|j3                  d      }n_|j3                  d      r|j3                  d      }n<|j3                  d      r|j3                  d      }nt7        j<                  d       i c S |r1t?        |      dkD  r#|D ]  }t        j@                  |d      |k(  s n n|d   }t        j@                  d      }|jB                  dk(  r|dk(  rd}t        j@                  |d      xs |}t        j@                  |d      }|r|stE        jF                         jI                  |      }|d   } g }g }g }g }g }g }g }g } j3                  d       r;|j3                  d       D ]'  }!|jK                  t        j@                  |!d!             ) |j3                  d"      r;|j3                  d"      D ]'  }"|jK                  t        j@                  |"d!             ) |j3                  d#      r;|j3                  d#      D ]'  }#|jK                  t        j@                  |#d!             ) |j3                  d$      r;|j3                  d$      D ]'  }$|jK                  t        j@                  |$d!             ) |j3                  d%      r;|j3                  d%      D ]'  }%|jK                  t        j@                  |%d!             ) |j3                  d&      r;|j3                  d&      D ]'  }&|jK                  t        j@                  |&d!             ) |j3                  d'      r;|j3                  d'      D ]'  }'|jK                  t        j@                  |'d(             ) |j3                  d)      rd}(|j3                  d)      D ]  })t        j@                  |)d      }*|*d*k(  rtM        |(du       }(t        jN                  t        j@                  |)d+            }+| jK                  t        jP                  t        j@                  |)d(            |*t        jP                  t        j@                  |)d,            t        jP                  t        j@                  |)d-            |*d*k(  r|(nd|*d*k(  r|+ndd.        d/k(  ri d0|d1|d2d3t        j@                  |d      d4t        j@                  |d5      d6t        j@                  |d7      d8t        j@                  |d8      d9t        j@                  |d:      d;t        j@                  |d<      d=t        j@                  |d>      d?t        j@                  |d@      dAt        j@                  |dB      dCt        j@                  |dC      dDt        j@                  |dE      dFt        j@                  |dG      dHt        j@                  |dI      dJt        j@                  |dK      i dLt        j@                  |dL      dMt        j@                  |dN      dOt        j@                  |dO      dPt        j@                  |dP      dQt        j@                  |dQ      dRt        j@                  |dS      dTt        j@                  |dU      dVt        j@                  |dW      dXt        j@                  |dY      dZt        j@                  |dZ      d[t        j@                  |d[      d\t        j@                  |d]      d^t        j@                  |d_      d`t        j@                  |d`      dat        j@                  |db      dct        j@                  |dd      det        j@                  |de      i dft        j@                  |df      dgt        j@                  |dh      dit        j@                  |dj      dkt        j@                  |dl      dmt        j@                  |dn      dot        j@                  |do      dpt        j@                  |dq      drt        j@                  |ds      dt|du|dv|dw|dx|dy|dz|d{| d|g g t        j@                  |d8      t        jP                  t        j@                  |d}            tS        t        j@                  |d~      dk(        d}
/n|dk(  rIt        j@                  |dZ      },|,jU                         r(tS        |,      dk  rt%        tS        |,      dz  dz        },i d0|d1|d2d3t        j@                  |d      d4t        j@                  |d5      d6t        j@                  |d7      d8t        j@                  |d8      d9t        j@                  |d:      d;t        j@                  |d<      d=t        j@                  |d>      d?t        j@                  |d@      dAt        j@                  |dB      dCt        j@                  |dC      dDt        j@                  |dE      dFt        j@                  |dG      dHt        j@                  |dI      dJt        j@                  |dK      i dLt        j@                  |dL      dMt        j@                  |dN      dOt        j@                  |dO      dPt        j@                  |dP      dQt        j@                  |dQ      dRt        j@                  |dS      dTt        j@                  |dU      dVt        j@                  |dW      dXt        j@                  |dY      dZ|,d[t        j@                  |d[      d\t        j@                  |d]      d^t        j@                  |d_      d`t        j@                  |d`      dat        j@                  |db      dct        j@                  |dd      det        j@                  |de      i dft        j@                  |df      dgt        j@                  |dh      dit        j@                  |dj      dkt        j@                  |dl      dmt        j@                  |dn      dot        j@                  |do      dpt        j@                  |dq      drt        j@                  |ds      dt|du|dv|dw|dx|dy|dz|d{| d|g g t        j@                  |d8      t        jP                  t        j@                  |d}            tS        t        j@                  |d~      dk(        d}
+n<|dk(  rMt        j@                  |d5      }-t        j@                  |dq      }.i }/|r|.r| jW                  |.      }/nR|r9|.r7|j+                  d
d      d   }0| jW                  |0 d
tY        |.             }/n|s|s|-r| jW                  |-      }/i d0|d1|d2d3t        j@                  |d      d4t        j@                  |d5      d6t        j@                  |d7      d8t        j@                  |d8      d9t        j@                  |d:      d;t        j@                  |d<      d=t        j@                  |d>      d?t        j@                  |d@      dAt        j@                  |dB      dCt        j@                  |dC      dDt        j@                  |dE      dFt        j@                  |dG      dHt        j@                  |dI      dJt        j@                  |dK      i dL|/j[                  dLd      dM|/j[                  dMd      dOt        j@                  |dO      xs |/j[                  dOd      dPt        j@                  |dP      dQt        j@                  |dQ      dRt        j@                  |dS      dTt        j@                  |dU      dVt        j@                  |dW      dXt        j@                  |dY      dZ|/j[                  dZd      d[t        j@                  |d[      d\|/j[                  d[d      d^t        j@                  |d_      d`t        j@                  |d`      dat        j@                  |db      xs |/j[                  d`      dct        j@                  |dd      det        j@                  |de      i df|/j[                  dfd      dgt        j@                  |dh      dit        j@                  |dj      dkt        j@                  |dl      dmt        j@                  |dn      dot        j@                  |do      dpt        j@                  |dq      drt        j@                  |ds      dt|/j[                  dtg       du|/j[                  dug       dv|/j[                  dvg       dw|/j[                  dwg       dx|/j[                  dxg       dy|/j[                  dyg       dz|d{| d||/j[                  dzg       g dj]                  t        j@                  |d:      t        j@                  |d8            t        jP                  t        j@                  |d}            tS        t        j@                  |d~      dk(        d}
%n|dk(  rt        j@                  |d7      }1t        j@                  |ds      }2i }/|r|2r| jW                  |2      }/nP|r9|2r7|j+                  d
d      d   }0| jW                  |0 d
tY        |2             }/n|s|1r| jW                  |1      }/t        j@                  |d5      }-t        j@                  |dK      Qt        j@                  |db      }3|-r| jW                  |-      ni }4|sV|sT|-sR|3j)                  d      r|3j_                  d
      d   }-|-s+|1r)| ja                  |1      }5tc        Qfd|5d   D        d      }-i d0|d1|d2d3t        j@                  |d      d4|-d6t        j@                  |d7      d8t        j@                  |d8      d9t        j@                  |d:      d;t        j@                  |d<      d=t        j@                  |d>      d?t        j@                  |d@      dAt        j@                  |dB      dCt        j@                  |dC      dDt        j@                  |dE      dFt        j@                  |dG      dHt        j@                  |dI      dJQi dL|/j[                  dLd      dMt        j@                  |dN      dOt        j@                  |dO      dPt        j@                  |dP      dQt        j@                  |dQ      dRt        j@                  |dS      dTt        j@                  |dU      dVt        j@                  |dW      dXt        j@                  |dY      dZt        j@                  |dZ      d[t        j@                  |d[      d\|4j[                  d[d      d^|/j[                  d[d      d`t        j@                  |d`      da|3xs |/j[                  d`      dct        j@                  |dd      det        j@                  |de      i df|/j[                  dfd      dgt        j@                  |dh      dit        j@                  |dj      dkt        j@                  |dl      dmt        j@                  |dn      dot        j@                  |do      dpt        j@                  |dq      drt        j@                  |ds      dt|du|dv|/j[                  dvg       dw|/j[                  dwg       dx|/j[                  dxg       dy|/j[                  dyg       dz|d{| d||4j[                  dzg       |/j[                  dzg       dj]                  t        j@                  |d<      t        j@                  |d8            t        jP                  t        j@                  |d}            tS        t        j@                  |d~      dk(        d}
 nE|dk(  ri d0|d1|d2d3t        j@                  |d      d4t        j@                  |d5      d6t        j@                  |d7      d8t        j@                  |d8      d9t        j@                  |d:      d;t        j@                  |d<      d=t        j@                  |d>      d?t        j@                  |d@      dAt        j@                  |dB      dCt        j@                  |dC      dDt        j@                  |dE      dFt        j@                  |dG      dHt        j@                  |dI      dJt        j@                  |dK      i dLt        j@                  |dL      dMt        j@                  |dN      dOt        j@                  |dO      dPt        j@                  |dP      dQt        j@                  |dQ      dRt        j@                  |dS      dTt        j@                  |dU      dVt        j@                  |dW      dXt        j@                  |dY      dZt        j@                  |dZ      d[t        j@                  |d[      d\t        j@                  |d]      d^t        j@                  |d_      d`t        j@                  |d`      dat        j@                  |db      dct        j@                  |dd      det        j@                  |de      i dft        j@                  |df      dgt        j@                  |dh      dit        j@                  |dj      dkt        j@                  |dl      dmt        j@                  |dn      dot        j@                  |do      dpt        j@                  |dq      drt        j@                  |ds      dt|du|dv|dw|dx|dy|dz|d{| d|g g t        j@                  |d8      t        jP                  t        j@                  |d}            tS        t        j@                  |d~      dk(        d}
n0|dk(  r~t        j@                  |d5      }-|-r| jW                  |-      ni }6i d0|d1|d2d3t        j@                  |d      d4t        j@                  |d5      d6t        j@                  |d7      d8t        j@                  |d8      d9t        j@                  |d:      d;t        j@                  |d<      d=t        j@                  |d>      d?t        j@                  |d@      dAt        j@                  |dB      dCt        j@                  |dC      dDt        j@                  |dE      dFt        j@                  |dG      dHt        j@                  |dI      dJt        j@                  |dK      i dLt        j@                  |dL      dMt        j@                  |dN      dOt        j@                  |dO      xs |6j[                  dOd      dPt        j@                  |dP      dQt        j@                  |dQ      dRt        j@                  |dS      dTt        j@                  |dU      dVt        j@                  |dW      dXt        j@                  |dY      dZt        j@                  |dZ      d[t        j@                  |d[      d\t        j@                  |d]      d^t        j@                  |d_      d`t        j@                  |d`      dat        j@                  |db      dct        j@                  |dd      det        j@                  |de      i df|6j[                  dfd      dgt        j@                  |dh      dit        j@                  |dj      dkt        j@                  |dl      dmt        j@                  |dn      dot        j@                  |do      dpt        j@                  |dq      drt        j@                  |ds      dt|du|dv|dw|dx|dy|dz|d{| d||6j[                  dzg       g dj]                  t        j@                  |d:      t        j@                  |d8            t        jP                  t        j@                  |d}            tS        t        j@                  |d~      dk(        d}
n|dk(  rt        j@                  |d5      }-|-r| jW                  |-      ni }7t        j@                  |d>      xs t        j@                  |d<      }8i d0|d1|d2d3t        j@                  |d      d4t        j@                  |d5      d6t        j@                  |d7      d8t        j@                  |d8      d9t        j@                  |d:      d;t        j@                  |d<      d=t        j@                  |d>      d?t        j@                  |d@      dAt        j@                  |dB      dCt        j@                  |dC      dDt        j@                  |dE      dFt        j@                  |dG      dHt        j@                  |dI      dJt        j@                  |dK      i dLt        j@                  |dL      dMt        j@                  |dN      dOt        j@                  |dO      dPt        j@                  |dP      dQt        j@                  |dQ      dRt        j@                  |dS      dTt        j@                  |dU      dVt        j@                  |dW      dXt        j@                  |dY      dZt        j@                  |dZ      d[|7j[                  d[d      d\t        j@                  |d]      d^t        j@                  |d_      d`t        j@                  |d`      dat        j@                  |db      dct        j@                  |dd      det        j@                  |de      i df|7j[                  dfd      dgt        j@                  |dh      dit        j@                  |dj      dkt        j@                  |dl      dmt        j@                  |dn      dot        j@                  |do      dpt        j@                  |dq      drt        j@                  |ds      dt|du|dv|dw|7j[                  dwg       dx|7j[                  dxg       dy|7j[                  dyg       dz|d{| d||7j[                  dzg       |7j[                  d|g       dj]                  t        j@                  |d8      |8      t        jP                  t        j@                  |d}            tS        t        j@                  |d~      dk(        d}
n|dk(  ri d0|d1|d2d3t        j@                  |d      d4t        j@                  |d5      d6t        j@                  |d7      d8t        j@                  |d8      d9t        j@                  |d:      d;t        j@                  |d<      d=t        j@                  |d>      d?t        j@                  |d@      dAt        j@                  |dB      dCt        j@                  |dC      dDt        j@                  |dE      dFt        j@                  |dG      dHt        j@                  |dI      dJt        j@                  |dK      i dLt        j@                  |dL      dMt        j@                  |dN      dOt        j@                  |dO      dPt        j@                  |dP      dQt        j@                  |dQ      dRt        j@                  |dS      dTt        j@                  |dU      dVt        j@                  |dW      dXt        j@                  |dY      dZt        j@                  |dZ      d[t        j@                  |d[      d\t        j@                  |d]      d^t        j@                  |d_      d`t        j@                  |d`      dat        j@                  |db      dct        j@                  |dd      det        j@                  |de      i dft        j@                  |df      dgt        j@                  |dh      dit        j@                  |dj      dkt        j@                  |dl      dmt        j@                  |dn      dot        j@                  |do      dpt        j@                  |dq      drt        j@                  |ds      dt|du|dv|dw|dx|dy|dz|d{| d|g g t        j@                  |d8      t        jP                  t        j@                  |d}            tS        t        j@                  |d~      dk(        d}
n|dk(  rt        j@                  |d5      }-|-r| jW                  |-      ni }9i d0|d1|d2d3t        j@                  |d      d4t        j@                  |d5      d6t        j@                  |d7      d8t        j@                  |d8      d9t        j@                  |d:      d;t        j@                  |d<      d=t        j@                  |d>      d?t        j@                  |d@      dAt        j@                  |dB      dCt        j@                  |dC      dDt        j@                  |dE      dFt        j@                  |dG      dHt        j@                  |dI      dJt        j@                  |dK      i dLt        j@                  |dL      dMt        j@                  |dN      dOt        j@                  |dO      dPt        j@                  |dP      dQt        j@                  |dQ      dRt        j@                  |dS      dTt        j@                  |dU      dVt        j@                  |dW      dXt        j@                  |dY      dZt        j@                  |dZ      d[t        j@                  |d[      d\t        j@                  |d]      d^t        j@                  |d_      d`t        j@                  |d`      dat        j@                  |db      dct        j@                  |dd      det        j@                  |de      i df|9j[                  dfd      dgt        j@                  |dh      dit        j@                  |dj      dkt        j@                  |dl      dmt        j@                  |dn      dot        j@                  |do      dpt        j@                  |dq      drt        j@                  |ds      dt|du|dv|dw|9j[                  dwg       dx|9j[                  dxg       dy|9j[                  dyg       dzg d{| d||9j[                  dzg       g dj]                  t        j@                  |d:      xs |t        j@                  |d8            t        jP                  t        j@                  |d}            tS        t        j@                  |d~      dk(        d}

n-|dk(  ri d0|dt        j@                  |d      d1|d2d3t        j@                  |d      d4t        j@                  |d5      d6t        j@                  |d7      d8t        j@                  |d8      d9t        j@                  |d:      d;t        j@                  |d<      d=t        j@                  |d>      d?t        j@                  |d@      dAt        j@                  |dB      dCt        j@                  |dC      dDt        j@                  |dE      dFt        j@                  |dG      dHt        j@                  |dI      i dJt        j@                  |dK      dLt        j@                  |dL      dMt        j@                  |dN      dOt        j@                  |dO      dPt        j@                  |dP      dQt        j@                  |dQ      dRt        j@                  |dS      dTt        j@                  |dU      dVt        j@                  |dW      dXt        j@                  |dY      dZt        j@                  |dZ      d[t        j@                  |d[      d\t        j@                  |d]      d^t        j@                  |d_      dt        j@                  |d      dt        j@                  |d      d`t        j@                  |d`      j_                  d      d   i dat        j@                  |db      dct        j@                  |dd      det        j@                  |de      dft        j@                  |df      dgt        j@                  |dh      dit        j@                  |dj      dkt        j@                  |dl      dmt        j@                  |dn      dot        j@                  |do      dpt        j@                  |dq      drt        j@                  |ds      dt        j@                  |d      dt|du|dv|dw|dx|||| g g t        j@                  |d8      t        jP                  t        j@                  |d            tS        t        j@                  |d~      dk(        t        jP                  t        j@                  |d            d	}
n|dk(  ri d0|d1|d2d3t        j@                  |d      dot        j@                  |do      d8t        j@                  |d8      dOt        j@                  |dO      dZt        j@                  |dZ      dt        j@                  |d      d`t        j@                  |d      dit        j@                  |dj      dkt        j@                  |dl      dmt        j@                  |dn      dt        jP                  t        j@                  |d}            dt        jP                  t        j@                  |d            dt        j@                  |d      d~tS        t        j@                  |d~      dk(        }
n|dk(  ri d0|d1|d2d3t        j@                  |d      d4t        j@                  |d5      d6t        j@                  |d7      d8t        j@                  |d8      d9t        j@                  |d:      d;t        j@                  |d<      d=t        j@                  |d>      d?t        j@                  |d@      dAt        j@                  |dB      dCt        j@                  |dC      dDt        j@                  |dE      dFt        j@                  |dG      dHt        j@                  |dI      dJt        j@                  |dK      i dLt        j@                  |dL      dMt        j@                  |dN      dOt        j@                  |dO      dPt        j@                  |dP      dQt        j@                  |dQ      dRt        j@                  |dS      dTt        j@                  |dU      dVt        j@                  |dW      dXt        j@                  |dY      dZt        j@                  |dZ      d[t        j@                  |d[      d\t        j@                  |d]      d`t        j@                  |d`      dat        j@                  |db      dct        j@                  |dd      det        j@                  |de      dft        j@                  |df      i dgt        j@                  |dh      dit        j@                  |dj      dkt        j@                  |dl      dmt        j@                  |dn      dot        j@                  |do      dpt        j@                  |dq      drt        j@                  |ds      dt|du|dv|dw|dx|dy|dz|d{| d|g dg t        j@                  |d8      t        j@                  |d      t        j@                  |d      tS        t        j@                  |d~      dk(        d}
n|
S d}:|s|
d~   rtd        jf                  |
d1<   td        jh                  |
d2<   | jk                         D ]m  };| jW                  d
|;d    dtY        |
do          d      }:|:s.|;d   |
d<   g d}<|<D ]
  }=|:|=   |
|=<    t        jl                  |:d   d   d   dd      |
dg<    nt nr|sp|
d~   rktd        jf                  |
d1<   td        jh                  |
d2<   | jW                  |
do         }|r.g d}<|<D ]
  }=||=   |
|=<    t        jn                  |dg         |
dg<   |
	rR|		rOg }>|j3                  d      }?|?D 	]1  }@d}Ag }B|@j3                  d      }C|CD ].  }Dg }E|Dj3                  d      }F|FD ]~  }Gt        j@                  |Gd      dk(  rt        j@                  Gd      }HAxs H}AEjK                  i d(t        j@                  Gd(      dt        j@                  |Gd      dt        j@                  |Gd      dt        j@                  |Gd      dt        j@                  |Gd      dt        j@                  |Gd      dt        j@                  |Gd      dt        j@                  |Gd      dt        j@                  |Gd«      dt        j@                  |Gdī      dt        j@                  |Gdƫ      d| jq                  |G      dtS        t        j@                  |Gdɫ      dk(        dtS        t        j@                  |Gd˫      dk(        dt        jP                  t        j@                  |Gdͫ            dtS        t        j@                  |Gdϫ      dk(        dt        jP                  t        j@                  |Gdѫ            tS        t        j@                  |Gdҫ      dk(        t        jr                  t        j@                  |Gdӫ            t        j@                  |Gdԫ      t        j@                  |Gdի      t        j@                  |Gd֫      t        j@                  |Gd׫      t        j@                  |Gdث      t        j@                  |Gd٫      t        j@                  |Gdګ      t        j@                  |Gd      tS        t        j@                  |Gd۫      dk(        dܜ       .t        j@                  Gd      dk(  rEjK                  t        j@                  Gd(      t        j@                  |Gd      t        j@                  |Gd      t        j@                  |Gd      t        j@                  |Gdޫ      t        j@                  |Gd߫      t        j@                  |Gd      t        j@                  |Gd      t        j@                  |Gdث      t        j@                  |Gd٫      t        j@                  |Gdګ      tS        t        j@                  |Gd۫      dk(        d       dt        j@                  Gd      dk(  sEjK                  t        j@                  Gd(      t        j@                  |Gd      t        j@                  |Gd      t        j@                  |Gd      t        j@                  |Gd      tS        t        j@                  |Gd      dk(        t        j@                  |Gd      rdndt        j@                  Gdث      t        j@                  |Gd٫      tS        t        j@                  |Gd۫      dk(        d
        BjK                  t        j@                  Dd(      t        j@                  |Dd      t        j@                  |Dd      tS        t        j@                  |Dd      dk(        EtS        t        j@                  |Dd۫      dk(        d       1 t        j@                  @d      ju                         jw                  d      }Itd        jx                  j[                  |I|IAdd xs dz         }Jt        j@                  @d      }Ki d(t        j@                  |@d(      dt        j@                  |@d      dt        j@                  |@d      dt        j@                  |@d֫      dt        j@                  |@d׫      dt        j@                  |@d      dt        j@                  |@d      dId|Jdt        j@                  |@d      dt        j@                  |@d      dt        j@                  |@d      d|Kdtd        jz                  j[                  |K|K      d t        j@                  |@d      dtS        t        j@                  |@d      dk(        dt        j@                  |@d      t        j@                  |@d      t        j@                  |@d      t        j@                  |@d	      t        j@                  |@d
      t        j@                  |@d      t        j@                  |@d      t        jP                  t        j@                  |@d            t        jP                  t        j@                  |@d            Bd	}L|:rg d}M|MD ]  }=|:d   d   |=   L|=<    |>jK                  L       	4 |>|
d<   |
r|rt        j                         |
d<   t         j                  j                  t        j                  j
                  d      }Nt         j                  j                  |Nd|z        }Ot         j                  j                  |N      st        j                  N       	 t        Od      5 }Pt        j|                  |
|P       ddd       |
S |
S |
S # 1 sw Y   ExY w# t        t        f$ r}Y d}~Ed}~ww xY w# t4        $ r$}t7        j8                  d|z         i cY d}~S d}~ww xY w# 1 sw Y   |
S xY w# t        t        f$ r(}t7        j~                  d|d|       Y d}~|
S d}~ww xY w(  z
        Return processed and validated metadata list for requested item.

        Parameters required:    rating_key { Plex ratingKey }

        Output: array
        session_metadatazmetadata-sessionKey-%s.jsonrN_cache_timer   r   r   )zplex://moviezplex://episoder}      z!https://metadata.provider.plex.tv)r0   r-   r   zHTautulli Pmsconnect :: Unable to parse XML for get_metadata_details: %s.r   r   r   r   TrackPhotoPlaylistz&Tautulli Pmsconnect :: Metadata failedr   r   photophoto_albumr   r   section_namer   r   r   r   r   r   r   r   r   MarkercreditsfinalstartTimeOffsetendTimeOffset)r   r   start_time_offsetend_time_offsetfirstr3  r   r   rl   r   rU   r   r   r   r   r   r   r   r   r   r   r   r   r   edition_titleeditionTitleslugparent_slug
parentSluggrandparent_sluggrandparentSlugr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   parent_year
parentYeargrandparent_yeargrandparentYearr   r   r   r   r   r   r   r  r  r   r  r  r  r  r  r  parent_guid
parentGuidgrandparent_guidgrandparentGuidr
  r  r  r  r  r\   r  markersparent_guids	leafCountliver   )grandparent_guidsr  children_countrK  r     <   season)	plex_guid)maxsplit)rY   r|   z{} - {}episoderS      c              3   8   K   | ]  }|d    k(  r|d     yw)r   rU   Nr   ).0cr   s     r"   	<genexpr>z2PmsConnect.get_metadata_details.<locals>.<genexpr>  s,      .Y!12=1AEW1W /0o .Ys   children_listr   albumtrackr^   sub_media_typesubtypemin_yearminYearmax_yearmaxYearr~   r  r	  smart)	r\   r  rH  rI  rL  r  rM  rK  rb  playlist	compositerM  playlist_typeplaylistTypecliprL  	extraType)r  
extra_typesub_typerK  epg_identifierz
/metadata/T)rY   
media_info)
r   r   r   r  r   r   rF  r   r   rD  rl  	begins_at)sepymd)r   r   r   r   r   r  rF  r  MediaPartStream
streamTypescanTypevideo_codeccodecvideo_codec_levellevelvideo_bitratebitratevideo_bit_depthbitDepthvideo_chroma_subsamplingchromaSubsamplingvideo_color_primariescolorPrimariesvideo_color_range
colorRangevideo_color_space
colorSpacevideo_color_trccolorTrcvideo_dynamic_rangevideo_dovi_bl_presentDOVIBLPresentvideo_dovi_el_presentDOVIELPresentvideo_dovi_level	DOVILevelvideo_dovi_presentDOVIPresentvideo_dovi_profileDOVIProfileDOVIRPUPresentDOVIVersion	frameRate	refFramesheightwidthlanguagelanguageCodeprofileselected)video_dovi_rpu_presentvideo_dovi_versionvideo_frame_ratevideo_ref_framesvideo_heightvideo_widthvideo_languagevideo_language_codevideo_profilevideo_scan_typer  r   bitrateModechannelsaudioChannelLayoutsamplingRate)r   r   audio_codecaudio_bitrateaudio_bitrate_modeaudio_channelsaudio_channel_layoutaudio_sample_rateaudio_languageaudio_language_codeaudio_profiler  3	containerr2   forcedr   externalembedded)
r   r   subtitle_codecsubtitle_containersubtitle_formatsubtitle_forcedsubtitle_locationsubtitle_languagesubtitle_language_coder  fileindexessd)r   r  	file_sizer  streamsr  videoResolutionippaudioChannelsaspect_ratioaspectRatio
videoCodecvideo_resolutionvideo_full_resolutionvideo_frameratevideoFrameRater  videoProfiler  
audioCodecr  r  r  audioProfileoptimized_version	proxyType42channel_call_signchannelCallSign	channelIDchannelIdentifierchannelTitlechannelThumb
channelVcnprotocolbeginsAtendsAt)	
channel_idchannel_identifierchannel_titlechannel_thumbchannel_vcnr  rm  ends_atparts)r  r  r  wzLTautulli Pmsconnect :: Unable to create cache file for metadata (sessionKey z): )@ospathjoinr   r   	CACHE_DIRexistsmkdiropenjsonloadIOError
ValueErrorpopr	   	timestampMETADATA_CACHE_SECONDSrV   r   r   
startswithrsplitr   r9   rZ   r   r   r   r   r  debuglenr   nodeNamer   	Librariesget_detailsr  bool	bool_truecast_to_intr   isdigitget_metadata_detailsr   getr2   splitget_item_childrennextr   LIVE_TV_SECTION_IDLIVE_TV_SECTION_NAMEget_dvrs_listtimestamp_to_YMDHMS
iso_to_YMDget_dynamic_rangecast_to_floatlowerrstripVIDEO_RESOLUTION_OVERRIDESAUDIO_CHANNELSdumperror)Rr=   rU   r   rQ  rY   rl   
skip_cache	cache_keyreturn_cacherl  r]   in_file_folderin_file_pathinFiler   r(  metadata_xmlplextv_metadatar   r  metadata_main_listmetadata_mainmetadata_typer   r   r
  r  r  r  r  r\   r  rH  r  r   r!  r"  r#  r^   r  r8  markermarker_typer3  r   r   rD  show_detailsepg_key_rootr   rF  r   season_detailsrY  artist_detailsalbum_detailstrack_artistphoto_album_detailsepg_metadatadvrkeys_to_updater   mediasmedia_itemsmediavideo_full_resolution_scan_typer  
part_itemspartr  stream_itemsstreamr  r  r  r  _media_infomedia_info_keys_to_updateout_file_folderout_file_pathoutFiler   sR                                                                                    @r"   r   zPmsConnect.get_metadata_details  s}O    iWW\\&--*A*ACUVN77<<8UXa8abL77>>.1(,, 1#yy0H1
 &ll=!<7#4#4#6#DHlHl#l#O,,S_E,RL--c'l%-PL!!"DE"))#q1"5J(-PX^XeXeXoXopO*77
RW7XL000NLO	#889IJH
  #	<A~~f%>>&)S0#O%%k2%&%;%;K%H"''0%&%;%;G%D"''0%&%;%;G%D"''0%&%;%;G%D"''
3%&%;%;J%G"EF	312Q6%7 M++M;G:U !31 5#00GM%%4'9Q - --a1CDR
J"//3HILJ(224@@L+N;G#	<J 	--j9)>>zJ H  !5!5h!FGH --h7'<<XF Dw33FEBCD --f5&;;FC Bg225%@AB --g6&;;GD Bg225%@AB --g6&;;GD Bg225%@AB --l;+@@N L
""7#7#7
E#JKL --f5%::6B ?W11$=>? --h7E'<<XF %2266B)+ $/E))'*>*>vw*OP!--g.B.B64.PQ')0)<)<W=Q=QRXZk=l)m'.':':7;O;OPVXg;h'i&1Y&>UD&1Y&>UD   G#7m 7$j7&7 %g&:&:=+&V7 ,W-A-A-Qb-c	7
 1'2F2F}Vl2m7  !5!5mW!M7 '(<(<]M(Z7 ,W-A-A-Qc-d7 )'*>*>}o*^7 %g&:&:=+&V7 ()=)=m^)\7  4 4]F K7 &w';';M<'X7 +G,@,@Pa,b7 &w';';M7'S7  -g.B.B=R_.`!7" !'"6"6}h"O#7$ )'*>*>}o*^%7& "7#7#7y#Q'7( "7#7#7y#Q)7* !'"6"6}h"O+7, '(<(<]M(Z-7. *7+?+?O_+`/70 01E1EmUj1k172 &w';';M<'X374 #G$8$8
$S576  4 4]F K778 &w';';M<'X97: +G,@,@Pa,b;7<  !5!5mW!M=7> '(<(<]M(Z?7@ ,W-A-A-Qc-dA7B w33M5IC7D !'"6"6}h"OE7F 273G3GWn3oG7H #G$8$8	$RI7J %g&:&:=+&VK7L )'*>*>}n*]M7N  4 4]F KO7P &w';';M<'XQ7R +G,@,@Pa,bS7T $YU7V "7W7X !&Y7Z !&[7\ !&]7^ &{_7`  a7b "7c7d 'e7f .0&-&:&:='&R*1*=*=g>R>RS`bm>n*o #G$8$8$OSV$V Wm7Hr f$++M:FH!c(md&:s8}r1D897m 7$j7&7 %g&:&:=+&V7 ,W-A-A-Qb-c	7
 1'2F2F}Vl2m7  !5!5mW!M7 '(<(<]M(Z7 ,W-A-A-Qc-d7 )'*>*>}o*^7 %g&:&:=+&V7 ()=)=m^)\7  4 4]F K7 &w';';M<'X7 +G,@,@Pa,b7 &w';';M7'S7  -g.B.B=R_.`!7" !'"6"6}h"O#7$ )'*>*>}o*^%7& "7#7#7y#Q'7( "7#7#7y#Q)7* !'"6"6}h"O+7, '(<(<]M(Z-7. *7+?+?O_+`/70 01E1EmUj1k172 &w';';M<'X374 #H576  4 4]F K778 &w';';M<'X97: +G,@,@Pa,b;7<  !5!5mW!M=7> '(<(<]M(Z?7@ ,W-A-A-Qc-dA7B w33M5IC7D !'"6"6}h"OE7F 273G3GWn3oG7H #G$8$8	$RI7J %g&:&:=+&VK7L )'*>*>}n*]M7N  4 4]F KO7P &w';';M<'XQ7R +G,@,@Pa,bS7T $YU7V "7W7X !&Y7Z !&[7\ !&]7^ &{_7`  a7b "7c7d 'e7f .0&-&:&:='&R*1*=*=g>R>RS`bm>n*o #G$8$8$OSV$V Wm7Hr h& ' 4 4]DU V!..}lKKL[#88;8O[&~~cA~>qA#88L>QRS]^iSjRkAl8mw3D#889JK8m 8$j8&8 %g&:&:=+&V8 ,W-A-A-Qb-c	8
 1'2F2F}Vl2m8  !5!5mW!M8 '(<(<]M(Z8 ,W-A-A-Qc-d8 )'*>*>}o*^8 %g&:&:=+&V8 ()=)=m^)\8  4 4]F K8 &w';';M<'X8 +G,@,@Pa,b8 &w';';M7'S8  -g.B.B=R_.`!8" !,"2"28R"@#8$ ),*:*:;KR*P%8& "7#7#7y#Q#tUaUeUefoqsUt'8( "7#7#7y#Q)8* !'"6"6}h"O+8, '(<(<]M(Z-8. *7+?+?O_+`/80 01E1EmUj1k182 &w';';M<'X384 #L$4$4Z$D586  4 4]F K788 &|'7'7'C98: +G,@,@Pa,b;8<  !5!5mW!M=8> '(<(<]M(Z(w^j^n^nov^w?8@ ,W-A-A-Qc-dA8B w33M5IC8D !,"2"28R"@E8F 273G3GWn3oG8H #G$8$8	$RI8J %g&:&:=+&VK8L )'*>*>}n*]M8N  4 4]F KO8P &w';';M<'XQ8R +G,@,@Pa,bS8T $\%5%5k2%FU8V "<#3#3Ir#BW8X !,"2"28R"@Y8Z !,"2"28R"@[8\ !,"2"28R"@]8^ &|'7'7r'J_8`  a8b "7c8d '(8(8"(Ee8f .0&/&6&6w7K7KM[h7i7>7K7KM[b7c'e*1*=*=g>R>RS`bm>n*o #G$8$8$OSV$V Wo8Ht i'%,%9%9-I_%`"&33MCTUL-#88CS8T-&~~cA~>qA#88L>QRS]^nSoRpAq8r#9#889OP ' 4 4]DU V!(!5!5m]!S"//}MLM^T667HIdfNW5F**+?@(4(:(:3(?(B% )-C$($:$:;Q$RM(, .Y}UdGe .YZ\)^%8m 8$j8&8 %g&:&:=+&V8 ,->	8
 1'2F2F}Vl2m8  !5!5mW!M8 '(<(<]M(Z8 ,W-A-A-Qc-d8 )'*>*>}o*^8 %g&:&:=+&V8 ()=)=m^)\8  4 4]F K8 &w';';M<'X8 +G,@,@Pa,b8 &w';';M7'S8  -.@!8" !,"2"28R"@#8$ )'*>*>}o*^%8& "7#7#7y#Q'8( "7#7#7y#Q)8* !'"6"6}h"O+8, '(<(<]M(Z-8. *7+?+?O_+`/80 01E1EmUj1k182 &w';';M<'X384 #G$8$8
$S586  4 4]F K788 &~'9'9&"'E98: +L,<,<VR,H;8<  !5!5mW!M=8> '(Q8H8H8Q?8@ ,W-A-A-Qc-dA8B w33M5IC8D !,"2"28R"@E8F 273G3GWn3oG8H #G$8$8	$RI8J %g&:&:=+&VK8L )'*>*>}n*]M8N  4 4]F KO8P &w';';M<'XQ8R +G,@,@Pa,bS8T $YU8V "7W8X !,"2"28R"@Y8Z !,"2"28R"@[8\ !,"2"28R"@]8^ &|'7'7r'J_8`  a8b "7c8d '(:(:7B(Ge8f .:-=-=gr-J&/&6&6w7K7KM[m7n7>7K7KM[b7c'e*1*=*=g>R>RS`bm>n*o #G$8$8$OSV$V Wo8Ht h&7m 7$j7&7 %g&:&:=+&V7 ,W-A-A-Qb-c	7
 1'2F2F}Vl2m7  !5!5mW!M7 '(<(<]M(Z7 ,W-A-A-Qc-d7 )'*>*>}o*^7 %g&:&:=+&V7 ()=)=m^)\7  4 4]F K7 &w';';M<'X7 +G,@,@Pa,b7 &w';';M7'S7  -g.B.B=R_.`!7" !'"6"6}h"O#7$ )'*>*>}o*^%7& "7#7#7y#Q'7( "7#7#7y#Q)7* !'"6"6}h"O+7, '(<(<]M(Z-7. *7+?+?O_+`/70 01E1EmUj1k172 &w';';M<'X374 #G$8$8
$S576  4 4]F K778 &w';';M<'X97: +G,@,@Pa,b;7<  !5!5mW!M=7> '(<(<]M(Z?7@ ,W-A-A-Qc-dA7B w33M5IC7D !'"6"6}h"OE7F 273G3GWn3oG7H #G$8$8	$RI7J %g&:&:=+&VK7L )'*>*>}n*]M7N  4 4]F KO7P &w';';M<'XQ7R +G,@,@Pa,bS7T $YU7V "7W7X !&Y7Z !&[7\ !&]7^ &{_7`  a7b "7c7d 'e7f .0&-&:&:='&R*1*=*=g>R>RS`bm>n*o #G$8$8$OSV$V Wm7Hr g% ' 4 4]DU VM^T667HIdfN8m 8$j8&8 %g&:&:=+&V8 ,W-A-A-Qb-c	8
 1'2F2F}Vl2m8  !5!5mW!M8 '(<(<]M(Z8 ,W-A-A-Qc-d8 )'*>*>}o*^8 %g&:&:=+&V8 ()=)=m^)\8  4 4]F K8 &w';';M<'X8 +G,@,@Pa,b8 &w';';M7'S8  -g.B.B=R_.`!8" !'"6"6}h"O#8$ )'*>*>}o*^%8& "7#7#7y#Q#vUcUgUghqsuUv'8( "7#7#7y#Q)8* !'"6"6}h"O+8, '(<(<]M(Z-8. *7+?+?O_+`/80 01E1EmUj1k182 &w';';M<'X384 #G$8$8
$S586  4 4]F K788 &w';';M<'X98: +G,@,@Pa,b;8<  !5!5mW!M=8> '(<(<]M(Z?8@ ,W-A-A-Qc-dA8B w33M5IC8D !."4"4Xr"BE8F 273G3GWn3oG8H #G$8$8	$RI8J %g&:&:=+&VK8L )'*>*>}n*]M8N  4 4]F KO8P &w';';M<'XQ8R +G,@,@Pa,bS8T $YU8V "7W8X !&Y8Z !&[8\ !&]8^ &{_8`  a8b "7c8d '(:(:7B(Ge8f .0&/&6&6w7K7KM[h7i7>7K7KM[b7c'e*1*=*=g>R>RS`bm>n*o #G$8$8$OSV$V Wo8Ht g% ' 4 4]DU VL]D556GHceM"//O S"//?QR 8m 8$j8&8 %g&:&:=+&V8 ,W-A-A-Qb-c	8
 1'2F2F}Vl2m8  !5!5mW!M8 '(<(<]M(Z8 ,W-A-A-Qc-d8 )'*>*>}o*^8 %g&:&:=+&V8 ()=)=m^)\8  4 4]F K8 &w';';M<'X8 +G,@,@Pa,b8 &w';';M7'S8  -g.B.B=R_.`!8" !'"6"6}h"O#8$ )'*>*>}o*^%8& "7#7#7y#Q'8( "7#7#7y#Q)8* !'"6"6}h"O+8, '(<(<]M(Z-8. *7+?+?O_+`/80 01E1EmUj1k182 &w';';M<'X384 #G$8$8
$S586  1 1&" =788 &w';';M<'X98: +G,@,@Pa,b;8<  !5!5mW!M=8> '(<(<]M(Z?8@ ,W-A-A-Qc-dA8B w33M5IC8D !-"3"3Hb"AE8F 273G3GWn3oG8H #G$8$8	$RI8J %g&:&:=+&VK8L )'*>*>}n*]M8N  4 4]F KO8P &w';';M<'XQ8R +G,@,@Pa,bS8T $YU8V "7W8X !&Y8Z !-"3"3Hb"A[8\ !-"3"3Hb"A]8^ &}'8'8'K_8`  a8b "7c8d '(9(9'2(Fe8f .;->->~r-R&/&6&6w7K7KM[b7c7C'E*1*=*=g>R>RS`bm>n*o #G$8$8$OSV$V Wo8Ht m+7m 7$j7&7 %g&:&:=+&V7 ,W-A-A-Qb-c	7
 1'2F2F}Vl2m7  !5!5mW!M7 '(<(<]M(Z7 ,W-A-A-Qc-d7 )'*>*>}o*^7 %g&:&:=+&V7 ()=)=m^)\7  4 4]F K7 &w';';M<'X7 +G,@,@Pa,b7 &w';';M7'S7  -g.B.B=R_.`!7" !'"6"6}h"O#7$ )'*>*>}o*^%7& "7#7#7y#Q'7( "7#7#7y#Q)7* !'"6"6}h"O+7, '(<(<]M(Z-7. *7+?+?O_+`/70 01E1EmUj1k172 &w';';M<'X374 #G$8$8
$S576  4 4]F K778 &w';';M<'X97: +G,@,@Pa,b;7<  !5!5mW!M=7> '(<(<]M(Z?7@ ,W-A-A-Qc-dA7B w33M5IC7D !'"6"6}h"OE7F 273G3GWn3oG7H #G$8$8	$RI7J %g&:&:=+&VK7L )'*>*>}n*]M7N  4 4]F KO7P &w';';M<'XQ7R +G,@,@Pa,bS7T $YU7V "7W7X !&Y7Z !&[7\ !&]7^ &{_7`  a7b "7c7d 'e7f .0&-&:&:='&R*1*=*=g>R>RS`bm>n*o #G$8$8$OSV$V Wm7Hr g% ' 4 4]DU VRc$";";<M"Nik8m 8$j8&8 %g&:&:=+&V8 ,W-A-A-Qb-c	8
 1'2F2F}Vl2m8  !5!5mW!M8 '(<(<]M(Z8 ,W-A-A-Qc-d8 )'*>*>}o*^8 %g&:&:=+&V8 ()=)=m^)\8  4 4]F K8 &w';';M<'X8 +G,@,@Pa,b8 &w';';M7'S8  -g.B.B=R_.`!8" !'"6"6}h"O#8$ )'*>*>}o*^%8& "7#7#7y#Q'8( "7#7#7y#Q)8* !'"6"6}h"O+8, '(<(<]M(Z-8. *7+?+?O_+`/80 01E1EmUj1k182 &w';';M<'X384 #G$8$8
$S586  4 4]F K788 &w';';M<'X98: +G,@,@Pa,b;8<  !5!5mW!M=8> '(<(<]M(Z?8@ ,W-A-A-Qc-dA8B w33M5IC8D !"5"9"9(B"GE8F 273G3GWn3oG8H #G$8$8	$RI8J %g&:&:=+&VK8L )'*>*>}n*]M8N  4 4]F KO8P &w';';M<'XQ8R +G,@,@Pa,bS8T $YU8V "7W8X !&Y8Z !"5"9"9(B"G[8\ !"5"9"9(B"G]8^ &':'>'>}b'Q_8`  a8b "7c8d '(;(?(?(Le8f .0&/&6&6w7K7KM[h7i7ymy7>7K7KM[b7c'e*1*=*=g>R>RS`bm>n*o #G$8$8$OSV$V Wo8Ht l*<m <('*>*>}i*X<$j< '< %g&:&:=+&V	<
 ,W-A-A-Qb-c< 1'2F2F}Vl2m<  !5!5mW!M< '(<(<]M(Z< ,W-A-A-Qc-d< )'*>*>}o*^< %g&:&:=+&V< ()=)=m^)\<  4 4]F K< &w';';M<'X< +G,@,@Pa,b<  &w';';M7'S!<" -g.B.B=R_.`#<$ !'"6"6}h"O%<& )'*>*>}o*^'<( "7#7#7y#Q)<* "7#7#7y#Q+<, !'"6"6}h"O-<. '(<(<]M(Z/<0 *7+?+?O_+`1<2 01E1EmUj1k3<4 &w';';M<'X5<6 #G$8$8
$S7<8  4 4]F K9<: &w';';M<'X;<< +G,@,@Pa,b=<> #G$8$8	$R?<@ #G$8$8	$RA<B  !5!5mW!M!S!STW!XYZ![C<D '(<(<]M(ZE<F ,W-A-A-Qc-dG<H w33M5II<J !'"6"6}h"OK<L 273G3GWn3oM<N #G$8$8	$RO<P %g&:&:=+&VQ<R )'*>*>}n*]S<T  4 4]F KU<V &w';';M<'XW<X +G,@,@Pa,bY<Z &w';';M<'X[<\ $Y]<^ "7_<` !&a<b !&c<d !&e<f (3!&#*(*-/&-&:&:='&R*1*=*=g>R>RS`bn>o*p #G$8$8$OSV$V W!(!4!4W5I5I-Y`5a!bw<H| j(m $j& %g&:&:=+&V  4 4]F K	
  !5!5mW!M "7#7#7y#Q #G$8$8
$S $W%9%9-%U  !5!5m[!Q #G$8$8	$R %g&:&:=+&V )'*>*>}n*] )'*=*=g>R>RS`bm>n*o  !4!4W5I5I-Y`5a!b ()=)=m^)\  G$8$8$OSV$V W!H& f$7m 7$j7&7 %g&:&:=+&V7 ,W-A-A-Qb-c	7
 1'2F2F}Vl2m7  !5!5mW!M7 '(<(<]M(Z7 ,W-A-A-Qc-d7 )'*>*>}o*^7 %g&:&:=+&V7 ()=)=m^)\7  4 4]F K7 &w';';M<'X7 +G,@,@Pa,b7 &w';';M7'S7  -g.B.B=R_.`!7" !'"6"6}h"O#7$ )'*>*>}o*^%7& "7#7#7y#Q'7( "7#7#7y#Q)7* !'"6"6}h"O+7, '(<(<]M(Z-7. *7+?+?O_+`/70 01E1EmUj1k172 &w';';M<'X374 #G$8$8
$S576  4 4]F K778 &w';';M<'X97:  !5!5mW!M;7< '(<(<]M(Z=7> ,W-A-A-Qc-d?7@ w33M5IA7B !'"6"6}h"OC7D 273G3GWn3oE7F #G$8$8	$RG7H %g&:&:=+&VI7J )'*>*>}n*]K7L  4 4]F KM7N &w';';M<'XO7P +G,@,@Pa,bQ7R $YS7T "7U7V !&W7X !&Y7Z !&[7\ &{]7^  _7` "7a7b 'c7d ,Re7f '.&:&:='&R&-&:&:=+&V$+$8$8	$R #G$8$8$OSV$V Wm7Ht O 8F+%+%>%>H\"'-'B'BH^$ ))+ #881SIYEZD[[efpqy  {A  rB  gC  fD  BE  RV8   W145E1FH-.&N
  . :(4S(9::A:U:UVbcoVpqrVst  WA  GK  QU  ;VH67 x/%+%>%>H\"'-'B'BH^$"77(6BR7SO"H) 9C$3C$8HSM96=6H6HYrIs6t23
F'<<WEK$ z+24/"77?
& I%D G#'#<#<X#FL". =/"//EL.5.B.B6:.VO?^?qbq;#NN ,.D'2F2Fvt2T ,.,2G4H4HQ]4^,.,97;O;OPVX_;`,. -@AUAUV\^eAf,. -<W=Q=QRXZc=d	,.
 ->w?S?STZ\f?g,. -GH\H\]cexHy,. -DWEYEYZ`brEs,. -@AUAUV\^jAk,. -@AUAUV\^jAk,. ->w?S?STZ\f?g,. -B4CYCYZ`Ca,. -DSI]I]^dfuIvz}I}E~,. -DSI]I]^dfuIvz}I}E~,. -?@S@ST[ThThioq|T}@~,. -A#gFZFZ[acpFquxFxBy,.  -A'BUBUV]VjVjkq  tA  WB  CC!,." GJ'J^J^_egwJx|J  GABIBWBWX_XlXlms  vC  YD  CE@G@T@TU[]h@i@G@T@TU[]h@i<C<P<PQWYa<b;B;O;OPVX_;`>E>R>RSY[e>fCJCWCWX^`nCo=D=Q=QRXZc=d?F?S?STZ\f?g8;G<P<PQWYc<dhk<k8l7,. /< %11&,G3N#NN'2F2Fvt2T4;4H4HQ]4^;B;O;OPVX_;`=D=Q=QRXZc=dBIBVBVW]_lBm>E>R>RSY[e>fDKDXDXY_auDvAHAUAUV\^lAm>E>R>RSY[e>fCJCWCWX^`nCo=D=Q=QRXZc=d8;G<P<PQWYc<dhk<k8l,. / %11&,G3N#NN'2F2Fvt2T4;4H4HQ]4^>E>R>RSY[b>cBIBVBVW]_jBk?F?S?STZ\d?e?B7CWCWX^`hCimpCp?qOVOcOcdjlqOr  yCAHAUAUV\^hAiFMFZFZ[acqFr8;G<P<PQWYc<dhk<k8l
,. 
/g=/~ LL(<(<T4(H*1*>*>tV*L/6/C/CD&/Q-01E1EdI1VZ^1^-_-4.1'2F2FtZ2X\_2_.`"$ %GI%V $+#7#7?P#Q#W#W#Y#`#`ae#f (.(I(I(M(M$&6:YZ\[\:]:dad&e)% ")!5!5e_!M tW%9%9%%F  )7+?+?{+S ')=)=eY)O  '(<(<UH(M  &w';';E7'K	 
 -g.B.B5-.X  ,W-A-A%-V  12B  67L  01E1EeM]1^  .w/C/CE>/Z  ,W-A-A%-V  /  5f6K6K6O6OP^`n6o  .w/C/CE>/Z  23w7K7KES^7_cg7g3h   273G3GO`3a! " -4,@,@,T4;4H4HPc4d/6/C/CE>/Z/6/C/CE>/Z-4-A-A%-V*1*>*>uj*Q+2+>+>w?S?STY[e?f+g)0)<)<W=Q=QRWYa=b)c',3 8  1-  9 N+7+Ea+H+MC(N k*uz+x &,H\"*1*;*;*='"$'',,v}}/F/FHZ"[ "_>[^g>g hww~~o6HH_-3mS1 5W		(G45 O8OO1 1Z( 0  	KKbeffgI	z5 O	  , 3LL$-q"2 3 3 O	3s   DW &DW<DW DW+ VDX( VDXV3DX( WDWWDW WDW(W#DW(W+	DXW4DXXDXXDXXDX%X DX( X%DX( X(DYX7DYYDYc                    |dk(  r/dj                  |      }| j                  t        |      |d      }n.| j                  t        |      d      }	 |j	                  d      }g }	|D ]  }
|
j                  d	      r|
j                  d	      d
k(  r|	c S |
j	                  d      r]|
j	                  d      }|D ]F  }t        j                  |d      }| j                  t        |            }|s6|	j                  |       H |
j	                  d      r^|
j	                  d      }|D ]F  }t        j                  |d      }| j                  t        |            }|s6|	j                  |       H 
|s|
j	                  d      s!|
j	                  d      }|D cg c]  }t        j                  |d      s| }}|D ]G  }t        j                  |d      }| j                  t        |      |      }|s7|	j                  |       I  |	S # t
        $ r$}t        j                  d|z         g cY d}~S d}~ww xY wc c}w )z
        Return processed and validated metadata list for all children of requested item.

        Parameters required:    rating_key { Plex ratingKey }

        Output: array
        r   &artist.id={}&type=9r   rl   r   rG   r   r   zITautulli Pmsconnect :: Unable to parse XML for get_metadata_children: %s.Nr   r   r   r   r+  r   )r2   r   r   r_   r   r   r   r   r  r	   r   r   r  get_metadata_children_detailsr   )r=   rU   get_childrenr   rl   r   r   r]   r   metadata_listr  r  itemchild_rating_keydir_mainds                   r"   r9  z(PmsConnect.get_metadata_children_details  sB    !.55jAI..z?## / H 11#j/QV1WH#889IJ
  	7A~~f%>>&)S0((%%g. ! 6 6w ?) 7D'.';';D+'N$#88=M9NOH%,,X6	7 ''0 ! 6 6w ?) 7D'.';';D+'N$#88=M9NOH%,,X6	7 !"8"8"E11+>,4 ]q8L8LQP[8\ ] ]) 7D'.';';D+'N$#AA#FVBWYefH%,,X6	71	7< I  gjkkl	: !^s*   H I 9I 	H=H82H=8H=c                    | j                  d      }	 |j                  d      }g }|D ]  }|j                  d      r|j                  d      dk(  rddi}|c S |j                  d	      r|j                  d	      }|D ]  }t        j                  |d
      }	|	|k(  sdt        j                  |d
      t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d      d}
|
d   dk(  rd|
d<   |
d   dk(  rd|
d<   |
d   dk(  sd|
d<    d
i} |S # t        $ r$}t        j                  d|z         g cY d}~S d}~ww xY w)z
        Return processed and validated metadata list for requested library.

        Parameters required:    section_id { Plex library key }

        Output: array
        r   r   r   zPTautulli Pmsconnect :: Unable to parse XML for get_library_metadata_details: %s.Nr   r   r]   r   r   libraryr   r   r   r   )r   rl   rA  r   r   r   r   section_typer   rS  r   r[  )rz   r   r   r   r   r  r	   r   )r=   rl   libraries_datar   r   r;  r  result_dataresultr   r]   s              r"   get_library_metadata_detailsz'PmsConnect.get_library_metadata_details  s    00u0E	%::;KLH
  	3A~~f%>>&)S0%/$6M((%%k244[A) ?F!..vu=Cj(2;292F2Fvu2U/6/C/CFF/S-4-A-A&'-R+2+?+?+N-4-A-A&'-R$& $I.'97>H^4%i0F:7@H^4%i0H<7>H^4?" (2M3	36 C  	KKjmnnoI	s   D? ?	E,E'!E,'E,c                    | j                  d      }	 |j                  d      }g }|D ]@  }|j                  d      r|j                  d      dk(  r	dg d}|c S |j                  d	      rb|j                  d	      }|D ]L  }t        j                  |d
      j                  d      r)| j                  ||      }|j                  |       N |j                  d      r<|j                  d      }|D ]&  }| j                  ||      }|j                  |       ( |j                  d      s|j                  d      }|D ]&  }| j                  ||      }|j                  |       ( C t        |d       }t        j                  |d   d      t        j                  |      d}	|	S # t        $ r$}t        j                  d|z         g cY d}~S d}~ww xY w)zU
        Return processed and validated session list.

        Output: array
        r   r   r   zHTautulli Pmsconnect :: Unable to parse XML for get_current_activity: %s.Nr   r   )stream_countsessionsr+  r  z
library://)r  r   r,  c                     | d   S )Nsession_keyr   r   s    r"   r   z1PmsConnect.get_current_activity.<locals>.<lambda>J  s    !M:J r$   )r   r   )rL   r   r   r   r   r  r	   r   r  get_session_eachr  r  r   mask_session_info)
r=   r  session_datar   r   session_listr  session_session_outputr  s
             r"   get_current_activityzPmsConnect.get_current_activity  s    ((u(=	#889IJH
  	8A~~f%>>&)S04702$&L ('%%g. 55g> , 8H++Hf=HHV %)%:%:8PZ%:%[N ''78 %%g. 55g> , 8H%)%:%:8PZ%:%[N ''78 %%g. 55g> , 8H%)%:%:8PZ%:%[N ''78/	86 l0JK")"6"6x{F"K%77E O  	KKbeffgI	s   F, ,	G5GGGc                 4  9:;<=>?@ t        j                  |d      }t        j                  |d      }t        j                  |d      } |j                  d      d   }t        j                  |d      }|dk(  r9t        j                         j                  t        j                  |d      	      }n$t        j                         j                  |
      } |j                  d      d   }	t        j                  |	d      <t        j                  j                  <<      <<st        j                  |	d      dk(  rd<t        <fdt        j                  j                         D        d      }
t        j                  |	d      j                  d      d   t        j                  |	d      j                  d      d   t        j                  |	d      <|
t        j                  |	d      t        j                  |	d      t        j                  |	d      t        j                  |	d      t        j                  |	d      xs t        j                  |	d      t        j                  |	d      t        j                  |	d      t        t        j                  |	d      dk(        t        j                  |	dd      t        j                  |	dd      d } |j                  d!      rX |j                  d!      d   }t        j                  |d      t        j                  |d"      t        j                  |d#      d$}nd%d%|d   rd&nd'd$}|d   t        |d#   d&k7  xr |d(   d)k(        |d<   nt        j                  |d         |d<   |d   t        |d   dk(        |d<    |j                  d*      rd+} |j                  d*      d   }t        j                  |d,      }t        j                  |d-      }t        j                  |d.      }t        j                  |d/      }i d0t        j                  |d1      d2t        t        j                  |d3      dk(        d4t        t        t        j                   |      d            d5t#        t        t        j                   |      d6            d7t        j                  |d8      d9t        j                  |d:      d;t        j                  |d<      d=t        j                  |d>      d?t        j                  |d@      dAt        j                  |dB      dCt        j                  |dD      dEt        t        t        j                   |      d            dFt        t        t        j                   |      d            dGt        t        j                  |dH      dk(        dIt        j                  |dJ      dKt        j                  |dL      dMt        j                  |dN      t        j                  |dO      t        t        j                  |dP      dk(        t        j                  |dQ      t        j                  |dR      t        j                  |dS      t        j                  |d3      dk(  rdndTdU}n@dV}i d0d%d2dd4dd5d%d7d%d9d%d;d%d=d%d?d%dAd%dCd%dEddFddGddId%dKd%dMd%d%ddWdWd%dTdU}t        |dI   j%                         t        j&                  v       |dX<   t        |dM   j%                         t        j(                  v       |dY<    |j                  dZ      }t        d[ |D        |d         }|j                  d\      }t        d] |D        |d         }dx}x}}|j                  d^      D ]  }t        j                  |d_      dk(  r|t        j                  |d`      dk(  s8|};t        j                  |d_      dak(  r|t        j                  |d`      dk(  sp|}st        j                  |d_      dbk(  s|t        j                  |d`      dk(  s|} dx@x9?|rt        j                  |d      @i dct        j                  |dd      det        j                  |df      dgt        j                  |dh      dit        j                  |dj      dkt        j                  |dl      dmt        j                  |dn      dot        j                  |dp      dqt        j                  |dr      dst        j                  |dt      du| j+                  |      dvt        t        j                  |dw      dk(        dxt        t        j                  |dy      dk(        dzt        j                  t        j                  |d{            d|t        t        j                  |d}      dk(        d~t        j                  t        j                  |d            dt        t        j                  |d      dk(        dt        j                   t        j                  |d            t        j                  |d@      t        j                  |d>      t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d      xs dWd}n5i dcd%ded%dgd%did%dkd%dmd%dod%dqd%dsd%dud%dd%dd%dd%dd%dd%dd%dd%}|rt        j                  |d      9t        j                  |d      }t        j                  |d      }t        j                  |dd      t        j                  |d      ||xs  t        j,                  j                  ||      t        j                  |dj      t        j                  |d      |t        j                  |d      t        j                  |d      t        j                  |d      xs dWd
} nd%d%d%d%d%d%d%d%d%d%d
} |rt        j                  |d      ?t        j                  |d`      }!t        j                  |dj      t        j                  |dB      t        j                  |d      t        t        j                  |d      dk(        t        j                  |d#      t        j                  |d      t        j                  |d      t        j                  |d      xs |d   t        t        j                  |d      dk(        d	}"nd}!d%d%d%dd%d%d%d%dd	}"t        j                  |d      }#t        j                  |d      }$|#dk(  r*t        j                  |d      ;dj/                  ;|$      }%nd%}%t        j                  |d         dk\  rd}&n3t        j                  |d      j%                         j1                  d      }&t        j                  |dB      t        j                  |dd      t        j                  |d      t        j                  |d      |&t        j                  |d      xs t        j                  |d      t        j                  |d      j3                  ddW      t        t        j                  |d      dk(        t        j                  |d      dt        t        j                  |d      dk(        t        j                  |d      t        |#dk(        |%?r|!rd6ndd}'i x}(x})x}*x}+},t        j                  |d      j5                         sd6}-t        j                  |d8      }.i d|dt        j                  |d      dt        j                  |d      dt        j                  |d      dt        j                  |d      dt        j                  |d      dt        j                  |d      dt        j                  |d      dt        j                  |d      dt        j                  |d      dt        j                  |d      dt        j                  |d      dt        j                  |d«      dt        j                  |dë      dt        j                  |dū      dt        j                  |dƫ      dt        j                  |dǫ      i dt        j                  |dȫ      dt        j                  |dʫ      dt        j                  |d̫      dt        j                  |dΫ      dt        j                  |dЫ      dt        j                  |d      dt        j                  |dѫ      dt        j                  |dҫ      dt        j                  |dԫ      dt        j                  |d֫      dt        j                  |d׫      dt        j                  |dث      dt        j                  |dګ      dt        j                  |dܫ      dt        j                  |dޫ      dt        j                  |d      dt        j                  |d      i dg dg dg dg dg dt        j                  |d      dBt        j                  |dB      xs t        j                  |dB      ddt        j                  |dd      d@t        j                  |d@      d>t        j                  |d>      dt        j                  |d      dt        j                  |d<      dt        j                  |d      j%                         dt        j                  |d      j%                         dt        j                  |d      dt        j                  |d      dt        j                  |d:      |.t        j,                  j                  |.|.      t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d      d}/nd}-t        j                  |d      :t        j                  |d      ;| j7                  |||      }/|/j9                  dg       }0t        :fd|0D        t        d |0D        i             }(|(j9                  dg       }1t        ;fd|1D        t        d |1D        i             })|)j9                  dg       }2i dd%dd%dd%dd%dd%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%d%dd%d%d%d	},@r(t        @fd|2D        t        d |2D        |*            }*9r(t        9fd|2D        t        d |2D        |+            }+?r(t        ?fd|2D        t        d |2D        |,            },|dk(  r1|/j                  d      r|/d   r|/d   j3                  dd      |/d<   |'d   ri|rgd|'d<   |dA   |'d<   |d   |d<   |d;   |di<   |d   | d<   |d9   | d<   |d7   | d <   t        j,                  j                  |d7   |d7         | d!<   |d   dk(  s
| d   dk(  rd}3n|d   d"k(  s
| d   d"k(  rd"}3ndW}3|3|'d#<   |'d   |'d$<   | d   d%k(  r|+j                  dd%      | d<   |d9   d%k(  r|+j                  dd%      |d9<   |di   d%k(  r|*j                  dd%      |di<   |d;   d%k(  r|*j                  dd%      |d;<   |d&v r:t        j:                  j                  |'d'   |'d'   |d   dd6 xs d(z         |'d)<   |d&v rd*|'v r|d   dk(  rxd%}4t        j                  |'d*         >t        j                  |(j                  dd            =	 t=        =>fd+t        j>                  D              }5t        j>                  |5   }6nd%}4d,}6|'d-   rUt        j                  |(j                  dd            =d.j/                  t        =d/z  d6      |(j                  d            }7nd%}7n|d0k(  rd*|'v rzd%}4t        j                  |'d*         >t        j                  |(j                  dd            =	 t=        =>fd1t        jB                  D              }5t        jB                  |5   }6d%}7n|d2k(  rd,}6d%}4d%}7nd3}6d%}4d%}7|||$t#        t        jD                  |$|'d4               |6|4|7|d5   |-d6	}8|8jG                  |/       |8jG                  |(       |8jG                  |)       |8jG                  |*       |8jG                  |+       |8jG                  |,       |8jG                  |       |8jG                  |       |8jG                  |       |8jG                  |       |8jG                  |'       |8jG                  |       |8jG                  |        |8jG                  |"       |8S # t@        $ r d,}6Y )w xY w# t@        $ r d,}6Y \w xY w(7  z
        Return selected data from current sessions.
        This function processes and validates session data

        Parameters required:    session { the session dictionary }
        Output: dict
        r   r   
sessionKeyUserr   r   r   r   )userr)   PlayerplatformproductDLNAc              3   N   K   | ]  \  }}|j                         v s|  y wN)r  )rV  r   vrX  s      r"   rX  z.PmsConnect.get_session_each.<locals>.<genexpr>q  s&     cDAqQRZR`R`RbMbacs   %%defaultaddressz::ffff:r*  remotePublicAddressdeviceplatformVersionversionr  machineIdentifierstatelocalrelayedN)default_returnsecure)
ip_addressip_address_publicra  rX  platform_nameplatform_versionrY  product_versionr  player
machine_idre  rf  rg  ri  Session	bandwidthlocation)rO   rr  rs  r|   lanwanrk  z	127.0.0.1TranscodeSessionTprogressspeedminOffsetAvailablemaxOffsetAvailabletranscode_keyr   transcode_throttled	throttledtranscode_progresstranscode_speedr)  transcode_audio_channelsr  transcode_audio_codecr  transcode_video_codecr  transcode_widthr  transcode_heightr  transcode_containerr  transcode_protocolr  transcode_min_offset_availabletranscode_max_offset_availabletranscode_hw_requestedtranscodeHwRequestedtranscode_hw_decodetranscodeHwDecodingtranscode_hw_decode_titletranscodeHwDecodingTitletranscode_hw_encodetranscodeHwEncodingtranscodeHwEncodingTitletranscodeHwFullPipelineaudioDecisionvideoDecisionsubtitleDecisionr   )transcode_hw_encode_titletranscode_hw_full_pipelineaudio_decisionvideo_decisionsubtitle_decisionr}  Fzdirect playtranscode_hw_decodingtranscode_hw_encodingrp  c              3   T   K   | ]   }t        j                  |d       dk(  s| " ywr  r   Nr	   r   rV  r  s     r"   rX  z.PmsConnect.get_session_each.<locals>.<genexpr>  s'     !jw?S?STUWa?bfi?i!!j   ((rq  c              3   T   K   | ]   }t        j                  |d       dk(  s| " ywr  r  rV  r  s     r"   rX  z.PmsConnect.get_session_each.<locals>.<genexpr>  s'     'oaGDXDXYZ\fDgknDn'or  rr  rs  r  r   r  stream_video_bitraterz  stream_video_bit_depthr|  stream_video_chroma_subsamplingr~  stream_video_codecrv  stream_video_codec_levelrx  stream_video_color_primariesr  stream_video_color_ranger  stream_video_color_spacer  stream_video_color_trcr  stream_video_dynamic_rangestream_video_dovi_bl_presentr  stream_video_dovi_el_presentr  stream_video_dovi_levelr  stream_video_dovi_presentr  stream_video_dovi_profiler  stream_video_dovi_rpu_presentr  stream_video_dovi_versionr  r  r  r  rt  decision)stream_video_heightstream_video_widthstream_video_ref_framesstream_video_languagestream_video_language_codestream_video_scan_typestream_video_decisionr  r  r  r  r  r  r  r  r  r  r  )
stream_audio_bitratestream_audio_bitrate_modestream_audio_channelsstream_audio_channel_layoutstream_audio_codecstream_audio_sample_ratestream_audio_channel_layout_stream_audio_languagestream_audio_language_codestream_audio_decisionr2   r  r  	transient)	stream_subtitle_codecstream_subtitle_containerstream_subtitle_formatstream_subtitle_forcedstream_subtitle_locationstream_subtitle_languagestream_subtitle_language_codestream_subtitle_decisionstream_subtitle_transientr  
viewOffsetr  z1/library/parts/{part_id}/indexes/sd/{view_offset})part_idview_offseti   4kr  r  r  r  r   
directplayr  r  rK  uuid)stream_containerstream_bitratestream_aspect_ratiostream_video_frameratestream_video_resolutionstream_durationstream_container_decisionr  optimized_version_titlesynced_versionrK  	live_uuidr  	bif_thumb	subtitlesr   rl   r   r   r   rU   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   r   r   r   r   r  r  r   r  r  r  r  r  r  r
  r  r  r  r  r  r  ru  r  r  r  r  r  r  r  
sourceIconsourceTitlerh  r]  )r  r  r  channel_iconr  ri  rj  )rU   r  r  rl  c              3   4   K   | ]  }|d    k(  s|  ywr   Nr   )rV  r  media_ids     r"   rX  z.PmsConnect.get_session_each.<locals>.<genexpr>  s     (YqQtWPXEX(Y   c              3       K   | ]  }|  y wr\  r   r  s     r"   rX  z.PmsConnect.get_session_each.<locals>.<genexpr>  s     `zghab`z   r  c              3   4   K   | ]  }|d    k(  s|  ywr  r   )rV  r  r  s     r"   rX  z.PmsConnect.get_session_each.<locals>.<genexpr>  s     -bAqQUwZaOaa-br  c              3       K   | ]  }|  y wr\  r   r  s     r"   rX  z.PmsConnect.get_session_each.<locals>.<genexpr>  s       jIpqjk  jIr  r  rw  ry  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  r  c              3   4   K   | ]  }|d    k(  s|  ywr  r   )rV  r  video_ids     r"   rX  z.PmsConnect.get_session_each.<locals>.<genexpr>        ,i1UVW[U\`hUhQ,ir  c              3   2   K   | ]  }|d    dk(  s|  yw)r   r   Nr   r  s     r"   rX  z.PmsConnect.get_session_each.<locals>.<genexpr>       1kZ[\bZcgjZj!1k   c              3   4   K   | ]  }|d    k(  s|  ywr  r   )rV  r  audio_ids     r"   rX  z.PmsConnect.get_session_each.<locals>.<genexpr>  r  r  c              3   2   K   | ]  }|d    dk(  s|  yw)r   r   Nr   r  s     r"   rX  z.PmsConnect.get_session_each.<locals>.<genexpr>  r  r  c              3   4   K   | ]  }|d    k(  s|  ywr  r   )rV  r  subtitle_ids     r"   rX  z.PmsConnect.get_session_each.<locals>.<genexpr>	  s      /oaXYZ^X_cnXn/or  c              3   2   K   | ]  }|d    dk(  s|  yw)r   r  Nr   r  s     r"   rX  z.PmsConnect.get_session_each.<locals>.<genexpr>	  s     4n1]^_e]fjm]mQ4nr  rg  ri  z/artz/thumb	transcoder  r  r  r  r  r  r  r  copytranscode_decisioncontainer_decision*)r   rS  rg  r  r  stream_video_full_resolutionr  c              3   @   K   | ]  }|cxk  rk  sn n|  y wr\  r   rV  bsource_bitrater  s     r"   rX  z.PmsConnect.get_session_each.<locals>.<genexpr>;	  s&      +kNVWDi[iDi+k   
Originalr  z
{} Mbps {}g     @@r[  c              3   @   K   | ]  }|cxk  rk  sn n|  y wr\  r   r  s     r"   rX  z.PmsConnect.get_session_each.<locals>.<genexpr>Q	  s      &yQSaefSxjxSxq&yr  r.  Unknownr  username)	rK  r   r  progress_percentquality_profilesynced_version_profileoptimized_version_profilerV  channel_stream)$r	   r   r   r   r7   r  r   PLATFORM_NAME_OVERRIDESr  r  PLATFORM_NAMESitemsr  r   r  roundr  r   r  HW_DECODERSHW_ENCODERSr
  r  r2   r  replacer  r   r  r  minVIDEO_QUALITY_PROFILESr  AUDIO_QUALITY_PROFILESget_percentupdate)Ar=   r   r  r   rU   rK  	user_infor*   user_detailsplayer_inforl  player_detailssession_infosession_detailstranscode_sessiontranscode_infor~  r  transcode_min_offsettranscode_max_offsettranscode_detailsmedia_info_allstream_media_infopart_info_allstream_media_parts_infovideo_stream_infoaudio_stream_infosubtitle_stream_infor0  video_detailsr  stream_audio_channel_layouts_audio_detailssubtitle_selectedsubtitle_detailsr  r  r  r  stream_detailssource_media_detailssource_media_part_detailssource_video_detailssource_audio_detailssource_subtitle_detailsr  r  metadata_detailssource_mediassource_media_partssource_media_part_streamsr  r  quailtiy_bitrater
  r  rQ  r  r  r  rX  r  r  r  r  sA                                                            @@@@@@@@r"   rL  zPmsConnect.get_session_eachR  s    ))'6:
))';?
**7LA 1G008;	&&y$7c> ;;=44':N:NyZa:b4cL ;;=44W4EL 3g228<Q? ''Z@1155hIG00iHFRHcF,A,A,G,G,Iceno(/(<(<[)(T(Z(Z[d(efh(i/6/C/CKQf/g/m/mnw/xy{/|$+$8$8h$O&.+8.5.B.B;Pa.b%,%9%9+y%Q-4-A-A+y-Y%,%9%9+y%Q$+$8$8g$N$~RYRfRfgrt}R~(/(<(<[J](^#*#7#7W#M#&w';';K'QUX'X#Y%,%9%9+yae%f$+$8$8h_c$d$ (7''	27777	B1EL-4-A-A,PT-U,3,@,@{,[+2+?+?j+Y!O
 .0,.4B74K5QV!O )$,(+OJ,G5,P -_,:;N,OS^,^)`N9% )0(;(;N9<U(VN9% (#/'*>(+Cs+J'KN8$ (7''(:; $9W99:LMaPN!(!5!5nj!Q%22>7KO#*#7#7H\#] #*#7#7H\#] !#'2F2F~W\2] !#!6G<P<PQ_al<mqt<t8u!#!5s5AVAVWiAjlm;n7o!# "3Cg>S>STc>dfg8h4i!# "<W=Q=QR`bq=r	!#
 "9':N:N~_k:l!# "9':N:N~_k:l!# "3G4H4HY`4a!# "4W5I5I.Zb5c!# "78L8L^]h8i!# "6w7K7KN\f7g!# "B3uWMbMbcwMxz{G|C}!# "B3uWMbMbcwMxz{G|C}!# ":3w?S?STbdz?{  @C  @C  <D!# "78L8L^]r8s!# "=g>R>RSac}>~!#  "78L8L^]r8s!!#" ?F>R>RSac}>~?B7CWCWXf  iB  DC  GJ  DJ  @K3:3G3GXg3h3:3G3GXg3h6=6J6J>[m6n5<5I5I.Ze5fjm5mcsv-!#2 !&!#" !#!6!#!5q!# "3B!# "<R	!#
 "9"!# "9"!# "3B!# "4R!# "7!# "6r!# "B1!# "B1!# ":1!# "7!# "=b!#  "7!!#" ?A?@3@3@68.1-!#4 699JK`9a9g9g9imsmm9  6A12589JK`9a9g9g9imsmm9  6A12555g> !j^!jlz{|l}~)>>vF"&'o='oq~  @A  rB  #C HLKK-0D-BB8L 	2F##FL9S@$,0D0DVZ0X\_0_(.%%%fl;sB$,0D0DVZ0X\_0_(.%%%fl;sB'/73G3GPZ3[_b3b+1(	2 -1008k++,=tDH3W5I5IJ[]f5g 5w7K7KL]_i7j>@T@TUfh{@| 273G3GHY[b3c 89M9MN_ah9i	
 <W=Q=QRceu=v 89M9MN_am9n 89M9MN_am9n 6w7K7KL]_i7j :4;Q;QRc;d <SAUAUVgixAy  ~A  BA  >B <SAUAUVgixAy  ~A  BA  >B 78K8KGL`L`art  MA  9B 9#g>R>RSdfs>tx{>{:| 9':M:MgNbNbct  wD  OE  ;F =c'BVBVWhjzB{  @C  CC  ?D  9':O:OPWPdPdev  yF  QG  ;H!" 5<4H4HIZ\d4e3:3G3GHY[b3c8?8L8LM^`k8l6=6J6JK\^h6i;B;O;OPacq;r7>7K7KL]_i7j6=6J6JK\^h6i6zmz/M43R 5r> 22 8	
 <R 8 8 6r :2 3B 22 7 5b :2 6r  5b!M& ++,=tDH$+$8$89JJ$W!,3,@,@ARTh,i)5<5I5IJ[]f5g:A:N:NO`bo:p6K<Y =O]c]r]r]v]v!68M^O3:3G3GHY[b3c9@9M9MN_ao9p=Z6=6J6JK\^h6i;B;O;OPacq;r6=6J6JK\^h6i6zmzM 68:<68<>359;=?68;=68
M  !../CTJK ' 4 45I: V9@9M9MNbdk9l=D=Q=QRfhs=t:A:N:NOcem:n:=g>R>RSgiq>rvy>y:z<C<P<PQegq<r<C<P<PQegq<rAHAUAUVjlzA{<C<P<PQegq<r  =]  wH  I\  w]=@AUAUVjlwAx|A  >A	 " !%9;=?:<:;<><>AC<>=>	 " &&'>	J**7LAd?**+BDIGKRR[bp{R|II}-ABCtK&*#&-&:&:;LN_&`&f&f&h&o&opt&u#.5.B.BCTVa.b,3,@,@ART],^181E1EFWYf1g4;4H4HIZ\l4m5L-4-A-ABSU_-`  .Ndkdxdx  zA  CM  eN7>7K7KLceo7p7x7x  zF  HU  8V/273G3GHY[f3gko3o/p5<5I5IJ[]d5e,-"%g&:&:7F&Ks&R"S'.';';<Mv'V%(D%9'0,7<MqST& UW	W 	W8 	W 	W#7:Q##G[9AACN$112C_UN; "j ; " ,g.B.B7L^._; " .0D0DWNc0d; " !-g.B.B7K.X; " !4W5I5I'Sd5e	; "
 !9':N:NwXn:o; " !()=)=gw)O; " !/0D0DWm0\; " !4W5I5I'Se5f; " !1'2F2FwP_2`; " !-g.B.B7K.X; " !.w/C/CGW/U; " !5g6J6J7Ta6b; " !)'*>*>w*Q; " !1'2F2FwP_2`; " !*7+?+?+S; "  !*7+?+?+S!; "" !)'*>*>w*Q#; "$ !/0D0DWm0\%; "& !273G3GQa3b'; "( !89M9MgWl9m); "* !.w/C/CG\/Z+; ", !+G,@,@*,U-; ". !'(<(<Wf(M/; "0 !()=)=gw)O1; "2 !/0D0DWm0\3; "4 !4W5I5I'Se5f5; "6 !&w';';GU'K7; "8 !)'*>*>w*Q9; ": !:7;O;OPWYp;q;; "< !+G,@,@),T=; "> !-g.B.B7K.X?; "@ !1'2F2FwP^2_A; "B !'(<(<Wf(MC; "D !,RE; "F !*2G; "H !)"I; "J !)"K; "L !)"M; "N !-g.B.B7G.TO; "P !,W-A-ABSU`-a .k070D0DE\^i0jS; "T !*7+?+?@QS\+]U; "V !)'*>*>?PRZ*[W; "X !()=)=>OQX)YY; "Z !/0D0DEVXe0f[; "\ !.w/C/CDUWc/d]; "^ !3G4H4HIZ\m4n4t4t4v_; "` !89M9MN_ar9s9y9y9{a; "b !273G3GHY[k3lc; "d !01E1EFWYg1he; "f !.w/C/CDUWc/dg; "h 3A8>8M8M8Q8QR`bp8q181E1EFWYg1h070D0DWl0[181E1Eg}1].5.B.B7K.X,3,@,@),Tu; "z N++,=tDH**+BDIG#88JDNZe  9  g -00rBM#'(YM(Y[_`zly`z|~[  $A !5!9!9'2!F(,-b9K-bdh  jI  vH  jI  KM  eN  )O%(A(E(EiQS(T%$&D" $&$*B$&$12$& %8$& %4R	$&
 %6r$& %?$& %<R$& %8$& %8$& %6r$& %:2$& %7$& %7$& %3B$& %22$&  %5b!$&" <>7957'$& * +-,.3557:<68<>9;68;=57$&  .0/19;=?:<:;<><>AC	')# '+,i8Q,i,01k=V1k  nB  -C(D$'+,i8Q,i,01k=V1k  nB  -C(D$*./o;T/o/34n@Y4n  qH  0I+J' $4$8$8$FK[\aKb(8(?(G(GPX(YW% &!&7:EN671BCX1YN-.5FGW5XM122CD[2\M./5FGW5XM122CD[2\M./5FGa5bM12;A;P;P;T;T!"<=?PQk?l<nM78 01[@MRiDjnyDy!,23v=OfAgkqAq!'!./A+,/=>Y/Z+, -.#52F2J2J=Z\2]M./45<9M9Q9QR_ac9d56 -.#52F2J2J=Z\2]M./45<9M9Q9QR_ac9d5655=C=^=^=b=b8989]Kc=degfg=h=olop>rN9:
 55:Jn:\45D)+&!(!4!4^DT5U!V!(!4!45I5M5Mi5X!Y1'* +k#)#@#@+k (k$&,&C&CDT&UO *,&",12!(!4!45I5M5Mi5X!Y,8,?,?nW]F]_`@a@T@X@XYp@q-s) -/)7"'7>'I%'"$00@P1QRN$001E1I1I)1TUN-#&&y&2O2O&y#y "("?"?@P"Q )+%7"(O%'"(*% (O%'"(*% *5(2)4.1'2E2EkSabsSt2u.v-<4J7P".z":,:	 	./2378232356l+n-o./0n-m,m,./ " 1&0O1*  -",-s0   _;7Ai c!7Ai% iAi"i!Ai"i%Ai5i4Ai5c                 T   t        j                         }|j                         sd}t        j                  d|z         |S |j                  d      xs d}t        j                         }|r|j                  |      }|r,|s*|d   }n$|r|j                  |      }|r|s|d   }nd	x}x}}|s#d
|d|d}t        j                  d|z         |S |r;t        j                  d|d|d       | j                  ||      }|j                  S d}t        j                  d|z         |S )z1
        Terminates a streaming session.
        zNo Plex Pass subscriptionz7Tautulli Pmsconnect :: Failed to terminate session: %s.zutf-8z&The server owner has ended the stream.)rK  rO   )rO   rK  NzInvalid session_key (z) or session_id ()z+Tautulli Pmsconnect :: Terminating session z (session_id z).)rO   rP   zMissing session_id)r   PlexTVget_plexpass_statusr   r   r   r   ActivityProcessorget_session_by_keyget_session_by_idr   rQ   ok)	r=   rK  rO   messageplex_tvmsgapr   responses	            r"   terminate_sessionzPmsConnect.terminate_session	  s.    --/**,-CKKQTWWXJ..)U-U113+++DGz$\2
**j*AG{%m4 265G5kJCNPZ[CKKQTWWXJKK\gistu22jQX2YH;;&CKKQTWWXJr$   c                 h   dg d}g }|dk(  r| j                  |d      }n|dk(  r| j                  |dd      }ns|r| j                  |d      }n]|d	k(  rE| j                  |      }|d
   }dj	                  |      }	| j                  t        |      |	d      }n| j                  |d      }|s	 j                  d      }g }|D ]  }|j                  d      r-|j                  d      dk(  rt        j                  d       |c S g }|j                  D ]@  }|j                  t        j                   k(  s!|j"                  dv s0|j%                  |       B |s|D ]0  }g }g }g }g }g }g }|j                  d      r;|j                  d      D ]'  }|j%                  t'        j(                  |d             ) |j                  d      r;|j                  d      D ]'  }|j%                  t'        j(                  |d             ) |j                  d      r;|j                  d      D ]'  }|j%                  t'        j(                  |d             ) |j                  d      r;|j                  d      D ]'  }|j%                  t'        j(                  |d             ) |j                  d      r;|j                  d      D ]'  }|j%                  t'        j(                  |d             ) |j                  d      r;|j                  d      D ]'  }|j%                  t'        j(                  |d             ) t'        j(                  |d      }|j*                  dk(  r|dk(  rd}i d|d
t'        j(                  |d       d!t'        j(                  |d"      d#t'        j(                  |d$      d%t'        j(                  |d&      d't'        j(                  |d(      d)t'        j(                  |d)      d*t'        j(                  |d+      d,t'        j(                  |d-      d.t'        j(                  |d/      d0t'        j(                  |d1      d2t'        j(                  |d3      d4t'        j(                  |d5      d6t'        j(                  |d6      d7t'        j(                  |d8      d9t'        j(                  |d9      d:t'        j(                  |d:      i d;t'        j(                  |d;      d<t'        j(                  |d=      d>t'        j(                  |d?      d@t'        j(                  |dA      dBt'        j(                  |dC      dDt'        j(                  |dD      dEt'        j(                  |dE      dFt'        j(                  |dF      dGt'        j(                  |dH      dIt'        j(                  |dJ      dKt'        j(                  |dK      dLt'        j(                  |dL      dMt'        j(                  |dN      dOt'        j(                  |dP      dQt'        j(                  |dR      dSt'        j(                  |dT      dUt'        j(                  |dU      ||||||t'        j(                  |d)      dV}|j%                  |       3  t'        j,                  t'        j(                  |d   d            t'        j(                  |d   dW      xs |r|d   d   ndXt'        j(                  |d   dY      |dZ}|S # t        $ r$}
t        j                  d|
z         |cY d}
~
S d}
~
ww xY w)[V
        Return processed and validated children list.

        Output: array
        r   )rM  rY  rc  r   r   r^   T)r^   rG   r   rl   r7  r8  r   zETautulli Pmsconnect :: Unable to parse XML for get_item_children: %s.Nr   r   z(Tautulli Pmsconnect :: No children data.)r   r   r+  r,  r   r   r   r   r   r   r   r   r   r.  r/  r   r   r   r   rU   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   r   r   r   r   r   r   r   r  r  r   r  r  r  r  r  r  )r
  r  r  r  r  r\   r  	viewGroupr|   title2)rM  children_typer   rY  )rc   r_   ra   r   r2   r   r   r   r   r   r   r  r  
childNodesnodeTyper   ELEMENT_NODEtagNamer  r	   r   r  r  )r=   rU   r   get_grandchildrenrh  r   children_dataartist_metadatarl   r   r   rY  r  rD  xr  r
  r  r  r  r  r\   r  r   r!  r"  r#  r^   children_outputr  s                                 r"   r  zPmsConnect.get_item_children	  s    -.+- # 33Je3TM<' 66zdbg6hM ;;JV[;\M8#"77
CO(6J.55jAI..z?## / H !66zQV6WM&(==>NO
  [	:A~~f%>>&)S0LL!KL))K\\ *::!2!22qyyDl7l&&q)* $ N:A "I GFFF"$K--j9()(>(>z(J TH%,,W-A-A(E-RST --h7&'&<&<X&F PF#NN7+?+?+NOP --f5%&%;%;F%C NE"MM'*>*>ue*LMN --g6%&%;%;G%D NE"MM'*>*>ue*LMN --g6%&%;%;G%D NE"MM'*>*>ue*LMN --l;*+*@*@*N XJ'..w/C/CJPU/VWX ")!5!5a!@Jzz[0Z75J%2
)')|Z )')'3W5I5I!M_5`)')'5w7K7KAOd7e)') (4W5I5I![5Y)') (;G<P<PQRTe<f	)')
 (@AUAUVWYoAp)') (/0D0DQ0P)') (6w7K7KA}7])') (;G<P<PQRTf<g)') (89M9MaQ`9a)') (4W5I5I![5Y)') (5g6J6J1g6V)') (<W=Q=QRSUb=c)') (01E1Ea1R)') (89M9MaQ`9a)') (1'2F2Fq)2T)')  (1'2F2Fq)2T!)')" (01E1Ea1R#)')$ (6w7K7KA}7]%)')& (9':N:NqRb:c')')( (?@T@TUVXm@n))')* (5g6J6J1l6[+)'), (273G3G:3V-)'). (.w/C/CAv/N/)')0 (/0D0DQ0P1)')2 (6w7K7KA}7]3)')4 (;G<P<PQRTf<g5)')6 (-g.B.B1e.L7)')8 (01E1Ea1R9)'): (A'BVBVWXZqBr;)')< (273G3G93U=)')> (4W5I5I![5Y?)')@ (89M9MaQ_9`A)')B (.w/C/CAv/NC)')D 5>291717176A5<5I5I!W5UQ)')OT "((9]N:[	:z %,$7$78L8LXVW[Z`8a$b#*#7#7[#Q  $O  yFVcdeVfgsVt  LN"//XF#0 S  &cfggh%%&s   1\ 	\1\,&\1,\1c                    | j                  |d      }	 |j                  d      }g g g g g g g d}|D ]  }t        j                  |d      }|j                  d      }|D ]  }	t        j                  |	d	      }
t        j                  |	d
      }t        j                  |	d      }t        j                  |	d      }|
dk(  s|j                  d      r||vrwg }|	j                  d      r|	j                  d      }|	j                  d      r|	j                  d      }|	j                  d      r|	j                  d      }|D ]  }|t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d      d
}||   j                  |         t        d |j                         D              |d}|c S  y# t        $ r$}t        j                  d|z         g cY d}~S d}~ww xY w)rK  r   r   r   zMTautulli Pmsconnect :: Unable to parse XML for get_item_children_related: %s.N)r   r   rP  rS  r   rZ  r[  r   Hubr   r   r   hubIdentifierr   zcollection.relatedr   r   r+  r   r   r   r   r   r   r   )
rl   rU   r   r   r   r   r   r   r   r   c              3   8   K   | ]  \  }}t        |        y wr\  r  )rV  r   r]  s      r"   rX  z7PmsConnect.get_item_children_related.<locals>.<genexpr>p
  s     *\da3q6*\s   results_countresults_list)ro   r   r   r   r   r	   r   r  r  sumr  )r=   rU   rT  r   r   children_results_listr  rl   hubshr   r   r   hub_identifierrD  rE  rW  r  s                     r"   get_item_children_relatedz$PmsConnect.get_item_children_related4
  sy    66zQV6W	$99:JKH
 +-)++-,.+-*,*,!#  )	A --a1CDJ))%0D N++Av6$11!V<
,,Q8!(!5!5a!I3;n&?&?@T&U"*?? ))'2"#"8"8"AK))+6"#"8"8"EK))'2"#"8"8"AK) NF5?5<5I5I&R]5^<C<P<PQWYj<k6=6J6J6SZ6[070D0DVW0U7>7K7KFTa7b/6/C/CFF/S070D0DVW0U7>7K7KAw7W3:3G3GPZ3[
'(O **5<<_MN'NB (+*\>S>Y>Y>[*\'\&;F MS)	  	KKgjkklI	s   I 	I3I.(I3.I3c           	         | j                  d      }	 |j                  d      }g }|D ]  }t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d	      t        j                  |d
      d}|j                  |        |S # t        $ r$}t        j                  d|z         g cY d}~S d}~ww xY w)zJ
        Return the list of local servers.

        Output: array
        r   r   ServerzCTautulli Pmsconnect :: Unable to parse XML for get_server_list: %s.Nr   rd  hostr(   rc  )r   r   rh  r(   rc  )rs   r   r   r   r   r	   r   r  )r=   r  r   r   server_infor  r  s          r"   r   zPmsConnect.get_servers_infov
  s     %%E%:	228<H
  	'A%221f=,3,@,@DW,X%221f=%221f=!(!5!5a!C	F v&	'   	KK]`aabI	s   B- -	C6CCCc                    | j                  d      }	 |j                  d      }i }|D ]/  }t        j                  |d      t        j                  |d      d}1 |S # t        $ r$}t        j                  d|z         i cY d}~S d}~ww xY w)	zJ
        Return the local machine identity.

        Output: dict
        r   r   r   zMTautulli Pmsconnect :: Unable to parse XML for get_local_server_identity: %s.Nrd  rc  )r   rc  )rx   r   r   r   r   r	   r   )r=   identityr   r   server_identityr  s         r"   get_server_identityzPmsConnect.get_server_identity
  s     111F	445EFH
  	!A5<5I5I!M`5a*1*>*>q)*L!O	!
   	KKgjkklI	s   A 	B
&B?B
B
c                 P   |ra| j                  d      }	 |j                  d      }d}|D ]4  }t        j                  |d      |k(  st        j                  |d	      } |S  |S t        j                  d
       y# t        $ r"}t        j                  d|z         Y d}~yd}~ww xY w)z
        Return a specified server preference.

        Parameters required:    pref { name of preference }

        Output: string
        r   r   SettingzITautulli Pmsconnect :: Unable to parse XML for get_local_server_name: %s.Nr|   Noner   valuezLTautulli Pmsconnect :: Server preferences queried but no parameter received.)rv   r   r   r   r   r	   r   r  )r=   r   prefsr   r   
pref_valuer  s          r"   r   zPmsConnect.get_server_pref
  s     )))>E 55i@
  J ''40D8!(!5!5a!AJ
 LLgh  gjkkls   A: :	B%B  B%c                 *   | j                  d      }	 |j                  d      }g }|D ]  }|j                  d      r2|j                  d      dk(  rt        j                  d       dg d	}|c S |j                  d
      sY|j                  d
      }|D ]  }t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d      d}|j                  |         t        j                  |d   d      t        j                  |d   d      |d}	|	S # t        $ r$}t        j                  d|z         g cY d}~S d}~ww xY w)z^
        Return processed and validated server libraries list.

        Output: array
        r   r   r   zFTautulli Pmsconnect :: Unable to parse XML for get_libraries_list: %s.Nr   r   z)Tautulli Pmsconnect :: No libraries data.)libraries_countlibraries_listr   r   r   r   agentr   r   )rl   rB  r0  rw  r   r   r   title1)ru  r   rv  )
rz   r   r   r   r   r  r  r	   r   r  )
r=   rC  r   r   rv  r  rD  rE  libraries_outputr  s
             r"   get_server_childrenzPmsConnect.get_server_children
  s    00u0E	%::;KLH
  	<A~~f%>>&)S0LL!LM9<8:&(N *)%%k244[A) <F6=6J6J6SX6Y8?8L8LVU[8\8?8L8LVU\8]181E1Efg1V181E1Efg1V/6/C/CFE/R(*$ #))*:;<	<* &-%9%9(1+v%N"//XF$2
 A  	KK`cddeI	s   E% %	F.FFFc                 
   |dk(  rd}nR|dk(  rd}nJ|dk(  rd}nB|dk(  rd}n:|d	k(  rd
}n2|dk(  rd}n*|dk(  rd}n"|dk(  rd}n|dk(  rd}n|dk(  rd}n
|dk(  rd}nd}t        |      j                         r4|dk7  r/| j                  t        |      d      }		 |	j                  d      }
nnt        |      j                         s|dk(  r9|dk(  r|r|dt        |      z   z  }| j                  t        |      ||||d      }
nt        j                  d       g S d}g }|
D ]  }|j                  d       r2|j                  d       dk(  rt        j                  d!       dg d"}|c S |rt        j                  |
d#   d       }nt        j                  |
d#   d$      }g }|j                  d%      r;|j                  d%      }||D cg c]  }t        j                  |d&      s| c}z  }|j                  d'      r||j                  d'      z  }|j                  d(      r||j                  d(      z  }|j                  d)      r||j                  d)      z  }|D ]  }t        j                  |d*      }|j                  d%k(  r|dk(  rd}i d+t        j                  |d,      d-|d.t        j                  |d&      d/t        j                  |d0      d1t        j                  |d2      d3t        j                  |d3      d4t        j                  |d5      d6t        j                  |d7      d8t        j                  |d9      d:t        j                  |d;      d<t        j                  |d=      d>t        j                  |d?      d@t        j                  |d@      dAt        j                  |dA      dBt        j                  |dA      dCt        j                  |dD      dEt        j                  |dF      }|r|j                  dG      }|D ]  }t        j                  |dH      t        j                  |dI      t        j                  |dJ      t        j                  |dK      j                         t        j                  |dL      t        j                  |dM      t        j                  |dN      t        j                  |j                  dO      d#   dP      t        j                  |j                  dO      d#   d       dQ	}|j                  |       	 |j                  |         ||d"}|S # t        $ r$}t        j                  d|z         g cY d}~S d}~ww xY wc c}w )Rz
        Return processed and validated server library items list.

        Parameters required:    section_type { movie, show, episode, artist }
                                section_id { unique library key }

        Output: array
        r   z&type=1r   z&type=2rP  z&type=3rS  z&type=4r   z&type=8rZ  z&type=9r[  z&type=10r.  r|   r/  z&type=14picturez&type=13&clusterZoomLevel=1rg  z&type=12&clusterZoomLevel=1r   r   r   zPTautulli Pmsconnect :: Unable to parse XML for get_library_children_details: %s.Nz&artist.id=)rl   r   rh   r   r   rG   z`Tautulli Pmsconnect :: get_library_children called by invalid section_id or rating_key provided.r   r   z'Tautulli Pmsconnect :: No library data.)r   rY  r   r   r   r   r   r+  r,  r   rl   r   r   rU   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  rp  r  rz  r  r  r  r  r  rq  r  )	r  rz  ru  r  r  r  r  r  r  )r   r  r_   r   r   r   r   r   r  r  r	   r   r  r  r  r  )r=   rl   rB  r   rh   rU   r   get_media_infor   r   r   r   r   rY  r  	item_mainr>  r?  r<  r   	item_info
item_mediar+  rl  r  s                            r"   get_library_children_detailsz'PmsConnect.get_library_children_details
  s    7"!IV#!IX%!IY&!IX%!IW$!IW$"IW$I]*"IY&5IV#5IIz?""$)@55c*oUZ5[L'<<=MN
 _$$&,'*Aw&:]S_<<	..z?#### / H KKz{I  B	0A~~f%>>&)S0LL!JK6968%'M )( ' 4 4Xa[& I ' 4 4Xa[+ N I%%k211+>ZAW5I5I![5YaZZ	%%g.Q33G<<	%%g.Q33G<<	%%g.Q33G<<	! '0$11$?
==K/J'4I!.J\7+?+?CU+V ):)7+?+?k+R 1'2F2FtM^2_ 6w7K7KDRh7i	
 %g&:&:4&I ,W-A-A$-V 1'2F2FtM_2` .w/C/CD//Z *7+?+?k+R +G,@,@w,O 273G3Gm3\ $W%9%9$%G %g&:&:4&I ,W-A-A$-P 1'2F2FtM_2`  ()=)=dI)N!	& "!%!:!:7!CJ!+ 53:3G3G{3[181E1EeY1W5<5I5I%Q]5^:A:N:NuVg:h:n:n:p9@9M9MeUe9f5<5I5I%Q]5^8?8L8LUTc8d.5.B.B5C]C]^dCefgChjp.q3:3G3GHbHbciHjklHmou3v	&(
 "((45 $$Y/O'07B	0H $1#0 C  nqrrs	X [s*   T: U*U*:	U'U"U'"U'c           
      <   | j                         }g }|r|d   dk7  r}|d   }|D ]r  }|d   }|d   }| j                  ||d      }|s%||d   ||d	   |d
   |d   |d   dd}|dk(  r\| j                  |dd      }	|	rd|	d   i}
|j                  |
       | j                  |dd      }|rd|d   i}|j                  |       |dk(  r\| j                  |dd      }	|	rd|	d   i}
|j                  |
       | j                  |dd      }|rd|d   i}|j                  |       |dk(  r\| j                  |dd      }	|	rd|	d   i}
|j                  |
       | j                  |dd      }|rd|d   i}|j                  |       |j                  |       u |S )z[
        Return processed and validated library statistics.

        Output: array
        ru  r   rv  rB  rl   r   )rl   rB  rh   r0  rw  r   r   r   r)  )rl   r0  rB  rw  r   r   rh   	is_activer   rP  parent_countrS  r  r   rZ  r[  r.  r|  rg  )rz  r  r  r  )r=   server_librariesserver_library_statsrv  rA  rB  rl   rY  library_statsparent_listparent_stats
child_listchild_statss                r"   get_library_detailszPmsConnect.get_library_details{  sF     335! 01B Cs J-.>?N) 1?&~6$\2
 $ A AZfrz} A ~ 3=5<^5L5A.5g.>.5g.>,3EN.;O.L23%'M $v-&*&G&GS]lt|&G  'A&,:K<X+YL)00>%)%F%FR\kt|%F  &A
%+8*_:U*VK)00=#x/&*&G&GS]ls{~&G&&,:K<X+YL)00>%)%F%FR\krz}%F%~
%+8*_:U*VK)00=#w.&*&G&GS]lu  ~A&G  'B&,:K<X+YL)00>%)%F%FR\kqy|%F%}
%+8*_:U*VK)00=(//>c1?f $#r$   c                    | j                  t        |      d      }	 |j                  d      }g }|D ]  }|j                  d      r-|j                  d      dk(  rt	        j                  d       |c S |j                  d      sS|j                  d      }|D ]@  }t        j                  |d	      t        j                  |d
      d}	|j                  |	       B  |S # t        $ r"}t	        j
                  d|z         Y d }~y d }~ww xY w)Nr   )rl   rG   r   zMTautulli Pmsconnect :: Unable to parse XML for get_library_label_details: %s.r   r   z&Tautulli Pmsconnect :: No labels data.r   r   r   )r   label_title)r   r   r   r   r   r   r  r  r	   r   r  )
r=   rl   labels_datar   r   labels_listr  labels_mainr<  r#  s
             r"   get_library_label_detailsz$PmsConnect.get_library_label_details  s   --ZX]-^	"778HIH
  	.A~~f%>>&)S0LL!IJ&&%%k244[A' .D*1*>*>tU*K,3,@,@w,OE  &&u-	.	. )  	KKgjkkl	s   C   	D)DDc
                    |xs d}|xs d}|rT|j                  d      }|j                  d      }d|v rd|v r|j                  dd      }|	ro|sm|sk|j                  d      }|d	   j                         rdj	                  |d
d	       }dj                  |j                  d      t        j                               }|rdd|z  i}n@|rd|dt        d| j                  i      i}ndd|dt        d| j                  i      i}||d<   ||d<   ||d<   |r||d<   |r||d<   |r||d<   dt        |      z  }| j                  j                  |dd      }|y
|d   |d   fS t        j                  d       y
)a  
        Return image data as array.
        Array contains the image content type and image binary

        Parameters required:    img { Plex image location }
        Optional parameters:    width { the image width }
                                height { the image height }
                                opacity { the image opacity 0-100 }
                                background { the image background HEX }
                                blur { the image blur 0-100 }
        Output: array
        rN    httpz/:/resourcesr^   rd  r   r}   r*  Nz{}/{}r0   z%sr   zX-Plex-Tokenzhttp://127.0.0.1:32400r~   r  r  r2   opacity
backgroundblurz/photo/:/transcode?%srC   T)rE   rF   return_typer   r)  zATautulli Pmsconnect :: Image proxy queried but no input received.)r  r  r  r  r  r2   r  r	   r  r   r-   r<   rI   r   r  )r=   imgr  r  r  r  r  
img_formatrg  refreshkwargsweb_imgresource_img	img_splitparamsrE   rE  s                    r"   	get_imagezPmsConnect.get_image  s    4nnV,G>>.9Ls"{c'9kk+w7w|IIcN	R=((*((9Sb>2CnnSZZ_g6G6G6IJ,CNDJJ;W1X!YZ#yR`bfblblQmGn!op#F7O%F8)F8$+y!'1|$!%v)If,==C))663DICG 7 IF ~ay&)++ LL\]r$   c           	         | j                  ||d      }	 |j                  d      }g g g g g g g g d}|D ]  }|j                  d      }|D ]  }	t        j                  |	d      d	k(  st        j                  |	d
      |vr6|	j                  d      rW|	j                  d      }
|
D ]A  }t        j                  |d      }| j                  |      }||d      j                  |       C |	j                  d      r|	j                  d      }
|
D ]  }t        j                  |d      }| j                  |      }||d      j                  |       |d   dk(  sK| j                  |d         }|d   dk7  si|d   D ]1  }|d   s	| j                  |d         }|d   j                  |       3  |	j                  d      sy|	j                  d      }
|
D ]A  }t        j                  |d      }| j                  |      }||d      j                  |       C   t        d |j                         D              |d}|S # t        $ r$}t        j                  d|z         g cY d}~S d}~ww xY w)zQ
        Return processed list of search results.

        Output: array
        r   )r   r   rG   r   zETautulli Pmsconnect :: Unable to parse XML for get_search_result: %s.N)r   r   rP  rS  r   rZ  r[  r^   rY  r   r   r   r   r   rU   r   r   r   rU   rM  r   rY  rP  r+  c              3   2   K   | ]  }t        |        y wr\  r\  )rV  ss     r"   rX  z0PmsConnect.get_search_results.<locals>.<genexpr>S  s     &T!s1v&Ts   r]  )r   r   r   r   r   r	   r   r   r  r  r`  values)r=   r   r   search_resultsr   r   search_results_listr  rb  rc  rD  rE  rU   r]   show_seasonsrP  r  s                    r"   get_search_resultszPmsConnect.get_search_results  s    uEQVW	%::;KLH
 )+'))+*,)+(*(*-/!  #	UA))%0D  U''62c9((F3;NN))'2"#"8"8"AK"- U%,%9%9&+%N
#'#<#<
#<#S+H\,BCJJ8TU
 ))+6"#"8"8"EK"- W%,%9%9&+%N
#'#<#<
#<#S+H\,BCJJ8T#L1V;+/+A+AXVbMc+A+dL+,<=B.:?.K !WF'-l';373L3LX^_kXl3L3m(;H(E(L(LX(V!WW ))'2"#"8"8"AK"- U%,%9%9&+%N
#'#<#<
#<#S+H\,BCJJ8TU; U#	UJ $'&T7J7Q7Q7S&T#T"5 o  	KK_bccdI	s   I 	I3I.(I3.I3c                    |dk(  rddt        |      ii}|S |dk(  s
|dk(  s|dk(  rd}nd}d	}d	}|d
k(  s|dk(  r(	 | j                  |      }|d   }|d   }|d   }|d   }n^|dk(  s|dk(  r(	 | j                  |      }|d   }|d   }|d   }|d   }n,|dk(  s|dk(  r"	 | j                  |      }|d   }|d   }|d   }|dv r/dj                  |      }
| j                  t        |      |
d      }n.| j                  t        |      d      }	 |j                  d      }|D ]  }|j                  d      r|j                  d      dk(  ri c S |j                  d      r|j                  d      }ng }i }|D ]  }t        j                  |d       }t        j                  |d      }t        j                  |d      }|sI| j                  t        |      d      }	 |j                  d      }|D ]  }|j                  d      r|j                  d      dk(  ri c c c S |j                  d!      r|j                  d!      }n%|j                  d"      r|j                  d"      }ng }i }|D ]t  }t        j                  |d       }t        j                  |d      }t        j                  |d      }|sH|rt        |      n|}|j                  |dt        |      ii       v  |dk(  rt        |      nt        |      j                         }|j                  |t        |      d#i         |dk(  rdnt              j                         }|t        |      d#d|d|i}|S # t        $ r$}	t        j                  d|	z         i cY d	}	~	S d	}	~	ww xY w# t        $ r$}	t        j                  d|	z         i cY d	}	~	S d	}	~	ww xY w# t        $ r$}	t        j                  d|	z         i cY d	}	~	S d	}	~	ww xY w# t        $ r$}	t        j                  d|	z         i cY d	}	~	S d	}	~	ww xY w# t        $ r(}	t        j                  d|	z         i cY d	}	~	c c S d	}	~	ww xY w)$zg
        Return processed list of grandparent/parent/child rating keys.

        Output: array
        r   r   rU   r   rZ  r[  r   r   NrP  r  r   r   rl   r   zTTautulli Pmsconnect :: Unable to get parent_rating_key for get_rating_keys_list: %s.rS  r   r   zYTautulli Pmsconnect :: Unable to get grandparent_rating_key for get_rating_keys_list: %s.r   )r   rZ  r[  r7  r   r8  r   r   zHTautulli Pmsconnect :: Unable to parse XML for get_rating_keys_list: %s.r   r   r   r   r   r+  )rU   children)r   r   r   r   r   r2   r   r   r_   r   r  r	   r   r  r  )r=   rU   r   key_list
match_typerl   r   r]   r   r   r   r   r  parents_metadataparentsr<  r   parent_indexr   children_metadatar  r=  child_indexchild_titler   s                            r"   get_rating_keys_listzPmsConnect.get_rating_keys_listY  s     L#j/:;HO!Z7%:jG>S J J
 !Z7%:44
4K 0%&9:
%l3
'7
 9$
g(=44
4K !45%&>?
%l3
'7
 6!Z8%;44
4K )%l3
'7 55.55jAI..z?## / H 11#j/QV1WH#889IJ
  4	'A~~f%>>&)S0I%%k2#$#9#9+#F #% G( )'$+$8$8{$K!&33D'B&33D'B$#99#>O:P`e9fH"#+#@#@AQ#R
 & ^>>&1 ~~f5<')	11':010F0Fw0O-33G<010F0Fw0O-02-#%$5 ^D/6/C/CD+/V,*1*>*>tW*MK*1*>*>tW*MK/:Ec+&6; (|SIYEZ6[0\ ]^^, 0:W/D#l+#lJ[JaJaJcCNNC367H3I19%;$& 'M)'4	'l (ac%j.>.>.@J&-/ *"L Q  ruvvw	  wz{{|	  wz{{|	$  fijjk	4 % "$nqr$rs!		"s   &M* ,&N !O
 O: P**	N3NNN	O#O<OO
	O7O2,O72O7:	P'P"P'"P'*	Q3QQQc                 `   | j                  d      }	 |j                  d      }i }|D ]  }t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d	      t        j                  |d
      t        j                  |d      d}|d   dk(  rd|d<   |d   dvrd|d<   |d   dk(  rd|d<   |d   dk(  rd|d<   d|d<    |S # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w)Nr   r   MyPlexzGTautulli Pmsconnect :: Unable to parse XML for get_server_response: %s.mappingStatemappingErrorsignInStatepublicAddress
publicPortprivateAddressprivatePort)mapping_statemapping_errorsign_in_statepublic_addresspublic_portprivate_addressprivate_portr  unknownz'Plex remote access port mapping unknownrP   )mappedwaitingz"Plex remote access port not mappedr  unreachablezHPlex remote access port mapped, but the port is unreachable from Plex.tvpublisherrorzIPlex remote access port mapped, but failed to publish the port to Plex.tvr|   )r   r   r   r   r   r	   r   )r=   account_datar   r   server_responser  s         r"   get_server_responsezPmsConnect.get_server_response  sY   ''e'<	#88BH
  	/A070D0DQ0W070D0DQ0W070D0DQ0V181E1Ea1Y.5.B.B1l.S292F2FqJZ2[/6/C/CA}/U!O /9<,U) 19NN,P) 1]B-W) 1^C-X) -/)+	/. ;  	KKadeef	s   D 	D-D((D-c           
         | j                          | j                  d      }	 |j                  d      }i }|D ]  }|j                  d      s|j                  d      }|D ]n  }t        j                  |d	      t        j                  |d
      t        j                  |d      t        j                  |d      t        j                  |d      d}p  |S # t        $ r}t	        j
                  d|z         |g k(  rqt	        j
                  d       t	        j                  d       dt        j                  _	        t        j                          t        j                  j                          i cY d }~S d }~ww xY w)Nr   r   r   zDTautulli Pmsconnect :: Unable to parse XML for get_update_staus: %s.z[Plex API updater XML is broken on the current PMS version. Please update your PMS manually.zOTautulli is unable to check for Plex updates. Disabling check for Plex updates.r   Release
canInstalldownloadURLrc  re  fixed)can_installdownload_urlrc  re  	changelog)r   r   r   r   r   r   r   r   r   MONITOR_PMS_UPDATESinitialize_schedulerr   r	   r   )r=   updater_statusr   r   updater_infor  releaser<  s           r"   get_update_stauszPmsConnect.get_update_staus  sQ   )))>	%::;KLH"  		&A%%i000;# &D3:3G3G<3X4;4H4HM4Z/6/C/CD)/T-4-A-A$-P181E1EdG1T	$&L&		& 9  	KK^abbc #yzmn 561++-##%I	s   C 	E9BE4.E94E9c                     | j                         }|j                  dt        j                  j                        }t        j                  j                  d|       t        j                  j                          y )Nrc  PMS_VERSION)rm  r  r   r   r  r   r   )r=   rk  rc  s      r"   set_server_versionzPmsConnect.set_server_version'  sN    ++-,,y&--*C*CD!!-9r$   c                     t         j                  j                  dk(  r| j                  d      }|dk(  ryyt         j                  j                  S )NplexButlerUpdateChannelr   betapublic)r   r   PMS_UPDATE_CHANNELr   )r=   update_channel_values     r"   get_server_update_channelz$PmsConnect.get_server_update_channel.  sD    ==++v5#'#7#78M#N #s*}}///r$   c                    t        j                  | d      }t        j                  t        j                  | d            }t        j                  | d      }t        j                  | d      }t        |dkD  xr |dk(  xs |dk(        }t        |      }|s|syg }t        j                  t
        j                  j                        t        j                  d	      k\  rZd
|v sd|v r|j                  d
       d|v r|j                  d       d|v r|j                  d       n=d|v r9|j                  d       n'|r|j                  d
       n|r|j                  d       |sydj                  |      S )NextendedDisplayTitler|  r  r     	smpte2084zarib-std-b67SDRz1.25.6.5545zDolby VisionDoViHLGHDR10HDRr}   )
r	   r   r  r  version_to_tupler   r   r  r  r  )r0  extended_display_title	bit_depth	color_trcDOVI_profiler  DVr  s           r"   r
  zPmsConnect.get_dynamic_range9  sX   !(!5!5f>T!U''(<(<VZ(PQ	((<	++FMB9q=^i;&>&])~B]_,2  ##FMM$=$=>'BZBZ[hBii!776E[;[#**>:..#**5100#**7300#**51#**>:#**51"xx+,,r$   c                 f   | j                  d      }	 |j                  d      }g }D ]  }|j                  d      }|D ]  }t        j                  |d      t        j                  |d      t        j                  |d      t        j                  |d	      t        j                  |d
      t        j                  |d      t        j                  |d      t        j                  |d      d}|j                  |         |S # t        $ r#}t        j                  d|z         Y d }~d }~ww xY w)Nr   r   r   zATautulli Pmsconnect :: Unable to parse XML for get_dvrs_list: %s.Dvrr   r  r  lineupTitlelineupcountryrefreshedAtepgIdentifier)r   r  r  lineup_titler  r  r  rk  )r   r   r   r   r   r	   r   r  )	r=   dvrs_xmlr   r   dvrs_outputr  dvrsr'  dvr_infos	            r"   r  zPmsConnect.get_dvrs_list]  s'   ==u=5	a445EFH  	-A))%0D -"//U;#00f= ' 4 4S* E$+$8$8m$L%223A&33CC#*#7#7]#K&-&:&:3&P	 ""8,-	- )  	aKK[^__``	as   D 	D0D++D0)NN)r|   )r|   r|   )r|   Fr|   )r   r   r|   )r|   r   r   r|   )r|   allr   r   r|   r|   r|   )r|   r  r|   r|   r|   r|   )r|   r|   r|   )r   r   r|   Fr|   )r   r   r|   r|   )	r|   r|   r|   r|   r|   FNFT)r|   FNN)F)NF)r|   NFr\  )r|   r|   r  r|   r|   r|   F)	NrN  r  NNNpngFF):__name__
__module____qualname____doc__r@   rL   rQ   rV   rZ   r_   ra   rc   ri   rm   ro   rq   rs   rv   rx   rz   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r9  rF  rR  rL  rI  r  re  r   rm  r   rz  r  r  r  r  r  r  r  r  r  r  staticmethodr
  r  r   r$   r"   r   r   8   so   T6 "$       \^57* VX79B ( IV df^bRh 8t-^1fkZ'RJX@D6,8*X ceQVJX@$D6 `d8=<^|AFCJ"H#J	0 !- !-Fr$   r   )r  r  timeurllib.parser   r   r   xml.dom.minidomr   r   r   r   r	   r
   r   r   r   r   r   r#   objectr   r   r$   r"   <module>r     sJ   $  	  5 5    %        (~4 ~4r$   