From 027475e5c34e408c3d8ca56f6b421f98158095c9 Mon Sep 17 00:00:00 2001 From: ilyashramko Date: Thu, 9 Nov 2023 23:12:10 +0300 Subject: [PATCH] initial commit --- com.synology.TMDBExample/INFO | 25 ++ com.synology.TMDBExample/README.md | 54 +++ .../__pycache__/constant.cpython-310.pyc | Bin 0 -> 1066 bytes .../__pycache__/searchinc.cpython-310.pyc | Bin 0 -> 5259 bytes .../util_themoviedb.cpython-310.pyc | Bin 0 -> 6533 bytes com.synology.TMDBExample/constant.py | 102 +++++ com.synology.TMDBExample/loader.sh | 23 + .../plugin_data/movie/862/en-US.json | 1 + .../plugin_data/movie/862/translation.json | 1 + .../movie/query/Toy+Story_1995_en-US_1.json | 1 + com.synology.TMDBExample/search.py | 400 ++++++++++++++++++ com.synology.TMDBExample/searchinc.py | 221 ++++++++++ com.synology.TMDBExample/util_themoviedb.py | 257 +++++++++++ 13 files changed, 1085 insertions(+) create mode 100644 com.synology.TMDBExample/INFO create mode 100644 com.synology.TMDBExample/README.md create mode 100644 com.synology.TMDBExample/__pycache__/constant.cpython-310.pyc create mode 100644 com.synology.TMDBExample/__pycache__/searchinc.cpython-310.pyc create mode 100644 com.synology.TMDBExample/__pycache__/util_themoviedb.cpython-310.pyc create mode 100644 com.synology.TMDBExample/constant.py create mode 100644 com.synology.TMDBExample/loader.sh create mode 100644 com.synology.TMDBExample/plugin_data/movie/862/en-US.json create mode 100644 com.synology.TMDBExample/plugin_data/movie/862/translation.json create mode 100644 com.synology.TMDBExample/plugin_data/movie/query/Toy+Story_1995_en-US_1.json create mode 100644 com.synology.TMDBExample/search.py create mode 100644 com.synology.TMDBExample/searchinc.py create mode 100644 com.synology.TMDBExample/util_themoviedb.py diff --git a/com.synology.TMDBExample/INFO b/com.synology.TMDBExample/INFO new file mode 100644 index 0000000..cf8c3a4 --- /dev/null +++ b/com.synology.TMDBExample/INFO @@ -0,0 +1,25 @@ +{ + "id": "com.synology.TMDBExample", + "description": "", + "version": "1.0", + "site": "http://www.themoviedb.org/", + "entry_file": "loader.sh", + "type": ["movie", "tvshow"], + "language": ["enu"], + "test_example": { + "movie": { + "title": "Harry Potter", + "original_available": "2001-11-16" + }, + "tvshow": { + "title": "Game of Thrones", + "original_available": "2011-04-17" + }, + "tvshow_episode": { + "title": "Game of Thrones", + "original_available": "2011-04-17", + "season": 1, + "episode": 1 + } + } +} diff --git a/com.synology.TMDBExample/README.md b/com.synology.TMDBExample/README.md new file mode 100644 index 0000000..864be00 --- /dev/null +++ b/com.synology.TMDBExample/README.md @@ -0,0 +1,54 @@ +## The Movie Database API + +### API Docs +https://developers.themoviedb.org/3 + + +### Search +https://developers.themoviedb.org/3/search/search-movies + +- required + - api_key + - query +- optional + - language, default: en-US + - year + +year information can help distinguishing movie with the same name in different year +e.g. Total Recall, which has 1990 and 2012 version + +https://api.themoviedb.org/3/search/movie?api_key=${APIKEY}&query=total%20recall +https://api.themoviedb.org/3/search/movie?api_key=${APIKEY}&query=total%20recall&language=zh-TW +https://api.themoviedb.org/3/search/movie?api_key=${APIKEY}&query=total%20recall&year=1990 + + +### Movie +https://developers.themoviedb.org/3/movies/get-movie-details + +- optional + - append_to_response, get credits (actor, director, writer) and releases (certificate) in one request + +https://api.themoviedb.org/3/movie/861?api_key=${APIKEY}&append_to_response=credits,releases&language=zh-TW + + +### Translation +https://developers.themoviedb.org/3/movies/get-movie-translations + +https://api.themoviedb.org/3/movie/861/translations?api_key=${APIKEY} + + +### Image +https://developers.themoviedb.org/3/movies/get-movie-images + +Movie detail has poster_path and backdrop_path. +Image API can get more images and specify language using include_image_language parameter. + +Using `append_to_response` is also possible to append images result in movie detail request. + + +### Language +ISO-639-1 and ISO 3166-1 + +https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes +https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 + diff --git a/com.synology.TMDBExample/__pycache__/constant.cpython-310.pyc b/com.synology.TMDBExample/__pycache__/constant.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..672d569712cd50fbbba82f7df5c957af5101c77d GIT binary patch literal 1066 zcmaKqTW`}a6vy4PO>b$3#>7QjB_2>;nr-X`LWq=lTeM!Xv>hx$irm`k%$lZhvP<`b zc;_4J3-As2EEaD(A$WurkQh$7FggT2^4~uH-^qz&+s)^*K#ceEr}#q(fR91)=g5oX zshHjyAsAQy$E+BZED6W0I8ImzoV1cywq%^LQaEj;appXFU>p?S>`BhbWI)7(lRHUT z*>eYHqH3&QMezKIV&y`v;KGSyDR`<0ikIl;H~{pEkmGAz*C~0Uf!lX`qf)C@DZ?Y= z4EyBx)~@dly+^8whP34G630ED1b0d<>!}aa<2w{3-fP%O80l(Ynl1^u-OBQxk2wGU)S)QBk?2tv=MYD@5OLGr7DCT(5r+%OC zl#hCSIv{*H>SUt>MEj^CVBxoSR_yIN4q_vo>k{VE9oj`c;mIBuFtMPn?=qgol#y^J zA2R9_#*^g8XQ-HD;*0Ovo-J$jIyA$*Qr4brRLq7EW-}GIss$b33qva~w%_GH#N_^(6HxPHe@s)T&m;MIkOkfdT<~ z0a_9ZX3|kEJ$N#mNiRK7?a88+Rg&{J;dH0keKP>Licmr{d$;oHUT z_xOFkRXj0KHt_pX*!{)lCk*4C)Y<%wwD*Y>il>*8`z*Uqw|>(aO`FPD9zQyEotIpNoK*bZAhBDgR=F_tHVB?_pgge{7w z>%tKw)JH{GR8UWgs+d51Ow_~?)W^l7m_mI*)WuQMC&jclhWeB^E>56+POt@|dGaYv zW6ZZ0RpXzD+QM@cPjUrCYHS*%=e&4u>R0 zGmJ7LqiPo*GKl0su0_w=!4{o}*<`)*-wcv8QH6fjOV*Xs_11k6$fRj1Ctu>0P)G9CwLto9!7 zpBS==kAJZ+w-$H(xqjlyxw~7fHBWZ$%D4mRWG>l?;xKM+x$8j`_u?Q~pKHb4+1=sU z#XHx2czx6B_CkLy@jcmE3!>I+Z%dtO`|18;xY$?z{Ylbf4Ta4dUS(xQkHsVnJ)?RD zgIe|X&=|a!8X25zn}1q|>e+~AY-H{jr1Fd}85}NX;cwey#*(pMTr`r?8&Ev`-N&

+8e(n| z&QTjqWD}#)dDM~7cb!7m+A03H-zjLUIW_sPTfB4o)kYYs`;D7^Ydvl@e&Wj{h@-jJXD`lPY%F-Io(v#;Y4)`XH&mq+ z$Lm4vbc;={YC$`SrH>#=TAmbpeSfouuu7D9^ZFuO)$Geq71!XmSX|j%KV6GOlc{1F zbp5!W4hsErb>__{fQQu}^dqn9%ja-zNsbzP2ES94B=ypM;9i&agDO$jyuuwMk76vP-DE)_hKS|Zm z_ZAn&O8{RidS?>!w9- zJ7Nd0C_K2L&LBRQ%^|6_Q>Ur10nplArG;sSKjFvbK;q4y&Ww z^CZ+vua>Y_LOzh6{5Z2r`%9aW#vKeEKvGH=u6!IpuC9L3s2e1m4^2up1AaM09SU@Zu&@wQ0#6Nn`QHFYSlOfUf@%2f;; z009bEQq)yE2_?gva%5mvaw0WGCbgJmO`18e`KEOU?vS7e;s1g3X;22)#)Rb9dUtoxz>c&DcQ_eOuys>bXOv4MR&#-(YGyiglgnXRrkWL!ys z{u!Pe3Yh}{bm06Jt0MvEw+En*2<4vJ{~a9=O5O(0k>h^?t&O0S9d?bt8~}ICc<>{@ z8fc~{WT-pl4xmZ*?Y(|6!?g{%KA+**M)ku48P$I0i9p#_6b*f_JU%YUk^!5=gXG~>2TfYUHJnoMe9x*gO?6r>g;9B z_>(JW?8<+^8iT^myqUoRR2OF6dN6Q)uIuw>sYNf&pS_`srY+ycs)|eU1bu%}bncqmF@Mwgaj@oaS%1j$fN|~)i?^bTmUe>x2B3fXgBJ2f!OgnU1I23Ns_Xw zrdn~7dO>s*m%4j7tErENt_AHN9go$p#Qy#S`d?2uq!&q7u@Ro+H59~5z%>9X^vC%m zcK|Y+O#+`S;52SNJg@o31UzM?=N~W_1@>NW&!f|ZtNtDggK~6=e4QNKb6Mo#vCATi z;W!4|c7k#^T?8|RJ5l4|iHr-IGAXs-AjNq^C-W5dB4ws)K5o#fiU$#DJRbPrDo7+> z**dVR{ca>5Vpse0AP;uQU1T2x{X0ZHLNS>6)#Mk#U544tegmKGhwY;^39B8i20L-ZgcrkZWd-lh}98j5TU`C zW@!TT?7ZZRAS}ou+dlZenE%Hjf5QoKi+pzkot4pTF@HT3REU8OUmrUJvqdC zMD0hYa2*0+%E?oWnyWJIx|;Xo<|)PKEP-Jq%8C39-8yWaMJ)7JJP8360tw-CQin+y zRyz5gGVa`X(L9}J5q+--F(5lstWdFq0<0rwt%Dexr;(Rwq(--i*_;R9!Y02*Z-^PI zBA5v=4ds9%2g>a*3_{{RIe1K$7u literal 0 HcmV?d00001 diff --git a/com.synology.TMDBExample/__pycache__/util_themoviedb.cpython-310.pyc b/com.synology.TMDBExample/__pycache__/util_themoviedb.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c519d1dd270c19e57daf3e1e68914f5d663722a4 GIT binary patch literal 6533 zcmb_gTW=f372Z3S6h%w6Y)ihyNn9svO*3u)=Th5sY{{`=nHFq0X@srORBFN10~@Hi5Fhifj_)1S_$9D2r^0O{1J-``H1MB{stj zqTI(0vBM~**eshvIn9o+qbT>YW9&G}1MCEQ0p$$S?`Y+dpX0<@t!`71{U%U4c&_3R z{{Uh7rk$9~Xc;^oYnx7I5-qc3h-s7-dS_xCy~dh$M@yVUOZ3D_?8nw-F3D{f%-+_; zDK(a3_MEoq#%7Yk93wFk>#@C=kF6yC810tEKT7PxO-rV~q2aw_`|Vj-Nb*~DQrOmY z?dyApx0$2%3=<SxQSU=r%>f z0yz;!u^)O}e=QK47L*-%$Xg3yPp$Jr;PZOJV}9(*1FAn>AL}$RS59|*E`ss?Fz84p zcoYX6R-TYn$8QJH3jNNSw8Lh*8OuUDU`^kPH@XAke$iN+6O*3O63M$`_fJrVHg@Ua&!L5!Xv-k4Y5Jo486D!C~mNOXS*A+n4M1@KaZD*S3xY@ zH5`2kk7bsOf~&oE@-h%C0cr7J~qY4hm)w~n0Y}$tR? z+9b*^J_Cuh2l}QJ8;K59+p+n;0((gWPV8*uFzRmWOg{|sa#&-=VJ*%l#$&Xpp4h`a zQ}vmLA$qJSFbku27-p!ISgmH~Ms{#jU9E(`Cm?WITYPLnbop9;vZ^3meb@{5Mpf$G zj(zrlh&ug)sT|VbpZeXV*9tZ+?&MCZnHP5or%8!>(A0}N&S~N(m87{BpG-=(9(6?Q zcVg+hv%Gj?;X^s&p=&+hu@^@kZKrI2)8k>-yeDlXYFT*Li()8p*c1E(@J-H<2|{zN z*-^#^QsYqGh;K-DdFk%Ei?zjhX^NQ3(#rLPo44LyT$sP&-MzgePbw=#qWA9esO{DL zdL!^6$UXX`6GlFhGxH1A-nqN9;w}7adGYqbytlG=bKyyzPvXTXtO!heKb<3&F+dgv zU!jg)Aal0RsgnsUq;Kf@aYLH;ti9OEVV`Sw#B~rycY!1e=D~Psj6BXro%++Z^>o%6 z%o@yqfq7aoIPF>|gFW~W?uOWV4-JJqofIE6E5%t1^bPQ}X`tU>K-I99a0T>jnsE+J zjK*Ds7rVBT%kZ)@T^-S11(_Wuh0@NU(IGL!4p{pd&cn|UA?fn-MBX6sCXu&@yiMdM zAWtlrQ#uQqa*;YO6M2USnf6_+l}AS$)ySa~U{)~o3m3%Ej~PeIlFo@IbrWRpBNh%g zCKwuuV`iqUR%~ur=z*Ij4TTXLa!%V{0!RtQ>RmlM>+$W)`e097wa4jGZtqu6D!K2eEl))^<3tb zb9|8|rFJ@a)P+VdFK)Jjl+BlD@G_Ba;`PDZn1BT_jJD$PFECx41tDDTqI!VU6uYA+ zhV6V>H25tndA2P282!GofCN&@39e^yfh>k{A$gEoAP*%MvX0q`fqd}Bd}bY$g!mGU z!O1K1Cq03XCG@$%yAoM{x|;Qki;fdFo)kt9|Lu~Ia|4UCbgTC6m{}SXnzBgWMOKG) zWtE*#39E&Z2~xA?3G16oPil~q*}0A7b#m*2AH`%tCAx=(5}c7Kk@*}YB5{xsk&=B~ ziQoX0644AB3S=iVFBMQORUsvy{uKO67{WIooJc*`#BN8G-^7uWPVr^bo;bTY@Lf2m z+)x?`?{2D?`3Sp-mq4D!OzY`O7Az0hqG!eloT5ka$c1XWp1EU%I%OXE`!jbOukYgQ zM_7@5Q-x}TI9?@kfylU#allu_M_3AeUm z5d%}LCCj>FQgbN({+rLUsqpT&sl*;fSlU?=XXxU>JGdD&nLxz(8um;5*SBl4a$@`r ztr!=D+)sLm`_qU4{WYcuI_>jebS#sD(!mcfeGE zrV0o0WQJ+}K_&_Q^3as)Jqf zBdgKR3Yp=Z$aXJ6uk+CByb4QGy`HQ|!waOw@8TPjAkh}79^|Xpm9@&>$7tWJLNO4p zj!O9Gb0qwAA*#@0kH;L3M6hPpV>;>kWG*|$uKAD$v#u=GL?lSyQNC0j7>pq@#6>k7 z`6dT@Bm>7_{s>5ZhYuF?)dZ4R#EygLaoo=iOgBZA#_+MeDw*8F z*3XP3`4xFGTw&BfZwU)(SjO{H)jR4{b?k^^Ywqk7yDH*!Xc8;ml zu9`!zr(G$9a}{&)blrwRXj_E@iK}e`i5K)HPz}`VtqDs0Y#WsL;mf0MLOf^I)D5@! zZv^AzqBJ5wc?{eIko;(hSV$LwZBv*fEfs7L|Wa!E$O!X7UDiG0H$P>MKJrH7#AXQlYS8S?$9d5+97f%@l+=*4)EF!g`9>YQ}(i;?Cj7gOO z1PT}^=oKG?c=}53m#7K7FW^8u$p$CaLaR4P!aC{bNjda9d7SeB~I6)=C3K%ei z3_tRGI;1BL4?Q| ze@^qpw2+QZkK!CzE2M(Jl`Iu>VACL;A>l{dG*McKz6DMVvIB(OhtLUd#jYW3wwrYk zGLP(^cmDOaymPWZ)z{CRKkuE}(JN)0Q&3a3IY%K~`k*Din4hAigSl9R`2iOegL3RlAFq;LPV@E)bvSXmf*$L1W*h$bA*-M}=vs3H`>@<7jx7HtY zVkog~TSJ!Y8Zu|v9A$f{Pgi}l1Z{?={Ax{_^@ix%{YK@gs>iCn@&WqAM&GWB%GFhA zGQZQenO~W|A)S!6a`%oj@AIH<-{+NUw0{LOsGhov2c~CCzTw>f7D0vW)(2 zd=K@was~6d@tUeHV^7}0`FXE$`!0?pDhqe|wpg#+S?Jp_udLig(WtCkFIz~hbUPrh zM`p}hAPv84NDHYTWaHNTuosB3kzOSgM&_IKcrO}AufD*eTo+st(i&qAoDdReyN_x7 z*BX5+<4bGwv5o&YHqvoBMHfjFIN!cV~+E{{e{#0Pz3- literal 0 HcmV?d00001 diff --git a/com.synology.TMDBExample/constant.py b/com.synology.TMDBExample/constant.py new file mode 100644 index 0000000..82b2579 --- /dev/null +++ b/com.synology.TMDBExample/constant.py @@ -0,0 +1,102 @@ +ERROR_PLUGIN_QUERY_FAIL = 1003 +ERROR_PLUGIN_PARSE_RESULT_FAIL = 1004 + +PLUGINID = 'com.synology.TMDBExample' +THEMOVIEDB_URL = 'https://api.themoviedb.org/3/' +BANNER_URL = 'https://image.tmdb.org/t/p/w500' +BACKDROP_URL = 'https://image.tmdb.org/t/p/original' +DEFAULT_EXPIRED_TIME = 86400 +DEFAULT_LONG_EXPIRED_TIME = 86400 * 30 +#TODO: you should assign your own APIKEY here +APIKEY = "bcebb6ce4f8ea47f712bfe5dca058619" + +MOVIE_DATA_TEMPLATE = { + 'title': '', + 'tagline': '', + 'original_available': '', + 'original_title': '', + 'summary': '', + 'certificate': '', + 'genre': [], + 'actor': [], + 'director': [], + 'writer': [], + 'extra': {} +} + +""" +movie extra template + 'extra': { + PLUGINID: { + 'poster': [], + 'backdrop': [], + 'reference': { + 'themoviedb': None, + 'imdb': None + }, + 'rating': { + 'themoviedb': None + }, + 'collection_id': { + 'themoviedb': -1 + } + } + } +""" + + +TVSHOW_DATA_TEMPLATE = { + 'title': '', + 'original_available': '', + 'original_title': '', + 'summary': '', + 'extra': {} +} + +""" +tvshow extra template + 'extra': { + PLUGINID: { + 'poster': [], + 'backdrop': [], + } + } +""" + + +TVSHOW_EPISODE_DATA_TEMPLATE = { + 'title': '', + 'tagline': '', + 'original_available': '', + 'summary': '', + 'certificate': '', + 'genre': [], + 'actor': [], + 'director': [], + 'writer': [], + 'season': -1, + 'episode': -1, + 'extra': {} +} + +""" +tvshow_episode extra template + 'extra': { + PLUGINID: { + 'tvshow': TVSHOW_DATA_TEMPLATE, + 'poster': [], + 'reference': { + 'themoviedb_tv': None, + 'imdb': None + }, + 'rating': { + 'themoviedb_tv': None + } + } + } +""" + +MOVIE_SIMILAR_DATA_TEMPLATE = { + 'title': '', + 'id': -1 +} diff --git a/com.synology.TMDBExample/loader.sh b/com.synology.TMDBExample/loader.sh new file mode 100644 index 0000000..3c514d5 --- /dev/null +++ b/com.synology.TMDBExample/loader.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +BASEDIR=$(dirname $0) +ARGV="" + +escape() +{ + local ARG=$(echo -E $@ | sed "s/'/'\\\\''/g") + echo \'$ARG\' +} + + +i=1 +while [ $i -le $# ]; do + eval ARG=\$\(escape \${$i}\) + ARGV="$ARGV $ARG" + i=`expr $i + 1` +done + + +eval "/usr/bin/env python3 "\ + "$BASEDIR/search.py $ARGV" + diff --git a/com.synology.TMDBExample/plugin_data/movie/862/en-US.json b/com.synology.TMDBExample/plugin_data/movie/862/en-US.json new file mode 100644 index 0000000..e216843 --- /dev/null +++ b/com.synology.TMDBExample/plugin_data/movie/862/en-US.json @@ -0,0 +1 @@ +{"adult":false,"backdrop_path":"/lxD5ak7BOoinRNehOCA85CQ8ubr.jpg","belongs_to_collection":{"id":10194,"name":"Toy Story Collection","poster_path":"/rki5qLuwb0xnnE9seehxO9TlLhW.jpg","backdrop_path":"/9FBwqcd9IRruEDUrTdcaafOMKUq.jpg"},"budget":30000000,"genres":[{"id":16,"name":"Animation"},{"id":12,"name":"Adventure"},{"id":10751,"name":"Family"},{"id":35,"name":"Comedy"}],"homepage":"http://toystory.disney.com/toy-story","id":862,"imdb_id":"tt0114709","original_language":"en","original_title":"Toy Story","overview":"Led by Woody, Andy's toys live happily in his room until Andy's birthday brings Buzz Lightyear onto the scene. Afraid of losing his place in Andy's heart, Woody plots against Buzz. But when circumstances separate Buzz and Woody from their owner, the duo eventually learns to put aside their differences.","popularity":100.954,"poster_path":"/uXDfjJbdP4ijW5hWSBrPrlKpxab.jpg","production_companies":[{"id":3,"logo_path":"/1TjvGVDMYsj6JBxOAkUHpPEwLf7.png","name":"Pixar","origin_country":"US"}],"production_countries":[{"iso_3166_1":"US","name":"United States of America"}],"release_date":"1995-10-30","revenue":394400000,"runtime":81,"spoken_languages":[{"english_name":"English","iso_639_1":"en","name":"English"}],"status":"Released","tagline":"Hang on for the comedy that goes to infinity and beyond!","title":"Toy Story","video":false,"vote_average":7.97,"vote_count":17279,"credits":{"cast":[{"adult":false,"gender":2,"id":31,"known_for_department":"Acting","name":"Tom Hanks","original_name":"Tom Hanks","popularity":83.881,"profile_path":"/xndWFsBlClOJFRdhSt4NBwiPq2o.jpg","cast_id":14,"character":"Woody (voice)","credit_id":"52fe4284c3a36847f8024f95","order":0},{"adult":false,"gender":2,"id":12898,"known_for_department":"Acting","name":"Tim Allen","original_name":"Tim Allen","popularity":30.027,"profile_path":"/woWhZzFILVhYMAvsPL171HjMY0y.jpg","cast_id":15,"character":"Buzz Lightyear (voice)","credit_id":"52fe4284c3a36847f8024f99","order":1},{"adult":false,"gender":2,"id":7167,"known_for_department":"Acting","name":"Don Rickles","original_name":"Don Rickles","popularity":18.451,"profile_path":"/iJLQV4dcbTUgxlWJakjDldzlMXS.jpg","cast_id":16,"character":"Mr. Potato Head (voice)","credit_id":"52fe4284c3a36847f8024f9d","order":2},{"adult":false,"gender":2,"id":12899,"known_for_department":"Acting","name":"Jim Varney","original_name":"Jim Varney","popularity":15.468,"profile_path":"/dIQwvAt9uxbchRHY0bz4OluKpIx.jpg","cast_id":17,"character":"Slinky Dog (voice)","credit_id":"52fe4284c3a36847f8024fa1","order":3},{"adult":false,"gender":2,"id":12900,"known_for_department":"Acting","name":"Wallace Shawn","original_name":"Wallace Shawn","popularity":46.698,"profile_path":"/wVaM1WlFKDce4esThwL4XtNLhOe.jpg","cast_id":18,"character":"Rex (voice)","credit_id":"52fe4284c3a36847f8024fa5","order":4},{"adult":false,"gender":2,"id":7907,"known_for_department":"Acting","name":"John Ratzenberger","original_name":"John Ratzenberger","popularity":21.364,"profile_path":"/e5aNU09v1q6WYTx9pNzC7yjSpve.jpg","cast_id":19,"character":"Hamm (voice)","credit_id":"52fe4284c3a36847f8024fa9","order":5},{"adult":false,"gender":1,"id":8873,"known_for_department":"Acting","name":"Annie Potts","original_name":"Annie Potts","popularity":54.026,"profile_path":"/wci5yNwwQvvRtHybDG36wZqhC1t.jpg","cast_id":20,"character":"Bo Peep (voice)","credit_id":"52fe4284c3a36847f8024fad","order":6},{"adult":false,"gender":2,"id":1116442,"known_for_department":"Acting","name":"John Morris","original_name":"John Morris","popularity":2.765,"profile_path":"/lSdNMhN3DoXEQJ37IeOD5mTMUQK.jpg","cast_id":26,"character":"Andy (voice)","credit_id":"52fe4284c3a36847f8024fc1","order":7},{"adult":false,"gender":2,"id":12901,"known_for_department":"Acting","name":"Erik von Detten","original_name":"Erik von Detten","popularity":17.706,"profile_path":"/7fHjKnLKmqzR0kmvRPLxpQE7BsK.jpg","cast_id":22,"character":"Sid (voice)","credit_id":"52fe4284c3a36847f8024fb1","order":8},{"adult":false,"gender":1,"id":12133,"known_for_department":"Acting","name":"Laurie Metcalf","original_name":"Laurie Metcalf","popularity":27.37,"profile_path":"/ypAppMZ1Q99cBjtX4BAnZmWjVXe.jpg","cast_id":23,"character":"Mrs. Davis (voice)","credit_id":"52fe4284c3a36847f8024fb5","order":9},{"adult":false,"gender":2,"id":8655,"known_for_department":"Acting","name":"R. Lee Ermey","original_name":"R. Lee Ermey","popularity":19.648,"profile_path":"/aXFJlEGHlQT7bwxkKwq6Sx7PeEp.jpg","cast_id":24,"character":"Sergeant (voice)","credit_id":"52fe4284c3a36847f8024fb9","order":10},{"adult":false,"gender":1,"id":12903,"known_for_department":"Acting","name":"Sarah Freeman","original_name":"Sarah Freeman","popularity":2.345,"profile_path":null,"cast_id":25,"character":"Hannah (voice)","credit_id":"52fe4284c3a36847f8024fbd","order":11},{"adult":false,"gender":2,"id":37221,"known_for_department":"Acting","name":"Penn Jillette","original_name":"Penn Jillette","popularity":8.821,"profile_path":"/zmAaXUdx12NRsssgHbk1T31j2x9.jpg","cast_id":27,"character":"TV Announcer (voice)","credit_id":"52fe4284c3a36847f8024fc5","order":12},{"adult":false,"gender":2,"id":19545,"known_for_department":"Acting","name":"Jack Angel","original_name":"Jack Angel","popularity":12.716,"profile_path":"/5MsVwIULYJotUSbDs61uSJff7ei.jpg","cast_id":300,"character":"Shark / Rocky Gibraltar (voice)","credit_id":"5aa599ad9251412787027f71","order":13},{"adult":false,"gender":0,"id":1266092,"known_for_department":"Acting","name":"Spencer Aste","original_name":"Spencer Aste","popularity":1.294,"profile_path":null,"cast_id":301,"character":"Wounded Soldier (voice)","credit_id":"5aa599edc3a3687bfc02cbf2","order":14},{"adult":false,"gender":2,"id":94038,"known_for_department":"Acting","name":"Greg Berg","original_name":"Greg Berg","popularity":2.873,"profile_path":"/w5Cn5dc9Sci7rTtMfCmIqIJfMjX.jpg","cast_id":302,"character":"Local Announcer (voice)","credit_id":"5aa59b229251412781026d69","order":15},{"adult":false,"gender":0,"id":1202809,"known_for_department":"Acting","name":"Lisa Bradley","original_name":"Lisa Bradley","popularity":1.543,"profile_path":null,"cast_id":303,"character":"Kid (voice)","credit_id":"5aa59b4e925141278d027723","order":16},{"adult":false,"gender":0,"id":134713,"known_for_department":"Acting","name":"Kendall Cunningham","original_name":"Kendall Cunningham","popularity":3.029,"profile_path":null,"cast_id":304,"character":"Kid (voice)","credit_id":"5aa59b7b92514127840277c1","order":17},{"adult":false,"gender":1,"id":73016,"known_for_department":"Acting","name":"Debi Derryberry","original_name":"Debi Derryberry","popularity":24.499,"profile_path":"/aCVgHnvGBw7ssZA9kl1Pnr5pJjU.jpg","cast_id":305,"character":"Aliens / Pizza Planet Announcer (voice)","credit_id":"5aa59b8d0e0a26075a02c4d4","order":18},{"adult":false,"gender":2,"id":186614,"known_for_department":"Acting","name":"Cody Dorkin","original_name":"Cody Dorkin","popularity":6.962,"profile_path":null,"cast_id":306,"character":"Kid (voice)","credit_id":"5aa59bc0c3a3687c0c02aa21","order":19},{"adult":false,"gender":2,"id":84213,"known_for_department":"Acting","name":"Bill Farmer","original_name":"Bill Farmer","popularity":16.489,"profile_path":"/lhezx68R12s5Bsv7d77BrQb7tWA.jpg","cast_id":310,"character":"Monotone Announcer (voice)","credit_id":"5aa59c2e0e0a26075d02c5cd","order":20},{"adult":false,"gender":2,"id":1122227,"known_for_department":"Production","name":"Craig Good","original_name":"Craig Good","popularity":1.4,"profile_path":null,"cast_id":311,"character":"Mission Control (voice)","credit_id":"5aa59c62925141278d027807","order":21},{"adult":false,"gender":0,"id":1017469,"known_for_department":"Acting","name":"Gregory Grudt","original_name":"Gregory Grudt","popularity":0.859,"profile_path":null,"cast_id":307,"character":"Kid (voice)","credit_id":"5aa59bd0c3a3687bfc02cdf4","order":22},{"adult":false,"gender":1,"id":1217873,"known_for_department":"Acting","name":"Danielle Judovits","original_name":"Danielle Judovits","popularity":3.362,"profile_path":"/5ecdzR76eyTDcaTGfLOWNeksUi6.jpg","cast_id":312,"character":"Burned Rag Doll (voice)","credit_id":"5aa59c75925141277e02772d","order":23},{"adult":false,"gender":0,"id":1266095,"known_for_department":"Acting","name":"Sam Lasseter","original_name":"Sam Lasseter","popularity":1.052,"profile_path":null,"cast_id":308,"character":"Kid (voice)","credit_id":"5aa59bde0e0a26074d0285ce","order":24},{"adult":false,"gender":1,"id":178710,"known_for_department":"Acting","name":"Brittany Levenbrown","original_name":"Brittany Levenbrown","popularity":0.6,"profile_path":null,"cast_id":309,"character":"Kid (voice)","credit_id":"5aa59c0b0e0a26075402b8a5","order":25},{"adult":false,"gender":1,"id":214701,"known_for_department":"Acting","name":"Sherry Lynn","original_name":"Sherry Lynn","popularity":3.75,"profile_path":"/cp7SYig9JVbBWgc2YD4wEUNQGzh.jpg","cast_id":162,"character":"Mom (voice)","credit_id":"59f546f592514141ed005c7f","order":26},{"adult":false,"gender":2,"id":79020,"known_for_department":"Acting","name":"Scott McAfee","original_name":"Scott McAfee","popularity":4.147,"profile_path":"/meKYkzavWpSg2KheDlMlUmZC4za.jpg","cast_id":313,"character":"Kid (voice)","credit_id":"5aa59ca4c3a3687c2502c393","order":27},{"adult":false,"gender":1,"id":84493,"known_for_department":"Acting","name":"Mickie McGowan","original_name":"Mickie McGowan","popularity":8.046,"profile_path":"/4K1HF10EvDjdaIoDAnWqFZjnmvk.jpg","cast_id":339,"character":"Sid's Mom (voice)","credit_id":"5e6ea17eb1f68d0019d87b0f","order":28},{"adult":false,"gender":2,"id":166406,"known_for_department":"Acting","name":"Ryan O'Donohue","original_name":"Ryan O'Donohue","popularity":3.67,"profile_path":null,"cast_id":314,"character":"Kid (voice)","credit_id":"5aa59cb20e0a26074b02c841","order":29},{"adult":false,"gender":2,"id":7882,"known_for_department":"Writing","name":"Jeff Pidgeon","original_name":"Jeff Pidgeon","popularity":6.84,"profile_path":"/t8LV9Y6s1qwQQNSRfo6GWEExffd.jpg","cast_id":315,"character":"Aliens / Robot / Mr. Spell (voice)","credit_id":"5aa59cbf0e0a260760027438","order":30},{"adult":false,"gender":2,"id":61968,"known_for_department":"Acting","name":"Patrick Pinney","original_name":"Patrick Pinney","popularity":8.731,"profile_path":"/lFRkthHgjyUn2AAqDAoVszedVJL.jpg","cast_id":316,"character":"Pizza Delivery Guy / Angry Driver #2 (voice)","credit_id":"5aa59cce925141279302851e","order":31},{"adult":false,"gender":2,"id":61969,"known_for_department":"Acting","name":"Phil Proctor","original_name":"Phil Proctor","popularity":11.439,"profile_path":"/iLTvGROn3XvT0MPPspF2e3OsFCs.jpg","cast_id":317,"character":"Pizza Planet Announcer / Pizza Planet Guard (voice)","credit_id":"5aa59cdec3a3687c2502c3d9","order":32},{"adult":false,"gender":2,"id":157626,"known_for_department":"Acting","name":"Jan Rabson","original_name":"Jan Rabson","popularity":4.869,"profile_path":"/8IBFupx53arTqxOYhGkGwyVSaOn.jpg","cast_id":318,"character":"Gas Station Attendant (voice)","credit_id":"5aa59ced0e0a26075a02c62b","order":33},{"adult":false,"gender":2,"id":7911,"known_for_department":"Writing","name":"Joe Ranft","original_name":"Joe Ranft","popularity":7.265,"profile_path":"/f1BoWC2JbCcfP1e5hKfGsxkHzVU.jpg","cast_id":319,"character":"Lenny the Binoculars (voice)","credit_id":"5aa59cfa0e0a260760027472","order":34},{"adult":false,"gender":2,"id":7,"known_for_department":"Writing","name":"Andrew Stanton","original_name":"Andrew Stanton","popularity":15.741,"profile_path":"/tRwWuo06aN9vuXAPaswMN42x2ii.jpg","cast_id":320,"character":"Commercial Chorus (voice)","credit_id":"5aa59d0bc3a3687bff02cc99","order":35},{"adult":false,"gender":2,"id":158124,"known_for_department":"Acting","name":"Shane Sweet","original_name":"Shane Sweet","popularity":2.289,"profile_path":null,"cast_id":321,"character":"Kid (voice)","credit_id":"5aa59d18925141277e0277a1","order":36},{"adult":false,"gender":2,"id":7879,"known_for_department":"Production","name":"John Lasseter","original_name":"John Lasseter","popularity":11.79,"profile_path":"/gAVAZZHBa1v3gTcsWcBUwiHcyA0.jpg","cast_id":323,"character":"Commercial Chorus #1 (voice) (uncredited)","credit_id":"5aa59d62c3a3687c06026721","order":37},{"adult":false,"gender":2,"id":2256785,"known_for_department":"Acting","name":"Jonathan Benair","original_name":"Jonathan Benair","popularity":0.794,"profile_path":null,"cast_id":341,"character":"Troops (uncredited)","credit_id":"607ad05c43d9b10057d83973","order":38},{"adult":false,"gender":2,"id":1320992,"known_for_department":"Acting","name":"Anthony Burch","original_name":"Anthony Burch","popularity":5.977,"profile_path":"/aKqOh3xLr28d4RbwQNpVyZrv29w.jpg","cast_id":361,"character":"Kid (voice)","credit_id":"62bb5fd7c613ce00633660f8","order":39}],"crew":[{"adult":false,"gender":2,"id":7,"known_for_department":"Writing","name":"Andrew Stanton","original_name":"Andrew Stanton","popularity":15.741,"profile_path":"/tRwWuo06aN9vuXAPaswMN42x2ii.jpg","credit_id":"52fe4284c3a36847f8024f55","department":"Writing","job":"Screenplay"},{"adult":false,"gender":2,"id":7,"known_for_department":"Writing","name":"Andrew Stanton","original_name":"Andrew Stanton","popularity":15.741,"profile_path":"/tRwWuo06aN9vuXAPaswMN42x2ii.jpg","credit_id":"5891edf9c3a36809700075e6","department":"Writing","job":"Original Story"},{"adult":false,"gender":2,"id":7,"known_for_department":"Writing","name":"Andrew Stanton","original_name":"Andrew Stanton","popularity":15.741,"profile_path":"/tRwWuo06aN9vuXAPaswMN42x2ii.jpg","credit_id":"5892132b9251412dc80097b1","department":"Visual Effects","job":"Character Designer"},{"adult":false,"gender":2,"id":7,"known_for_department":"Writing","name":"Andrew Stanton","original_name":"Andrew Stanton","popularity":15.741,"profile_path":"/tRwWuo06aN9vuXAPaswMN42x2ii.jpg","credit_id":"617c69725aba3200439f4f90","department":"Art","job":"Storyboard Artist"},{"adult":false,"gender":2,"id":8,"known_for_department":"Directing","name":"Lee Unkrich","original_name":"Lee Unkrich","popularity":6.801,"profile_path":"/crb297utC6W4HSstOe5djDPTwEN.jpg","credit_id":"52fe4284c3a36847f8024f8b","department":"Editing","job":"Editor"},{"adult":false,"gender":2,"id":9,"known_for_department":"Production","name":"Graham Walters","original_name":"Graham Walters","popularity":1.45,"profile_path":"/rmFFUsCJBjtl2xgsED6hODix9cy.jpg","credit_id":"5aa58c01c3a3687c060255e1","department":"Visual Effects","job":"Shading"},{"adult":false,"gender":2,"id":9,"known_for_department":"Production","name":"Graham Walters","original_name":"Graham Walters","popularity":1.45,"profile_path":"/rmFFUsCJBjtl2xgsED6hODix9cy.jpg","credit_id":"5aa58bf60e0a26075d02b325","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":2,"id":10,"known_for_department":"Acting","name":"Bob Peterson","original_name":"Bob Peterson","popularity":8.15,"profile_path":"/dJe3nTCIToebjj1WHFHP7LmZKyk.jpg","credit_id":"617c6bf8651fcf004303ce82","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":2,"id":7879,"known_for_department":"Production","name":"John Lasseter","original_name":"John Lasseter","popularity":11.79,"profile_path":"/gAVAZZHBa1v3gTcsWcBUwiHcyA0.jpg","credit_id":"52fe4284c3a36847f8024f49","department":"Directing","job":"Director"},{"adult":false,"gender":2,"id":7879,"known_for_department":"Production","name":"John Lasseter","original_name":"John Lasseter","popularity":11.79,"profile_path":"/gAVAZZHBa1v3gTcsWcBUwiHcyA0.jpg","credit_id":"574f12309251415ca1000012","department":"Writing","job":"Original Story"},{"adult":false,"gender":2,"id":598,"known_for_department":"Production","name":"Mike Fenton","original_name":"Mike Fenton","popularity":3.969,"profile_path":"/oIKCBb2w47iZps9neDo2GY29g1y.jpg","credit_id":"5aa59daec3a3687bff02cd24","department":"Production","job":"Casting"},{"adult":false,"gender":2,"id":2216,"known_for_department":"Sound","name":"Gary Rydstrom","original_name":"Gary Rydstrom","popularity":2.876,"profile_path":"/1DoKaxoJlz6hV9bai43e07GxGQf.jpg","credit_id":"58920f1fc3a3680977009021","department":"Sound","job":"Sound Designer"},{"adult":false,"gender":2,"id":2216,"known_for_department":"Sound","name":"Gary Rydstrom","original_name":"Gary Rydstrom","popularity":2.876,"profile_path":"/1DoKaxoJlz6hV9bai43e07GxGQf.jpg","credit_id":"58921544c3a3686b0a00507d","department":"Sound","job":"Sound Re-Recording Mixer"},{"adult":false,"gender":1,"id":2874,"known_for_department":"Production","name":"Janet Hirshenson","original_name":"Janet Hirshenson","popularity":5.382,"profile_path":null,"credit_id":"5aa59dddc3a3687c130273f4","department":"Production","job":"Casting"},{"adult":false,"gender":2,"id":4949,"known_for_department":"Sound","name":"Don Davis","original_name":"Don Davis","popularity":2.556,"profile_path":"/39dDBsvnw05JCw1Qft9h6wMgVB2.jpg","credit_id":"5892173dc3a3680968009351","department":"Sound","job":"Orchestrator"},{"adult":false,"gender":0,"id":7069,"known_for_department":"Sound","name":"Pat Jackson","original_name":"Pat Jackson","popularity":3.632,"profile_path":null,"credit_id":"589215c39251412dcb009c12","department":"Sound","job":"Sound Effects Editor"},{"adult":false,"gender":1,"id":7881,"known_for_department":"Visual Effects","name":"Jill Culton","original_name":"Jill Culton","popularity":3.648,"profile_path":"/mtEH7qmhT4jJMWBukJ7G7ql5M7b.jpg","credit_id":"617c69c60d5d850065fa35b8","department":"Art","job":"Storyboard Artist"},{"adult":false,"gender":2,"id":7882,"known_for_department":"Writing","name":"Jeff Pidgeon","original_name":"Jeff Pidgeon","popularity":6.84,"profile_path":"/t8LV9Y6s1qwQQNSRfo6GWEExffd.jpg","credit_id":"5892110b9251412dc800959d","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":2,"id":7882,"known_for_department":"Writing","name":"Jeff Pidgeon","original_name":"Jeff Pidgeon","popularity":6.84,"profile_path":"/t8LV9Y6s1qwQQNSRfo6GWEExffd.jpg","credit_id":"617c6a2d0d5d850065fa3674","department":"Art","job":"Storyboard Artist"},{"adult":false,"gender":2,"id":7883,"known_for_department":"Art","name":"Ralph Eggleston","original_name":"Ralph Eggleston","popularity":3.119,"profile_path":"/28ZxW5tHMuWYK8T3I0xLfVAF9yw.jpg","credit_id":"52fe4284c3a36847f8024f91","department":"Art","job":"Art Direction"},{"adult":false,"gender":2,"id":7885,"known_for_department":"Sound","name":"Randy Newman","original_name":"Randy Newman","popularity":6.237,"profile_path":"/u4b5Jaqyd5QAl407Zf3PHEf1HWD.jpg","credit_id":"5aa728a50e0a263dc4015a07","department":"Sound","job":"Original Music Composer"},{"adult":false,"gender":2,"id":7885,"known_for_department":"Sound","name":"Randy Newman","original_name":"Randy Newman","popularity":6.237,"profile_path":"/u4b5Jaqyd5QAl407Zf3PHEf1HWD.jpg","credit_id":"646ce3d133a376011ec58fb0","department":"Sound","job":"Songs"},{"adult":false,"gender":2,"id":7885,"known_for_department":"Sound","name":"Randy Newman","original_name":"Randy Newman","popularity":6.237,"profile_path":"/u4b5Jaqyd5QAl407Zf3PHEf1HWD.jpg","credit_id":"61c4210c48333a0062f4dac9","department":"Sound","job":"Orchestrator"},{"adult":false,"gender":0,"id":7887,"known_for_department":"Production","name":"Thomas Porter","original_name":"Thomas Porter","popularity":3.347,"profile_path":null,"credit_id":"589211c1c3a3686b0a004d28","department":"Visual Effects","job":"Visual Effects Supervisor"},{"adult":false,"gender":1,"id":7890,"known_for_department":"Art","name":"Tia W. Kratter","original_name":"Tia W. Kratter","popularity":1.4,"profile_path":"/bn9DbdYISmkqTLeG31Z8PHsPKdi.jpg","credit_id":"5aa574529251412781023e4f","department":"Art","job":"Lead Painter"},{"adult":false,"gender":2,"id":7892,"known_for_department":"Crew","name":"Glenn McQueen","original_name":"Glenn McQueen","popularity":1.513,"profile_path":null,"credit_id":"589210fa9251412dc8009595","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":7893,"known_for_department":"Visual Effects","name":"Rich Quade","original_name":"Rich Quade","popularity":2.17,"profile_path":null,"credit_id":"589210069251412dd7009219","department":"Visual Effects","job":"Animation Director"},{"adult":false,"gender":0,"id":7897,"known_for_department":"Visual Effects","name":"Eben Ostby","original_name":"Eben Ostby","popularity":1.328,"profile_path":null,"credit_id":"5aa59725925141277e027292","department":"Visual Effects","job":"Visual Effects Technical Director"},{"adult":false,"gender":1,"id":7902,"known_for_department":"Production","name":"Ruth Lambert","original_name":"Ruth Lambert","popularity":9.967,"profile_path":null,"credit_id":"589216e49251412dcd009a4f","department":"Production","job":"Casting Consultant"},{"adult":false,"gender":2,"id":7911,"known_for_department":"Writing","name":"Joe Ranft","original_name":"Joe Ranft","popularity":7.265,"profile_path":"/f1BoWC2JbCcfP1e5hKfGsxkHzVU.jpg","credit_id":"574f12519251415c92000015","department":"Writing","job":"Original Story"},{"adult":false,"gender":2,"id":7911,"known_for_department":"Writing","name":"Joe Ranft","original_name":"Joe Ranft","popularity":7.265,"profile_path":"/f1BoWC2JbCcfP1e5hKfGsxkHzVU.jpg","credit_id":"617c692bd388ae008a026b84","department":"Writing","job":"Story Supervisor"},{"adult":false,"gender":2,"id":7918,"known_for_department":"Acting","name":"Bud Luckey","original_name":"Bud Luckey","popularity":1.936,"profile_path":"/csLjHwg7x1OFTiHjJAPpqNjjDiH.jpg","credit_id":"589210e1c3a36809770091a7","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":2,"id":7918,"known_for_department":"Acting","name":"Bud Luckey","original_name":"Bud Luckey","popularity":1.936,"profile_path":"/csLjHwg7x1OFTiHjJAPpqNjjDiH.jpg","credit_id":"589213249251412dd100987b","department":"Visual Effects","job":"Character Designer"},{"adult":false,"gender":2,"id":7918,"known_for_department":"Acting","name":"Bud Luckey","original_name":"Bud Luckey","popularity":1.936,"profile_path":"/csLjHwg7x1OFTiHjJAPpqNjjDiH.jpg","credit_id":"617c6a1e651fcf006269a283","department":"Art","job":"Storyboard Artist"},{"adult":false,"gender":2,"id":7940,"known_for_department":"Production","name":"Jonas Rivera","original_name":"Jonas Rivera","popularity":1.919,"profile_path":"/uzoCan3ZeK2jXt3NaZ6uilvcQTU.jpg","credit_id":"5aa591189251412784026ef2","department":"Crew","job":"Production Office Assistant"},{"adult":false,"gender":0,"id":7949,"known_for_department":"Visual Effects","name":"Robin Cooper","original_name":"Robin Cooper","popularity":1.417,"profile_path":null,"credit_id":"572e2522c3a36869e6001a9c","department":"Visual Effects","job":"CG Painter"},{"adult":false,"gender":0,"id":7961,"known_for_department":"Art","name":"Norm DeCarlo","original_name":"Norm DeCarlo","popularity":1.556,"profile_path":null,"credit_id":"574f14f19251415ca1000082","department":"Art","job":"Sculptor"},{"adult":false,"gender":2,"id":8010,"known_for_department":"Visual Effects","name":"Doug Sweetland","original_name":"Doug Sweetland","popularity":1.789,"profile_path":"/zYxgikK0IBkMUmUBXBppJJDK4ZD.jpg","credit_id":"58921148c3a3686b0a004c99","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":8015,"known_for_department":"Visual Effects","name":"Shawn Krause","original_name":"Shawn Krause","popularity":1.628,"profile_path":"/m8QpuUJgZ40A2WvpNcklj8fkf9L.jpg","credit_id":"5aa595f5c3a3687c13026db6","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":8017,"known_for_department":"Visual Effects","name":"Jeff Pratt","original_name":"Jeff Pratt","popularity":0.923,"profile_path":null,"credit_id":"58921113c3a36863480044e4","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":8025,"known_for_department":"Visual Effects","name":"Michael Berenstein","original_name":"Michael Berenstein","popularity":0.924,"profile_path":null,"credit_id":"589210329251412dcd00943b","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":2,"id":8029,"known_for_department":"Visual Effects","name":"Jimmy Hayward","original_name":"Jimmy Hayward","popularity":1.972,"profile_path":"/iUPWT3m14xpl3WSLm8LblKHRmwy.jpg","credit_id":"58921093c3a3686348004477","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":8035,"known_for_department":"Visual Effects","name":"Karen Kiser","original_name":"Karen Kiser","popularity":0.883,"profile_path":null,"credit_id":"589210a29251412dc5009a29","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":2,"id":8042,"known_for_department":"Visual Effects","name":"Andrew L. Schmidt","original_name":"Andrew L. Schmidt","popularity":3.464,"profile_path":null,"credit_id":"617c6c3d3f7e1d0042cf7db7","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":8044,"known_for_department":"Visual Effects","name":"David Tart","original_name":"David Tart","popularity":2.588,"profile_path":null,"credit_id":"58921150c3a3680966009125","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":8050,"known_for_department":"Visual Effects","name":"Alan Sperling","original_name":"Alan Sperling","popularity":0.6,"profile_path":null,"credit_id":"5892113cc3a3680970009106","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":8067,"known_for_department":"Sound","name":"Dan Engstrom","original_name":"Dan Engstrom","popularity":0.6,"profile_path":null,"credit_id":"589216d79251412dc8009aa0","department":"Sound","job":"Assistant Sound Editor"},{"adult":false,"gender":0,"id":8082,"known_for_department":"Visual Effects","name":"Deirdre Warin","original_name":"Deirdre Warin","popularity":0.972,"profile_path":null,"credit_id":"5aa58b7a9251412784026766","department":"Visual Effects","job":"Shading"},{"adult":false,"gender":0,"id":8082,"known_for_department":"Visual Effects","name":"Deirdre Warin","original_name":"Deirdre Warin","popularity":0.972,"profile_path":null,"credit_id":"5aa58c100e0a26075402a654","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":8086,"known_for_department":"Visual Effects","name":"Mark Adams","original_name":"Mark Adams","popularity":1.201,"profile_path":null,"credit_id":"5aa58b990e0a26075d02b279","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":8086,"known_for_department":"Visual Effects","name":"Mark Adams","original_name":"Mark Adams","popularity":1.201,"profile_path":null,"credit_id":"5aa59849925141278a027474","department":"Lighting","job":"Lighting Artist"},{"adult":false,"gender":0,"id":8096,"known_for_department":"Visual Effects","name":"Daniel McCoy","original_name":"Daniel McCoy","popularity":0.6,"profile_path":null,"credit_id":"5aa5927fc3a3687c06025e19","department":"Crew","job":"Software Engineer"},{"adult":false,"gender":0,"id":8098,"known_for_department":"Visual Effects","name":"Anthony A. Apodaca","original_name":"Anthony A. Apodaca","popularity":1.442,"profile_path":null,"credit_id":"5aa592c80e0a26074b02beb8","department":"Visual Effects","job":"Shading"},{"adult":false,"gender":0,"id":8098,"known_for_department":"Visual Effects","name":"Anthony A. Apodaca","original_name":"Anthony A. Apodaca","popularity":1.442,"profile_path":null,"credit_id":"5aa59858925141277e02737d","department":"Lighting","job":"Lighting Artist"},{"adult":false,"gender":0,"id":8098,"known_for_department":"Visual Effects","name":"Anthony A. Apodaca","original_name":"Anthony A. Apodaca","popularity":1.442,"profile_path":null,"credit_id":"5aa592adc3a3687c03025ee5","department":"Crew","job":"Software Engineer"},{"adult":false,"gender":0,"id":8125,"known_for_department":"Crew","name":"Rob Cook","original_name":"Rob Cook","popularity":0.664,"profile_path":null,"credit_id":"5aa591ebc3a3687bff02c2a3","department":"Crew","job":"Software Engineer"},{"adult":false,"gender":2,"id":8135,"known_for_department":"Camera","name":"Louis Rivera","original_name":"Louis Rivera","popularity":0.941,"profile_path":null,"credit_id":"5aa570d8c3a3687c0602329b","department":"Camera","job":"Camera Supervisor"},{"adult":false,"gender":0,"id":8138,"known_for_department":"Camera","name":"Don Conway","original_name":"Don Conway","popularity":0.6,"profile_path":null,"credit_id":"5aa5708e925141278a024381","department":"Camera","job":"Camera Technician"},{"adult":false,"gender":1,"id":8160,"known_for_department":"Sound","name":"Dennie Thorpe","original_name":"Dennie Thorpe","popularity":2.449,"profile_path":null,"credit_id":"5aa5739f9251412787024f90","department":"Sound","job":"Foley"},{"adult":false,"gender":0,"id":8164,"known_for_department":"Sound","name":"Tony Eckert","original_name":"Tony Eckert","popularity":3.549,"profile_path":null,"credit_id":"5aa573adc3a3687c030235e7","department":"Sound","job":"Foley"},{"adult":false,"gender":2,"id":8276,"known_for_department":"Sound","name":"Tim Holland","original_name":"Tim Holland","popularity":1.4,"profile_path":null,"credit_id":"58921555c3a36809680091bd","department":"Sound","job":"Supervising Sound Editor"},{"adult":false,"gender":2,"id":12079,"known_for_department":"Directing","name":"Kelly Asbury","original_name":"Kelly Asbury","popularity":4.691,"profile_path":"/fzHQFYLc1zVVn3dUjr6pMuKdE0U.jpg","credit_id":"617c6985e93e9500624fdb8b","department":"Art","job":"Storyboard Artist"},{"adult":false,"gender":2,"id":12890,"known_for_department":"Writing","name":"Pete Docter","original_name":"Pete Docter","popularity":9.188,"profile_path":"/xz46mHzo8apkVMxmrkMQvqakOL0.jpg","credit_id":"574f1240c3a3682e7300001c","department":"Writing","job":"Original Story"},{"adult":false,"gender":2,"id":12890,"known_for_department":"Writing","name":"Pete Docter","original_name":"Pete Docter","popularity":9.188,"profile_path":"/xz46mHzo8apkVMxmrkMQvqakOL0.jpg","credit_id":"58920f0b9251412dd7009104","department":"Crew","job":"Supervising Animator"},{"adult":false,"gender":2,"id":12890,"known_for_department":"Writing","name":"Pete Docter","original_name":"Pete Docter","popularity":9.188,"profile_path":"/xz46mHzo8apkVMxmrkMQvqakOL0.jpg","credit_id":"617c69d4fdc4fa00876a9361","department":"Art","job":"Storyboard Artist"},{"adult":false,"gender":2,"id":12891,"known_for_department":"Writing","name":"Joss Whedon","original_name":"Joss Whedon","popularity":7.765,"profile_path":"/mVvpZnKYKSCtkOQixQnOonV5kv3.jpg","credit_id":"52fe4284c3a36847f8024f4f","department":"Writing","job":"Screenplay"},{"adult":false,"gender":2,"id":12892,"known_for_department":"Writing","name":"Joel Cohen","original_name":"Joel Cohen","popularity":3.744,"profile_path":"/xcYDoo4waWmYvCeG6OnbfESuH2J.jpg","credit_id":"52fe4284c3a36847f8024f5b","department":"Writing","job":"Screenplay"},{"adult":false,"gender":0,"id":12893,"known_for_department":"Writing","name":"Alec Sokolow","original_name":"Alec Sokolow","popularity":3.316,"profile_path":null,"credit_id":"52fe4284c3a36847f8024f61","department":"Writing","job":"Screenplay"},{"adult":false,"gender":1,"id":12894,"known_for_department":"Production","name":"Bonnie Arnold","original_name":"Bonnie Arnold","popularity":1.32,"profile_path":"/fFU68wkvil1w8gOjwCzzHysKJP0.jpg","credit_id":"52fe4284c3a36847f8024f67","department":"Production","job":"Producer"},{"adult":false,"gender":2,"id":12895,"known_for_department":"Production","name":"Edwin Catmull","original_name":"Edwin Catmull","popularity":2.075,"profile_path":"/dRxY51eWnvSpTn1A2MQOwbnHDFE.jpg","credit_id":"52fe4284c3a36847f8024f6d","department":"Production","job":"Executive Producer"},{"adult":false,"gender":2,"id":12896,"known_for_department":"Production","name":"Ralph Guggenheim","original_name":"Ralph Guggenheim","popularity":1.176,"profile_path":null,"credit_id":"52fe4284c3a36847f8024f73","department":"Production","job":"Producer"},{"adult":false,"gender":2,"id":12897,"known_for_department":"Acting","name":"Steve Jobs","original_name":"Steve Jobs","popularity":1.331,"profile_path":"/n71rW0xTowxKD0HwvLiWkaIfgbf.jpg","credit_id":"52fe4284c3a36847f8024f79","department":"Production","job":"Executive Producer"},{"adult":false,"gender":2,"id":12905,"known_for_department":"Writing","name":"Ash Brannon","original_name":"Ash Brannon","popularity":3.312,"profile_path":"/meH6AhBnCyX4w0lBFvRQWDJmvjv.jpg","credit_id":"5751ae4bc3a3683772002b7f","department":"Visual Effects","job":"Animation Director"},{"adult":false,"gender":2,"id":12905,"known_for_department":"Writing","name":"Ash Brannon","original_name":"Ash Brannon","popularity":3.312,"profile_path":"/meH6AhBnCyX4w0lBFvRQWDJmvjv.jpg","credit_id":"617c6995387651008c0fce3d","department":"Art","job":"Storyboard Artist"},{"adult":false,"gender":0,"id":12909,"known_for_department":"Production","name":"Karen Robert Jackson","original_name":"Karen Robert Jackson","popularity":0.732,"profile_path":null,"credit_id":"58920f389251412dd700912d","department":"Production","job":"Production Supervisor"},{"adult":false,"gender":1,"id":12912,"known_for_department":"Camera","name":"Sharon Calahan","original_name":"Sharon Calahan","popularity":0.6,"profile_path":null,"credit_id":"589212709251412dcd009676","department":"Lighting","job":"Lighting Supervisor"},{"adult":false,"gender":0,"id":12915,"known_for_department":"Visual Effects","name":"William Cone","original_name":"William Cone","popularity":1.103,"profile_path":null,"credit_id":"589212cdc3a3680970009268","department":"Visual Effects","job":"CG Painter"},{"adult":false,"gender":0,"id":12915,"known_for_department":"Visual Effects","name":"William Cone","original_name":"William Cone","popularity":1.103,"profile_path":null,"credit_id":"58921332c3a368634800467b","department":"Visual Effects","job":"Character Designer"},{"adult":false,"gender":2,"id":15894,"known_for_department":"Sound","name":"Tom Myers","original_name":"Tom Myers","popularity":2.066,"profile_path":"/igQ5idVJbKHFHaUPvIyR40qiZyF.jpg","credit_id":"58921698c3a368096a009788","department":"Crew","job":"Sound Design Assistant"},{"adult":false,"gender":1,"id":7899,"known_for_department":"Production","name":"Galyn Susman","original_name":"Galyn Susman","popularity":1.927,"profile_path":"/x7eCfF09EXtGThrf5tnr83G7qm7.jpg","credit_id":"5892127fc3a3686b0a004de5","department":"Lighting","job":"Lighting Supervisor"},{"adult":false,"gender":2,"id":57673,"known_for_department":"Production","name":"Kevin Reher","original_name":"Kevin Reher","popularity":1.901,"profile_path":null,"credit_id":"5aa58ef80e0a2607510254a0","department":"Crew","job":"Production Controller"},{"adult":false,"gender":2,"id":60678,"known_for_department":"Writing","name":"William Joyce","original_name":"William Joyce","popularity":1.292,"profile_path":null,"credit_id":"617c6c97d388ae00611a7d1e","department":"Art","job":"Concept Artist"},{"adult":false,"gender":2,"id":66193,"known_for_department":"Directing","name":"Chris Sanders","original_name":"Chris Sanders","popularity":11.94,"profile_path":"/6CtrIOCxggJ5eIAWeFQqd4Hs9FP.jpg","credit_id":"617c6b5d71f0950042dc22ab","department":"Visual Effects","job":"Character Designer"},{"adult":false,"gender":1,"id":84493,"known_for_department":"Acting","name":"Mickie McGowan","original_name":"Mickie McGowan","popularity":8.046,"profile_path":"/4K1HF10EvDjdaIoDAnWqFZjnmvk.jpg","credit_id":"589216f39251412dc2009cf3","department":"Production","job":"ADR Voice Casting"},{"adult":false,"gender":0,"id":78009,"known_for_department":"Visual Effects","name":"Colin Brady","original_name":"Colin Brady","popularity":2.102,"profile_path":null,"credit_id":"5892103bc3a368096a009180","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":555795,"known_for_department":"Writing","name":"Mark Oftedal","original_name":"Mark Oftedal","popularity":1.08,"profile_path":null,"credit_id":"589211029251412dc8009598","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":587314,"known_for_department":"Visual Effects","name":"Guionne Leroy","original_name":"Guionne Leroy","popularity":1.048,"profile_path":null,"credit_id":"589210d7c3a3686b0a004c1f","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":953331,"known_for_department":"Crew","name":"Chris Montan","original_name":"Chris Montan","popularity":2.567,"profile_path":null,"credit_id":"58920fbd9251412dcb00969c","department":"Crew","job":"Executive Music Producer"},{"adult":false,"gender":2,"id":958055,"known_for_department":"Writing","name":"Jason Katz","original_name":"Jason Katz","popularity":1.754,"profile_path":null,"credit_id":"617c6a0e651fcf004303cab7","department":"Art","job":"Storyboard Artist"},{"adult":false,"gender":2,"id":958881,"known_for_department":"Writing","name":"Robert Lence","original_name":"Robert Lence","popularity":3.979,"profile_path":"/LaT44CeqJYQuN8SfDvbCyoA3kt.jpg","credit_id":"617c69585294e7002a4ab452","department":"Writing","job":"Story Supervisor"},{"adult":false,"gender":0,"id":1088034,"known_for_department":"Visual Effects","name":"Tom Holloway","original_name":"Tom Holloway","popularity":1.31,"profile_path":"/a0r0T2usTBpgMI5aZbRBDW1fTl8.jpg","credit_id":"5892138e9251412dc20099fc","department":"Visual Effects","job":"Character Designer"},{"adult":false,"gender":1,"id":1116126,"known_for_department":"Production","name":"Meredith Layne","original_name":"Meredith Layne","popularity":1.76,"profile_path":null,"credit_id":"5aa570a992514127900247f7","department":"Production","job":"Casting Assistant"},{"adult":false,"gender":2,"id":1146858,"known_for_department":"Sound","name":"Armen Ksajikian","original_name":"Armen Ksajikian","popularity":1.443,"profile_path":"/5QBiIGEn4sMx9fbY5X4kBofvU7E.jpg","credit_id":"634ffbe9d363e500824d7bba","department":"Sound","job":"Musician"},{"adult":false,"gender":2,"id":1168870,"known_for_department":"Editing","name":"Robert Gordon","original_name":"Robert Gordon","popularity":0.6,"profile_path":null,"credit_id":"598331bf925141421201044b","department":"Editing","job":"Editor"},{"adult":false,"gender":2,"id":1176752,"known_for_department":"Visual Effects","name":"Dan Haskett","original_name":"Dan Haskett","popularity":2.041,"profile_path":null,"credit_id":"58921384c3a3680973008fd4","department":"Visual Effects","job":"Character Designer"},{"adult":false,"gender":0,"id":1184140,"known_for_department":"Writing","name":"Steve Rabatich","original_name":"Steve Rabatich","popularity":0.6,"profile_path":null,"credit_id":"5892111c9251412dcb0097e9","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":1336438,"known_for_department":"Editing","name":"Dana Mulligan","original_name":"Dana Mulligan","popularity":2.769,"profile_path":null,"credit_id":"5892149ec3a3686348004798","department":"Editing","job":"Assistant Editor"},{"adult":false,"gender":0,"id":1372885,"known_for_department":"Sound","name":"James Flamberg","original_name":"James Flamberg","popularity":1.614,"profile_path":null,"credit_id":"589217cec3a3686b0a0052ba","department":"Sound","job":"Music Editor"},{"adult":false,"gender":0,"id":1399287,"known_for_department":"Visual Effects","name":"Mark Dornfeld","original_name":"Mark Dornfeld","popularity":0.6,"profile_path":null,"credit_id":"5aa59450925141278d02711a","department":"Crew","job":"Title Graphics"},{"adult":false,"gender":0,"id":1401794,"known_for_department":"Crew","name":"Lucas Putnam","original_name":"Lucas Putnam","popularity":0.6,"profile_path":null,"credit_id":"5aa56a3c9251412787024604","department":"Production","job":"Assistant Production Coordinator"},{"adult":false,"gender":0,"id":1406878,"known_for_department":"Visual Effects","name":"Mark Thomas Henne","original_name":"Mark Thomas Henne","popularity":1.435,"profile_path":null,"credit_id":"589211d4c3a3680968008ed9","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":1414177,"known_for_department":"Sound","name":"J.R. Grubbs","original_name":"J.R. Grubbs","popularity":1.608,"profile_path":null,"credit_id":"589216a89251412dc2009ca4","department":"Sound","job":"Assistant Sound Editor"},{"adult":false,"gender":1,"id":1414182,"known_for_department":"Sound","name":"Marilyn McCoppen","original_name":"Marilyn McCoppen","popularity":1.276,"profile_path":null,"credit_id":"589215969251412dcb009bf6","department":"Sound","job":"ADR Editor"},{"adult":false,"gender":2,"id":1421301,"known_for_department":"Visual Effects","name":"Steve Johnson","original_name":"Steve Johnson","popularity":1.651,"profile_path":null,"credit_id":"5aa7b4599251415e4b01a7c4","department":"Crew","job":"Software Engineer"},{"adult":false,"gender":0,"id":1425978,"known_for_department":"Sound","name":"Gary Summers","original_name":"Gary Summers","popularity":2.929,"profile_path":null,"credit_id":"5892154c9251412dd1009a56","department":"Sound","job":"Sound Re-Recording Mixer"},{"adult":false,"gender":2,"id":1426773,"known_for_department":"Visual Effects","name":"Hal Hickel","original_name":"Hal Hickel","popularity":2.637,"profile_path":"/56Vpbrd8W9XzuhOmLdO406MGGBA.jpg","credit_id":"5892109b9251412dcd0094b0","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":1429549,"known_for_department":"Editing","name":"Dale E. Grahn","original_name":"Dale E. Grahn","popularity":2.152,"profile_path":null,"credit_id":"5693e6b29251417b0e0000e3","department":"Editing","job":"Color Timer"},{"adult":false,"gender":0,"id":1443471,"known_for_department":"Art","name":"Sonoko Konishi","original_name":"Sonoko Konishi","popularity":2.656,"profile_path":null,"credit_id":"58921411c3a3686b0a004f70","department":"Art","job":"Set Dresser"},{"adult":false,"gender":0,"id":1446996,"known_for_department":"Sound","name":"Tom Barwick","original_name":"Tom Barwick","popularity":0.646,"profile_path":null,"credit_id":"5aa5738d0e0a26076002412f","department":"Sound","job":"Foley"},{"adult":false,"gender":0,"id":1447465,"known_for_department":"Visual Effects","name":"Jean Gillmore","original_name":"Jean Gillmore","popularity":1.194,"profile_path":null,"credit_id":"58921395c3a368097700942f","department":"Visual Effects","job":"Character Designer"},{"adult":false,"gender":2,"id":1450347,"known_for_department":"Writing","name":"Mike Cachuela","original_name":"Mike Cachuela","popularity":1.407,"profile_path":"/cpFzLDMttRswVY3XLefXDYwKN9L.jpg","credit_id":"617c69a8d6dbba0044bff4f0","department":"Art","job":"Storyboard Artist"},{"adult":false,"gender":0,"id":1453514,"known_for_department":"Visual Effects","name":"Kim Blanchette","original_name":"Kim Blanchette","popularity":1.042,"profile_path":null,"credit_id":"5531824d9251415289000945","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":1454030,"known_for_department":"Visual Effects","name":"Angie Glocka","original_name":"Angie Glocka","popularity":0.901,"profile_path":null,"credit_id":"589210669251412dcd009466","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":1454034,"known_for_department":"Visual Effects","name":"Ken Willard","original_name":"Ken Willard","popularity":0.698,"profile_path":null,"credit_id":"589211629251412dc5009b00","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":1455525,"known_for_department":"Visual Effects","name":"Victoria Livingstone","original_name":"Victoria Livingstone","popularity":0.6,"profile_path":null,"credit_id":"5aa590bf0e0a26075702c871","department":"Crew","job":"Production Intern"},{"adult":false,"gender":0,"id":1458006,"known_for_department":"Art","name":"Susan Bradley","original_name":"Susan Bradley","popularity":2.047,"profile_path":null,"credit_id":"589218429251412dd1009d1b","department":"Art","job":"Title Designer"},{"adult":false,"gender":0,"id":1468014,"known_for_department":"Crew","name":"Lauren Beth Strogoff","original_name":"Lauren Beth Strogoff","popularity":1.868,"profile_path":null,"credit_id":"589214e39251412dc8009904","department":"Crew","job":"Unit Publicist"},{"adult":false,"gender":0,"id":1509559,"known_for_department":"Visual Effects","name":"Steve Segal","original_name":"Steve Segal","popularity":0.84,"profile_path":null,"credit_id":"5892112b9251412dcb0097fb","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":1552883,"known_for_department":"Sound","name":"Mary Helen Leasman","original_name":"Mary Helen Leasman","popularity":0.6,"profile_path":null,"credit_id":"5892168cc3a36809660095f9","department":"Sound","job":"Foley Editor"},{"adult":false,"gender":0,"id":1589729,"known_for_department":"Sound","name":"Robin Lee","original_name":"Robin Lee","popularity":0.648,"profile_path":null,"credit_id":"58921479c3a368096800910f","department":"Editing","job":"Assistant Editor"},{"adult":false,"gender":0,"id":1629419,"known_for_department":"Crew","name":"Patsy Bouge","original_name":"Patsy Bouge","popularity":2.391,"profile_path":null,"credit_id":"574f12cec3a3682e82000022","department":"Crew","job":"Post Production Supervisor"},{"adult":false,"gender":2,"id":1643610,"known_for_department":"Visual Effects","name":"Bob McKnight","original_name":"Bob McKnight","popularity":0.6,"profile_path":null,"credit_id":"617c6b3584f249004441806d","department":"Visual Effects","job":"Character Designer"},{"adult":false,"gender":0,"id":1677823,"known_for_department":"Production","name":"Triva von Klark","original_name":"Triva von Klark","popularity":0.98,"profile_path":null,"credit_id":"5aa569000e0a260757028e66","department":"Visual Effects","job":"Animation Manager"},{"adult":false,"gender":0,"id":1738132,"known_for_department":"Editing","name":"Rich Mackay","original_name":"Rich Mackay","popularity":0.6,"profile_path":null,"credit_id":"5aa58d9dc3a3687bfc02bdc7","department":"Editing","job":"Negative Cutter"},{"adult":false,"gender":1,"id":1739962,"known_for_department":"Editing","name":"Mary Beth Smith","original_name":"Mary Beth Smith","popularity":0.75,"profile_path":null,"credit_id":"58921831c3a3686348004a64","department":"Editing","job":"Negative Cutter"},{"adult":false,"gender":0,"id":1748513,"known_for_department":"Editing","name":"Rick Mackay","original_name":"Rick Mackay","popularity":0.732,"profile_path":null,"credit_id":"58921838c3a36809700096c0","department":"Editing","job":"Negative Cutter"},{"adult":false,"gender":0,"id":1748557,"known_for_department":"Crew","name":"William Reeves","original_name":"William Reeves","popularity":0.6,"profile_path":null,"credit_id":"5891ed99c3a3680966007670","department":"Crew","job":"Supervising Technical Director"},{"adult":false,"gender":0,"id":1748682,"known_for_department":"Visual Effects","name":"Davey Crockett Feiten","original_name":"Davey Crockett Feiten","popularity":0.6,"profile_path":null,"credit_id":"5892105dc3a3680968008db2","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":1748683,"known_for_department":"Visual Effects","name":"Rex Grignon","original_name":"Rex Grignon","popularity":1.361,"profile_path":null,"credit_id":"5892107c9251412dd1009613","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":1748684,"known_for_department":"Visual Effects","name":"Tom K. Gurney","original_name":"Tom K. Gurney","popularity":0.6,"profile_path":null,"credit_id":"5892108ac3a3680973008d3f","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":1748688,"known_for_department":"Visual Effects","name":"Anthony B. LaMolinara","original_name":"Anthony B. LaMolinara","popularity":0.6,"profile_path":null,"credit_id":"589210ccc3a3680977009191","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":1748689,"known_for_department":"Visual Effects","name":"Les Major","original_name":"Les Major","popularity":0.735,"profile_path":null,"credit_id":"589210ee9251412dc200978a","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":1748691,"known_for_department":"Visual Effects","name":"Doug Sheppeck","original_name":"Doug Sheppeck","popularity":0.757,"profile_path":null,"credit_id":"589211349251412dc80095c3","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":2,"id":1748698,"known_for_department":"Visual Effects","name":"Oren Jacob","original_name":"Oren Jacob","popularity":0.982,"profile_path":null,"credit_id":"589211f59251412dd4008e65","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":1748699,"known_for_department":"Visual Effects","name":"Darwyn Peachey","original_name":"Darwyn Peachey","popularity":0.6,"profile_path":null,"credit_id":"58921242c3a368096a00939b","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":1748701,"known_for_department":"Visual Effects","name":"Mitch Prater","original_name":"Mitch Prater","popularity":1.023,"profile_path":null,"credit_id":"5892124b9251412dc5009bd2","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":1748703,"known_for_department":"Visual Effects","name":"Brian M. Rosen","original_name":"Brian M. Rosen","popularity":0.6,"profile_path":null,"credit_id":"58921264c3a3686b0a004dbf","department":"Visual Effects","job":"Visual Effects"},{"adult":false,"gender":0,"id":1748705,"known_for_department":"Art","name":"Shelley Daniels Lekven","original_name":"Shelley Daniels Lekven","popularity":0.652,"profile_path":null,"credit_id":"5892130f9251412dc8009791","department":"Art","job":"Sculptor"},{"adult":false,"gender":0,"id":1748710,"known_for_department":"Art","name":"Kelly O'Connell","original_name":"Kelly O'Connell","popularity":0.6,"profile_path":null,"credit_id":"589214099251412dc5009d57","department":"Art","job":"Set Dresser"},{"adult":false,"gender":0,"id":1748711,"known_for_department":"Art","name":"Ann M. Rockwell","original_name":"Ann M. Rockwell","popularity":0.6,"profile_path":null,"credit_id":"58921434c3a368096a00956e","department":"Art","job":"Set Dresser"},{"adult":false,"gender":0,"id":1748712,"known_for_department":"Editing","name":"Julie M. McDonald","original_name":"Julie M. McDonald","popularity":0.6,"profile_path":null,"credit_id":"5892144ac3a36809680090de","department":"Editing","job":"Editorial Manager"},{"adult":false,"gender":0,"id":1748712,"known_for_department":"Editing","name":"Julie M. McDonald","original_name":"Julie M. McDonald","popularity":0.6,"profile_path":null,"credit_id":"64c04226174973011bcacd76","department":"Camera","job":"Camera Department Manager"},{"adult":false,"gender":0,"id":1748716,"known_for_department":"Editing","name":"Tom Freeman","original_name":"Tom Freeman","popularity":1.66,"profile_path":null,"credit_id":"5892148b9251412dd10099cc","department":"Editing","job":"Assistant Editor"},{"adult":false,"gender":0,"id":1748717,"known_for_department":"Editing","name":"Ada Cochavi","original_name":"Ada Cochavi","popularity":0.6,"profile_path":null,"credit_id":"589214959251412dcb009b1f","department":"Editing","job":"Assistant Editor"},{"adult":false,"gender":0,"id":1748718,"known_for_department":"Editing","name":"Deirdre Morrison","original_name":"Deirdre Morrison","popularity":0.6,"profile_path":null,"credit_id":"589214adc3a368096a0095db","department":"Editing","job":"Editorial Coordinator"},{"adult":false,"gender":0,"id":1748719,"known_for_department":"Production","name":"Lori Lombardo","original_name":"Lori Lombardo","popularity":0.6,"profile_path":null,"credit_id":"589214c7c3a368097700952b","department":"Production","job":"Production Coordinator"},{"adult":false,"gender":0,"id":1748720,"known_for_department":"Production","name":"Ellen Devine","original_name":"Ellen Devine","popularity":0.6,"profile_path":null,"credit_id":"589214cec3a368096a009603","department":"Production","job":"Production Coordinator"},{"adult":false,"gender":1,"id":1748724,"known_for_department":"Sound","name":"Susan Sanford","original_name":"Susan Sanford","popularity":0.786,"profile_path":null,"credit_id":"589216c19251412dc2009cb9","department":"Sound","job":"Assistant Sound Editor"},{"adult":false,"gender":0,"id":1748725,"known_for_department":"Sound","name":"Susan Popovic","original_name":"Susan Popovic","popularity":0.61,"profile_path":null,"credit_id":"589216ccc3a3680973009274","department":"Sound","job":"Assistant Sound Editor"},{"adult":false,"gender":0,"id":1749775,"known_for_department":"Editing","name":"Christian Hill","original_name":"Christian Hill","popularity":0.6,"profile_path":null,"credit_id":"5aa591090e0a26075402adc4","department":"Crew","job":"Production Office Assistant"},{"adult":false,"gender":0,"id":1760552,"known_for_department":"Production","name":"Terri Greening","original_name":"Terri Greening","popularity":1.096,"profile_path":null,"credit_id":"5aa56fec0e0a260754027e48","department":"Production","job":"Production Accountant"},{"adult":false,"gender":0,"id":1847643,"known_for_department":"Production","name":"Miguel Ángel Poveda","original_name":"Miguel Ángel Poveda","popularity":0.85,"profile_path":null,"credit_id":"5aa58eca0e0a26075a02b73e","department":"Crew","job":"Post Production Supervisor"},{"adult":false,"gender":0,"id":1909457,"known_for_department":"Visual Effects","name":"B.Z. Petroff","original_name":"B.Z. Petroff","popularity":0.6,"profile_path":null,"credit_id":"5aa56910c3a3687c03022b9e","department":"Visual Effects","job":"Animation Manager"},{"adult":false,"gender":2,"id":1993493,"known_for_department":"Writing","name":"Matthew Luhn","original_name":"Matthew Luhn","popularity":1.285,"profile_path":null,"credit_id":"5aa595e3c3a3687c32029346","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":1994536,"known_for_department":"Visual Effects","name":"Cynthia Dueltgen","original_name":"Cynthia Dueltgen","popularity":1.014,"profile_path":null,"credit_id":"5aa59876c3a3687bff02c877","department":"Lighting","job":"Lighting Artist"},{"adult":false,"gender":0,"id":1994587,"known_for_department":"Crew","name":"Matthew Martin","original_name":"Matthew Martin","popularity":0.6,"profile_path":null,"credit_id":"5aa597630e0a26075702cf95","department":"Camera","job":"Camera Technician"},{"adult":false,"gender":0,"id":1994602,"known_for_department":"Directing","name":"Ewan Johnson","original_name":"Ewan Johnson","popularity":0.6,"profile_path":null,"credit_id":"5aa5753ec3a3687c130242b6","department":"Lighting","job":"Lighting Technician"},{"adult":false,"gender":0,"id":1994655,"known_for_department":"Directing","name":"Victoria Jaschob","original_name":"Victoria Jaschob","popularity":1.052,"profile_path":null,"credit_id":"5aa56a2b0e0a260757028fd7","department":"Production","job":"Assistant Production Coordinator"},{"adult":false,"gender":0,"id":1994673,"known_for_department":"Crew","name":"Don Schreiter","original_name":"Don Schreiter","popularity":0.6,"profile_path":null,"credit_id":"5aa59264c3a3687c0c02a177","department":"Crew","job":"Software Engineer"},{"adult":false,"gender":0,"id":1994686,"known_for_department":"Crew","name":"Mark T. VandeWettering","original_name":"Mark T. VandeWettering","popularity":0.6,"profile_path":null,"credit_id":"5aa598c60e0a26075a02c1fe","department":"Lighting","job":"Lighting Artist"},{"adult":false,"gender":0,"id":1994686,"known_for_department":"Crew","name":"Mark T. VandeWettering","original_name":"Mark T. VandeWettering","popularity":0.6,"profile_path":null,"credit_id":"5aa5928fc3a3687c13026aa0","department":"Crew","job":"Software Engineer"},{"adult":false,"gender":0,"id":1996103,"known_for_department":"Visual Effects","name":"Maureen Wylie","original_name":"Maureen Wylie","popularity":0.6,"profile_path":null,"credit_id":"5aa568dfc3a3687bfc028a17","department":"Visual Effects","job":"Animation Department Coordinator"},{"adult":false,"gender":0,"id":1996110,"known_for_department":"Art","name":"Terry McQueen","original_name":"Terry McQueen","popularity":0.6,"profile_path":null,"credit_id":"5aa569dd0e0a26074b028404","department":"Art","job":"Art Department Manager"},{"adult":false,"gender":0,"id":1996115,"known_for_department":"Lighting","name":"Douglas Todd","original_name":"Douglas Todd","popularity":0.6,"profile_path":null,"credit_id":"5aa56c35925141277e023cda","department":"Lighting","job":"Lighting Coordinator"},{"adult":false,"gender":0,"id":1996141,"known_for_department":"Crew","name":"David H. Ching","original_name":"David H. Ching","popularity":0.6,"profile_path":null,"credit_id":"5aa571209251412793024f94","department":"Crew","job":"Information Systems Manager"},{"adult":false,"gender":0,"id":1996149,"known_for_department":"Editing","name":"Jesse William Wallace","original_name":"Jesse William Wallace","popularity":0.6,"profile_path":null,"credit_id":"5aa573660e0a26074b028f9c","department":"Editing","job":"Editorial Production Assistant"},{"adult":false,"gender":0,"id":1996151,"known_for_department":"Production","name":"Lisa Ellis","original_name":"Lisa Ellis","popularity":0.919,"profile_path":null,"credit_id":"5aa57381925141278d024612","department":"Production","job":"Finance"},{"adult":false,"gender":2,"id":1996159,"known_for_department":"Visual Effects","name":"Kevin Bjorke","original_name":"Kevin Bjorke","popularity":0.6,"profile_path":null,"credit_id":"5aa58bd8925141277e0265b4","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":1996162,"known_for_department":"Lighting","name":"Barbara T. Labounta","original_name":"Barbara T. Labounta","popularity":0.6,"profile_path":null,"credit_id":"5aa574bc9251412793025343","department":"Lighting","job":"Lighting Coordinator"},{"adult":false,"gender":0,"id":1996232,"known_for_department":"Crew","name":"Michael E. Murdock","original_name":"Michael E. Murdock","popularity":0.6,"profile_path":null,"credit_id":"5aa5892cc3a3687c320282be","department":"Crew","job":"Systems Administrators & Support"},{"adult":false,"gender":0,"id":1996241,"known_for_department":"Visual Effects","name":"Deborah R. Fowler","original_name":"Deborah R. Fowler","popularity":0.847,"profile_path":null,"credit_id":"5aa58ba4c3a3687c2502b072","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":1996243,"known_for_department":"Visual Effects","name":"Damir Frkovic","original_name":"Damir Frkovic","popularity":0.732,"profile_path":null,"credit_id":"5aa58bb10e0a26074b02b460","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":1996243,"known_for_department":"Visual Effects","name":"Damir Frkovic","original_name":"Damir Frkovic","popularity":0.732,"profile_path":null,"credit_id":"5aa598860e0a260751025d94","department":"Lighting","job":"Lighting Artist"},{"adult":false,"gender":0,"id":1996244,"known_for_department":"Visual Effects","name":"Shalini Govil-Pai","original_name":"Shalini Govil-Pai","popularity":0.6,"profile_path":null,"credit_id":"5aa58bbc0e0a26075d02b2b1","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":1996244,"known_for_department":"Visual Effects","name":"Shalini Govil-Pai","original_name":"Shalini Govil-Pai","popularity":0.6,"profile_path":null,"credit_id":"5aa59894c3a3687c2502bfcb","department":"Lighting","job":"Lighting Artist"},{"adult":false,"gender":0,"id":1996245,"known_for_department":"Visual Effects","name":"David R. Haumann","original_name":"David R. Haumann","popularity":1.702,"profile_path":null,"credit_id":"5aa58bc89251412790026bfd","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":1996245,"known_for_department":"Visual Effects","name":"David R. Haumann","original_name":"David R. Haumann","popularity":1.702,"profile_path":null,"credit_id":"5aa598b20e0a26075402b50d","department":"Lighting","job":"Lighting Artist"},{"adult":false,"gender":0,"id":1996246,"known_for_department":"Visual Effects","name":"Yael Milo","original_name":"Yael Milo","popularity":0.6,"profile_path":null,"credit_id":"5aa58be30e0a26074b02b4be","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":1996246,"known_for_department":"Visual Effects","name":"Yael Milo","original_name":"Yael Milo","popularity":0.6,"profile_path":null,"credit_id":"5aa598d30e0a26075402b538","department":"Lighting","job":"Lighting Artist"},{"adult":false,"gender":0,"id":1996258,"known_for_department":"Sound","name":"Tod Cooper","original_name":"Tod Cooper","popularity":1.96,"profile_path":null,"credit_id":"5aa58cde0e0a26075a02b448","department":"Sound","job":"Music Supervisor"},{"adult":false,"gender":0,"id":1996266,"known_for_department":"Crew","name":"Andrew Caldwell","original_name":"Andrew Caldwell","popularity":0.6,"profile_path":null,"credit_id":"5aa58f2c925141279302781e","department":"Crew","job":"Production Intern"},{"adult":false,"gender":0,"id":1996267,"known_for_department":"Crew","name":"Martín Caplan","original_name":"Martín Caplan","popularity":0.6,"profile_path":null,"credit_id":"5aa58f5d0e0a26074b02ba3f","department":"Crew","job":"Production Intern"},{"adult":false,"gender":0,"id":1996268,"known_for_department":"Crew","name":"Ryan Chisum","original_name":"Ryan Chisum","popularity":0.6,"profile_path":null,"credit_id":"5aa58f6e0e0a26075702c676","department":"Crew","job":"Production Intern"},{"adult":false,"gender":0,"id":1996269,"known_for_department":"Crew","name":"Takeshi Hasegawa","original_name":"Takeshi Hasegawa","popularity":0.6,"profile_path":null,"credit_id":"5aa58f80925141278d026c47","department":"Crew","job":"Production Intern"},{"adult":false,"gender":0,"id":1996270,"known_for_department":"Crew","name":"Jay Hathaway","original_name":"Jay Hathaway","popularity":0.6,"profile_path":null,"credit_id":"5aa58f94c3a3687c06025aa6","department":"Crew","job":"Production Intern"},{"adult":false,"gender":0,"id":1996271,"known_for_department":"Crew","name":"Jason Henry","original_name":"Jason Henry","popularity":0.6,"profile_path":null,"credit_id":"5aa58fc0925141277e026b2c","department":"Crew","job":"Production Intern"},{"adult":false,"gender":0,"id":1996272,"known_for_department":"Crew","name":"Steven Kani","original_name":"Steven Kani","popularity":0.6,"profile_path":null,"credit_id":"5aa58fdbc3a3687c03025bca","department":"Crew","job":"Production Intern"},{"adult":false,"gender":0,"id":1996277,"known_for_department":"Crew","name":"Kevin Page","original_name":"Kevin Page","popularity":1.015,"profile_path":null,"credit_id":"5aa59035c3a3687c0c029ef0","department":"Crew","job":"Production Intern"},{"adult":false,"gender":0,"id":1996281,"known_for_department":"Crew","name":"Benjamin Salles","original_name":"Benjamin Salles","popularity":0.6,"profile_path":null,"credit_id":"5aa59062c3a3687c0c029f26","department":"Crew","job":"Production Intern"},{"adult":false,"gender":2,"id":1996283,"known_for_department":"Directing","name":"Dave Thomas","original_name":"Dave Thomas","popularity":0.656,"profile_path":null,"credit_id":"5aa590acc3a3687bff02c11e","department":"Crew","job":"Production Intern"},{"adult":false,"gender":0,"id":1996284,"known_for_department":"Crew","name":"Nancy Copeland","original_name":"Nancy Copeland","popularity":0.6,"profile_path":null,"credit_id":"5aa590e30e0a260760026a87","department":"Crew","job":"Production Office Assistant"},{"adult":false,"gender":0,"id":1996285,"known_for_department":"Crew","name":"Alethea Harampolis","original_name":"Alethea Harampolis","popularity":0.6,"profile_path":null,"credit_id":"5aa590f00e0a26074b02bc5a","department":"Crew","job":"Production Office Assistant"},{"adult":false,"gender":0,"id":1996289,"known_for_department":"Crew","name":"Pat Hanrahan","original_name":"Pat Hanrahan","popularity":0.652,"profile_path":null,"credit_id":"5aa591fcc3a3687c06025d7d","department":"Crew","job":"Software Engineer"},{"adult":false,"gender":0,"id":1996292,"known_for_department":"Crew","name":"Jim Lawson","original_name":"Jim Lawson","popularity":0.6,"profile_path":null,"credit_id":"5aa5923d925141278d026f60","department":"Crew","job":"Software Engineer"},{"adult":false,"gender":0,"id":1996294,"known_for_department":"Crew","name":"M.W. Mantle","original_name":"M.W. Mantle","popularity":0.6,"profile_path":null,"credit_id":"5aa5924ac3a3687c06025ddc","department":"Crew","job":"Software Engineer"},{"adult":false,"gender":0,"id":1996295,"known_for_department":"Crew","name":"David Salesin","original_name":"David Salesin","popularity":0.6,"profile_path":null,"credit_id":"5aa59256925141277e026e27","department":"Crew","job":"Software Engineer"},{"adult":false,"gender":0,"id":1996300,"known_for_department":"Visual Effects","name":"Keith B.C. Gordon","original_name":"Keith B.C. Gordon","popularity":0.6,"profile_path":null,"credit_id":"5aa593339251412790027531","department":"Visual Effects","job":"Shading"},{"adult":false,"gender":0,"id":1996301,"known_for_department":"Visual Effects","name":"Larry Gritz","original_name":"Larry Gritz","popularity":0.6,"profile_path":null,"credit_id":"5aa5933e925141279002753f","department":"Visual Effects","job":"Shading"},{"adult":false,"gender":0,"id":1996301,"known_for_department":"Visual Effects","name":"Larry Gritz","original_name":"Larry Gritz","popularity":0.6,"profile_path":null,"credit_id":"5aa598a292514127840275ab","department":"Lighting","job":"Lighting Artist"},{"adult":false,"gender":0,"id":1996303,"known_for_department":"Crew","name":"Bill Carson","original_name":"Bill Carson","popularity":0.6,"profile_path":null,"credit_id":"5aa593899251412784027178","department":"Crew","job":"Software Engineer"},{"adult":false,"gender":0,"id":1996304,"known_for_department":"Crew","name":"Ken Huey","original_name":"Ken Huey","popularity":0.6,"profile_path":null,"credit_id":"5aa59394c3a3687c03025fa5","department":"Crew","job":"Software Engineer"},{"adult":false,"gender":0,"id":1996306,"known_for_department":"Visual Effects","name":"Mark Eastwood","original_name":"Mark Eastwood","popularity":0.6,"profile_path":null,"credit_id":"5aa595a2c3a3687bfc02c7c2","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":1996307,"known_for_department":"Visual Effects","name":"Monique Hodgkinson","original_name":"Monique Hodgkinson","popularity":0.6,"profile_path":null,"credit_id":"5aa595ad9251412784027353","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":1996308,"known_for_department":"Visual Effects","name":"Grey Holland","original_name":"Grey Holland","popularity":0.6,"profile_path":null,"credit_id":"5aa595b8c3a3687c0302614e","department":"Visual Effects","job":"Modeling"},{"adult":false,"gender":0,"id":1996316,"known_for_department":"Lighting","name":"Larry Aupperle","original_name":"Larry Aupperle","popularity":0.6,"profile_path":null,"credit_id":"5aa59866925141278d027475","department":"Lighting","job":"Lighting Artist"},{"adult":false,"gender":0,"id":1996317,"known_for_department":"Visual Effects","name":"Heather Knight","original_name":"Heather Knight","popularity":0.6,"profile_path":null,"credit_id":"5aa598fd0e0a260760027127","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":2004942,"known_for_department":"Visual Effects","name":"Roger Rose","original_name":"Roger Rose","popularity":3.842,"profile_path":null,"credit_id":"5ab3b6180e0a265f24009c36","department":"Visual Effects","job":"Animation"},{"adult":false,"gender":0,"id":3289681,"known_for_department":"Art","name":"Perry Farinola","original_name":"Perry Farinola","popularity":0.6,"profile_path":null,"credit_id":"617c69fd678259002aba64d3","department":"Art","job":"Storyboard Artist"}]},"releases":{"countries":[{"certification":"G","descriptors":[],"iso_3166_1":"US","primary":false,"release_date":"1995-11-19"},{"certification":"G","descriptors":[],"iso_3166_1":"PR","primary":false,"release_date":"2023-10-05"},{"certification":"PG","descriptors":[],"iso_3166_1":"GB","primary":false,"release_date":"1996-03-22"},{"certification":"0","descriptors":[],"iso_3166_1":"DE","primary":false,"release_date":"1996-03-21"},{"certification":"Ai","descriptors":[],"iso_3166_1":"ES","primary":false,"release_date":"1996-03-15"},{"certification":"7","descriptors":[],"iso_3166_1":"DK","primary":false,"release_date":"1996-03-22"},{"certification":"G","descriptors":[],"iso_3166_1":"AU","primary":false,"release_date":"1995-12-07"},{"certification":"","descriptors":[],"iso_3166_1":"IT","primary":false,"release_date":"1996-03-22"},{"certification":"","descriptors":[],"iso_3166_1":"JP","primary":false,"release_date":"1996-03-23"},{"certification":"ALL","descriptors":[],"iso_3166_1":"KR","primary":false,"release_date":"1995-12-30"},{"certification":"","descriptors":[],"iso_3166_1":"CZ","primary":false,"release_date":"1996-04-11"},{"certification":"K-7","descriptors":[],"iso_3166_1":"FI","primary":false,"release_date":"1996-03-29"},{"certification":"U","descriptors":[],"iso_3166_1":"FR","primary":false,"release_date":"1996-03-27"},{"certification":"L","descriptors":[],"iso_3166_1":"BR","primary":false,"release_date":"1995-10-30"},{"certification":"G","descriptors":[],"iso_3166_1":"US","primary":false,"release_date":"1995-11-22"},{"certification":"7","descriptors":[],"iso_3166_1":"SE","primary":false,"release_date":"1996-03-08"},{"certification":"M/6","descriptors":[],"iso_3166_1":"PT","primary":false,"release_date":"1996-03-29"},{"certification":"AL","descriptors":[],"iso_3166_1":"NL","primary":false,"release_date":"1996-04-04"},{"certification":"AL","descriptors":[],"iso_3166_1":"NL","primary":false,"release_date":"2010-05-05"},{"certification":"A","descriptors":[],"iso_3166_1":"ES","primary":false,"release_date":"2009-10-23"},{"certification":"6","descriptors":[],"iso_3166_1":"NO","primary":false,"release_date":"1996-03-08"},{"certification":"PG","descriptors":[],"iso_3166_1":"ZA","primary":false,"release_date":"2009-10-02"},{"certification":"AA","descriptors":[],"iso_3166_1":"MX","primary":false,"release_date":"1996-03-21"},{"certification":"","descriptors":[],"iso_3166_1":"HK","primary":false,"release_date":"1996-02-16"},{"certification":"PG","descriptors":[],"iso_3166_1":"IE","primary":false,"release_date":"1996-03-22"},{"certification":"ATP","descriptors":[],"iso_3166_1":"AR","primary":false,"release_date":"1996-03-14"},{"certification":"G","descriptors":[],"iso_3166_1":"US","primary":false,"release_date":"2009-10-02"},{"certification":"G","descriptors":[],"iso_3166_1":"US","primary":false,"release_date":"2023-07-21"},{"certification":"","descriptors":[],"iso_3166_1":"EE","primary":false,"release_date":"1996-09-06"},{"certification":"AL","descriptors":[],"iso_3166_1":"NL","primary":false,"release_date":"2011-10-29"},{"certification":"7","descriptors":[],"iso_3166_1":"SE","primary":false,"release_date":"2011-12-07"},{"certification":"7","descriptors":[],"iso_3166_1":"SE","primary":false,"release_date":"2010-04-14"},{"certification":"7","descriptors":[],"iso_3166_1":"SE","primary":false,"release_date":"1996-10-16"},{"certification":"7","descriptors":[],"iso_3166_1":"SE","primary":false,"release_date":"2000-11-15"},{"certification":"G","descriptors":[],"iso_3166_1":"US","primary":false,"release_date":"1996-10-29"},{"certification":"G","descriptors":[],"iso_3166_1":"CA","primary":false,"release_date":"1996-10-29"},{"certification":"AL","descriptors":[],"iso_3166_1":"NL","primary":false,"release_date":"2005-08-27"},{"certification":"","descriptors":[],"iso_3166_1":"BE","primary":false,"release_date":"2004-12-17"}]}} \ No newline at end of file diff --git a/com.synology.TMDBExample/plugin_data/movie/862/translation.json b/com.synology.TMDBExample/plugin_data/movie/862/translation.json new file mode 100644 index 0000000..6f3b37f --- /dev/null +++ b/com.synology.TMDBExample/plugin_data/movie/862/translation.json @@ -0,0 +1 @@ +{"id":862,"translations":[{"iso_3166_1":"SA","iso_639_1":"ar","name":"العربية","english_name":"Arabic","data":{"homepage":"","overview":"تحكي القصة عن طفل يُهادى بلعبة في إحدى المناسبات ويفتح الطفل اللعبة ليضعها بين قرناءها من الألعاب في غرفته وتبدأ الأحداث باعتقاد اللعبة أنها حقيقة وليست لعبة ولهذا يبدأ المأمور وودي أفضل الألعاب عند الطفل بإقناع رائد الفضاء باز أنه مجرد لعبة وتتعدد الحوادث بعدها إلى أن تتجمع اللعب جميعا ثانيةً وقد اقتنعوا أن هدفهم الأساسي كلعب هو الترفيه عن الطفل وليس غير.","runtime":0,"tagline":"حكاية لعبة","title":"حكاية لعبة"}},{"iso_3166_1":"BY","iso_639_1":"be","name":"беларуская мова","english_name":"Belarusian","data":{"homepage":"","overview":"Кожнае дзіця верыць, што калі яно пакідае свае цацкі аднымі, яны пачынаюць займацца сваімі справамі. І гэты мультфільм дазваляе ім пераканацца ў сваёй праваце. Асноўная ідэя фільма - кожная цацка баіцца надакучыць, стаць забытаю, быць замененай іншаю, так як увесь сэнс іх існавання - рабіць сваіх маленькіх гаспадароў шчаслівымі.","runtime":0,"tagline":"","title":"Гісторыя цацак"}},{"iso_3166_1":"BG","iso_639_1":"bg","name":"български език","english_name":"Bulgarian","data":{"homepage":"","overview":"В един свят където играчките живеят свой собствен живот, Уди е дървена играчка каубой, която дълго време е била фаворит на своя собственик – момченцето Анди. Когато си детска играчка обаче живееш в постоянен стрес, че ново попълнение в колекцията на детето, на което принадлежиш всеки момент може да те измести от сърцето му и да те прати на боклука. Един ден се случва точно това – Анди получава като подарък космическия рейнджър Бъз Лайтиър – играчка от ново поколение, в която хлапето моментално се влюбва.","runtime":81,"tagline":"","title":"Играта на играчките"}},{"iso_3166_1":"BS","iso_639_1":"bs","name":"Bosanski","english_name":"Bosnian","data":{"homepage":"","overview":"Dječak Andy voli boraviti u svojoj sobi i igrati se s igračkama, pogotovo s Woodyjem. Ali Andy nije svjestan da Woody i ostale igračke oživljavaju čim on nije s njima. Woody vjeruje da je njegov život jako dobar, no kada Andyjeva majka za rođendan svom sinu pokloni novu igračku, Buzza Lightyeara, Woody postaje strahovito ljubomoran i na sve se moguće načine pokušava riješiti Buzza...","runtime":0,"tagline":"","title":"Priča o Igračkama"}},{"iso_3166_1":"ES","iso_639_1":"ca","name":"Català","english_name":"Catalan","data":{"homepage":"","overview":"Les joguines d'Andy, un nen de sis anys, temen que hagi arribat la seva hora i que un nou regal d'aniversari els substitueixi al cor del propietari. Woody, un vaquer que ha estat fins ara la joguina favorita d'Andy, intenta tranquil·litzar-los fins que apareix Buzz Lightyear, un heroi espacial dotat de tota mena d'avenços tecnològics. Woody és relegat a un segon pla., però la seva constant rivalitat es transformarà en una gran amistat quan tots dos es perden a la ciutat sense saber com tornar a casa.","runtime":0,"tagline":"L'aventura acaba de començar!","title":""}},{"iso_3166_1":"CZ","iso_639_1":"cs","name":"Český","english_name":"Czech","data":{"homepage":"","overview":"Kdo si myslí, že hračky nemají vlastní život, se mýlí. Sotva dítko vyjde ze dveří, začnou se v jeho pokoji dít podivné věci. Všechny hračky si vydechnou, protože mohou být konečně samy sebou, místo aby předstíraly, že jsou pouhými neživými předměty. Nejoblíbenější hračka – kovboj Woody – má pochopitelně hlavní slovo a všichni ostatní dnes pod jeho vedením připravují speciální průzkumnou akci. Chlapec má totiž narozeniny a Woodyho přátelé se obávají, jaké nové (a lepší) hračky budou muset přivítat ve svém středu. Jejich nejhorší tušení se tentokrát vyplňují a Woodyho konkurentem se stává narozeninový dárek – mluvící superkosmonaut Buzz Rakeťák. Už na první pohled si Woody s Buzzem nepadli do oka, ale když rakeťák nešťastnou náhodou vypadne z okna na dvorek sousedního domu, ve kterém bydlí chlapec, jehož nejoblíbenější zábavou je mučení hraček, musí se Woody vydat na záchrannou výpravu. Čeká ho s Buzzem největší dobrodružství jejich „života“.","runtime":80,"tagline":"Věděli jste, že hračky mají duši?","title":"Toy Story: Příběh hraček"}},{"iso_3166_1":"DK","iso_639_1":"da","name":"Dansk","english_name":"Danish","data":{"homepage":"","overview":"Da Anders til sin fødselsdag får robothelten Buzz Lightyear i gave, skaber det forvirring på børneværelset. Anført af cowboysheriffen Woody har legetøjet indtil da levet under ordnede forhold, men med Buzz' entre føler Woody sin myndighed truet. To sheriffer i et børneværelse er ikke sagen, så Woody vælger en noget ufin måde at slippe af med sin rival. Det andet legetøj er ikke begejstret for træ-sheriffens diktatoriske selvrådighed, så de vender ham ryggen, og snart havner han i samme uheldige situation som Buzz: Langt borte fra værelset, vennerne og ikke mindst Anders.","runtime":82,"tagline":"","title":""}},{"iso_3166_1":"DE","iso_639_1":"de","name":"Deutsch","english_name":"German","data":{"homepage":"","overview":"Als Andys Lieblingspuppe hat Woody im Kinderzimmer das Sagen. Kaum ist der Junge nicht da, erwacht die Cowboy-Figur zum Leben, und mit ihm auch all das andere Spielzeug um ihn herum. Aufgeregt debattiert man über Andys bevorstehenden Geburtstag. Es wird befürchtet, daß ihr Besitzer ein neues Geschenk bevorzugen wird. Und tatsächlich: Der Neuankömmling Buzz Lightyear, ein stolzer Space Ranger, avanciert zu Andys Favoriten. Diese Herabstufung will Woody nicht hinnehmen.","runtime":81,"tagline":"","title":""}},{"iso_3166_1":"GR","iso_639_1":"el","name":"ελληνικά","english_name":"Greek","data":{"homepage":"","overview":"Μια υφασμάτινη κούκλα, ο σερίφης Γούντι είναι το αγαπημένο παιχνίδι του μικρού Άντι. Όταν στα γενέθλιά του παίρνει δώρο μια διαστημική κούκλα-αστροναύτη όλα θα αλλάξουν. Ο μικρός θα λατρέψει το νέο παιχνίδι το οποίο θα ανακηρυχτεί αρχηγός των παιχνιδιών, παραγκωνίζοντας έτσι τον Γούντι.","runtime":77,"tagline":"Η περιπέτεια ξεκινά!","title":"Η Ιστορία των Παιχνιδιών"}},{"iso_3166_1":"US","iso_639_1":"en","name":"English","english_name":"English","data":{"homepage":"http://toystory.disney.com/toy-story","overview":"Led by Woody, Andy's toys live happily in his room until Andy's birthday brings Buzz Lightyear onto the scene. Afraid of losing his place in Andy's heart, Woody plots against Buzz. But when circumstances separate Buzz and Woody from their owner, the duo eventually learns to put aside their differences.","runtime":81,"tagline":"Hang on for the comedy that goes to infinity and beyond!","title":""}},{"iso_3166_1":"ES","iso_639_1":"es","name":"Español","english_name":"Spanish","data":{"homepage":"","overview":"Los juguetes de Andy, un niño de seis años, temen que haya llegado su hora y que un nuevo regalo de cumpleaños les sustituya en el corazón de su dueño. Woody, un vaquero que ha sido hasta ahora el juguete favorito de Andy, trata de tranquilizarlos hasta que aparece Buzz Lightyear, un héroe espacial dotado de todo tipo de avances tecnológicos. Woody es relegado a un segundo plano., pero su constante rivalidad se transformará en una gran amistad cuando ambos se pierden en la ciudad sin saber cómo volver a casa.","runtime":77,"tagline":"","title":"Toy Story (Juguetes)"}},{"iso_3166_1":"MX","iso_639_1":"es","name":"Español","english_name":"Spanish","data":{"homepage":"","overview":"Un muñeco vaquero se siente profundamente amenazado y celoso cuando una nueva figura del hombre del espacio lo suplanta como juguete principal en el cuarto de un niño.","runtime":81,"tagline":"La aventura acaba de comenzar","title":"Toy Story"}},{"iso_3166_1":"EE","iso_639_1":"et","name":"Eesti","english_name":"Estonian","data":{"homepage":"","overview":"","runtime":0,"tagline":"","title":"Lelulugu"}},{"iso_3166_1":"IR","iso_639_1":"fa","name":"فارسی","english_name":"Persian","data":{"homepage":"","overview":"اندی پسر بچه‌ای شش ساله است که اسباب بازی‌هایش را خیلی دوست دارد. اما دانستن این موضوع که اسباب بازی‌ها زنده می‌شوند کمی عجیب به‌نظر می‌رسد.وودی، گاو چرانی قدیمی و اسباب بازی مورد علاقهٔ اندی، رهبر تمامی اسباب بازی‌ها در اتاق اندی است. دوستان وودی یک دایناسور، خوک، سگ و سیب زمینی هستند. اندی در جشن تولدش، تکاوری فضایی به نام باز لایت‌یر هدیه می‌گیرد و این اسباب بازی جدید جای وودی را تا حدی تنگ می‌کند. حس حسادت وودی منجر به چشم و هم‌چشمی می‌شود. طی بروز اتفاقاتی وودی و باز سر از خانهٔ پسر همسایه، سید، در می‌آورند که از قضا این پسر عادت به شکنجه و خراب کردن اسباب بازی‌ها دارد. وودی و باز باید هر چه زودتر به خانهٔ اندی برگردند چون تا چند روز آینده خانوادهٔ اندی قصد اسباب کشی دارد…","runtime":0,"tagline":"","title":"داستان اسباب‌بازی"}},{"iso_3166_1":"FI","iso_639_1":"fi","name":"suomi","english_name":"Finnish","data":{"homepage":"","overview":"Toy Story – leluelämää sijoittuu maailmaan, jossa leluilla on oma elämänsä, kun ihmiset eivät ole paikalla. Se vie elokuvankatsojat fantastisen hauskalle matkalle, joka nähdään pääasiassa kahden kilpailevan lelun silmin: narusta vedettävän puhuvan cowboylelu Woodyn ja sankarillisen avaruustoimintahahmon Buzz Lightyearin. Koomisen yhteensopimaton kaksikko oppii lopulta panemaan erimielisyytensä syrjään, kun ne joutuvat eroon omistajastaan Andysta ja löytävät itsensä hulvattomasta seikkailuntäyteisestä tehtävästä. Ainoa keino selvitä on muodostaa kiusallinen liitto.","runtime":0,"tagline":"","title":"Toy Story - leluelämää"}},{"iso_3166_1":"CA","iso_639_1":"fr","name":"Français","english_name":"French","data":{"homepage":"","overview":"Quand le jeune Andy quitte sa chambre, ses jouets se mettent à mener leur propre vie sous la houlette de son pantin préféré, Woody le cow-boy. Andy ignore également que chaque anniversaire est une source d'angoisse pour ses jouets qui paniquent à l'idée d'être supplantés par un nouveau venu. Ce qui arrive quand Buzz l'éclair est offert à Andy. Cet intrépide aventurier de l'espace, venu d'une lointaine galaxie, va semer la zizanie dans ce petit monde et vivre avec Woody d'innombrables aventures aussi dangereuses que palpitantes.","runtime":81,"tagline":"","title":"Histoire de jouets"}},{"iso_3166_1":"FR","iso_639_1":"fr","name":"Français","english_name":"French","data":{"homepage":"http://toystory.disney.com/toy-story","overview":"Dans un monde où les jouets vivent leur vie quand les humains ne sont pas présents, Toy Story emmène les spectateurs dans un voyage fantastique vu principalement par les yeux de deux rivaux : Woody, un cow-boy, et Buzz l'Éclair, un ranger de l’espace. Ce duo va devoir apprendre à mettre ses différences de côté et s'allier, lorsqu’il sera séparé de son propriétaire Andy.","runtime":81,"tagline":"Vers l’infini et au‐delà !","title":""}},{"iso_3166_1":"IL","iso_639_1":"he","name":"עִבְרִית","english_name":"Hebrew","data":{"homepage":"","overview":"שתי בובות - הקאובוי וודי, הצעצוע האהוב על הילד אנדי; ומגן החלל באז שנות אור, הצעצוע החדש והמשוכלל שמשוכנע שהוא אכן לוחם חלל נועז - מתחרים על ליבו של הילד אנדי, אך כשהם נופלים בטעות לידיו של ילד מרושע, עליהם לאחד כוחות, להתגבר על משקעי העבר ולצאת להרפתקה של חייהם כדי למצוא את הדרך הביתה.","runtime":0,"tagline":"ההרפתקה ממריאה!","title":"צעצוע של סיפור"}},{"iso_3166_1":"HR","iso_639_1":"hr","name":"Hrvatski","english_name":"Croatian","data":{"homepage":"","overview":"Dječak Andy voli boraviti u svojoj sobi i igrati se s igračkama, pogotovo s Woodyjem. Ali Andy nije svjestan da Woody i ostale igračke oživljavaju čim on nije s njima. Woody vjeruje da je njegov život jako dobar, no kada Andyjeva majka za rođendan svom sinu pokloni novu igračku, Buzza Lightyeara, Woody postaje strahovito ljubomoran i na sve se moguće načine pokušava riješiti Buzza...","runtime":0,"tagline":"","title":"Priča o igračkama"}},{"iso_3166_1":"HU","iso_639_1":"hu","name":"Magyar","english_name":"Hungarian","data":{"homepage":"","overview":"Andy szobájában vidám élet folyik! Különösen akkor, amikor a szoba gazdája távol van, ugyanis ha senki nem figyeli őket, megelevenednek a játékok. Woody a főnök, az öreg harcos, a beszélő seriff-rongybaba. De ott van még Mr. Krumplifej, aki szerelemre vágyik, Rex, az ijedős dinoszaurusz, Guba a tudálékos perselymalac, kalandvágyó katonák, kacér öltöztetőbabák és a többiek. Ám egy nap új társuk érkezik: Buzz, a hipermodern, csillagközi lézerharcos. Két dudás még egy gyerekszobában sem fér meg. Buzz és Woody hamar ellenségek lennének, ha nem zuhannának ki véletlenül az ablakon, és nem kéne együtt megküzdeniük a valódi világgal, hogy száz kaland, veszély és viszontagság után végre visszajuthassanak Andyhoz.","runtime":91,"tagline":"Vigyázzon a kis zöld emberekre.","title":"Toy Story - Játékháború"}},{"iso_3166_1":"IS","iso_639_1":"is","name":"Íslenska","english_name":"Icelandic","data":{"homepage":"","overview":"Addi er ungur drengur sem hefur gaman af leikföngum. Samtals á hann tugi leikfanga og þykir afar vænt um þau öll. Eins og gengur og gerist hjá ungum krökkum er það alltaf eitt leikfang sem stendur upp úr. Uppáhalds leikfang Adda er kúrekabrúðan Viddi, heiðarlegur fógeti úr villta vestrinu. Hin leikföngin lýta upp til hans og er hann einhverskonar foringi hópsins og hlýða allir því sem hann segir.","runtime":0,"tagline":"","title":"Leikfangasaga"}},{"iso_3166_1":"IT","iso_639_1":"it","name":"Italiano","english_name":"Italian","data":{"homepage":"","overview":"Nell'universo confinato che è la stanza di Andy i suoi giocattoli si autogestiscono facendo riferimento a Woody il cowboy, da sempre il preferito del bambino. Quando però una festa di compleanno porta in casa lo space ranger Buzz Lightyear, giocattolo nuovo e moderno, gli equilibri e le preferenze cominciano a cambiare. Buzz ha un carattere diverso da Woody, pensa di essere un vero space ranger e piace a tutti. Questo proprio a pochi giorni dal temutissimo grande trasloco in cui tutti i giocattoli temono di essere persi...","runtime":81,"tagline":"","title":"Toy Story - Il mondo dei giocattoli"}},{"iso_3166_1":"JP","iso_639_1":"ja","name":"日本語","english_name":"Japanese","data":{"homepage":"","overview":"カウボーイ人形のウッディはアンディ少年の大のお気に入り。だがそれも誕生日プレゼントでアクション人形バズ・ライトイヤーを手にするまでの事だった。NO.1の座を奪われたウッディは何とかバズをこらしめようとするが、バズはバズで自分が本物のスペース・レンジャーだと思い込んでいる有り様。そんな二人がふとしたいざこざから外の世界に飛び出してしまう。なんとか我が家へ帰還しようとする二人だが、なんとアンディの隣に住む悪ガキのシドに捕まってしまった……。","runtime":0,"tagline":"友情している場合じゃないぜ!!","title":"トイ・ストーリー"}},{"iso_3166_1":"GE","iso_639_1":"ka","name":"ქართული","english_name":"Georgian","data":{"homepage":"","overview":"","runtime":0,"tagline":"","title":"სათამაშოების ისტორია"}},{"iso_3166_1":"KR","iso_639_1":"ko","name":"한국어/조선말","english_name":"Korean","data":{"homepage":"","overview":"카우보이 인형 우디는 꼬마 주인인 앤디의 가장 사랑받는 장난감이다. 그러나 어느날 버즈라는 새로운 장난감이 등장한다. 버즈는 최신형 장난감으로 레이저 빔 등의 첨단장비를 갖추고 있으나, 버즈는 자신이 장난감임을 인식하지 못하고 자신이 우주에서 온 전사이며 자신이 갖춘 장비로 하늘을 날 수 있다고 믿고 있다. 버즈의 허상을 상처받지 않고 인식시켜 주려는 우디와 친구들. 그러나 뜻밖의 사고가 일어난다. 옆집 개에게 버즈가 납치당하고 이런 버즈를 구하기 위해 우디와 친구들은 구조대를 조직해 버즈를 구하러 가는데...","runtime":81,"tagline":"장난감과 좋은 친구가 되자","title":"토이 스토리"}},{"iso_3166_1":"LT","iso_639_1":"lt","name":"Lietuvių","english_name":"Lithuanian","data":{"homepage":"","overview":"Du žaisliukai, Vudis ir Buzas, nekenčia vienas kito labiau nei bet kas. Atsitiktinai Buzas iškrenta pro langą, dėl to apkaltinamas Vudis. Šiam tenka iškeliauti iš namų, kad surasti iškritusįjį ir jie kartu galėtu grįžti namo. Kelyje atgal jų laukia gausybė nemalonumų.","runtime":0,"tagline":"","title":"Žaislų istorija"}},{"iso_3166_1":"LV","iso_639_1":"lv","name":"Latviešu","english_name":"Latvian","data":{"homepage":"","overview":"","runtime":0,"tagline":"","title":"Rotaļlietu stāsts"}},{"iso_3166_1":"NO","iso_639_1":"nb","name":"Bokmål","english_name":"Norwegian Bokmål","data":{"homepage":"","overview":"Under ledelsen av Woody, lever Andys leker lykkelig på rommet til Andy. Men da Andys bursdag bringer Buzz Lightyear inn i omgivelsene, frykter Woody miste sin plass i Andys hjerte, og prøver sabotere for Buzz. Men når omstendighetene skiller Buzz og Woody fra eieren sin, begraver de stridsøksen og lærer seg å samarbeide.","runtime":81,"tagline":"","title":"Toy Story"}},{"iso_3166_1":"NL","iso_639_1":"nl","name":"Nederlands","english_name":"Dutch","data":{"homepage":"","overview":"Cowboy Woody is al jaren het favoriete speelgoed van Andy. Wanneer de jongen voor zijn verjaardag de blitse astronautenpop Buzz Lightyear krijgt, wordt Woody naar de achtergrond verdrongen. De twee stukken speelgoed wedijveren om de gunst van de jongen en zetten door hun geruzie de hele kinderkamer in rep en roer. Als Buzz door toedoen van Woody uit het raam valt, krijgt Woody hiervan de schuld van de rest van het speelgoed. Hij gaat naar buiten om Buzz proberen te redden.","runtime":81,"tagline":"","title":""}},{"iso_3166_1":"NO","iso_639_1":"no","name":"Norsk","english_name":"Norwegian","data":{"homepage":"","overview":"Woody, Andys favorittleketøy, sheriff og selvutnevnt leder for gjengen får plutselig konkurranse når Andy har bursdag og får en ny, superkul Buzz Lightyear i gave. Woody blir selvsagt sjalu når han oppdager at nykommeren Buzz blir både Andys og de andre lekenes nye favoritt. Når Woody og Buzz ved en feiltagelse havner i hendene på nabogutten Sid må rivalene samarbeide for å komme seg unna. Vil de lykkes innen Sid setter i gang med sitt neste eksperiment?","runtime":0,"tagline":"","title":"Toy Story"}},{"iso_3166_1":"PL","iso_639_1":"pl","name":"Polski","english_name":"Polish","data":{"homepage":"","overview":"W świecie zabawek Andy'ego, których niekwestionowanym liderem był dotychczas kowboj Chudy, pojawia się nowa zabawka - astronauta Buzz.","runtime":80,"tagline":"","title":"Toy Story"}},{"iso_3166_1":"BR","iso_639_1":"pt","name":"Português","english_name":"Portuguese","data":{"homepage":"","overview":"Buzz Lightyear é o novo e sofisticado astronauta de brinquedo do garoto Andy. Buzz não imaginava que encontraria um rival: Woody, um cowboy de brinquedo que, dominado pelo ciúme, acredita ter perdido um lugar precioso no coração do seu dono. Os dois brinquedos vivem brigando até que vão parar nas garras do vizinho, um verdadeiro destruidor de brinquedos. Agora, mais do que nunca, Buzz e Woody precisam precisam se unir para escapar do perigo. Com a ajuda de seus amigos da caixa de brinquedos, eles vão viver uma incrível aventura.","runtime":81,"tagline":"","title":"Toy Story: Um Mundo de Aventuras"}},{"iso_3166_1":"PT","iso_639_1":"pt","name":"Português","english_name":"Portuguese","data":{"homepage":"","overview":"Quando um reluzente 'ranger' do espaço chamado Buzz Lightyear invade o mundo de um cowboy de corda chamado Woody, desencadeia uma hilariante briga entre brinquedos. Agora o favoritismo de Woody no coração do seu dono está em perigo... assim como as vidas de Buzz e Woody. Acidentalmente levados para longe de casa, estes dois rivais caem nas garras de um vizinho mau e fanfarrão e têm de trabalhar em equipa se querem escapar. Com os amigos brinquedos , Rex o Dinossauro, o exército dos Homens Verdes e o Sr. Cabeça de Batata, dispostos a ajudar, Woody e Buzz selam a sua amizade nesta fenomenal aventura para regressarem a casa.","runtime":77,"tagline":"Ao infinito... e mais além!","title":"Toy Story: Os Rivais"}},{"iso_3166_1":"RO","iso_639_1":"ro","name":"Română","english_name":"Romanian","data":{"homepage":"","overview":"Toy Story este un film despre viața secretă a jucăriilor care prind viață atunci când nu sunt văzute de oameni. Woody este o păpușă-cowboy cu sfori, care a petrecut cinci ani pe noptiera de la capul patului unui băiețel pe nume Andy, câștigând astfel statutul de jucărie preferată și devenind liderul incontestabil al celorlalte jucării. Din nefericire, autoritatea îi este amenințată de Buzz Lightyear, cosmonautul, care din momentul în care intră în camera lui Andy încearcă să instaureze o nouă ordine. În afară de faptul că nu-l poate înghiți pe cowboy, Buzz are pretenția că este real. Cei doi se suportă cu greu, dar, într-o zi, când ajung la capătul răbdărilor, se iau la bătaie. În timpul confruntării, Buzz cade pe fereastră. Woody este acuzat de toate jucăriile ca l-a ucis și, vinovat, pornește degrabă în căutarea lui. Însă odată ieșiți din casă, cei doi vor trece prin tot felul de peripeții, căci drumul de întoarcere este mult mai greu.","runtime":81,"tagline":"Știați că jucăriile au suflet?","title":"Povestea Jucăriilor"}},{"iso_3166_1":"RU","iso_639_1":"ru","name":"Pусский","english_name":"Russian","data":{"homepage":"","overview":"Каждый ребёнок верит, что когда он оставляет свои игрушки одни, они начинают заниматься своими делами. Этот мультипликационный фильм позволяет убедиться им в своей правоте. Основная идея фильма — каждая игрушка боится надоесть, стать забытой, заменённой другой, так как весь смысл их существования доставлять счастье своим хозяевам.","runtime":81,"tagline":"","title":"История игрушек"}},{"iso_3166_1":"SK","iso_639_1":"sk","name":"Slovenčina","english_name":"Slovak","data":{"homepage":"","overview":"Kto si myslí, že hračky nemajú vlastný život, sa veľmi mýli. Sotva dieťa vyjde z izby, začnú sa v jeho izbe diať zvláštne veci. Všetky hračky si vydýchnu, pretože môžu byť konečne samy sebou, namiesto toho, aby predstierali, že sú iba neživými predmetmi. Najobľúbenejšia hračka - kovboj Woody - má pochopiteľne hlavné slovo a všetci sa pod jeho vedením pripravujú na špeciálnu prieskumnú akciu. Chlapec má totiž narodeniny a Woodyho priatelia sa obávajú, aké nové hračky budú musieť privítať. Ich najhoršie tušenie sa vyplní.","runtime":0,"tagline":"","title":"Toy Story: Príbeh hračiek"}},{"iso_3166_1":"SI","iso_639_1":"sl","name":"Slovenščina","english_name":"Slovenian","data":{"homepage":"","overview":"","runtime":0,"tagline":"","title":"Svet igrač"}},{"iso_3166_1":"RS","iso_639_1":"sr","name":"Srpski","english_name":"Serbian","data":{"homepage":"","overview":"Прича о играчкама у којој све играчке живе само када нема људи у близини. Главни ликови су играчке дечака Ендија које воде врло интересантан живот у његовој соби. Најомиљенија Ендијева играчка, а самим тим и главна играчка, је каубој Вуди. Вуди је уживао да буде вођа играчака све док Енди није добио нову играчку за рођендан – свемирског ренџера База Лајтира који је у великој мери модернији од Вудија. Баз моментално постаје бр.1 међу Ендијевим играчкама што Вудију и није пријало. Једном приликом, током мање расправе, Вуди је случајно избацио База напоље кроз прозор. Остале играчке су оптужиле Вудија за тај инцидент и натерале су га да иде напоље и да врати База. Напољу долази до већих компликација тако да Вуди мора ићи много даље од куће како би вратио База. Такође, мора се вратити кући што пре јер се Ендијева породица сели са имања…","runtime":0,"tagline":"","title":"Прича о играчкама"}},{"iso_3166_1":"SE","iso_639_1":"sv","name":"svenska","english_name":"Swedish","data":{"homepage":"","overview":"Trädockan Woody har alltid varit pojken Andys favoritleksak och ledare för de andra leksakerna. Allting förändras den dag då Andy fyller år och får en ny, supercool Buzz Lightyear-docka i present. Woody ser avundsjukt på medan Buzz blir både Andys och de andra leksakernas nya favorit. Men när Woody och Buzz av misstag hamnar hos den elake grannpojken Sid, måste de tidigare rivalerna hjälpas åt för att kunna fly. Men kommer de att lyckas innan Sid ska påbörja sina läskiga leksaksexperiment?","runtime":81,"tagline":"","title":""}},{"iso_3166_1":"TH","iso_639_1":"th","name":"ภาษาไทย","english_name":"Thai","data":{"homepage":"","overview":"เด็กชายตัวน้อย แอนดี ชอบขลุกอยู่ในห้องส่วนตัวเพื่อเล่นของเล่น โดยเฉพาะเล่นกับตุ๊กตาคาวบอยตัวโปรดของเขาที่ชื่อ วูดดี แต่เมื่อ แอนดี ไม่อยู่ในห้อง วูดดี และพรรคพวกของเล่นชิ้นอื่นๆ ไม่ได้เป็นของเล่นเงียบๆ ธรรมดาอย่างที่ แอนดี คิด พวกเขามีชีวิตเป็นของตัวเองขึ้นมาอย่างน่าอัศจรรย์ วูดดี เชื่อว่าเขามีชีวิตที่ดีในฐานะของเล่นชิ้นหนึ่ง แต่เขาก็มีเรื่องกังวลอยู่บ้าง นั่นคือ แอนดี กำลังจะย้ายบ้านเร็วๆ นี้ และอีกเรื่องที่เขาไม่ทันได้ตั้งตัวก็คือเรื่องที่เกิดขึ้นในงานเลี้ยงวันเกิดของ แอนดี ซึ่งคุณแม่มอบหุ่นนักสู้อวกาศชื่อ บัซซ์ ไลต์เยียร์ ให้ แอนดี เป็นของขวัญ วูดดี รู้สึกอิจฉา บัซซ์ ไลต์เยียร์ มากจนคิดจะกำจัดเขา แต่แล้วทั้งคู่กลับหลงทางด้วยกัน และพวกเขาต้องรีบหาทางกลับบ้านให้เร็วที่สุด ก่อนที่ แอนดี จะย้ายบ้านไปเสียก่อน ยิ่งไปกว่านั้น พวกเขาจะต้องเอาชีวิตให้รอดจาก ซิด ฟิลลิปส์ เด็กวัยรุ่นจอมอำมหิตที่ชอบทำลายของเล่นเป็นที่สุด","runtime":81,"tagline":"","title":"ทอย สตอรี่"}},{"iso_3166_1":"TR","iso_639_1":"tr","name":"Türkçe","english_name":"Turkish","data":{"homepage":"","overview":"Buzz Lightyear adlı yeni çıkan oyuncak, Andy'e hediye edilir. Oyuncağı çok seven Andy, eski gözdesi Şerif Woody'e olan ilgisini yitirir. Bir gün Buzz yanlışlıkla pencereden aşağı uçunca, herkes Woody'nin onu öldürdüğüne inanır. Woody, kendisini kurtarabilmek için Buzz'ın arkasından giderek onu geri getirmeye karar verir. Fakat ikiliyi dış dünyada büyük tehlikelerle dolu maceralar beklemektedir.","runtime":0,"tagline":"","title":"Oyuncak Hikayesi"}},{"iso_3166_1":"UA","iso_639_1":"uk","name":"Український","english_name":"Ukrainian","data":{"homepage":"","overview":"Кожна дитина вірить, що коли вона залишає свої іграшки одні, вони починають займатися своїми справами. Цей мультиплікаційний фільм дозволяє переконатися їм в своїй правоті. Основна ідея фільму: кожна іграшка боїться набриднути, стати забутою, заміненою іншою, тому що весь сенс їхнього існування — приносити щастя своїм господарям.","runtime":0,"tagline":"","title":"Історія іграшок"}},{"iso_3166_1":"UZ","iso_639_1":"uz","name":"ozbek","english_name":"Uzbek","data":{"homepage":"","overview":"","runtime":0,"tagline":"","title":"Oʻyinchoqlar Tarixi"}},{"iso_3166_1":"VN","iso_639_1":"vi","name":"Tiếng Việt","english_name":"Vietnamese","data":{"homepage":"","overview":"Thế giới đồ chơi của cậu bé Andy bị xáo trộn khi có sự xuất hiện của cảnh sát vũ trụ Buzz Lightyear. Cảm thấy mình bị “thất sủng”, anh chàng cao bồi gỗ Woody xô xát với Buzz và cả hai bị rơi vào một cuộc phiêu lưu đầy mạo hiểm. Câu chuyện nói về thế giới đồ chơi của cậu bé...","runtime":0,"tagline":"","title":"Câu Chuyện Đồ Chơi"}},{"iso_3166_1":"CN","iso_639_1":"zh","name":"普通话","english_name":"Mandarin","data":{"homepage":"","overview":"胡迪是小主人安迪最喜欢的传统牛仔玩偶,他和其他玩具趁主人不在时,便会"活"起来一起玩闹。可是好景不常,最新奇的热门玩具巴斯光年来了,他让胡迪备受冷落。失宠的胡迪为了巩固自己的地位,只好处心积虑地想要赶走巴斯。在一次意外中,胡迪和巴斯不幸陷入一个玩具虐待狂的邻居家中而命在旦夕。两个冤家路窄互不相容的对手,是否能够化敌为友、发挥机智,顺利地通过这场冒险之旅,回到小主的身边呢?","runtime":0,"tagline":"坚持下去 喜剧将无限延伸","title":"玩具总动员"}},{"iso_3166_1":"HK","iso_639_1":"zh","name":"普通话","english_name":"Mandarin","data":{"homepage":"","overview":"自從簇新的「太空特警」巴斯光年闖入由拉線牛仔胡迪領導的玩具世界後,不但令胡迪在小主人心中的位置不保,更引發出各種玩具之間一連串令人發噱的爭執。因為一次意外,胡迪和巴斯光年不幸落入刁鑽殘忍的鄰居小孩手中,生命更受到威脅。這一對鬥氣活寶貝今回必須同心合力,一起逃離險境。最後幸得抱抱龍、眾士兵及薯蛋頭等一班玩具好朋友的幫助,化敵為友的胡迪和巴斯光年才能脫離重重險阻,順利回家!","runtime":80,"tagline":"","title":"反斗奇兵"}},{"iso_3166_1":"TW","iso_639_1":"zh","name":"普通话","english_name":"Mandarin","data":{"homepage":"","overview":"傳統牛仔玩偶「胡迪」(Woody)是小屁孩安弟(Andy)最喜歡的玩具,可是熱門玩具「巴斯光年」來了之後讓胡迪失寵。胡迪為了要趕走巴斯卻反被其他玩具們唾棄,之後意外與巴斯一起陷入致命危機,兩個冤家的冒險之旅也由此展開。巴斯光年原本深信自己是要拯救地球的太空騎警,但他後來卻發現自己只是個玩具遂陷入沮喪。當巴斯萬念俱灰,胡迪則設法要逃出玩具虐待狂阿薛的家;眼看安弟要搬家了,他們即將失去小主人,胡迪和巴斯必須團結合作,才能回到小主人的身邊。","runtime":0,"tagline":"","title":"玩具總動員"}}]} \ No newline at end of file diff --git a/com.synology.TMDBExample/plugin_data/movie/query/Toy+Story_1995_en-US_1.json b/com.synology.TMDBExample/plugin_data/movie/query/Toy+Story_1995_en-US_1.json new file mode 100644 index 0000000..b38c43b --- /dev/null +++ b/com.synology.TMDBExample/plugin_data/movie/query/Toy+Story_1995_en-US_1.json @@ -0,0 +1 @@ +{"page":1,"results":[{"adult":false,"backdrop_path":"/lxD5ak7BOoinRNehOCA85CQ8ubr.jpg","genre_ids":[16,12,10751,35],"id":862,"original_language":"en","original_title":"Toy Story","overview":"Led by Woody, Andy's toys live happily in his room until Andy's birthday brings Buzz Lightyear onto the scene. Afraid of losing his place in Andy's heart, Woody plots against Buzz. But when circumstances separate Buzz and Woody from their owner, the duo eventually learns to put aside their differences.","popularity":100.954,"poster_path":"/uXDfjJbdP4ijW5hWSBrPrlKpxab.jpg","release_date":"1995-10-30","title":"Toy Story","video":false,"vote_average":7.97,"vote_count":17277},{"adult":false,"backdrop_path":"/k7vO3lOOkxZ88Bieu5UQLEBKZOl.jpg","genre_ids":[99],"id":711704,"original_language":"en","original_title":"Making 'Toy Story'","overview":"Documentary of the making of the groundbreaking Disney/Pixar animated hit movie.","popularity":5.067,"poster_path":"/s2vPOYtuOY3DMYTduRx0cOzDcWm.jpg","release_date":"1995-12-02","title":"Making 'Toy Story'","video":false,"vote_average":7.0,"vote_count":5}],"total_pages":1,"total_results":2} \ No newline at end of file diff --git a/com.synology.TMDBExample/search.py b/com.synology.TMDBExample/search.py new file mode 100644 index 0000000..c5f7d9c --- /dev/null +++ b/com.synology.TMDBExample/search.py @@ -0,0 +1,400 @@ +import argparse +import html +import os +import json +import copy +import re +import util_themoviedb +import searchinc +import constant + + +def _plugin_run(): + parser = argparse.ArgumentParser() + parser.add_argument("--input", type=str, required=True, help='json string') + parser.add_argument("--lang", type=str, required=True, default=None, help='enu|cht|...') + parser.add_argument("--type", type=str, required=True, default=None, help='movie|tvshow|...') + parser.add_argument("--limit", type=int, default=1, help='result count') + parser.add_argument("--allowguess", type=bool, default=True) + + # unknownPrm is useless, just for prevent error when unknow param inside + args, unknownPrm = parser.parse_known_args() + + argv_input = json.loads(args.input) + argv_lang = args.lang + argv_type = args.type + argv_limit = args.limit + argv_allowguess = args.allowguess + + cookie_path = searchinc.create_cookie_file() + + result = None + success = True + error_code = 0 + try: + if argv_type == 'movie_similar': + result = _similar(argv_input, argv_lang, argv_type, argv_limit) + else: + result = _process(argv_input, argv_lang, argv_type, argv_limit, argv_allowguess) + + except SystemExit as query_e: + error_code = constant.ERROR_PLUGIN_QUERY_FAIL + success = False + + except Exception as e: + error_code = constant.ERROR_PLUGIN_PARSE_RESULT_FAIL + success = False + + searchinc.delete_cookie_file(cookie_path) + _process_output(success, error_code, result) + + +def _process(input_obj, lang, media_type, limit, allowguess): + title = input_obj['title'] + year = _get_year(input_obj) + + season = input_obj['season'] if 'season' in input_obj else 0 + episode = input_obj['episode'] if 'episode' in input_obj else None + + # search + query_data = [] + titles = searchinc.get_guessing_names(title, allowguess) + + for oneTitle in titles: + if not oneTitle: + continue + + query_data = util_themoviedb.search_media(oneTitle, lang, limit, media_type, year) + + if 0 < len(query_data): + break + return _get_metadata(query_data, lang, media_type, season, episode, limit) + + +def _similar(input_obj, lang, media_type, limit): + item_id = int(input_obj['tmdb_id']) if 'tmdb_id' in input_obj else -1 + + if (0 > item_id): + return [] + return _get_similar_movies([{'id': item_id, 'collection_id': -1, 'lang': lang}], lang, limit) + + +def _get_year(input_obj): + year = 0 + + if 'original_available' in input_obj: + year = searchinc.parse_year(input_obj['original_available']) + + if 'extra' in input_obj: + extraItem = input_obj['extra'] + if 'tvshow' in extraItem and 'original_available' in extraItem['tvshow']: + year = searchinc.parse_year(extraItem['tvshow']['original_available']) + return year + + +def _get_metadata(query_data, lang, media_type, season, episode, limit): + result = [] + for item in query_data: + if item['lang'] != lang: + continue + + media_data = None + + if media_type == 'movie': + media_data = util_themoviedb.get_movie_detail_data(item['id'], item['lang'], constant.DEFAULT_EXPIRED_TIME) + elif media_type == 'tvshow' or media_type == 'tvshow_episode': + media_data = util_themoviedb.get_tv_detail_data(item['id'], item['lang']) + else: + return [] + + if not media_data: + continue + + if media_type == 'movie': + result.append(_parse_movie_info(media_data)) + + elif media_type == 'tvshow': + result.append(_parse_tvshow_info(media_data)) + + elif media_type == 'tvshow_episode': + episode_data = util_themoviedb.get_tv_episode_detail_data(media_data['id'], lang, season, episode) + result.extend(_parse_episodes_info(media_data, episode_data, season, episode)) + + if limit <= len(result): + result = result[:limit] + break + + return result + + +def _get_similar_movies(query_data, lang, limit): + result = [] + ids = [] + + for item in query_data: + if item['lang'] != lang: + continue + + if 'collection_id' in item: + if 0 >= item['collection_id']: + item['collection_id'] = _get_collection_id(item['id'], item['lang']) + + if 0 < item['collection_id']: + collection_response = util_themoviedb.get_movie_collection_data(item['collection_id'], item['lang']) + + if collection_response: + result, ids = _parse_similar_data_to_result_and_ids( + collection_response['parts'], limit, result, ids) + if len(result) >= limit: + break + page = 1 + while True: + similar_response = util_themoviedb.get_movie_similar_data(item['id'], lang, page) + + if not similar_response: + break + + result, ids = _parse_similar_data_to_result_and_ids(similar_response['results'], limit, result, ids) + + if len(result) >= limit: + break + + if similar_response['page'] >= similar_response['total_pages']: + break + + page = similar_response['page'] + 1 + + if len(result) >= limit: + break + return result + + +def _get_collection_id(item_id, lang): + movie_data = util_themoviedb.get_movie_detail_data(item_id, lang, constant.DEFAULT_LONG_EXPIRED_TIME) + if not movie_data: + return -1 + + if movie_data.get('belongs_to_collection') and 'id' in movie_data['belongs_to_collection']: + return movie_data['belongs_to_collection']['id'] + + return -1 + + +def _parse_similar_data_to_result_and_ids(movies, limit, result, ids): + # use for parsing each item in similar_response['results'] or collection_response['parts'] + + for movie in movies: + movie_id = movie['id'] + movie_title = movie['title'] + + if movie_id in ids: + continue + + data = copy.deepcopy(constant.MOVIE_SIMILAR_DATA_TEMPLATE) + data['title'] = movie_title + data['id'] = movie_id + + result.append(data) + ids.append(movie_id) + + if len(result) >= limit: + break + return result, ids + + +def _parse_movie_info(movie_data): + data = copy.deepcopy(constant.MOVIE_DATA_TEMPLATE) + + data['title'] = movie_data['title'] + data['original_available'] = movie_data['release_date'] + data['tagline'] = movie_data['tagline'] + data['summary'] = movie_data['overview'] + data['certificate'] = _parse_movie_certificate_info(movie_data) + data['genre'] = _parse_genre(movie_data) + + actor, director, writer = _get_cast_info(movie_data['credits']) + data['actor'] = actor + data['director'] = director + data['writer'] = writer + + data = _set_data_value(data, ['extra', constant.PLUGINID, 'reference', 'themoviedb'], movie_data['id']) + data = _set_data_value(data, ['extra', constant.PLUGINID, 'reference', 'imdb'], movie_data['imdb_id']) + + if movie_data['vote_average']: + data = _set_data_value(data, ['extra', constant.PLUGINID, 'rating', 'themoviedb'], movie_data['vote_average']) + + if movie_data['poster_path']: + data = _set_data_value(data, ['extra', constant.PLUGINID, 'poster'], [ + constant.BANNER_URL + movie_data['poster_path']]) + + if movie_data['backdrop_path']: + data = _set_data_value(data, ['extra', constant.PLUGINID, 'backdrop'], [ + constant.BACKDROP_URL + movie_data['backdrop_path']]) + + if movie_data['belongs_to_collection'] and ('id' in movie_data['belongs_to_collection']): + data = _set_data_value(data, ['extra', constant.PLUGINID, 'collection_id', + 'themoviedb'], movie_data['belongs_to_collection']['id']) + return data + + +def _parse_tvshow_info(tv_data): + data = copy.deepcopy(constant.TVSHOW_DATA_TEMPLATE) + + data['title'] = tv_data['name'] + data['original_available'] = tv_data['first_air_date'] + data['summary'] = tv_data['overview'] + + if tv_data['poster_path']: + data = _set_data_value(data, ['extra', constant.PLUGINID, 'poster'], [ + constant.BANNER_URL + tv_data['poster_path']]) + if tv_data['backdrop_path']: + data = _set_data_value(data, ['extra', constant.PLUGINID, 'backdrop'], [ + constant.BACKDROP_URL + tv_data['backdrop_path']]) + return data + +def _parse_episodes_info(tv_data, episode_data, season, episode): + parse_info_result = [] + if episode != None: + parse_info_result.append(_parse_episode_info(tv_data, episode_data, season, episode)) + else: + episodes = episode_data['episodes'] + for episode_object in episodes: + parse_info_result.append(_parse_episode_info(tv_data, episode_object, season, episode)) + return parse_info_result + +def _parse_episode_info(tv_data, episode_data, season, episode): + data = copy.deepcopy(constant.TVSHOW_EPISODE_DATA_TEMPLATE) + + data['title'] = tv_data['name'] + data['season'] = season + data['episode'] = episode_data['episode_number'] if episode_data != None and 'episode_number' in episode_data else episode + + tvshow_data = _parse_tvshow_info(tv_data) + data = _set_data_value(data, ['extra', constant.PLUGINID, 'tvshow'], tvshow_data) + + if not episode_data: + return data + + data['tagline'] = episode_data['name'] + data['original_available'] = episode_data['air_date'] + data['summary'] = episode_data['overview'] + data['certificate'] = _parse_tv_certificate_info(tv_data) + data['genre'] = _parse_genre(tv_data) + + if 'credits' in episode_data: + actor, director, writer = _get_cast_info(episode_data['credits']) + else: + actor, director, writer = _get_cast_info(episode_data) + + data['actor'] = actor + data['director'] = director + data['writer'] = writer + + if episode_data['still_path']: + data = _set_data_value(data, ['extra', constant.PLUGINID, 'poster'], [ + constant.BANNER_URL + episode_data['still_path']]) + + data = _set_data_value(data, ['extra', constant.PLUGINID, 'reference', 'themoviedb_tv'], tv_data['id']) + data = _set_data_value(data, ['extra', constant.PLUGINID, 'reference', 'imdb'], tv_data['external_ids']['imdb_id']) + data = _set_data_value(data, ['extra', constant.PLUGINID, 'rating', 'themoviedb_tv'], tv_data['vote_average']) + return data + + +def _set_data_value(data, key_list, value): + if not value: + return data + + now_data = data + for attr in key_list[:-1]: + if attr not in now_data: + now_data[attr] = {} + now_data = now_data[attr] + + now_data[key_list[-1]] = value + return data + + +def _get_cast_info(cast_data): + actor = [] + director = [] + writer = [] + + if 'cast' in cast_data: + for item in cast_data['cast']: + if item['name'] not in actor: + actor.append(item['name']) + + # only for tvshow episode + if 'guest_stars' in cast_data: + for item in cast_data['guest_stars']: + if item['name'] not in actor: + actor.append(item['name']) + + if 'crew' in cast_data: + for item in cast_data['crew']: + if (item['department'] == 'Directing') and (item['name'] not in director): + director.append(item['name']) + + if (item['department'] == 'Writing') and (item['name'] not in writer): + writer.append(item['name']) + return actor, director, writer + +def _parse_movie_certificate_info(movie_data): + release_data = movie_data['releases'] + + certificate = {} + for item in release_data['countries']: + if not item['certification']: + continue + + if item['iso_3166_1'].lower() == 'us': + return item['certification'] + + certificate[item['iso_3166_1']] = item['certification'] + + if len(certificate) == 0: + return None + + return list(certificate.values())[0] + + +def _parse_tv_certificate_info(tv_data): + certificate = {} + + for item in tv_data['content_ratings']['results']: + if not item['rating']: + continue + + if item['iso_3166_1'].lower() == 'us': + return item['rating'] + + certificate[item['iso_3166_1']] = item['rating'] + + if len(certificate) == 0: + return None + + return list(certificate.values())[0] + + +def _parse_genre(media_data): + genre = [] + for item in media_data['genres']: + if item['name'] not in genre: + genre.append(item['name']) + return genre + + +def _process_output(success, error_code, datas): + result_obj = {} + if success: + result_obj = {'success': True, 'result': datas} + else: + result_obj = {'success': False, 'error_code': error_code} + + json_string = json.dumps(result_obj, ensure_ascii=False, separators=(',', ':')) + json_string = html.unescape(json_string) + print(json_string) + + +if __name__ == "__main__": + _plugin_run() diff --git a/com.synology.TMDBExample/searchinc.py b/com.synology.TMDBExample/searchinc.py new file mode 100644 index 0000000..544ed80 --- /dev/null +++ b/com.synology.TMDBExample/searchinc.py @@ -0,0 +1,221 @@ +import os +import json +import shlex +import random +import tempfile +import re +import pickle +import urllib +import http +import http.cookiejar +import sys + +PKG_INSTALL_DIR = os.path.dirname(os.path.realpath(__file__)) + + +def get_plugin_data_directory(pluginId): + _remove_plugin_data() + + pluginDirectory = PKG_INSTALL_DIR + '/plugin_data' + if not os.path.exists(pluginDirectory): + oldmask = os.umask(0) + os.makedirs(pluginDirectory, 0o755) + os.umask(oldmask) + return pluginDirectory + + +def load_local_cache(cache_path): + try: + with open(cache_path, 'r') as f: + jsonResult = json.loads(f.read()) + return jsonResult + except: + return None + + +def http_get_download(url, filepath): + result = None + timeouts = 30 + header = { + r'user-agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_1; de-de) AppleWebKit/527+ (KHTML, like Gecko) Version/3.1.1 Safari/525.20', + } + + cookie = http.cookiejar.LWPCookieJar() + use_cookie = False + if 'cookie_path' in globals(): + global cookie_path + if os.path.exists(cookie_path): + use_cookie = True + + try: + if use_cookie: + cookie.load(cookie_path, ignore_discard=True, ignore_expires=True) + + handler = urllib.request.HTTPCookieProcessor(cookie) + opener = urllib.request.build_opener(handler) + request = urllib.request.Request(url=url, headers=header, method='GET') + + response = opener.open(request, timeout=timeouts) + result = response.read().decode('utf-8') + + if use_cookie: + cookie.save(filename=cookie_path, ignore_discard=True, ignore_expires=True) + + except urllib.error.HTTPError as http_e: + if http_e.code == 404: + response_obj = json.loads(http_e.read().decode()) + if response_obj.get('status_code') == 34: + # there's a situation that tvshow can find info, + # but episode can't find info at certain episodes + # so we still need process goes on, we return false + return False + sys.exit() + + except Exception: + # unexpected error + sys.exit() + + if(not result): + return False + + with open(filepath, 'w') as f: + f.write(result) + + return True + + +def parse_year(date_string): + # input should be '2008' or 2008 or '2008-01-03' + if type(date_string) == int: + return date_string + + try: + year = (int)(date_string.split('-', 1)[0]) + except: + year = 0 + return year + + +def get_guessing_names(title, allowguess): + if not allowguess: + return [title] + + title_list = [title, _pure_lang_text(title, False)] + engTitle = _pure_lang_text(title, True) + + if not engTitle: + engTitle = title + + effective_word_count = _get_effective_word_count(engTitle) + + if 2 <= effective_word_count: + title_list += [engTitle] + + if 3 <= effective_word_count: + right_cut = _cut_string(engTitle, 1, True) + left_cut = _cut_string(engTitle, 1, False) + title_list += [right_cut, left_cut] + + if 4 <= effective_word_count: + two_side_cut = _cut_string(_cut_string(engTitle, 1, False), 1, True) + right_cut = _cut_string(engTitle, 2, True) + left_cut = _cut_string(engTitle, 2, False) + title_list += [two_side_cut, right_cut, left_cut] + + if 6 <= effective_word_count: + two_side_cut = _cut_string(_cut_string(engTitle, 2, False), 2, True) + title_list += [two_side_cut] + + return title_list + + +def create_cookie_file(): + tmpfile = tempfile.NamedTemporaryFile('w+t', prefix='plugin_cookie_', dir='/tmp', delete=False) + path = tmpfile.name + + cookie = http.cookiejar.LWPCookieJar() + cookie.save(filename=path, ignore_discard=True, ignore_expires=True) + global cookie_path + cookie_path = path + return path + + +def delete_cookie_file(cookie_file): + if os.path.exists(cookie_file): + os.remove(cookie_file) + + +def _remove_plugin_data(): + randval = random.randrange(0, 1000) + if randval != 0: + return + path = PKG_INSTALL_DIR + '/plugin_data/' + if not os.path.exists(path): + return + + cmd = '/usr/bin/find ' + shlex.quote(path) + ' -mtime +1 -delete' + os.system(cmd) + + +def _pure_lang_text(text, only_english): + all_num = True + token = [] + data = [x for x in text.split(' ') if x] + + for term in data: + containCharResult = re.search('[a-z]', term, re.IGNORECASE) + containDigitResult = re.search('[0-9]', term, re.IGNORECASE) + if (containCharResult != None) and (containDigitResult != None): + # char and digit like 'hi123' would be ignore + continue + + allDigitResult = re.search('^[0-9]+$', term, re.IGNORECASE) + if allDigitResult != None: + # pure digit is accept + token.append(term) + continue + + allCharResult = re.search('^[a-z]+$', term, re.IGNORECASE) + if only_english and (allCharResult != None): + # pure english char + all_num = False + token.append(term) + continue + + if (not only_english) and (allCharResult == None): + # not pure english char, like cht, jpn or sympol + all_num = False + token.append(term) + continue + + if all_num: + return '' + return ' '.join(token) + + +def _get_effective_word_count(token): + filter = ['a', 'an', 'the', 'of', 'in', 'on', 'at', 'for', 'by'] + + if not isinstance(token, list): + token = [x for x in token.split(' ') if x] + + count = 0 + for term in token: + if term.lower() in filter: + continue + count += 1 + return count + + +def _cut_string(text, cut_count, cut_from_right): + token = [x for x in text.split(' ') if x] + origWords = _get_effective_word_count(token) + newWords = origWords + + while (len(token) > 1) and (cut_count > (origWords - newWords)): + if cut_from_right: + token.pop() + else: + token.pop(0) + newWords = _get_effective_word_count(token) + return ' '.join(token) diff --git a/com.synology.TMDBExample/util_themoviedb.py b/com.synology.TMDBExample/util_themoviedb.py new file mode 100644 index 0000000..773c2c3 --- /dev/null +++ b/com.synology.TMDBExample/util_themoviedb.py @@ -0,0 +1,257 @@ +import os +import urllib +import time +import json +import searchinc +import constant + + +def search_media(name, lang, limit, media_type, year): + page = 1 + + if media_type == 'movie': + search_func = _get_movie_search_data + + elif media_type == 'tvshow' or media_type == 'tvshow_episode': + search_func = _get_tv_search_data + + else: + return [] + + search_data = search_func(name, lang, year, page) + + if not search_data.get('total_pages'): + return [] + + total_pages = search_data['total_pages'] + total_result = parse_search_data(search_data, lang, limit, media_type, year) + + while ((len(total_result) < limit) and page < total_pages): + page += 1 + search_data = search_func(name, lang, year, page) + one_page_result = parse_search_data(search_data, lang, limit, media_type, year) + total_result.extend(one_page_result) + + if (0 < limit) and (limit < len(total_result)): + total_result = total_result[0:limit] + + return total_result + + +def parse_search_data(search_data, lang, limit, media_type, year): + if not search_data.get('results'): + return [] + + result = [] + for item in search_data['results']: + data = {} + data['id'] = item['id'] + + if not _is_translation_available(data['id'], lang, media_type): + continue + + data['lang'] = lang + + if year and 'release_date' in item: + item_year = searchinc.parse_year(item['release_date']) + year_diff = abs(item_year - year) + + if 2 <= year_diff and item_year: + continue + + result.append(data) + + if (0 < limit) and (limit <= len(result)): + break + + return result + + +def _get_movie_search_data(name, lang, year, page): + api_key = constant.APIKEY + convert_lang = _convert_to_api_lang(lang) + nameEncode = urllib.parse.quote_plus(name) + + cache_path = searchinc.get_plugin_data_directory( + constant.PLUGINID) + '/movie/query/' + nameEncode + '_' + str(year) + '_' + convert_lang + '_' + str(page) + '.json' + + # example: https://api.themoviedb.org/3/search/movie?api_key=xxxxx&query=harry%20potter&language=cht&year=0&page=1 + url = constant.THEMOVIEDB_URL + 'search/movie?api_key=' + api_key + '&query=' + nameEncode + '&language=' + \ + convert_lang + '&year=' + str(year) + '&page=' + str(page) + return _get_data_from_cache_or_download(url, cache_path, constant.DEFAULT_EXPIRED_TIME) + + +def _get_movie_translation_data(item_id): + api_key = constant.APIKEY + + cache_path = searchinc.get_plugin_data_directory(constant.PLUGINID) + '/movie/' + str(item_id) + '/translation.json' + + # example: https://api.themoviedb.org/3/movie/671/translations?api_key=xxxxx + url = constant.THEMOVIEDB_URL + 'movie/' + str(item_id) + '/translations?api_key=' + api_key + return _get_data_from_cache_or_download(url, cache_path, constant.DEFAULT_EXPIRED_TIME) + + +def get_movie_detail_data(item_id, lang, expired_time): + api_key = constant.APIKEY + convert_lang = _convert_to_api_lang(lang) + + cache_path = searchinc.get_plugin_data_directory( + constant.PLUGINID) + '/movie/' + str(item_id) + '/' + convert_lang + '.json' + + # example: https://api.themoviedb.org/3/movie/671?api_key=xxxxx&append_to_response=credits,releases&language=zh-tw + url = constant.THEMOVIEDB_URL + 'movie/' + str(item_id) + '?api_key=' + api_key + \ + '&language=' + convert_lang + '&append_to_response=credits,releases' + return _get_data_from_cache_or_download(url, cache_path, expired_time) + + +def get_movie_similar_data(item_id, lang, page): + api_key = constant.APIKEY + convert_lang = _convert_to_api_lang(lang) + + cache_path = searchinc.get_plugin_data_directory( + constant.PLUGINID) + "/movie/" + str(item_id) + "/" + convert_lang + "_" + str(page) + "_similar.json" + + # example: https://api.themoviedb.org/3/movie/671/similar?api_key=xxxxx&language=zh-tw&page=1 + url = constant.THEMOVIEDB_URL + "movie/" + str(item_id) + "/similar?api_key=" + api_key + \ + '&language=' + convert_lang + '&page=' + str(page) + return _get_data_from_cache_or_download(url, cache_path, constant.DEFAULT_LONG_EXPIRED_TIME) + + +def get_movie_collection_data(item_id, lang): + api_key = constant.APIKEY + convert_lang = _convert_to_api_lang(lang) + + cache_path = searchinc.get_plugin_data_directory( + constant.PLUGINID) + "/movie/" + str(item_id) + "/" + convert_lang + "_collection.json" + + # example: https://api.themoviedb.org/3/collection/1241?api_key=xxxxx&language=zh-tw + url = constant.THEMOVIEDB_URL + "collection/" + str(item_id) + '?api_key=' + api_key + '&language=' + convert_lang + return _get_data_from_cache_or_download(url, cache_path, constant.DEFAULT_LONG_EXPIRED_TIME) + + +def _get_tv_search_data(name, lang, year, page): + api_key = constant.APIKEY + convert_lang = _convert_to_api_lang(lang) + nameEncode = urllib.parse.quote_plus(name) + + cache_path = searchinc.get_plugin_data_directory( + constant.PLUGINID) + '/tv/query/' + nameEncode + '_' + str(year) + '_' + convert_lang + '_' + str(page) + '.json' + + # example: https://api.themoviedb.org/3/search/tv?api_key=xxxxx&query=superman&language=en&year=0&page=1 + url = constant.THEMOVIEDB_URL + "search/tv?api_key=" + api_key + '&query=' + \ + nameEncode + '&language=' + convert_lang + '&year=' + str(year) + '&page=' + str(page) + return _get_data_from_cache_or_download(url, cache_path, constant.DEFAULT_EXPIRED_TIME) + + +def get_tv_detail_data(item_id, lang): + api_key = constant.APIKEY + convert_lang = _convert_to_api_lang(lang) + + cache_path = searchinc.get_plugin_data_directory( + constant.PLUGINID) + "/tv/" + str(item_id) + "/" + convert_lang + ".json" + + # example: https://api.themoviedb.org/3/tv/1403?api_key=xxxxx&append_to_response=credits,content_ratings,external_ids&language=en + url = constant.THEMOVIEDB_URL + "tv/" + str(item_id) + '?api_key=' + api_key + '&language=' + \ + convert_lang + '&append_to_response=credits,content_ratings,external_ids' + return _get_data_from_cache_or_download(url, cache_path, constant.DEFAULT_EXPIRED_TIME) + + +def get_tv_episode_detail_data(item_id, lang, season, episode): + api_key = constant.APIKEY + convert_lang = _convert_to_api_lang(lang) + + episode_cache_pattern = '_e' + str(episode) if episode != None else '' + cache_path = searchinc.get_plugin_data_directory( + constant.PLUGINID) + "/tv/" + str(item_id) + "/" + convert_lang + '_s' + str(season) + episode_cache_pattern + ".json" + + # example: https://api.themoviedb.org/3/tv/1403/season/1/episode/3?api_key=xxxxx&language=en&append_to_response=credits + episode_url_pattern = '/episode/' + str(episode) if episode != None else '' + url = constant.THEMOVIEDB_URL + "tv/" + \ + str(item_id) + '/season/' + str(season) + episode_url_pattern + '?api_key=' + \ + api_key + '&language=' + convert_lang + '&append_to_response=credits' + return _get_data_from_cache_or_download(url, cache_path, constant.DEFAULT_EXPIRED_TIME) + + +def _get_tv_translation_data(item_id): + api_key = constant.APIKEY + + cache_path = searchinc.get_plugin_data_directory(constant.PLUGINID) + "/tv/" + str(item_id) + "/translation.json" + + # example: https://api.themoviedb.org/3/tv/1403/translations?api_key=xxxxx + url = constant.THEMOVIEDB_URL + "tv/" + str(item_id) + "/translations?api_key=" + api_key + return _get_data_from_cache_or_download(url, cache_path, constant.DEFAULT_EXPIRED_TIME) + + +def _get_data_from_cache_or_download(url, cache_path, expired_time): + result = None + + if os.path.exists(cache_path): + last_modify_time = os.path.getmtime(cache_path) + + if expired_time > (time.time()-last_modify_time): + result = searchinc.load_local_cache(cache_path) + + if result != None: + return result + + os.remove(cache_path) + + else: + directory_path = os.path.dirname(cache_path) + if not os.path.exists(directory_path): + oldmask = os.umask(0) + os.makedirs(directory_path, 0o755) + os.umask(oldmask) + + download_success = searchinc.http_get_download(url, cache_path) + + if download_success: + result = searchinc.load_local_cache(cache_path) + + return result + + +def _is_translation_available(item_id, lang, mediaType): + translationData = None + + if mediaType == 'movie': + translationData = _get_movie_translation_data(item_id) + elif mediaType == 'tvshow' or mediaType == 'tvshow_episode': + translationData = _get_tv_translation_data(item_id) + else: + return False + + if not translationData: + return False + + translation_array = _parse_translation(translationData) + converted_lang = _convert_to_api_lang(lang) + if converted_lang not in translation_array: + return False + return True + + +def _parse_translation(translationData): + langList = [] + for item in translationData['translations']: + iso639 = item['iso_639_1'] + iso3166 = item['iso_3166_1'] + langList.append(iso639 + '-' + iso3166) + return langList + + +def _convert_to_api_lang(lang): + langDict = { + 'chs': 'zh-CN', 'cht': 'zh-TW', 'csy': 'cs-CZ', 'dan': 'da-DK', + 'enu': 'en-US', 'fre': 'fr-FR', 'ger': 'de-DE', 'hun': 'hu-HU', + 'ita': 'it-IT', 'jpn': 'ja-JP', 'krn': 'ko-KR', 'nld': 'nl-NL', + 'nor': 'no-NO', 'plk': 'pl-PL', 'ptb': 'pt-BR', 'ptg': 'pt-PT', + 'rus': 'ru-RU', 'spn': 'es-ES', 'sve': 'sv-SE', 'trk': 'tr-TR', + 'tha': 'th-TH' + } + if lang in langDict.keys(): + return langDict[lang] + + if lang in langDict.values(): + return lang + return None