
    ڌhW                     (   d Z ddlmZmZ ddlZddlmZ ddlmZ ddl	m
Z
mZmZmZmZmZ ddlmZ 	 dd	lmZmZmZmZmZmZ eeef         Zn# e$ r Y nw xY wd
Zdej        iZdZe                    d          Z e                    d          Z!e                    d          Z"e                    d          Z#e                    d          Z$e                    d          Z%dZ&dej'        iZ(d Z)d dZ*d Z+d Z,d!dZ-d Z.d"dZ/d Z0d Z1d Z2d Z3dS )#z#Functions to interact with TMDb API    )absolute_importunicode_literalsN)floor)pformat   )cache
data_utils	api_utilssettingsimdbratingstraktratings)logger)TextOptionalUnionListDictAny))z
User-Agentz:Kodi TV Show scraper by Team Kodi; contact pkscout@kodi.tv)Acceptzapplication/jsonapi_keyzhttps://api.themoviedb.org/3/{}ztv/episode_group/{}z	search/tvzfind/{}ztv/{}ztv/{}/season/{}ztv/{}/season/{}/episode/{}z%https://webservice.fanart.tv/v3/tv/{}c                  t    t          j                    } t                                          }| d         |d<   |S )NLANG_DETAILSlanguage)r   getSourceSettingsTMDB_PARAMScopy)source_settingsparamss     h/Users/chudy/Library/Application Support/Kodi/addons/metadata.tvshows.themoviedb.org.python/libs/tmdb.py_get_paramsr    3   s5    022OF(8F:M    c                 t   t          j                    }t          j        t	          t
                               t                      }g }t          j        |           }|rt          j
        d|d         d|d         d           |d         dk    r!t                              |d                   }nvt                              |d                   }|d         |d<   nJt          j
        d| z             t          }t          j        d	|           |d
<   |rt#          |          |d<   t          j        |||d                   }|[|rC|d         dk    r |                    d          dk    rg }n1|g}n-|                    dg           }n|                    dg           }t          j        i            |S )z
    Search for a single TV show

    :param title: TV show title to search
    : param year: the year to search (optional)
    :return: a list with found TV shows
    zusing typez of titlez to find showtmdb_idexternal_sourcezusing title of %s to find showNFKCqueryfirst_air_date_year
VERBOSELOGr   
verboselogNsuccessfalse
tv_resultsresults)r   r   r
   set_headersdictHEADERSr    r	   parse_media_idr   debugSHOW_URLformatFIND_URL
SEARCH_URLunicodedata	normalizestr	load_infoget)r$   yearr   r   r0   ext_media_id
search_urlresps           r   search_showrC   :   s    022O$w--(((]]FG,U33L 6"6***L,A,A,AC 	D 	D 	D9,,!g)>??JJ!g)>??J(4V(<F$%%5=>>>
%/>>w 	6,/IIF()6ol.KM M MD 		.F#y0088I&&'11 GG#fGG((<44hhy"--G"Nr!   c                    g d}t          j                    }t          j        t	          t
                               t                      }|                                 D ]b\  }}||v rY|dz   |d<   t          	                    |          }t          j
        |||d                   }||                    dg           c S ct          j                     g S )zy
    Find a show by external IDs
    :param unique_ids: dict of external IDs
    :return: a list with found TV shows
    )imdbfacebook	instagramtvdbtiktoktwitterwikidatayoutube_idr&   r*   r+   Nr/   )r   r   r
   r1   r2   r3   r    itemsr8   r7   r=   r>   )
unique_idssupported_idsr   r   keyvaluerA   rB   s           r   
find_by_idrS   g   s    I I IM022O$w--(((]]F &&(( 2 2
U-(+eF$%!//J&6ol6SU U UDxxb11111Ir!   c                    	 t          j                    }t          j        t	          t
                               g }|jt          j        d|z              t          	                    |          }t          j
        |t          |d                   }|g | d<   |                    dg           D ]}g }	 |                    t          |d         d         d	                   i                                           }	n# t          $ r Y Yw xY w|d
         |	d
<   |d         |	d	<   |d         D ][}
|
d	         |
d<   |
d         |
d<   |d         |
d	<   |
d         dz   |
d<   |                    |
           |                    |
           \||	d<   | d                             |	           nt          j        d           g | d<   |                                D ] \  }}| d                             |           !|                     dg           D ]F}|                    dg           D ]-}
|
d	         |
d<   |
d         |
d<   |                    |
           .G|| d<   t          j        i            | S )zget the IMDB ratings detailsNz*Getting episodes with episode grouping of r*   r+   seasonsgroupsepisodesr   season_numbernameorderorg_seasonnumepisode_number	org_epnumr   z*Getting episodes from standard season list)r   r   r
   r1   r2   r3   r   r5   EPISODE_GROUP_URLr7   r=   r   r>   r<   r   
IndexErrorappendrN   )	show_info
season_mapep_groupingr   episode_listepisode_group_urlcustom_ordercustom_seasonseason_episodescurrent_seasonepisoderQ   rR   seasons                 r   load_episode_listrl   ~   s    4022O$w--(((L8;F	H 	H 	H-44[AA *kol>[] ] ]##%Ii !-!1!1(B!?!? < <"$%/^^M*5a8IJJB&P &PPTPTPVPV #N!   H)6v)>v&2?2H/,Z8 1 1G/6/GGO,+23C+DGK(/<W/EGO,070@10DG,-#**7333 ''0000-<z*)$++N;;;;ABBB!	)$**,, 	/ 	/JCi ''....mmIr22 	- 	-F!::j"55 - -+2?+C('./?'@$##G,,,,- )Ij"s   6AC>>
D
Dc           	      h
   t          j        t          t                               t	          j                    }|dk    rg }t          j        |           }|t          j	        d           t                              |           }t                      }d|d<   d|d         dd         z  |d	<   d|d         dd         z  |d
<   t          j        |||d                   }|dS |d         dk    rW|d         dk    rKd|d<   |d= t          j        |||d                   }||                    dd          |d<   |d         |d<   i }d|d<   |                    dg           D ]#}	t                              | |	                    dd                    }
t          j        |
|i |d                   }|                    dd          dk    s;|                    dd                                                              d          r|d         dk    rd|d<   t          j        |
|i |d                   }|d         |d<   |                    dd          dk    r|                    dd          |d<   |                    dd                                                              d          r|                    dd          |d<   |D ]n}t%          |d                   t%          |	                    d                    k    r3t          j	        d|d         d|	d                    |d         |d<    not'          |                    di                     |d<   ||t%          |	                    dd                    <   %t)          |||          }t+          |          |d<   t-          |          }t'          |                    di                     |d<   t/          |          }g }g }t1          |                    dg                     D ]}	|	                    di                               dg           D ]X}|                    dd          |vr>|                    |           |                    |                    dd                     Y||d         d<   t          j	        d           |d         r.t          j	        t          t5          |                               t          j        |           nt          j	        d            t          j        i            |S )!z
    Get full info for a single show

    :param show_id: themoviedb.org show ID
    :param ep_grouping: the episode group from TMDb
    :param named_seasons: the named seasons from the NFO file
    :return: show info or None
    Nz)no cache file found, loading from scratchz;credits,content_ratings,external_ids,images,videos,keywordsappend_to_response
%s,en,nullLANG_IMAGESr      include_image_languageinclude_video_languager*   r+   overview r   en-USr   zcredits,imagesrU   rX   )r   defaultr,   rY   rk   zadding season name of r   z& from named seasons in NFO for season imagesratingscreditscastzsaving show info to the cachezusing cached show info)r
   r1   r2   r3   r   r   r   load_show_info_from_cacher   r5   r6   r7   r    r=   r>   
SEASON_URLlower
startswithr<   _sort_image_typesrl   load_ratingsload_fanarttv_arttrim_artworkreversedr`   r   cache_show_info)show_idrc   named_seasonsr   ra   show_urlr   show_info_backuprb   rk   
season_urlseason_infoseason_info_backupnamed_season
cast_checkr{   cast_members                    r   load_show_infor      s    $w--(((022O/88I@AAA??7++'d#$+7/-:XYZ[\Y\:]+]'(+7/-:XYZ[\Y\:]+]'('V0MO O O	4Z B&&?>+Jg+U+U!(F:+,(2OL4Q S  S  S+(8(<(<Z(L(L	*%!0!@F:
'7#$mmIr22 	J 	JF#**OQ779 9J#-62/R^B_a a aK
B//255QS9T9T9Z9Z9\9\9g9ghp9q9q5  xG  HV  xW  [b  xb  xb%,z"%.%8vroVbFc&e &e &e"%4^%Dz"??:r22b88.@.D.D"B/( /(K
+??62..4466AA(KK M*<*@*@*L*LK' -  |A''3vzz//J/J+K+KKKLL$Q)@)@"B C C C*6q/K'E	 L %6"--%/ %/K!>IJs6::oq99::;;%i[II	+I66	)%i00	/	h0K0KLL	( ++	
y}}Y;;<< 	C 	CF%zz)R88<<VRHH C C??62..j@@KK,,,%%koofb&A&ABBBC (,	)V$4555<( 	5L	 2 233444i((((-..."r!   c                    t          j                    }t          j        t	          t
                               t          |           }|	 |d         t          |                   }n# t          $ r Y dS w xY wt          
                    |d         |d         |d                   }t                      }d|d<   d|d	         d
d         z  |d<   t          j        |||d                   }|dS d}d}	|                    d          }
|
dk    rd}dt          |d                   z   |d<   n/|
                                                    d          s|
dk    rd}|                    dd          dk    rd}	|	s|r|d         dk    rsd|d<   |d= t          j        |||d                   }|L|	r|                    dd          |d<   |r/|                    ddt          |d                   z             |d<   t#          |                    di                     |d<   |d         |d<   |d         |d<   |d         |d<   |d         |d<   t%          ||                    di                               d                    |d<   |                    d g           D ]P}|                    d          |d         k    r/|                    d!i                               d"g           |d#<    nQ||d         t          |          <   t'          j        |           t          j        i            |S t          j        i            dS )$zi
    Load episode info

    :param show_id:
    :param episode_id:
    :return: episode info or None
    NrW   idr[   r]   zcredits,external_ids,imagesrn   ro   rp   r   rq   rr   r*   r+   FrY   TzEpisode r\   rj   ru   rt   r   rv   r   rx   rX   external_idsimdb_id)show_imdb_idry   rU   rz   r{   season_cast)r   r   r
   r1   r2   r3   r   intKeyErrorEPISODE_URLr7   r    r=   r>   r<   r~   r   r   r   r   r   )r   
episode_idr   ra   episode_infoep_urlr   	ep_returnbad_return_namebad_return_overview
check_nameep_return_backuprk   s                r   load_episode_infor     s    022O$w--(((w''I	$Z0ZALL 	 	 	44	 ##dO\/:L<UW W'D#$+7/-:XYZ[\Y\:]+]'('6ol.KM M M	4#]]6**
"O *L!1233!4If**955 	#r9I9I"O==R((B.."& 	R? 	R8W[b8b8b!(F:+,(2v/,2O Q  Q  Q+& (,<,@,@"B-( -(Ij)" R(8(<(<
S>N1O-P-P P)R )RIf%/	h0K0KLL	(%1/%B	/"&23C&D	"#%1/%B	/"!-k!:	++IMM."$E$E$I$I)$T$T V  V  V	)mmIr22 	 	Fzz/**l?.KKK+1::r,# ,##&3vr?? -( L 2;	*c*oo.i(((b!!!"4s   A) )
A76A7ru   c                    t          j                    }i }|                     di                               d          }|d         D ]}t          j        d|z             |dk    r| d         | d         d|d<   4|d	k    rA|r?t          j        |                              d
          }|r|                    |           {|dk    rj|r(| d         }| d         }t          j        |||          }	nt          j        |          }	|	                    d
          }
|
r|                    |
           t          j        d	                    t          |                               |S )z
    Load the ratings for the show/episode

    :param the_info: show or episode info
    :param show_imdb_id: show IMDB
    :return: ratings or empty dict
    r   r   RATING_TYPESzsetting rating using %stmdb
vote_countvote_average)votesratingrE   ry   traktr[   r]   )rk   rj   zreturning ratings of
{})r   r   r>   r   r5   r   get_detailsupdater   r7   r   )the_infor   r   ry   r   rating_typeimdb_ratingrk   rj   rB   trakt_ratings              r   r   r   J  s    022OGll>2..229==G&~6 - -.<===&  (0(>)1.)AC CGFOOF""w"%1'::>>yIIK ,{+++G## 9!/2";/#/ B B B $/8888I..L -|,,,
L+22773C3CDDEEENr!   c           
          t          j                    }t          j        t	          t
                               |d         r|d         t          d<   |                     di                               d          }|r||d         rst          	                    |          }t          j
        |t          |d                   }|| S t           j                                        D ]\  }}| d	                             |          s |                    d
          sg | d	         |<   |                    |g           D ]}|                    d          }|dk    s|dk    rd}d}	|||d         dd         k    s|dk    r|                    d          }	|	r^|                    d
          r#|dd         }
t          t          |                     dg                               D ]}| d         |         d         }|                    d
d          }| d         |                             d	          si | d         |         d	<   | d         |         d	                             |
          sg | d         |         d	         |
<   |dk    s|t!          |          k    r1| d         |         d	         |
                             |	d|d           | d	         |                             |	d|d           t          j        i            | S )zm
    Add fanart.tv images for a show

    :param show_info: the current show info
    :return: show info
    FANARTTV_CLIENTKEY
client_keyr   tvdb_idFANARTTV_ENABLEr*   r+   Nrx   rk   langru   00r   r   rq   enurl   rU   rX   fanarttv)	file_pathr#   	iso_639_1)r   r   r
   r1   r2   r3   FANARTTV_PARAMSr>   FANARTTV_URLr7   r=   FANARTTV_MAPPINGrN   r   rangelenr<   r`   )ra   r   r   fanarttv_urlartworkfanarttv_type	tmdb_typeitemr   filepath
image_types
season_num	artseasons                 r   r   r   n  sU    022O$w--(((+, N(78L(M%mmNB//33I>>G \?#45 \#**733%_\=Z\ \ \?(0(A(G(G(I(I 	\ 	\$M9X&**955 4i>R>RS[>\>\ 413	(#I.M266 \ \xx''2::D<4?>+J1Q3+O#O#OSW[_S_S_#xxH \ ++H55 \%.qrr]
!&s9==B+G+G'H'H!I!I 	d 	dA)29)=a)@)QJ(,2(>(>I#,Y#7#:#>#>x#H#H GDF	) 4Q 7 A#,Y#7#:8#D#H#H#T#T SPR	) 4Q 7 A* M(B)s:2N2N )) 4Q 7 A* M T T2:J]a$b$b!d !d !d	d "(+I6==*2JUYZZ\ \ \+\. "r!   c           	      6   i }d}d}|                      di                                           D ],\  }}t          |          }|dk    r||z   } d|i||<   ||z   }-|                      dg           D ]e}|                     di                                           D ]:\  }}t          |          }t          |d                   d|}d|i||<   ||z   };f|t          j        k    r|t          j        k    r| S |t          j        k    rut          j        dt          |          z             t          j        d	t          t          j                  z             d
|t          j        z
  z  }	| d         d         |	d= |t          j        k    r	|t          j        z
  |z  }
t          j        dt          |          z             t          j        dt          t          j                  dt          |
                     |                                D ]b\  }}d
t          t          |d         |
z                      z  ||         d<   t          j
        |dt          ||                              c|                      di                                           D ]1\  }}|dk    r||         d         }	|	dk    r| d         |         |	d= 2t          t          |                      dg                               D ]}| d         |                              di                                           D ]\\  }}t          | d         |         d                   d|}||         d         }	|	dk    r| d         |         d         |         |	d= ]| S )z
    Trim artwork to keep the text blob below 65K characters

    :param show_info: the current show info
    :return: show info
    r   rx   	backdropstotalrU   rX   _zthere are %s fanart imageszIthat is more than the max of %s, image results will be trimmed to the maxNzthere are %s non-fanart imageszthat is more than the max of z#, image results will be trimmed by reducez: )r>   rN   r   r<   r   	MAXIMAGESr   errorr   r   r5   r   r   )ra   image_countsimage_totalbackdrops_totalr   
image_listr   rk   thetyper   	reductionrQ   rR   r   s                 r   r   r     s    LKO"+--""="="C"C"E"E . .
JJ$$-5OO(/'7L$%-KK--	2.. . .&,jj2&>&>&D&D&F&F 	. 	."J

OOE!$VO%<!=!=!=!=zzJG%,e$4L!%-KK		.
 h(((_@R-R-R+++1C4H4HHIII`cfd  d    	! 	! 	!);;<h,VWW5X''' 8#55{B	5K8H8HHIII"####S^^^5 	6 	6 	6&,,.. 	G 	GJC*,E%.945566+7Lh'LSSS',s2C*D*D*DEFFFF&/mmHb&A&A&G&G&I&I 	= 	="J
[((!*-h7F{{h'
3FGG<s9==B778899 	O 	OA*3I*>q*A*E*EhPR*S*S*Y*Y*[*[ O O&
J	),Q/@AAAA::O%g.x8Q;;!),Q/9*EfggNO r!   c                 `    |                                  D ]\  }}t          ||          | |<   | S )zS
    sort the images by language

    :param imagelist:
    :return: imagelist
    )rN   _image_sort)	imagelistr   rx   s      r   r   r     sA     (oo// @ @
F +FJ ? ?	*r!   c                    t          j                    }g }g }g }d}| D ]}|                    d          }||d         dd         k    r|                    |           nI|dk    r|                    |           n-|r|                    |           n|                    |           d}|dk    r||z   |z   S ||z   |z   S )	zl
    sort the images by language

    :param images:
    :param image_type:
    :return: list of images
    Tr   r   r   rq   r   Fposters)r   r   r>   r`   )	rx   r   r   	lang_pref	lang_nulllang_en
firstimageimage
image_langs	            r   r   r     s     022OIIGJ  YY{++
81===U####4NN5!!!! (  ''''  '''

Y7"Y..9$w..r!   )N)NN)ru   )4__doc__
__future__r   r   r:   mathr   pprintr   ru   r   r	   r
   r   r   r   utilsr   typingr   r   r   r   r   r   InfoTypeImportErrorr3   TMDB_CLOWNCARr   BASE_URLr7   r^   r9   r8   r6   r}   r   r   FANARTTV_CLOWNCARr   r    rC   rS   rl   r   r   r   r   r   r   r    r!   r   <module>r      s^  & * ) 8 8 8 8 8 8 8 8                 O O O O O O O O O O O O O O O O      	================D#IHH 	 	 	D	
 (01,OO$9:: __[))
??9%%??7##__.//
oo:;;6h89  * * * *Z  .- - -`S S S SlC C CL! ! ! !H/ / /d6 6 6r
 
 
/ / / / /s   A AA