
    `id                         S SK r S SKrS SKrS SKrS SKrS SKrS SKJrJrJ	r	J
r
JrJr  S SKJr   S SKJr  \	" S5        \R&                  " 5       r " S S5      rg!   S SKJr  \	" S5         N.= f)	    N)addondialogVSlogVSPathisMatrixxbmc)	QuotePlus)dbapi2zSQLITE 3 as DB engine for tmdbzSQLITE 2 as DB engine for tmdbc                      \ rS rSr0 SS_SS_SS_SS	_S
S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_S S!_S"S#_S$S%S&S'S(S)S*S+S,S-S.S/.ErS0rS1rS2r\" 5       (       d  \	" \5      R                  S35      rO\	" \5      rSZS4 jrS[S5 jrS6 rS7 rS\S8 jrS9 rS]S: jrS; rS^S< jrS= rS_S> jrS`S? jrS@ rSA rSB rSC rSD rS[SE jrSF rSaSG jrSH r SI r!SJ r"SK r#SL r$SM r%SbSN jr&ScSO jr'SdSP jr(SQ r)SR r*SS r+SeST jr,SfSV jr-SW r.SX r/SYr0gU)gcTMDb      Aventure   Fantastique   	Animation   Drame   Horreur   Action#   u   Comédie$   Histoire%   Western5   ThrillerP   Crimec   Documentairein  zScience-Fictioni%  u   Mystèrei(  Musiquei)  Romancei)  FamilialGuerrezAction & AventureKidsNewsu	   RéalitézScience-Fiction & Fantastique
FeuilletonTalkzGuerre & PolitiqueEtrangeru
   Téléfilm)i *  i*  i
*  i*  i*  i*  i*  i*  i*  i*  i*  zhttps://api.themoviedb.org/%d/z/plugin://plugin.video.youtube/play/?video_id=%szFspecial://home/userdata/addon_data/plugin.video.vstream/video_cache.dbutf-8c                 L   [        5       U l        U R                  R                  S5      U l        X l        U R                  R                  S5      U l        U R
                  (       d  SU l        SU R                  R                  S5      -  U l        SU R                  R                  S5      -  U l         [        R                  " U R                  5      (       d  [        R                  " U R                  S S9U l        [        R                  U R                  l        U R                  R#                  5       U l        U R$                  R'                  S5        U R)                  5         g   [        R                  " U R                  S S9U l        [        R                  U R                  l        U R                  R#                  5       U l        U R$                  R'                  S5        g !   [+        S	U R                  -  5         N= f!   [+        S
U R                  -  5         g = f)Napi_tmdb	tmdb_langfr-FRzhttps://image.tmdb.org/t/p/%sposter_tmdbbackdrop_tmdb)isolation_levelzpragma journal_mode=walzError: Unable to write on %szError: Unable to connect to %s)r   ADDON
getSettingapi_keydebuglangposterfanartxbmcvfsexistsCACHEsqliteconnect	REALCACHEdbRowrow_factorycursordbcurexecute_cTMDb__createdbr   )selfr8   r9   s      B/home/kodi/.kodi/addons/plugin.video.vstream/resources/lib/tmdb.py__init__cTMDb.__init__F   s~   W
zz,,Z8
JJ))+6	yyDI5

8M8Mm8\\5

8M8Mo8^^
	>>$**-- ..N&,jj#!WW^^-


""#<=! .		 nnT^^TJDG"(**DGG)DJJJ89	04>>AB	2T^^CDs   5B2G( *A=H (HH#c                     US:w  a  U R                   R                  SU-   5        Sn U R                   R                  U5        [        S5        Sn U R                   R                  U5        [        S5        S
n U R                   R                  U5        [        S5        Sn U R                   R                  U5        [        S5        Sn U R                   R                  U5        [        S5        g !   [        SU-  5         N= f!   [        S5         N= f!   [        S	5         N= f!   [        S5         N= f!   [        S5         N= f!   [        S5         g = f)N zDROP TABLE zError: Unable to drop table %saj  CREATE TABLE IF NOT EXISTS movie (imdb_id TEXT, tmdb_id TEXT, title TEXT, year INTEGER, director TEXT, writer TEXT, tagline TEXT, cast TEXT, crew TEXT, rating FLOAT, votes TEXT, duration INTEGER, plot TEXT, mpaa TEXT, premiered TEXT, genre TEXT, studio TEXT, status TEXT, poster_path TEXT, trailer TEXT, backdrop_path TEXT, landscape_path TEXT, UNIQUE(tmdb_id));ztable movie creeez Error: Cannot create table moviezCREATE TABLE IF NOT EXISTS saga (tmdb_id TEXT, title TEXT, plot TEXT, genre TEXT, poster_path TEXT, backdrop_path TEXT, landscape_path TEXT, UNIQUE(tmdb_id));ztable saga creeezError: Cannot create table sagaap  CREATE TABLE IF NOT EXISTS tvshow (imdb_id TEXT, tmdb_id TEXT, title TEXT, year INTEGER, director TEXT, writer TEXT, cast TEXT, crew TEXT, rating FLOAT, votes TEXT, duration INTEGER, plot TEXT, mpaa TEXT, premiered TEXT, genre TEXT, studio TEXT, status TEXT, poster_path TEXT, trailer TEXT, backdrop_path TEXT, landscape_path TEXT, nbseasons INTEGER, UNIQUE(tmdb_id));ztable tvshow creeez!Error: Cannot create table tvshowzCREATE TABLE IF NOT EXISTS season (tmdb_id TEXT, season INTEGER, year INTEGER, premiered TEXT, season_title TEXT, poster_path TEXT, plot TEXT, episode INTEGER, UNIQUE(tmdb_id, season));ztable season creeez!Error: Cannot create table seasona%  CREATE TABLE IF NOT EXISTS episode (tmdb_id TEXT, originaltitle TEXT,season INTEGER, episode INTEGER, year INTEGER, title TEXT, director TEXT, writer TEXT, guest_stars TEXT, plot TEXT, rating FLOAT, votes TEXT, premiered TEXT, tagline TEXT, poster_path TEXT, UNIQUE(tmdb_id, season, episode));ztable episode creeez"Error: Cannot create table episode)rG   rH   r   )rJ   	dropTable
sql_creates      rK   
__createdbcTMDb.__createdbi   sL   	B

""=9#<=

2	6JJz*%&	
	5JJz*$%
2	7JJz*&'

	7JJz*&'
&	8JJz*'(q	2Y>?<	645	534<	756 	7560	867sF   $C4 &D	 &D ;&D- $&D? &E 4D	DD*-D<?EE c                      U R                   R                  5         U R                  R                  5         g!   [        S5         g= f)z!Cleanup db when object destroyed zUnable to close databaseN)rG   closerC   r   )rJ   s    rK   __del__cTMDb.__del__   s7    	JJGGMMO	,-s	   47 Ac                 <   U R                  SS5      n[        U5      nUS:  Gax  Sn[        R                  " S5      (       dZ  SS KnUR                  X1S   -   5        U R                  R                  S5      U-  n[        5       nUR                  U5      (       d  gOXSS K
nSS	KJn  UR                  X1S   -   5      n	U	R                  [        S
5      SS9  U" S
SSS9n
U
R!                  5       nUS:X  a  gU R                  SSUS   -   5      nSU;   a]  US   (       aS  U R                  R#                  S[%        US   5      5        WR'                  U R                  R                  S5      5        g WR)                  SU R                  R                  S5      -   5        g g )Nzauthentication/token/newrO   r   z(https://www.themoviedb.org/authenticate/zsystem.platform.androidrequest_tokeniv  F)cInputWindowYesNozBspecial://home/userdata/addon_data/plugin.video.vstream/qrcode.png   )scalez5Scanner le QRCode pour acceder au lien d'autorisation   )captchamsgroundnumNzauthentication/session/newzrequest_token=successtmdb_session
session_idi0u  Erreur)_calllenr   getCondVisibility
webbrowseropenr6   VSlangr   VSyesnoqrcoderesources.lib.librecaptcha.guirZ   makesaver   get
setSettingstrVSinfoVSerror)rJ   resulttotalurlri   sTextDIALOGrm   rZ   qroSolverretArgs               rK   getTokencTMDb.getToken   s   6;FAI<C))*CDD!_&= =>**51S8~~e,,  - L[[o'>!>?cdlmn+4x  v  AB  C S= ZZ <>NQWXgQh>hiFF"vi'8

%%nc&:N6OPdjj//67x$***;*;E*BBC 	    c                 ^    UR                  S5      S   nU(       a  [        U5      S-   U-   nO[        U5      nU R                  S[        U5      -   SU-   S-   [        U5      -   5      nSU;   a7  U(       a  US   S:X  a  U R	                  U5      $ US   S:w  a  US   S   S	   nU$ g
!    N= f)N(r   &year=zsearch/query=&page=total_resultsresultsidF)splitr	   rf   rs   search_movie_name)rJ   nameyear	mediaTypepagetermmetatmdb_ids           rK   get_idbynamecTMDb.get_idbyname  s    	::c?1%D T?X-4DT?Dzz)c)n4ho6PSVW[S\6\] d"_-2--d33 O$)y/!,T2)	s   B( (B,c                 `    U R                  U< SU< 35      nSU;   a  US   $ SU;   a  US   $ g)N/titler   F)rf   )rJ   r   tmdbidr   s       rK   get_namebyidcTMDb.get_namebyid6  s<    zzY78 d?= T><r   c                 8   [         R                  " SSU5      nU(       a  [        U5      S-   U-   nO[        U5      nU R                  SSU-   S-   [	        U5      -   5      nSU;  Ga0  SU;  Ga)  S	U;   a!  US	   S
:X  a  U(       a  U R                  U5      $ S	U;   a  US	   S
:w  a  SnUS	   S:X  a	  US   S
   nOUS    HE  nUS   (       d  M  SUS   ;  d  M  U R                  US   5      U R                  U5      :X  d  MC  Un  O   U(       dc  US    HZ  nUS   (       d  M  SUS   ;  d  M  U(       a7  SU;   a1  US   (       a'  US   nUS S n	[        U5      [        U	5      -
  S:  a  MX  Un  O   U(       d  US   S
   nUS   n
U R                  U
5      nU$ 0 nU$ )N + r   zsearch/movier   r   errorsstatus_coder   r   rO   r]   r   	genre_idsr#   r   release_date   r   )	resubr	   rf   rs   r   _clean_titleintsearch_movie_id)rJ   r   r   r   r   r   moviesearchMovier   yyr   s              rK   r   cTMDb.search_movie_nameB  s   vvdC&T?X-4DT?Dzz.(T/H*Ds4y*PQ4M$= $&4+@A+E$--d33 $&4+@A+E (A- OA.E (,I&{33+kBZ8Z#00W1EF$J[J[\`Jaa(3 %	 (7 !+/	?K*;77BkR]F^<^ $('5'DUcId7B>7R-9"1-=+.t9SW+<q+@,4(3 % ,; ! $Y 2  +++G4  Dr   c                    [         R                  " SSU5      n[        U5      nU R                  SSU-   5      nSU;  a  SU;  a  SU;   a  US   S:w  a  S	nUS   S
:X  a	  US   S   nOiUS    H1  nU R	                  US   5      nU R	                  U5      nXg:X  d  M/  Un  O   U(       d  US    H  nSUS   ;  d  M  Un  O   U(       d  US   S   nUnUS   nXS'   U R                  U5      nU$ 0 nU$ )Nr   r   zsearch/collectionr   r   r   r   r   rO   r]   r   r   	animationr   r   )r   r   r	   rf   r   search_collection_id)	rJ   r   r   r   
collectionsearchColleccleanTitleTMDBcleanTitleSearchr   s	            rK   search_collection_namecTMDb.search_collection_name~  s3   vvdC&zz-x$?4M$= $&4+@A+E
 (A-!%i!3J )-Y)-):):<;O)P+/+<+<T+B()=)5J! )8 &,0OL*,v2FF-9
 % -< &%))_Q%7
!$T*")Y 009  Dr   c                    U(       a  [        U5      S-   U-   nO[        U5      nU R                  SSU-   S-   [        U5      -   5      nSU;  Ga'  SU;  Ga   SU;   a!  US   S:X  a  U(       a  U R                  U5      $ SU;   a  US   S:w  a  S	nUS   S
:X  a	  US   S   nOUS    H@  nUS	:X  d
  XHS   ;   d  M  US   n	U R	                  U	5      U R	                  U5      :X  d  M>  Un  O   U(       d_  US    HV  nU(       d  M  XHS   ;   d  M  U(       a7  SU;   a1  US   (       a'  US   n
U
S S n[        U5      [        U5      -
  S
:  a  MT  Un  O   U(       d  US   S   nUS   nU R                  U5      nU$ 0 nU$ )Nz&first_air_date_year=z	search/tvr   r   r   r   r   r   rO   r]   r   r   r   first_air_dater   r   )r	   rf   rs   search_tvshow_namer   r   search_tvshow_id)rJ   r   r   r   genrer   r   r   r   	movieNamer   r   r   s                rK   r   cTMDb.search_tvshow_name  s   T?%<<tCDT?Dzz+x$'ACI'MN4M$= $&4+@A+E$..t44 $&4+@A+E (A- OA.E (,I B;%{3K*K(3F(;I#00;t?P?PQU?VV(3 % (7 !+/	?K$uk2J)J $('7;'F;WgKh7BCS7T-9"1-=+.t9SW+<q+@,4(3 % ,; ! $Y 2  +,,W5  Dr   c                     [         R                  " SSU5      n[        U5      nU R                  SSU-   5      nSU;  a5  SU;  a/  SU;   a'  US   S:w  a  US	   S   nUS
   nU R	                  U5      nU$ 0 nU$ )Nr   r   zsearch/personr   r   r   r   r   r   r   )r   r   r	   rf   search_person_id)rJ   r   r   r   	person_ids        rK   search_person_namecTMDb.search_person_name  s    vvdC&zz/8d?; 4M$= $&4+@A+EIq) !J	,,Y7  Dr   c                 J    U R                  S[        U5      -   U5      nXS'   U$ )Nzmovie/r   rf   rs   )rJ   movie_idappend_to_responserv   s       rK   r   cTMDb.search_movie_id  s)    Hs8}46HI$yr   c                 J    U R                  S[        U5      -   U5      nXS'   U$ )Ntv/r   r   )rJ   show_idr   rv   s       rK   r   cTMDb.search_tvshow_id  s)    ECL02DE#yr   c                 f    U R                  S[        U5      -   S-   [        U5      -   5      nXS'   U$ )Nr   /season/r   r   )rJ   r   seasonrv   s       rK   search_season_idcTMDb.search_season_id	  s4    ECL0:=FKL#yr   c                     U(       aA  U R                  S[        U5      -   S-   [        U5      -   S-   [        U5      -   5      nXS'   U$ g)Nr   r   z	/episode/r   Fr   )rJ   r   r   episoderv   s        rK   search_episode_idcTMDb.search_episode_id  sL    ZZG 4z ACK OR] ]`cdk`l lmF '9Mr   c                 H    U R                  S[        U5      -   5      nXS'   U$ )Nzcollection/r   r   )rJ   collection_idrv   s      rK   r   cTMDb.search_collection_id  s'    MC,>>?)yr   c                 H    U R                  S[        U5      -   5      nXS'   U$ )Nzperson/r   r   )rJ   r   rv   s      rK   r   cTMDb.search_person_id  s&    II67%yr   c                     U R                  S[        U5      -  5      nSU;  aL  SU;   aF  US   S   nSnUS    H  n[        US   5      nXd:  d  M  UnUnM     XS'   UR                  S5        U$ 0 $ )Nznetwork/%s/imagesr   logosr   vote_averager   )rf   rs   floatpop)rJ   
network_idrv   networkvotelogologoVotes          rK   search_network_idcTMDb.search_network_id$  s    /#j/AB&7f+<Woa(GD w n!56?"G#D	 (
 ",IKK'N	r   c                 (   0 SUR                  SS5      _SUR                  S5      (       a  UR                  SS5      OUR                  S5      _SS_SUR                  S5      (       a  UR                  S5      OUR                  SS5      _SUS:X  a  UR                  SS5      OU_S	UR                  S
5      (       a  UR                  S
S5      OUR                  SS5      _SUR                  S5      (       a  UR                  SS5      OUR                  SS5      _SS_SSR                  S Vs/ s H+  oAR                  U5      S :w  d  M  UR                  US5      PM-     sn5      _SUR                  SS5      _SUR                  S5      (       a  UR                  SS5      OaUR                  S5      (       a  UR                  SS5      O9UR                  S5      (       a  UR                  SS5      OUR                  SS5      _SUR                  S5      (       a  UR                  SS5      OUR                  SS5      _SS_SUS:X  a  UR                  S5      OUR                  S5      _SS_S S_S!UR                  S!S5      _SSUR                  S"5      (       a  UR                  S"S5      OUR                  S#S5      UR                  S$5      (       a  UR                  S$S5      OUR                  S%S5      SR                  S& Vs/ s H+  oAR                  U5      S :w  d  M  UR                  US5      PM-     sn5      SR                  S' Vs/ s H+  oAR                  U5      S :w  d  M  UR                  US5      PM-     sn5      UR                  S(S5      UR                  S)5      (       a  UR                  S)S5      OUR                  S*/ 5      UR                  S+S5      [        UR                  S,/ 5      5      S-.
EnS.U;   a)  [        US.   5      (       a  UR                  S.S5      S   nOUR                  S/S5      nU(       a  US0-  US'    US   S:X  a  [	        US   S S1 5      US'   S2U;   a:  US2    H1  nUS    S:X  a  US ==   US   -  ss'   M  US ==   S3US   -   -  ss'   M3     SU;   a!  US   nS4U;   a  [        U5      US5'   GO0XS'   GO*S5U;   a;  US5    H1  n	US   S:X  a  US==   U	S   -  ss'   M  US==   S3U	S   -   -  ss'   M3     OS6U;   al  U R                  US6   5      n
SUS'   U
 H+  n	US   S:X  a  US==   U	-  ss'   M  US==   S3U	-   -  ss'   M-     [        5       (       d  [        US   S75      US'   OwS8U;   aq  U R                  US8   S   S6   5      n
SUS'   U
 H+  n	US   S:X  a  US==   U	-  ss'   M  US==   S3U	-   -  ss'   M-     [        5       (       d  [        US   S75      US'   SnSU;   a  US   (       a	  US   US'   OS9U;   aU   US9   S:   nU H  nUS;   S<:X  d  M  S=US   ;   d  M  US>   n  O   U(       d  US9   S:   S   S>   nU R                  U-  US'   OS?U;   a}  US?   (       as   US?   n[        US@   5      S:  a[  US@    H.  nUS;   S<:X  d  M  USA   SB:X  d  M  USC   nSDUSE   ;   d  M)  USC   n  O   U(       d  US?   S   SC   nU R                  U-  US'   SFU;   Gav  USF   (       Gak  / nUR                  SF0 5      R                  SG5      (       a
  XSF   SG   -  n/ nS n[        USH SI9 H  nU(       ar  UR                  S5      UR                  S5      :w  a  UR                  U5        S nO:UR                  SJ5      (       a$  SKU;   a  SLR                  USK   USJ   5      USK'   OS nU(       a  M  UR                  S5      UR                  S5      UR                  SJ5      UR                  SM5      SN.nUR                  SO5      (       d  M  U R                  USO   -   USP'   M     U(       a  UR                  U5        [        R                  " U5      USG'   US#   (       Gd  US%   (       Gd  / nSFU;   a4  [        [        USF   SQ   5      5      n[        R                  " U5      USQ'   OSQU;   a  [        [        USQ   5      5      n[        U5      S:  a  U H  nUSR   SS:X  a
  US   US#'   M  UST   SU:X  a3  US%   S:w  a  US%==   S3-  ss'   US%==   USR   < SVUS   < SW3-  ss'   MR  UST   SX:X  d  M]  SYUSR   ;   d  Mh  US%   S:w  a  US%==   S3-  ss'   US%==   USR   < SVUS   < SW3-  ss'   M     US   S:X  a[   USZ   n[        US@   5      S:  aC  US@    H  nSDUS[   ;   d  M  USZ   S   S\   US'     O   US   (       d  US@   S   SZ   S   S\   US'   UR                  S]5      (       a7  [        US]   5      R!                  S^5      (       a  U R                  US]   -   US]'   UR                  S_5      (       a7  [        US_   5      R!                  S^5      (       a  U R"                  US_   -   US_'   UR%                  S`S5         ['        U[(        5      (       a  UR                  Sa5      OS nU(       a  UR                  Sb/ 5      O/ nU(       a  U R*                  =(       d    ScR-                  Sd5      S   R/                  5       nU R1                  UUSeS /5      nU R3                  U5      nU(       a  UUS`'   UR                  S_5      (       d2  U R1                  US USe/5      nU R3                  U5      nU(       a  UUS_'   UR                  S`5      (       d  UR                  S_S5      =(       d    SUS`'   UR                  S`5      (       a7  [        US`   5      R!                  S^5      (       a  U R"                  US`   -   US`'   U$ s  snf s  snf s  snf !    GN= f!    GNC= f!    GNK= f!    GNU= f! [4         a7    UR                  S`5      (       d  UR                  S_S5      =(       d    SUS`'    Nf = f)fNimdb_idrO   r   r   tvdb_idr   r   
media_typeratings_vote_averageg        r   votess_vote_countr   
vote_countdurationplot)
s_overviewoverview	biographympaa	premiereds_premieredr   r   air_dater   s_yeartrailertagliner   r   studiostatus
s_directordirectors_writerwriter)poster_path
still_path	file_pathprofile_path)backdrop_pathr   r  r  episode_numberseason_numberseasonsnumber_of_seasonsguest_stars)
castcrewr   r   r   r  r   r   	nbseasonsr  episode_run_timeruntime<   r   production_companiesz / {genresr   r.   partstrailersyoutubetypeTrailerVFsourcevideosr   siteYouTubekeyfr	iso_639_1creditsr	  c                 &    U R                  SS5      $ )Norderr   )rq   )ks    rK   <lambda>cTMDb._format.<locals>.<lambda>  s    QUU7A5Fr   )r  	characterrolez{} / {}r!  )r   r   r%  r!  r  	thumbnailr
  jobDirector
departmentWritingz ()
ProductionProducerrelease_dates
iso_3166_1certificationr   r   r  landscape_pathimages	backdropsr2   -en)rq   joinrs   rg   r   evalgetGenresFromIDsr   unicodeURL_TRAILERsortedappendformatr;   jsondumps
startswithr<   
setdefault
isinstancedictr:   r   lower_select_backdrop_by_lang_build_backdrop_url	Exception)rJ   r   r   r   r  _metar   r   
listeGenrer   r  
trailer_idr  r   	cast_listr	  	cast_itemicrewsr
  certdatar3  r4  primarylandscape_fplandscape_url	fanart_fp
fanart_urls                                rK   _formatcTMDb._format5  sg   txx	2.$((92E2Etxx	2.488TX> r $((7*;*;TXXg&&RTAU	
 
b8H$((<4j BR9S9Sdhh/5Y]YaYabpruYv DHH^4L4LTXXna0RVRZRZ[gijRk  RWW;b|;bCfnfnorfsw{f{/dhhsB/;b|} DHHVR( 8O8O-4uyu}u}  M  vN  vNUYU]U]^lnpUq  vz  v~  v~  O  vP  vP  TX  T\  T\  ]m  oq  Tr  VZ  V^  V^  _i  km  Vn TXXh-?-?DHHXq)TXXfVWEX r :+Btxx'QZH[ R  b!" dhhx,#$ 6:hh|6L6Lr2RVRZRZ[egiRj26((:2F2Fdhhz2.DHHU]_aLb77A{  $VA{#  @H  @H  IL  @M  QU  @U$5DHHS"$5A{  $V  WWWC  &ZCC  DL  DL  MP  DQ  UY  DY&7dhhsB&7C  &Z  [xx 0!47;xx7P7Ptxx3VZV^V^_hjlVm"5r:txxr:;7> %#d3E.F*G*Gxx 2A6q9Hxx	1-H (2E*	V}! #E+$6r$: ;f "T)56?b((Ovf~5O(Ouvf~'==O	 7 d?gJj !%j!1X!+gh>R''NeFm3N'NeeFm&;;N	 ( D **4+<=FE'N>R''Ne+N'Neem3N	   ::!(w!Ag_**4=+;K+HIFE'N>R''Ne+N'Neem3N	   ::!(w!Ag
i#IE)4
+I6'Gv)376?2)0):J!	  ( "!%j!1)!<Q!?!IJ#'#3#3j#@i  $x.>x	*+a/#+I#6"6?i7GFOy<X)0J#w{';;-4U^
 % $7 &%)(^A%6u%=
'+'7'7*'DE)$ iIxx	2&**622)_V44	DII+FG }}V,f=I.$(	{++!Y.0:0A0A)FBSUVWbUc0dIf-(,I yeeDk !f%&UU;%7!"w	!1I
 uu^,,15q?P1P	+.# H$ I& JJt,E&M Z  xED Si!89: $

5 1f4Sf./5zA~!DE{j0,0Lj)l+y8 ?b0!(Ou4OhUT&\+RRl+|;
dSXk@Y ?b0!(Ou4OhUT&\+RR " =B
O,tI'* $Y4#55,0,A!,D_,UE&M! !0 !=(,Y(:?(KA(N(_f 99]##E-,@(A(L(LS(Q(Q#';;}1E#EE- 99_%%#eO.D*E*P*PQT*U*U%)[[53I%IE/" 	)2.	O+5dD+A+ATXXh'tF7=

;32I99/66s;A>DDF#<<YRVX\H]^ $ 8 8 F .;E*+ yy11 $ = =i$PWY]I^ _I!%!9!9)!DJ!1;o. 99-..*/))OR*H*NB&' 99%&&3u5E/F+G+R+RSV+W+W&*kkE:J4K&KE"#w } $V &Z&	z~D  	O99-..*/))OR*H*NB&'	Os   0p!p!
p&&p&p+-p+p0 #p8 ;p8 0p8 &q  2q  =q  -q  &q 0q %D-q 0p58p= qq>rrc                     [        5       nU(       d  [        US5      n[        R                  " SU5      R	                  SS5      R                  S5      nU(       d  UR	                  S5      n[        R                  " S[        R                  [        R                  -   -  SUR                  5       5      nU$ ! [         a
  n S nANYS nAff = f)Nr.   NFDasciiignoreunicode_escapez[^%s]rO   )r   r:  unicodedata	normalizeencodedecoderH  r   r   stringascii_lowercasedigitsrE  )rJ   r   bMatrixes       rK   r   cTMDb._clean_title  s    	jGw/))%7>>wQXXYijEW-
 w&"8"86=="HI2u{{}]  		s   A+B7 7
CCc                    US:X  a*  SnU(       a	  USU-  -   nOUSU-  -   nU(       a  USU-  -   nOUS:X  a  SnU(       a	  USU-  -   nOUSU-  -   nOUS:X  d  US	:X  a*  S
nU(       a	  USU-  -   nOUSU-  -   nU(       a  USU-  -   nOUS:X  a9  U(       a2  SnU(       a	  USU-  -   nOUSU-  -   nU(       a  USU-  -   nUSU-  -   nOCUS:X  a<  SnU(       a	  USU-  -  nOUSU-  -  nU(       a  USU-  -   nUSU< SU< SU< S3-  nOg S n U R                   R                  U5        U R                   R                  5       nU(       a  [        U5      $ g ! [         a  n	[	        SU	-  S5        S[        U	5      ;   d  S[        U	5      ;   aE  US:X  a#  U R                  S5        U R                  S5        OU R                  U5        [	        S5         U R                   R                  U5        U R                   R                  5       n[	        S5         S n	A	N! [         a  n	[	        SU	-  S5         S n	A	 S n	A	NS n	A	ff = fS n	A	ff = f)Nr   zSELECT * FROM moviez WHERE tmdb_id = '%s'z WHERE title = '%s'z AND year = %sr   zSELECT * FROM sagatvshowanimezSELECT * FROM tvshowz WHERE tvshow.tmdb_id = '%s'z WHERE tvshow.title = '%s'z AND tvshow.year = %sr   ao  SELECT tvshow.backdrop_path, tvshow.landscape_path, CASE WHEN season.poster_path IS NULL OR season.poster_path = '' THEN tvshow.poster_path ELSE season.poster_path END AS poster_path, season.season_title AS title, season.tmdb_id, season.season, season.year, season.premiered, season.plot, season.episode FROM season LEFT JOIN tvshow ON season.tmdb_id = tvshow.tmdb_idz AND season.season = '%s'r   a  SELECT tvshow.backdrop_path, tvshow.landscape_path, season.poster_path, episode.title, episode.tmdb_id, episode.poster_path AS poster_thumb, episode.premiered, episode.guest_stars, episode.year, episode.plot, episode.tagline, episode.director, episode.writer, episode.rating, episode.votes FROM episode LEFT JOIN tvshow ON episode.tmdb_id = tvshow.tmdb_id LEFT JOIN season ON episode.tmdb_id = season.tmdb_id AND episode.season = season.seasonz AND episode.season = 'z' AND episode.episode = 'z' AND season.season = ''z/************* Error selecting from cache db: %sr   no such columnno column namedTable recreatedz************* Error fixedz************* Error 2: %s)rG   rH   fetchonerH  r   rs   rI   rD  )
rJ   r   r   r   r   r   r   
sql_select
matchedrowrf  s
             rK   _cache_searchcTMDb._cache_search,  s    .J'*Cg*MM
'*AD*HH
!+.>.E!EJ<'-J'*Cg*MM
'*AD*HH
8#zW'</J'*JW*TT
'*H4*OO
!+.E.L!LJ8#R  '*JW*TT
'*H4*OO
!+.E.L!LJ#&Cf&LLJ9$j , >HH
<tCC
!+.E.L!LJtz  }D  FL  M  MJ
	JJz*,,.J* 
## 3  	CaGK3q6)->#a&-H)OOH-OOH-OOJ/'(

"":.!ZZ002
122 1A5q9!	s>   5E 
IA2IA H
H>!H90I9H>>IIc                 
   US;   a  g US:X  a  U R                  XU5      $ US:X  d  US:X  a  U R                  XXF5      $ US:X  a  U R                  X5      $ US:X  a  U R                  XXE5      $ US:X  a  U R	                  X5      $ g )N)personr   r   ri  rj  r   r   r   )_cache_save_movie_cache_save_tvshow_cache_save_season_cache_save_episode_cache_save_collection)rJ   r   r   r   r   r   r   s          rK   _cache_savecTMDb._cache_save  s    ..  ))$d;; !Z7%:**4vDD !**488 "++DHH %..t:: &r   c                    U(       d  SU;   a  US   n SnU R                  XAS   US   X#US   US   US   US   US	   US
   US   [        US   5      US   US   US   US   US   US   US   US   US   UR                  SS5      45        g ! [         a  n[	        [        U5      5        S[        U5      ;   d  S[        U5      ;   d  S[        U5      ;   a  U R                  S5        [	        S5        U R                  WUS   US   X#US   US   US   US   US	   US
   US   [        US   5      US   US   US   US   US   US   US   US   US   UR                  SS5      45        O[	        S5         S nAg S nAff = f)Nr   a(  INSERT or IGNORE INTO movie (imdb_id, tmdb_id, title, year, cast, crew, writer, director, tagline, rating, votes, duration, plot, mpaa, premiered, genre, studio, status, poster_path, trailer, backdrop_path, landscape_path) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)r   r   r	  r
  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r2  rO   rl  rm  no such tabler   rn  z!SQL ERROR INSERT into table movie)_sqlExecuters   rq   rH  r   rI   )rJ   r   r   r   sqlrf  s         rK   rv  cTMDb._cache_save_movie  s   $<D	^C S	?DOTQUV\Q]_cdj_kmqrzm{  ~B  CM  ~N  PT  U^  P_  ae  fn  ao  qu  v}  q~  @C  DH  IS  DT  @U  W[  \b  Wc  ei  jp  eq  sw  xC  sD  FJ  KR  FS  UY  Zb  Uc  ei  jr  es  uy  zG  uH  JN  OX  JY  [_  `o  [p  rv  rz  rz  {K  MO  rP  #Q  R 
	#a&M3q6)->#a&-HO_bcd_eLe('(   tIYUYZ`Uacghncoquv~q  BF  GQ  BR  TX  Yb  Tc  ei  jr  es  uy  zA  uB  DG  HL  MW  HX  DY  [_  `f  [g  im  nt  iu  w{  |G  wH  JN  OV  JW  Y]  ^f  Yg  im  nv  iw  y}  ~K  yL  NR  S\  N]  _c  ds  _t  vz  v~  v~  O  QS  vT  'U  V9:
	s   A:B 
FC"F  Fc                    US    H  nUS   US'   U R                  XS5        M     U(       d  SU;   a  US   n SnU R                  XaS   US   X$US   US   US   US	   US
   US   US   US   US   US   US   US   US   US   US   US   UR                  SS5      US   45        g ! [         a  n[	        [        U5      5        S[        U5      ;   d  S[        U5      ;   a  U R                  S5        [	        S5        U R                  WUS   US   X$US   US   US   US	   US
   US   US   US   US   US   US   US   US   US   US   US   UR                  SS5      US   45        O[	        S5         S nAg S nAff = f)Nr   r   r   a+  INSERT or IGNORE INTO tvshow (imdb_id, tmdb_id, title, year, cast, crew, writer, director, rating, votes, duration, plot, mpaa, premiered, genre, studio, status, poster_path, trailer, backdrop_path, landscape_path, nbseasons) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)r   r	  r
  r   r   r   r   r   r   r   r   r   r   r   r   r   r  r2  rO   r  rl  rm  ri  rn  z"SQL ERROR INSERT into table tvshow)rx  r  rq   rH  r   rs   rI   )rJ   r   r   r   r   s_metar  rf  s           rK   rw  cTMDb._cache_save_tvshow  s   8nF $YF9##F3 % $<D	^C S	?DOTQUV\Q]_cdj_kmqrzm{  ~B  CM  ~N  PT  U]  P^  `d  el  `m  os  t~  o  AE  FL  AM  OS  TZ  O[  ]a  bm  ]n  pt  u|  p}  C  DL  M  OS  T\  O]  _c  dq  _r  tx  yB  tC  EI  JY  EZ  \`  \d  \d  eu  wy  \z  |@  AL  |M  #N  O 
	#a&M3q6)->#a&-H)'(   tIYUYZ`Uacghncoquv~q  BF  GQ  BR  TX  Ya  Tb  dh  ip  dq  sw  xB  sC  EI  JP  EQ  SW  X^  S_  ae  fq  ar  tx  y@  tA  CG  HP  CQ  SW  X`  Sa  cg  hu  cv  x|  }F  xG  IM  N]  I^  `d  `h  `h  iy  {}  `~  @D  EP  @Q  'R  S:;
	s   A1B+ +
F	5C
FF	c                    SU;   a  US   (       a  US   nOSU;   a  US   (       a  US   nOSnSnSU;   a  US   (       a  US   nO U(       a  [        US S 5      nSU;   a  US   nOSU;   a  US   nSU;   a  UR                  SS	5      nOS	nUS
   (       a  U R                  US
   -   nOS	nUR                  S5      =(       d    UR                  S5      =(       d    S	n SnU R                  XS   X$X7XeUR                  SS5      45        g !    N= f! [         a  n	[        [        U	5      5        S[        U	5      ;   d  S[        U	5      ;   a{  U R                  S5        [        S5         U R                  WUS   X$X7XeUR                  SS5      45         S n	A	g ! [         a"  n	[        [        U	5      5         S n	A	 S n	A	g S n	A	ff = f[        S5         S n	A	g S n	A	ff = f)Nr   r   r   r   r   r  r   r   rO   r   r   r   zINSERT or IGNORE INTO season (tmdb_id, season, year, premiered, season_title, poster_path, plot, episode) VALUES (?, ?, ?, ?, ?, ?, ?, ?)r   episode_countrl  rm  rn  z"SQL ERROR INSERT into table season)r   rq   r;   r  rH  r   rs   rI   )
rJ   r   r   r   r   r   r<   season_titler  rf  s
             rK   rx  cTMDb._cache_save_season  s   $z"2Z(ID T+%6[)IIT>d6l&\F 2A/F d"/*F(^F88J+DD[[4#66FFxx(BDHHV,<B	<-CS	?FI]ckoksks  uD  FG  lH  #I  J/.  	<#a&M3q6)->#a&-H)'("$$S4	?FIeksws{s{  }L  NO  tP  +Q  R  R  "#a&MM" :;;	<sI   D !+D D
G AG-*F
G&G:GGGG c                 |    US-   U-   S-   U-   nSnU R                  XaS   XSXAS   XQS   US   US   US	   US
   US   US   SR                  UR                  SS5      5      US   45        g ! [         a  n[	        [        U5      5        S[        U5      ;   d  S[        U5      ;   a}  U R                  S5        [	        S5        U R                  WUS   WX4US   XQS   US   US   US	   US
   US   US   SR                  UR                  SS5      5      US   45         S nAg [	        S5         S nAg S nAff = f)N_SEzINSERT or IGNORE INTO episode (tmdb_id, originaltitle, season, episode, year, title, premiered, poster_path, plot, rating, votes, director, writer, guest_stars, tagline) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)r   r   r   r   r   r   r   r   r   rO   r  r   rl  rm  r   rn  z#SQL ERROR INSERT into table episode)r  r7  rq   rH  r   rs   rI   )rJ   r   r   r   r   r   r  rf  s           rK   ry  cTMDb._cache_save_episode%  s   	=4K&(3.8EBCS	?E7QWLZ_fqartx  zG  uH  JN  OU  JV  X\  ]e  Xf  hl  mt  hu  w{  |F  wG  IM  NV  IW  Y[  Y`  Y`  ae  ai  ai  jw  y{  a|  Y}  C  DM  N  #O  P 		=#a&M3q6)->#a&-H	*'(   tIvPTU[P\^cjuevx|  ~K  yL  NR  SY  NZ  \`  ai  \j  lp  qx  ly  {  @J  {K  MQ  RZ  M[  ]_  ]d  ]d  ei  em  em  n{  }  e@  ]A  CG  HQ  CR  'S  T  T;<<		=s   A*A- -
D;7B*D6&D66D;c                     SnU R                  X1S   X!S   US   US   US   45        g ! [         a  n[        [        U5      5        S[        U5      ;   d  S[        U5      ;   d  S	[        U5      ;   aC  U R	                  S
5        [        S5        U R                  WUS   X!S   US   US   US   45        O[        S5         S nAg S nAff = f)NznINSERT or IGNORE INTO saga (tmdb_id, title, plot, genre, poster_path, backdrop_path) VALUES (?, ?, ?, ?, ?, ?)r   r   r   r   r  rl  rm  r~  sagarn  z SQL ERROR INSERT into table saga)r  rH  r   rs   rI   )rJ   r   r   r  rf  s        rK   rz  cTMDb._cache_save_collection7  s    	'CS	?Dv,WW[\iWjlp  rA  mB  #C  D 
	#a&M3q6)->#a&-HO_bcd_eLe''(   tI6lDQXM[_`m[npt  vE  qF  'G  H89
	s   '* 
CBCCc	                 (   [         R                  " SSU5      nUR                  SS5      n[         R                  " SSU5      nSn	U(       d[  U(       d  US;   a  [         R                  " SSU5      nU R                  U5      n	U	(       d  0 $ U R	                  XXEXg5      n
U
(       a  U
$ 0 n
US	:X  a4  U(       a  U R                  U5      n
GOU(       a  U R                  X%5      n
GOUS
:X  a4  U(       a  U R                  U5      n
GOU(       a  U R                  X%5      n
GOxUS:X  aW  U(       aP  U(       a  U R                  XF5      n
GOQU R                  S
X%S9n
SU
;   a  U
S   (       a  U R                  SX*S   XVS9$ GOUS:X  aP  U(       a  U R                  XFU5      n
OU R                  S
X%S9n
SU
;   a  U
S   (       a  U R                  U
S   Xg5      n
OUS:X  a1  U(       a  U R                  U5      n
OU(       a  U R                  X%SS9n
OUS:X  a2  U(       a  U R                  U5      n
OoU(       a  U R                  U5      n
OVUS:X  a2  U(       a  U R                  U5      n
O7U(       a  U R                  U5      n
OUS:X  a  U(       a  U R!                  U5      n
U
(       a  SU
;   a  U R#                  XU5      n
U
R%                  S5      S:X  az  U
R%                  S5      (       dd   U
R%                  S5      nU(       aK  U R	                  S
U['        U5      S9nU(       a*  UR%                  S5      (       a  UR%                  S5      U
S'   U	(       d  U R                  U5      n	U R)                  XXXu5        U
$ U
S:w  a  U R#                  X5      n
U
$ 0 n
U
$ !    NN= f)a  
Main method to get meta data for movie or tvshow. Will lookup by name/year
if no IMDB ID supplied.

Args:
    media_type (str): 'movie' or 'tvshow'
    name (str): full name of movie/tvshow you are searching
Kwargs:
    imdb_id (str): IMDB ID
    tmdb_id (str): TMDB ID
    year (str): 4 digit year of video, recommended to include the year whenever possible
                to maximize correct search results.
    season (int)
    episode (int)

Returns:
    DICT of meta data or None if cannot be found.
r   r   VOSTFRrO   z(\W|_|^)FR(\W|_|$)N)r   ri  rj  r   z7(?i)( s(?:aison +)*([0-9]+(?:\-[0-9\?]+)*))(?:([^"]+)|)r   ri  r   )r   r   )r   r   r   r   rj  r   )r   r   ru  r   r   r   )r   F)r   r   replacer   rr  r   r   r   r   r   get_metar   r   r   r   r   r   rW  rq   rs   r{  )rJ   r   r   r   r   r   r   r   update
cleanTitler   r   	show_metas                rK   r  cTMDb.get_metaH  sK   ( vvdC&||HR(vv*B5

 !II66"[]_aefD**40J	%%jgV]D  ++G4--d98#,,W5..t:8#,,W=}}Xt}?$i==4iW[=kk9$--gwG}}Xt}?$i11$y/6SD7",,W5..t.D<'00922488#,,W5..t49$--g6 I%<<J7D xx%1$((=:Q:Q"hhy1G$($6$6xsSZ|$6$\	$})E)E2;--2ND/ !..t4
Tz7Q
 	 U]<<+D  Ds    A#N Nc                      U(       a  US-   [        U5      -   nOS[        U5      -   nU R                  X5      nU$ !    g= f)Nr   zpage=F)rs   rf   )rJ   rx   r   r   rv   s        rK   getUrlcTMDb.getUrl  sI    	hT2T*ZZ*F 	s	   8< A c                    SSK Jn  U R                  R                  S5      nU R                  U-  < U< SU R
                  < SU< 3nUR                  USS9nUR                  SS	5        [        R                  " U5      nUR                  5       nUR                  XxS
9n	U	R                  5       n
U	R                  5         [        R                  " U
5      nU$ )Nr   )requestrc   z	?api_key=z&session_id=POST)methodzContent-Typezapplication/json)rQ  )urllibr  r6   r7   URLr8   Request
add_headerr?  r@  r`  urlopenreadrU   loads)rJ   rx   postAPI_VERSIONr  rd   urlapireqrQ  rresponses              rK   
getPostUrlcTMDb.getPostUrl  s    " 	#ZZ**>:
59XX5KSRVR^R^`jkoofVo4~'9:zz${{}OOCO+668		zz(#r   c                      U R                   =(       d    SR                  S5      S   R                  5       nU(       d  SnUS:X  a  gSU-  $ ! [         a    Sn N#f = f)zyRetourne une valeur compatible TMDb pour include_image_language.
Ex: 'fr,en,null' (fallback EN puis images sans langue).
r2   r5  r   r  r6  zen,nullz
%s,en,null)r:   r   rE  rH  )rJ   rR  s     rK   _tmdb_image_langscTMDb._tmdb_image_langs  sc    	yy+G2237:@@BG Gd?g%%  	G	s   5A AAc                 D   U(       d  g0 nU H6  nUR                  SS5      nUR                  U/ 5      R                  U5        M8     U H6  nXS;   d  M
  X5   (       d  M  X5   S   R                  S5      nU(       d  M4  Us  $    US   R                  S5      nU=(       d    S$ )zyChoisit un backdrop selon iso_639_1 dans l'ordre preferred_langs.
preferred_langs peut contenir None (pour 'null' TMDb).
rO   r  Nr   r  )rq   rB  r=  )rJ   r4  preferred_langsby_langbr:   fps          rK   rF  cTMDb._select_backdrop_by_lang  s     A55d+DtR(//2  $D7==]1%))+62I	 $ q\k*xRr   c                     U(       d  g[        U5      R                  S5      (       a  U$ [        U5      R                  S5      (       d  S[        U5      -   nU R                  U-   $ )NrO   httpr   )rs   rA  r<   )rJ   r  s     rK   rG  cTMDb._build_backdrop_url
  sU    y>$$V,,9~((--c)n,I{{Y&&r   c                    SSK Jn  U R                  U-  < U< SU R                  < SU R                  < 3nU(       a  USU-  -  n Sn[        U[        5      (       a  SU;   a  SU;   a  S	n[        U[        5      (       a  UR                  S
5      (       a  S	nU(       a  SU;  a  USU R                  5       -  -  nU" U5      nUR                  S	S9nU$ ! [         a     N%f = f)Nr   )cRequestHandlerz
?language=z	&api_key=z&%sFzappend_to_response=r3  Tz/imageszinclude_image_language=z&include_image_language=%s)
jsonDecode)$resources.lib.handler.requestHandlerr  r  r:   r8   rC  rs   endswithr  rH  r  )	rJ   actionr   r  r  rx   wants_imagesoRequestHandlerrQ  s	            rK   rf   cTMDb._call  s    H/3xx+/EvtyyZ^ZfZfg5---C
	 L,c228MQc8cjr  wI  kI#&#&&6??9+E+E# 9 D3d6L6L6NNN *#.&&$&7  		s   A5C 
C#"C#Nc                      [         R                  5         U R                  R                  X5         [         R                  5         g ! [         a  ne S nAff = f! [         R                  5         f = fN)lockacquirerG   rH   rH  release)rJ   r  paramrf  s       rK   r  cTMDb._sqlExecute.  sN    	LLNJJw. LLN  		 LLNs#   /A 
AAAA A0c                     / nU H8  nU R                   R                  U5      nU(       d  M'  UR                  U5        M:     U$ r  )TMDB_GENRESrq   r=  )rJ   genresIDsGenresgidr   s        rK   r9  cTMDb.getGenresFromIDs9  s?    C$$((-Euu%  r   c                     [        U5      R                  5       (       d  U$ U R                  R                  U5      nU(       a  U$ U$ r  )rs   isdigitr  rq   )rJ   genreIDr   s      rK   getGenreFromIDcTMDb.getGenreFromIDB  s=    7|##%%N  $$W-Lr   )r6   r8   rC   rG   r9   r<   r:   r;   )rO   F)rO   )rO   r   r]   )rO   r]   )rO   r]   rO   )z8append_to_response=trailers,credits,release_dates,images)zCappend_to_response=external_ids,videos,credits,release_dates,images)rO   rO   rO   rO   )rO   rO   rO   rO   rO   F)r]   rO   )   )rO   r  r  )1__name__
__module____qualname____firstlineno__r  r  r;  r?   r   r   ra  rB   rL   rI   rV   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   rW  r   rr  r{  rv  rw  rx  ry  rz  r  r  r  r  rF  rG  rf   r  r9  r  __static_attributes__ r   rK   r   r      s   
J
M 	K 	G	
 	I 	H 	J 	J 	I 	J 	G 	N 	 	j 	y  	y!" 	z#$ ".#9K> +CCKTE ::5M((1	5M	!F8B$N8	9x,^7t,"eN qf;8.83<n=$"n`
B&,'4r   r   )r   rb  r=   r?  r^  	threadingresources.lib.comaddonr   r   r   r   r   r   resources.lib.utilr	   sqlite3r
   r@   	pysqlite2	Semaphorer  r   r  r   rK   <module>r     sb   
 
      O O (,(	
*+ 	o o,*	
*+s   A A,