From f3d1cc50c0b55574d61585974920818709c56951 Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Sat, 9 Feb 2008 17:53:08 +0000 Subject: [PATCH] some refactoring, new icons, imdb search engine --- fw/search.imdb.png | Bin 0 -> 31565 bytes fw/search.opensubtitles.png | Bin 0 -> 22237 bytes fw/search.subscene.png | Bin 0 -> 23957 bytes .../filebot/resources/ResourceManager.java | 75 ++++---------- .../filebot/resources/search.imdb.png | Bin 0 -> 325 bytes .../resources/search.opensubtitles.png | Bin 0 -> 328 bytes .../filebot/resources/search.subscene.png | Bin 0 -> 822 bytes .../ui/panel/search/FetchEpisodesTask.java | 8 +- .../filebot/ui/panel/search/SearchPanel.java | 42 ++++---- .../filebot/ui/panel/sfv/Checksum.java | 10 +- .../FileTransferablePolicy.java | 7 +- ...nidbSearchEngine.java => AnidbClient.java} | 8 +- ...archEngine.java => EpisodeListClient.java} | 8 +- .../filebot/web/ImdbSearchEngine.java | 96 ++++++++++++++++++ source/net/sourceforge/filebot/web/Movie.java | 43 ++++++++ .../filebot/web/OpenSubtitlesHasher.java | 21 +--- ...ageSearchEngine.java => TVRageClient.java} | 10 +- ...mSearchEngine.java => TvdotcomClient.java} | 10 +- source/net/sourceforge/tuned/XPathUtil.java | 5 + 19 files changed, 217 insertions(+), 126 deletions(-) create mode 100644 fw/search.imdb.png create mode 100644 fw/search.opensubtitles.png create mode 100644 fw/search.subscene.png create mode 100644 source/net/sourceforge/filebot/resources/search.imdb.png create mode 100644 source/net/sourceforge/filebot/resources/search.opensubtitles.png create mode 100644 source/net/sourceforge/filebot/resources/search.subscene.png rename source/net/sourceforge/filebot/web/{AnidbSearchEngine.java => AnidbClient.java} (94%) rename source/net/sourceforge/filebot/web/{SearchEngine.java => EpisodeListClient.java} (85%) create mode 100644 source/net/sourceforge/filebot/web/ImdbSearchEngine.java create mode 100644 source/net/sourceforge/filebot/web/Movie.java rename source/net/sourceforge/filebot/web/{TVRageSearchEngine.java => TVRageClient.java} (91%) rename source/net/sourceforge/filebot/web/{TvdotcomSearchEngine.java => TvdotcomClient.java} (92%) diff --git a/fw/search.imdb.png b/fw/search.imdb.png new file mode 100644 index 0000000000000000000000000000000000000000..aab7bc8afdcd5660dfb26a73a61a59d6d311a44d GIT binary patch literal 31565 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 literal 0 HcmV?d00001 diff --git a/fw/search.subscene.png b/fw/search.subscene.png new file mode 100644 index 0000000000000000000000000000000000000000..8e748312b7cf77e6cafd355893ff76a972cab63c GIT binary patch literal 23957 zcmb@u2T)W`vp5PSL=aF!a!^n*2uKc#AW4#B$s!<^e2Iu|3Vn7rH1f?l&eZ%gBTpB` znWQ0>x$<)CrKZQ!2b#-u?p)Khq`~& zlt;n2TAxo{){pA-Bi9f1yb+&fFEcew*{?VxtdEgSU`^Eqpvc7-$G*ZqC#7bB)|4^v za6#hhlyAvNCFF27{W!J6*J=uh5^p{{9MB<$>pW87h*INVJB_;gWR_p|QoI-5k5dN$ zzOoGxkT6fJ$W=3$>ZkFYD0Val6vy9;p} zlUqPaZMoEJz{SBqUdXX4rxAjwsR18k^p|QbvV8HPL0pj1vRQn7cC#`mJD%>N;pyw4Kn zDgitKx5mNfDp(`H-?IgkS;Wu1gGsz(_=a5pJ`OjGMDAT`4Mr=Wjw#JXDDTa<9h=nV z=HjVbJS;x*D>KvGsJZCF+BIwmJ2Vkj>WL6MKkmFILYuw9+-y2%)_4hqV%{83cDv+B zp$zIQ%`V?>M((B-lkZUqO!g_jQ--c#!nz1se1 zXLhosjmH9((E7BXy0jv3bqE+%bfvd|aM&+748EjAoozE-ClvVLweOwZrg(SrF%6<~ z@51<$R}FI`0rFx7_duc`7r)6GgMNa%<7+;N?IiLJfzfQUhK%N~lUC`y!dnb3lQe_` zJlX~kadxMy*I|8izlyou$n1{2w@6?KB$@l_xIK`>ysq_`R-%xN@L1yR>K!=OAT2V8 z)#g33+94bGH8&SHy7&7#OHP z$rF>G*-Ma1(^)gv#vHtTJY7&UG-@VbXY4n-_96_Mu4S^@AgH;wV7=ffJ2yr9=+2V> zbB5{i#dEz{*si{vRF>pS1nl*gZAIm1G%^UTz;71}|V$Du+sVLrYvfcan%WqEVvip_m&SKVA=!yw4(6xe~{4oV}sS*a(tg zh|?IDSq59jXlF{Fs4{nc7#j&`k)A3$!@o*fymA>}PPuez^$`BnQ!m>TqE6^9|9Ii8 z@7O&s?u~RPDC3sx(+M&(8J3p}cU9bR3jFMOS7mNvP?Bjf8NR;v7Ik}Eg0b;%K(=k? z>cNU%s|XW)$Z(S(pi66xf^tJ`qRS<~?C@wxE&C4h;gO!6g?>f&-(TK^#aoKwmxw0c}0o^+&hn|*mjve7QeR8)nZHrxszvNm)0Q} zcaCQACXKD%i)e+80!F^;G$cFE2i#v;>uwbJOZqA>?04#h<^t)P0!YeedOMEp-LG z^_Kw+Q)*Nuski=UmG;MZzGM7`AP%onK9|sEqS&*h_(am>8BE)lEEd=r48;A?0}Tf(vUo&@`?Sa zRdcgSaycKi)@I>c-#>f8PrdEIZf;isRg@anKJV|~y7YX+>nPo9n{tw(7wMUXG@QU) z3FkL%n~U7i%IZ+4T9*EYyD4-Eh0;Sya&-;vrGaQolR*BX=u|q5XLpju-q+A;xND1) zcX(C+u!gwq4CgRJ@iq$p;DNjwG=jzi?x~`#3<=`I<6!J=bBeXMZHx|S4WgkvlycV1O zUAt4ephXMov9olKvG~g0l=@Te@jH!Esl<=dzV>%nf&15Q1LMDz)JIH#_O>olccmyk z#~g=i%DOB*X^rFoEI?>ar#w}ne&n8xXnCg!`<2b?{-6hn)E|!uCW{KX4{K_AbC?!j zD~s(yZgH54gzk9Cjzr>LzhMKe^apd~*j!0G4P=HezS`+ueh4RfI)Z%&SCbc?W;Lq3E%PD6uNRL>$(7tEZ*cwgQJS>j5`LWY zCqnX7ua0(Cb#D*Rx?weyS_=CRJ!CV>F5T@tI$e@d!-&N%%5GSoFr0bE{4uvyU&?-) zoup~vi~PKkF*8C!@Duv0FHR)<_iJU(j`r;b@6bGb|FbZY>XO@QcZO{l z!p3e?88Q@*4h@>;(fh?4a@@AOcq)8$VlC{A*$(U6Ik`4<2MH9Sylbd?!49g+>0Xf$ zt)3qhlx3WkyTH8O`+4U-4>ehT`YKb~amT%UU&yJU`y8x6krv<*_;@CW8pODhjy)b` zy9q`r4xa`#pth4Y^g>F@w<#qRDY-cg0`vh&Ytl}E#$z4*kc;bcE0O4CzJOg>rJuMkGD zb zrKN;$I8|T5Jmi;gz*x$Nx6SURwys<~|C+s5psXAfjz_o>pEBa~Psyn1S#iC4o-r!+ z?(tJL^NbWdV3QCNg^WBdrHmMf8yYdIA7gSJuX?erI-bi^zlHI{61GC|?a9d>DNiyI zHyQFdKE+ghR02k?JCLrMd=&dEyZ#c2!g_%>wigwi zhxXWCDI7qPe_2v$>1ZeWveflb=S_s^>5Uq>ipWblS7e~XZj?9creGs(;u5!kT|JEY z>)aYqQ?uN6n*nQw8fkX@FO-z+x}bLp-kv;K{GK|Fc5586$(Heht79a(W_Wr`N{BS$ z-C81xEfT`wKl#5@{MPPQywMl;W}i4Uz%0yZRn4~6Ewp~&{pe;*i&6z6>V*q#Zms)F(mZd;syTQ8nB}2$9#9+En)Kd#Gw~;f9MwJ z+3E@cONQBOHu7aIAF|Mf@osyKhs`j|2=CW7T^ErYcRb|lRukI|)A$ssU&_<>M$R^-dp~-3?_Y6D|cPEV>N%ql;2RyzL3nuTx8)=9el?k z>=T5%8O(yTJ(H!T{X`X3^QCB6dh-W^uts*&a+VQlxpw$wk3sZU{@|wow}!>uhyXY7 zC*F@JH+!L2-mXtc#mS@K!Zzb0^2ecmuY=R=!!#&-wRNw0arZkqyRR^B6YB*$tj#|% z9lUx&-U4ANcKU;lI@M?pup-OmLH>vm@0nUnN?jxkDw=8OZ9aC>x%&J#t@bG@N$Aps zlW10w{(v##$X5&7$ka=_T_vrr1XOZ_zNm{-k8I%TiS|Mdk*eB{#_fzu?|zHf?|#Ht zraeR(6{b6?aiQhXd*1?1%5OE=1DC1$qt64q{lqm%LVA7Q=ucdb^4I09TSCeHaap#K znr=23cYi&&lI&r+Uz5q`-2Rl*{8*%zn@sDFI_rxPauAOF5%Xhav$&M=l5M((msrK& ztUh>D%APFLsmF(VO?QV(Ih`cIpXY%XuWN+9dQRObXM9+S?DV1E?)04bNq|Q>ZqMu^ zgQqr-b1&u%szzC9hcvdemW77&_Me{(p8i`xmKj|Mdkkvnkm+z|Km+|H*Yv$pp`*^{ zjv~&_=J{?lCCgcGynmPN($}7G(<(@W{p`|rLVVx?)~)Jq=8zZb@Qf+br_fLld_whG zjH&rvvgF>T!hxDTxHYA_iqYDL?tODFmV=kEQSMxkp7v#9AX(Q%OQQ`qdj*}wA#I*8 zCu{wl=Svg#*?Xpe`q7P}*LFM8RLkUS*JMhw4P2hd^oqX?MykGc4@_pUEDhqMNXab< zUMM`GaUV|PVgId`%e+bpiF9&k$@or{EHghXLQF3%ZHyUl=;Q2y-}k_$k&qTg$$2p&B@s^+CktmYrLfVqmx6`2074 z+wobwEJM&|*vYjg0d4M>=jVQUCBQuiK;?FzL9X%pHOYE6Em8feWJLH+ z;VW384tV|PeZKowQ8X#|*qh-m;Zz{PJ(hsbftl7dl@UKOI2GRU*2n`hi!{-K`IGyx zmIbDn`Lwo$>j{CLB6KS;UtNs%8iw}g?$|KV@%L-4-kn)O*mFq3IQk?}Tn-{pi?@|( z-+Hd3y&k=tyHDOS>B6SH&Md7aks9y*JU`3$tw21V@I5m<-{Yws_3uh3NlxzZ<|Oag zx~~Pss#0g=PX4XXf_Do$Pl8+tYNPnTZ5|=_lzR?4d4|zhs+?7iS9X%@{|ht2BjS)k z_75h6Y9Hh4tDk-Zh+N2tH=$83fAgxGZ^pm(SN#aIFo+HJ*i(ze4Lvw6k?yZ7XJSat zUwWIrcH&&F*fuutmr+pE?4?ntIa-(VWK4xKd~%3;FF91p5x-4g8`>VElJ#9XE`s`e zC?W9Wp-9FhS;kJagWxX<52|X1Bpjy@=0eA@t3;HmB*m^~C8NL~kQKCoqzD<%dKkBp zpEbe-3zKTtsGXGG=k|KqXF81b-8YYS?%m?li-R2&^s~3m&(#zCjBR0A6jm_(_^CA7 zhdCa}^~Jo(UO032#-2S+B+-CTeM^ z)B>};ERhA6V=s^~dG+J>cM)xG7qsTPk}r!)#P~I-hx@j2WISUY z>^eqf1tlks?Ek45Jo}bpofehDC8?Pr6QCbYW~7;b17$k*zoT0=76%V2vg_>8^G6PY%4*V&|xu6}U}Uo|j{(Yw7>P>gsoy<%rPAw%(M zt8~O3Z;f5Qp_To6lTf{qD#>=?KUlN!jiR07-0(AX!9z3A-(9qB51kIKX*s*wbs>B9 zLJyscb!J~AtmBCY1#G!wC9F{f?5;^1qK$l{>7Zl{>h-8oy1mXURK&#ocl(T4Hbiy;$gw6`9f!<R5TEW+rG$L8Sn7F4dJLEZl_2O*&9yUpMp^Zg2 zdL8bPA0)l#eCs^p=2z4go^-dL??ND^{yo3aXc@0ZUODafw=Eqk#~nzwUY})s^EGm_ zpA>UAyZOVY>e5RQPxkCGoA&b@YjYS$$fKq!tGz`y zqUeyWBI(@dki$JRzkQXm5%C7}OsbYVhk>cP+->idW0DY$`3|)S8@?B$J2R1f7%XBr zrTfEihaZ3>JJQ)ZQVFhY-z-!Yn?A4P=6$x2Vcx{cCGGD<#GewHDvT8Z`oHe1M~2N5 zA`cZ{o+~M!&<8CaLROW$3)`Y)Ed&2-%YO92yHjWKyq3wr%g<0%XPE6EUwrO(5)*je z-$S|jXZIr>8Hy}FRi$(&7A6t4E$44!|Hr_oUNfSY^B~01%MwM|wYHN*9dz=%yqquy z1SNkB+D3~uS=`6cNAbRI);5twQMjyYxAiEt^w2|bHF%PW#}!8t2aR&E3f{K4up8d3 zSdtrG)aB2e6PxX=5?6QdAHMBR|Nx*Gvk)7Xwug1J@ zz*wujBCy=rz}V>0xV7&xQrKtFM=c&j6&{}s#AZF(xnFwa{eo5eQV%T>_~%x{;Xu?< zZ*4;ME&iUf`KLoaN5|5MxzGlIIxj8fm0;K@&DlQ>m&^6_B|c>TP$-ycPtRE@)r$gh z636agsuvYNwCI3Uw5cG%C$EzXm#qV;^uXb$hc>iN+r-(_LOTQymu;8z#(Refmb7Ro zJ5P?>%71Zcc67}DuXok!o2oaVeT>J7X)^q8zx2`>Gx~G@G1qhLks!#?YT_^@ySy(i zc|INd%&4502`w7`{R;$|4Ge9txb1ANe?ha@GBM{@e+e)Ci=HdZEsu8SP%x!klqziy z_>H=UYiB^W{^jtGe6}gU_e)!oZIh4p5NBc?G zSr+x`dyb-AWJZ8&FYEL{MhL7XjaQ2U@@V_HuM3mxFligZEbE<5RMjk2VDEuDn&t)? z*M~hg9+7J4p>wV`N&LNZyFKBmy!}2BwAM0vxF~IJ3dHZ^rtEa~0Rv$VrbWm0_2$>$ z+HZX4=YB3p7iJSIkroFx$GzxC?gX4KK!q5;X7yr9K4hIY9_B@Dy=w?J(H9~-metq% ze*8x<7CNQMxE=2Ed93i9S9RpR0SgQYac&}fKgG6P)>`br6acj7<_NY?0|4M>j@Wyq zqvr>E15bEdCY$EtJF{=^x-bSCte7e-vlW+fyOC`s9?O&Ig#oC?kxsG1Yp0yT)esh_ z(V$fG%L~P5kH)4~_QcCbjxK(d0gkb)sk3$e2$FW|=*!2RKecX`6m|QA$lPSc&q%+0 z5o_Lft3|W1`Gb~7d41G$!^LFi?u{llk=|INEFXMc+t^rSJn5wfgQhAY&)SydH_qY< z1MOcoHYoysic7Ky&Tv4ww|HZ&*^HWdoi$R=oVEcooInXs8_`R`tpT@`Jas$dAZOC> z^<0i(J4&3+=RO#w>q^Io*GMI8esDaaGT(89iF$|;C;UR*4d=&_uUvvZkeT4fx}Nay zQYHrt|5%fi$T*Ts(Eld!@#fJR*0y*?|38NEMQv;8tHn7C{&%j~#Kgae#8E$!73`#Y z@#f~<8vF4Sr|0j2$glo)? zzvWY1k*_{<08FbqT)K?O$|JYg z>~`Jwm6nhoM_oP^(=>V3tYa$af_+?&fSafNc}CH(#hk+pDOCN|T*le`;(nvda{xB6wWL0(4Mey;f`{*K$=;B>v6)hXcYgEs$5rouF2|J2vDMw! zJ&)d!e5M5OpCC7>aY$qjdti1MD4ydJ2f$e`st>_g9{!ywC$IdQcaUm|8T<0oLTOURM#0Nr|>81r^$SZb>DtAoMJup-2Xm}R8O4m$VH91sDj%%OrSE?uG*b@<11>rJ0}q)Hw4tW z=E-2Kyk~(EuZH%+#`^etlNA@Ua?<-cS}o-Ho!|DQs)3`mkd;*7?~AHmGku+cKa58V z#bp$5n@y3AD@bfxDzMvKJ|BU_R|ev~w%@x5{}GA3@tMqH5L#_SpfNF(BpVazlpm7` z1&Af*JPK5q#?YTCr&LBN0Ig6LBH4Tr6=??vSMsuJo18yYyI1;P1r0sGJGowyAg#+HpA`rTTOH567ir;s7asP|>F& zn({qxC~dkYC|!<=6urLm?XWV*Ft1=;(aqJn!y_W|vqfxun^Wr8+|_Hlg`L9ll_E@?^tOzChS4J5y;M4R zRVnbOL2Ep}U(8R~G>N_0>-@{-zDv?QQOQTF`a`AoxHyFG+#ezb`W;XJ4e!}MpRkt^Jb;_m8OiVe*exgZ6zZ)b-dtfih($Bz3c;%zjgVYKE1KTE4a zz8-^vRm|h7UxKtbsFvZ=H(wVzGl!zgM1Z!1&&`CKZJ(hBjG=xJ>FXbypN+WEI`RT? z>QiWfF{!QKy^(L1itd_6?cDGPaPaEs&%+0D0Ou@VHU?Yo=BcEU7f%MnqV~5Chtjmw zixO(AAX3$w1fMk$?n}d_TgaVAv*u*44;MP&D(R)c!{!Z!dbd}am+Lb&62<|-msIEt zSwSgY1@5z_T4ARY38GWKa~@XwaZ||r+MylkYA&bF`eL;(s=D=UyEc8O@WKF(&dN`$ zuITGa7Tf2gPkwI^1hQLyFxh6Df#TXuX=c{~H?3`X8v)%uNqRSVuY7>Wb7e$>YMh-gb*@6QUnkE5o(d;~K93Lm{Z%0Leom7N zI{9(Iui{wX>?az;q)^C6Tc+*gua*}p881(iCO+Nl_fVGoY3U#4Ve+}1xun&X!n*10 zyYjsPilB~UtGc(`4rWgszBSS&@vAYQcqVoq_|CCfG1eAedlz+_$G}=HY_w{0ie5`n z%ht5hrAM+Nc_wz;azO!6M$sJ-i$4$)T>l_ilVq+8av??EK-dleRrle9VQIS18C41dy^4cFzPhUYBsEpv03nb4byXu`jOOO;%)pmM-HjF6zxQ`5>-oMDv**^g z9rq0?O${0ai^Uhna?o2)+0G1JeQ*L|n~Z`5;tO%6S)x{T6Hk|-t1pMFEpGukifGIg zLuc=My-!xeAK#ojmU=l7_`+CQ6h=?3o2TJvh3L|b{s4Rybt13}e7*SzrkrqQMWQO~ z;_Tz9QlGv1dAo%N>#^b%;@n)ZRdUcYdCrZLcjKJB~Mw2s9c*X};bbVJs8OP@amZqzWoXQdmxSehJpoMrWE z3%Ken4d`BZPrh=KP7#?a$CR=H{$(tIJ+Zfb+(-`xH@K+8_6T@`iWmBeX20>12h-kcQ>vn*zx))aQaA2e4n{&7`OKnl; z=VMWdDpXzwY<}XTW=vr9BwQ<&&AH+32>YJN)*cn$nu2Nex{vtMMrQT!{h0f zV+Qln5iJ;%_TtJuTX~#?*Syf;BAjLO_^Q=Baa8K;x%;(>gMIt%b=@l%3)9?20dRc$ z=8oX{;-;lJ3V^QTK1RfR+lkRle&=vGO54n!d6^Sxk#QO`RlRAEHV?ngj0DeZ8P&c% z+g>hpyYLjnc=@ZAO*m6yzr5TGGFf~6;iZ;ZFM%<+pTtC}bE(9Tm#n{q=K(rc=z+^ z>0JQ{8HLxcLc}bI*F+mFgNOY(!dC$HB63@_9O23`#NkG(;W~SU<(zHjlpQivOGM z?)aMm|C_Eh*BYVt`hx0cZ0(eqNUw`M*+{YU&YN4V@16eiMXL#B;(ScyDO_sOhepRg z+GI0uF^Gl4x4&nQVKQvG&`^|DENhxtS0NVjEA6&g8oOfScYfm<@`38kYhgOoL-!hQ z=v|V{rvP~h4o+&ngvJ&2Go6O$p>OxAm!BCQe=}3PX_neLVHsUGeGhcswY~h<@13Nu zoKAf_{Rc{#Mphcg#|VUE1aMg*w&-kNVExfaR{tX*y-4EaU9zMCOKJFXU=0z`z52f+ z(MON}P3D7)TK<1!^8dT@-z0u^Y{HTRxw4)rgW3~rj@W|lj}n!2Rb9Sk`dpllsSX)e zGB5dxfM*ZF3+_JrN%S3!@}LW|`cLsy>i`k(OYnhsRswS?r$Jmm+QtIvbfd?$v(mB? z{~Nj3VTUu4{7v4232uXIUY(}mn_C;=W?eZ!6)Hye1LT6R^K-Lr@FxT(5E`)$U2|RQ zz+umKMnLGFSG4t&=iEGk<2!V)1TCCd#UiA7(G`{Coo#AwVmVuF1$i@`jTe+cf$&%q zRP0ilz~7uq{#{b|0|2IvAAFP!#XHd=9LJvl8mSj=>@Z#(ZCeVTUsvvJLxi>!K=tGa z9`!Ux_b-50yFgc=OYgwVAg&{&2UK`~DC*Skiwg8p#vq2Xd_;91|hSvOv_An`6 zubv4HO%yvc(ZKvrPSq0mqs#BwIB~$c<;hayWz3GHbFV!)LDy>&?@`BUKK3rlnYGx` z4#RD1yvj|9cHT9I`thaJlsPZ5`G*M&9c29XT>2`}4Xh=pR6&ag7p{VEO;R}gM`eQICta0bKy1I%M41cC;E6W*3c!W-#BUzqEt-J7dJgt2+zYV9FNzG45S zz)>l8`i83;NHG=LnFIi?$;l63-sN7 zhF;yjgNR%rZRu;F^TzilcR~)gwX=rP5xV#+D5?kVePpT*Fnt9q1n}d0u8w!=XPhTz z6L3Hol|kzr^=~PiLcoZ&Vy~Su-(3y=)gl%a1ANa5@_))(Yty4ltc+Zzotf;_7kcYX z)&}5Nt!76wSvw7=2is$3XE%L-U7sV}qZs%GTkb;eD_9&}I9l2PM$dCAl>u4#wWVx? zlohD=i@?D7xCzF2knBLQYUkVjlO;Qt$5G>!;J_!=`GhmI`vac1|Rs0_`L=nrd>de8ZSimBK8TecSE2;f|2(rqOe$-nUVYWDW=-`#W>T5xAA(? zd>XBMmx7L?s18=+`rQ( z2_P_+z8zhz6kTaGJ2q|K@(WyDxIxzgyX=jX$ew|$T<6#kZDTq|hO0FKwgLZ|mlxzP zI?HuOk&Z4{m|R`r*7c1X#--(c+H3!9hSH(y8nqmU9K4$U5dhusBR)a<1nKXK zj0tFdK0ojT6KdP+FM$7rZN+6{r)g*Uo=#Ry9v6TR_nTLQu#e_0w!6<%?4X3>0N$zi zn~jMeD2o%uM}`W07euOfCY@6_3IC6(;&buZ$(jyNeVb{R7^m1a6FcHNaC<_5`AHu1lQ z7W2=GM`O7H#u=;EDl_$_j*C~&t@4$B>UY*IbJVxtlB|0t*ty)!p{68|9Hmr_OSi~A z4eXw!DZ!Elbm;6^W$k>_qbRrSRzT3h*TrfiT~iI*m8k*19?H1@i7U%<~@bk9Z6v~MKE^6pUR5d{=h&88ZWO^arg4ik7p0dvc zCdwdLS^J9?Y%~A~YBZC6v;^?RyTqj(w_d>##cW623)d!bofifl^n$!m#rS-SW~2eR zwzxLeexNijN)NKHg228E1k8UtX00PkARBl91MYEYNTVQ#FvPV_3!l1>GyK;Y=;0*^ z&>)*Qt5Vnx*!js^`0~)2^CQ)0v8yBJu6G1e!pa+bDDHdExQD>j!^N9^S(AkC&LJ-s z8nl;>;WU8?EQE3!EchIGEeN|_Ao+ps{ve898tNSM!>?S!4gRC@|7{ch%QC)b6X<>W zI4y|s7Au}-Zd^!S#cVUDb9-5R_;i(O&0YN+;YYoPFle)yYpw7c))M#T@Tl=|i$ro< z45!>?;yd}x)HaH7oidCLj^RW8`l1^mF8kcaHoR)2M zSqK(4tJx+-<#^XN$Ch7sAQO%jMde7QT`&XGE#j0~3W6df&mq-1@ahWV3aE0kMCu{v z0i_mTCrDaK_Ki#$d}$4z$A9EWbk@?F=%@8+m2qI-t`)C{k0UkPz-Zw%-wmrDqKoV%H2*~MJD7303jY{58+taS(v3VYgk62SU-w|NsK zEa~$_ESYIma6*77$DiN(SPH|78zAIg)My5*8l|z|;xTWGn=4I_<--T{Ki@xVjJbb2 zRp2BUAKLa1mU0YkNN1X@gs^Kv4E%Zbx(x^b=@T3^$|DZ8Y?Beh;(fNR)tDLnIvXa= zBVY_GW#sjin)b7mMqEpb0E>e52`ho2jWxVI39F%6cu7$H`brltB|xDc%R{=tl%uH)$5I{>jAk6uJcqTdbU-AlaOC?p;2}&MY;Xj zyhd!Y1F7}xLH}2s#jA)`M8c}{^obArTWR%|0m-y7YX2b*f1}Q1jA}*J#nFXfxRtL6 zfhhMYnr*%FSw0aF1@wO$*u>!fJqMPFn>>^`g4&IZqBl~4ie&RO)1bxvfgH5ePE8&H z!N03?aIkB&r+RpIA_Sb4*8Tnk9r>M*e>dv@Ec)_r2L{Oj1#U_qf5SFC3d@LWuaVsZ zoqbdkUL=r!$L&lPYyS%^9EdvKS%V0405Mn6@G5cJTL_Gb@(iX9oC4Oq?7Sg1iLbb_ zywpK^rxYbYkJnJy=KAMl+qcXa+ARu4D(sHi0^~kBz)JlOk63pc*SwnRTmx7#DE)5# z##j2;UdCZ^03bXvV2^(acYU^nZ1)XoDG?-lE!EDlFY+1>etsU&)=X<#YN1LCz4SZC zwPzR9R$)f?V`Cw|2?J~Y_}oD!_oOf$nzobY?3&3C5#tx*pK}I;;?bitWmu5m$2r12 zD7!6q6o24aqG#xH#N=-XoD|p$5uA`K2?~}mboXwNmm7WpK++gw<51rrBWv^oxDahq zAAU~;&3<{ZU5HP?0hu?u8s=s3%BF08hZq!AhR|7zR=CL1N*6e76yQBhXtuBg+04M& zu^O(tre=NoSH;YZt?=#pHdjWVaQGOS3%G)dKM*@{TfuR3u-5|oC&W_s6{dfU+0zcf zuLc0;8rU8BG4YBgTOvo=mO8+R9Ad9a_<<|^8dC;K`o1Yz7FfO`Fc}C#C%jrFJ~yzt33>%={a% zrl>lVS37gE)E33O?p|lufcirX!<|_yo)l(K2;e3d%9T$gU4)Huqgigle7}bVX5BR2 zFPjSPr)jlgu?HcxvdsGY?3XR9cMZ_f=dK&mJhBh+$+~L)Ts*lL#`hlUKTfHgHZHtb z4{-l@Zigofvt&?XjIz=^=7!r1nHF47GnYI$h6}7G?@;VJk7Nm>%7e=|(C?d&(nL@i zuW24b>AEr^sL$`VYN?q;i4X;^)OW_wgRk^Simy6p4qVq6l6@)z z^*+*8V3xb5bCN;4Idl8mwT##{vc7t;IsP!<`>jsx zvBZprvCJokesN(j-mTz6-hq91=Mz8ezZi zSxMu~NlGgF8(Xd_?W|QR(Ia3O{fT{hHZm&UBn>h8sz?O9k5B_$NQ4c1sy+8PAGR5t z@`Cz|3?iCB44BlA+eR?A)|s1JRqaOt7+`A2`5R|D}0Yf*MbN0$2_n9~Ckx_E@vZvqzwnZkqnHfzsi zE3<3A8Klo%GW&_hg4q}eDW(W9%VSLQB0{?95j00sZg|z(o$^ww&)2TR$)LzHHXXOlz z;(t&FS%Gbcs`44H)UqQcYPRdi57vmUv|_RP!ZtqVAJLe z?YAh6xkameomLCw z>Q0jp^Q)^?_By0*++lL*{*8oPhqYnP-peBi=S}BtJPKc81#C`u~bD?W)C~igT zvsq)}dZoUf$A6M*WP`lw%EueGu#jN!Kmz)#PvA?tg>;LX8}eBP3RS&DGcUTwzTX@n9euNzI2~Xn2d;dx{HIvXwiW0E8TMnyT#FIzuu0 zlw{?c47A)}UP5dI@Nb5=BHEdj^_Xp-DV8H(_&79V7=JCiGs7%xum3#9hi7fv2OZv+ zo+Nc==1xoTzJYzj&;oyE5^EY{IZ|n}KUdLMa8|>coi%rc zXdd-3Um%G8_aa}n<{r|SLzW#`7LL_oyuNqv+7@e=mp+7#&wYgxyS}oBhgF?O%c|(+ z)dI4J_PviPs~^uv%OD>k{Ju7_xjv5P&^i%fgw;jJO05;XJu%#(AqIQpf}n8kDV_b2&{H)aLsJE!MW-7;i&xh=XCVQ ziF@{YThP&g?Z;{YP5hqNy%!`UPX38G9YGn|7KTVb71*4SLpi{-x;JD; z>Qw{&0;nX_I5=)u>cYeuFp2jf^vE7nUUVKTyXV$sBHhN4I!0^F<>Uw>Hj_X)-u7!O zWQQS8qb>AubN%wg6`@rKi~q+(JqdNfHAdNfX+%_@;_ReCE1)fB4N=+P_eM}8pU8;z z7NE2}f!I8)8p)rn;;3`vvT8|Pd#?lmoc2u&5Dad6>Z?Gbv?MorPf1jiUl zi25WX`J!AxL6BsnJNpxAPYE)c%bLa+EqUMr0I5q)`AVJpGM={FmPtJdly9J1vaaog zv{%rC7o!Z(>wcU4G$gIoe~p;@QfizYi_e&Z0tr*fxm!ig3BeqbPb(Y0FHC}PidUGn z6*C0dULl(!z~!aqx;U=J`Td@eja5=Z{F?3Xm5Dx6-r={GD;QR|70BjixvenCY9fx; z<;?gBvJ1LaxJ+w_zmcQw_N_t>3xX1Ew&E$)lJ{jYd*Iiga?|G!SuE%yA@9Tv1_qcwL&rr*YtvoC`yBAJpD{)ko#Q?qcRa7)O-h|U5Y(FK zKs!`A1Q}XQc<%)Gx7GajCihP~af;k{5HPubK_qksQ4`9p+G_`<*6bg=ch$J^`zGh* z`m1Nn-pnoXNc|!ZNVp3pnxe#rgNO9Iy(Gs}kjH1gjw(B?|8%flE$quR@dtzTSKbm+BQW~w=v7Snb(lf=_AfYG zC;bxV&UuAwKQV)W$~j?)o>}_FO%NYM)TqC}>x)9!l4Ya7>7gJuSoXi<@P|lBc9l^82&*|R(KZ^SU6P;@vGBXv;=Bbp4dWB$-4>dOYv9hxKmG! z^(;NH9Jlw1gyT^MrjNKfkyQ4P{pG5^LBOmK8Dale^|%smj?74cMdB{ao*o;GjINsR zT$BytvD(rd!kqFQM_ckio+^yvSgDp$>~C1W&Wcy?F#bTC*jXr=W-ndGeC@4KHmf0w zQ5d6F5x3)S4k`4{net%G#w83bK}9C|%)Mcc6Hb0FulV{*fe|ZGi)nI;eo=o{J@1S% zg2UnGq0is*E=0Hd{wKu!DfYh<;$}oTAHJZvZT|nt(L?~muB~O9R2Qmkt}{r;J-=^O zk0?H^U*j!I)_ueM&jklXB9ZvRL&rCvYaul(X&RV^`<8kJIV&#WI~Nxo1T-4$5j5ge z%wjOdZ_okq^OKza>+MvQBM2A_M(~YSnLi+(V2^>U6Vm16Wl#E%JWFb0{YYHWu4$94A~hYVH~kI`+eLABJ-Ia$Ie7 zb$FDCXb%*pi={!yW#9k<-w_6>&qkz6{~nh4S&oetJafLP2Wx=@_qNpH>KBk7FLdTY zu>JvqXEM_^qx)j}Ht8-X>AlLuVM1YzPRGquXG}lHuH0B>W zMF2XpcV4KhVbvXmN zg3$N``GhKf-fOgexXz$x;euhIkwE<_YZ8}0P_dO$0pbCD1bWaF{=4^PRy%#%wFqJ8 z9d(dHJ31>Z;KsGTelg-zqqYU)e7I^-jv84D@W}Ry9}cW&I0db#aOb=&k`WY|6ABVe zodiR}a&!g%(1~Bi6ERMAPwsBH0tNzcMA7FK&0om6gNUr#l5Rl{96K786VerBrAzwJ> zLSQh+bdDRSvNqoGA%60m(y~S+42oO8bZ312lX{S1H51ZYfDwnCPm0q)kT7Mx%NL9C zYtb5v)PM_cN;9%v{gZvWyle-e^S>4HUs`FdDgEGo9TKFsS;N!f92TVGvWSR?_5Q~Q z6^8yV8KJoi`;hmK!gNU79+0?E(YjInb5q?GOx9TRgb+mv3s%h3#vE!ojq4?HsQn*> zb<&Lq)&bXsNsiR}AUj*Mk*?-Y52gW+jG_U^5gm>XIn(a-c%(+gV&DZis3Y7HUSpjC zthMqkAH&GjgJ#7$@v$eC4Tk}Sl7~4v{@FlG|3YVr#WZfjqXTY9fWrKO76H&B0?>BJ z{{#wOYQUjKk+4o&XC;~iiY!ISSIqigvXo|Xn4ymU5e<#}=cg6_cW^BaxQ8lh(p}{F zNJRAL$^T4m-CvteMErlpzRFTMDm!_+b!?U9yhhrUA`q}+ARE%KDg1gE=tiS6U1gA z1~;J+c_@(H4(t`{L8OJBV&x%c#>Jn_Kpg|nN=K7ahVkHTIpJ)zo1{c9EHi2t@%0=( z^j8n9=$3f#sZ44kd_}AirROcmeCsu$>p->$>1NIP^N-*Y@1;NuiLuAZBRU%@BYSM# zNT|IkuiQ{mCnr;g1)TX)+m6Dkec{F`-2##%ULNK!&6~n)(*>N_29BQD9@dC{NBo_4 zeouPm;?(QxrQ}?2VXv}PL|dxf zD{ek5jB@{MAC*#zuD2};U#>&(Yt<2!r1Aj=m_y(@w=vpkW4?%y%lzV79zQ5|InG&j z$*~jQ7gV^ph43Ha_*}JNRS*y1D zGC$WnyWC@N^OumS{sU*|zEyHd&cI0ElM%1TK;8NkOu#5Ek#Q(~Jyd94BuPsA?Q>!^|9(}jH~lqE1_dF*1s8jPa{>Zjx;V=M znwL>+tw@6K*IgEMeU5;pM-CZWUuQ*nv6TKXv2Edzu2lv?{ zR`Ua8HAn&Y7ip8$iX@ie?6P;QxW5CyL&Q2UBo~}@3?D7eUY4P0 z9R89gR5GiPx+p7g=drkJ=DU)UdsCHjO2yC$Rk6Fu_3(UdM2u zzVX@@Pi~ygd){c*!=G^-#P-}tFRNa$sd=3nN@&OT|La+HH1N%il6P|kTDJg=ZoeQI z!GCD3ycu6E0DMHl)V2&XVEUeYd(;OCPgA&p$Zl4A?hUMp<@^^oL0&~w#RJ(v{Nj<` zD|GHdiUip+(hE`4Mq4Nk@yfFhk&Hkb_!`#a%HPzm2C@?D?UM<(H=hPJl;)s7C-ovK zK;>@D}q9B z)GWlo%#EY*O&&b^hnNcyg!p3-rd0wcb9B8nhxJLf+kx9H1|>f6;KG_a_tXHmL9Bps zDlh3Octid!4IE8!4i-zFx?O3+$x%exC{8OClh8tI#G*Q_H;3e{I61$f^2Iy-ZofiiCRj53_0 znt!DOLPV`<2>)|FA;G#UsUswXXzF%B_fwSQI(B?^(9WWm-I*?RQOa**)rRC5HIh=y z_qWS`=h<@qew`gP97$OvT{X=&$dMdq|8V(RES*s~R56ws^Aau z`YmRZ5zFG3k6{0v$xS<}wrh)?2(J?F>~YoA+vby;C^h;aJ#J<)SYURbJsN!sC&Lwn zs;!5UB;p1M-p`U}$FJC`>w8Wh8^SN$Rj#n;K66mWoNi`sp;wo^0Q$u1gJ-RStp5}j zAHD}rqwLnghkm?0y$=Hv{O(26hwuB2-b}{P9!8j#YS8g;>UYN0eyq~QH&D!g`v-~i zCGLY5hV0Qs3I8*ZypAuCJgobQBwo)eH1%Xuvs`LRv%X*Kdk;o#nM24ypd!Ln2raBP z8BtwL*gaK@G@TG-!FiC9wgiuQRL_!0hV&IMj|@+XO%wSiZY%Wg(86kAbQ;(0zGnpC zVMP_wg>5d`Ux>Sd_Y|m4Lh#!5lohehtOsk>%nW9;7W1U4sy+W+G49iE&O{_tyrM#p z@BEo413S&MYLyGkod^ct9Lw@dkL-MZM(rb(TOdXK=G7~B!ZU{KMv&X@!p>CViC9@-Zsz5Umg*|!ArqgS zgsCeQXr`C>N1u9w+d0SdnE9R%I$5j!6qSC)B%gk!Y|;_ot<%@rP83NR7SP(Fv{QSF z)zQJ?FGSL0yIs~bY;Sz+4KP>ctS3rUWyO|1`cO3)--s;=_6*kBC@KA3_N83r?23l( z`G6P6jT(qJo%n;LHv6dMV06OfLg52PfM(*8F7?TuG%6{3svFfm-r_>fH7BbLvzvz6 zji=%B3oS+WQ%{U2-fSNBJT-atTuJ!0#Y_0`l>0^kr*uPh6$2KJUxFZ5p+hu+GtyW2 z2`K4+k5!yL`9Mf!&uY!n*m2Hc%ll1iQr?5X6?okg@C+CW#qO^aJjHeiIF7|_r`xvV zv9aBZw*FI%pse+s=n@%Zfn@74wxpgjv>hy3j}FUDeZVa~4#oqB*zMeBP2nddwWNgj0S` zLP{76*Paie@wy5TQrz)Anh%5Jo1RvHR7fnt)_S|A(S{CLq6KT7SBIKc(+-f$QwqI> z6were#UwP-Hk%CV&>}>O2;$)PD7ZC@YfCw9Tn{99c6q5;%-1-_g^_vbICz`f{+E1^ zwBziO-(BL;U@t||-;$Ihp|>MLg^n2=2CHwh3-Z(}E^!i4PKX*lSQiSjO|wU10|CR2 zt$bl>Tau0OUbg+rCu~`fNBTztTtrkvwMI8tLhM1L*TFPDdG~wRE|W6$YZr~&mHC%e zKd@Iao-D1iKPnWdAy|CR+)1{ki1%$hFomRlHi<6i;^@8Js6Zf!US?txUzYO>c1$Cz zTUT57x88vWG%XxLbT3ToJxpdG4_;Pfxi?$4^53_A7N)(*A8<%@3jPa_h@^`qli{%L zn_G(DS?mJ2wJ)tfbpiltU+DcE)Hh^QO;46=wg3hc$?j3pP`!J_$5+Et>^}ReIA0Kq zew6K>_zEl2<9d_t0z9Ps$2LR54|s=ykN8iVYAx)5JYLL2<~eCX&Ty0|e>wij%)PS6 zz`orge{zScBe!i1VOYW0zFad`bny3h>SflR@U$Q9+bS=b6-%_}D4k_eKTRij_FdDC z*}xRZ+iGdt=uLLRx4wceZt2MG-GwIXJvB+&Bn{LHGiSw=h*{o>rv>(bZT>8bavB** zEm;zTR_)da|w|*Gg&Y`I03s1}J^qZBCQGd#Tul!L`WuECe4*$5+HSR$3 z@mX?d;(n>y4LcoGDPDrlhj^%Ql zwy8UtIA>J=$$VhBt7r_f05qAOatSVu?fb_o{jGqdh&FZ7{kt~qWO?Y%9De(KjyH=d z5z5}D5(*@MGhpy97uq)Y1E85fAS|w1-ksP64G=yduZYP4gP~<6N@KCM{Fa z6~RTnZW3ld5*YO+^yS?7!p0B$xq2Ylx)XXUW^GZHIbv*u^!oT&$LrTiX5bFi^i=5cEO0^+Txr>b z{?-?sjiWNaLj5CezC?Hv{t5G{K3Sq)S~_^A6IOu7WZNbNwCb`=F;wf_o*wPA0Fv$Z zjh7WtZ7XSl63GyqAGaLw7_E_Gx$OkYbOOHA>t*1y@Lush*M`}FOe)>S%KS^ zsDc5i4<>&QX$f)`i-q`-jvrH9CV=lc;cj@I8pX5HNDoE|+YKkq7m^g!{?6Ns3^23* zw<|@OZEndIL&Kokn0yv`S)KM<5k7;K9asGIQYQa$-yI`)bK9M z7+~LSr+tF#0C5cqmw0FR5ujt8R;xxVz_&ZL~crZ)pnh z{K_@T#@RPkUUe}&R`*(GjoQ|#JU~fxM|qb8QClP|3#GPkM|bjz;0{Mc!R?ltq58UX z#*dL-OFB|_bE_^#?RB^l>WPE059kx;Ik&t6Ti1^=!xP05M#8r8IOLYEqw8eU_(>PB zhDX67*UGBX83#t&CyT#$N=POF14Zk>h71WLrMDPV#d4L z01Ua`N|w&$i0;d0he#VfElmBLcCdX1;9|65{KMWhCx9=;>=Z>7x@%EHNh2aZhkw2D ziIckEjYT0tsWGGw)tcV0-+}ODV+=b^6wi9Asd2&;(9xC)quI&d+&t7L)j5zMTi6|u`B*lb@x)5LM?Jt=a>HZWnavbWS!H2Ascm%4wN z6-QRGmiq*)yu7sAv(9?Ms^$W|6A1i=1tt~5Jz#YM^7>!_AGGUdVk>eLuql&5N;CiH zOLN3a-LlELd%}4`V&vVncy^-1+J@DK;7-}w-y2^GS;7dBzRyuncx9*pqgBE zf$9!jh*Fcxs6hu(ruswXWYUlH7{=7WJ{spG zh$N^O!0LT5;UZe1WzK}CADY0C{FI*Pr3shIb@WlZ1iPl!S-`<~_ARwhklvYyR<6su1n<2q;xuVav{SjjS%lZ7 zX2-<89uzXKd|XsVUiUeM1f7QpF4h;NZK2b>wCCLLMxt2Pe3tGSg_jmQ*Uy@Nci?}d zX8JH)SY~B>qrmt5BMtNy<_N;Y8SJeD zTf0hn%77F%ItVA1sqyL;D7(* zN-Ui1chPfXgCE+6p$6{L+YV{KWgH)PZGP_aaqx6@)nFSZV{De>kI{)%8{m$vWBS&w z6{eP z^zpOj!lOVR8}YAeNizOwF8;9%byH}>L-g=zl;Hq4nkX-VoTYYnkG`x|6T#i?d{agnXC+Q`_A`f1<_&h^J#gXcXe+Fdo=9Xy_pxt zd<$K4p4rF0)BE%$XMZN+ytMs4U_39MCk2iiQv@mq{-^%%ObJ>|nH}uSVZ*;74GoPE-u z3%fl79JZg~>#(=bz*%fD-`!nOz*O;ThPKisk^!d(;bPqS!bs|2T~N>9kpj*aG*@H3 z;labrqS751a~K{S_Dk#SiwUwhqb&I5^(TBCkf%N#QokA;{rz%LY&30!9P+YTV?Vo2 zYKOl6n97IT$ocuP3xOtep-jHxv|9iE_2*Z$m2wPPclvYL8Q)1MZ$eEsCUlcP5e@DJ z6eO%ym85QKD?0#qW8#Xsj-Tbo+fv7Cb`%%ucP9zQMc;#;v)F1=W|P=1+ykgIW!Z+u z8s@QVO!r8q5rjsNIpKD8LD^*{tP#-;suB+d*^0kMc*JEynXuhe1GOd6I$2{|b?&>c z$<%YYL|U{hkJPVaAl~fEu|gp3(e9K((15rUAJu$b6-!Ylnl4 z4A!Q-+b^yusOw^>4)k~lF|J_JE~A<%_W*A4Oq>3YBq5KvT3o8!-|9=>oB4wwRaTK# z#<{R3t0qm|F!v9cU&Vvfky}|NgOpw2*mY-*g+5 z_5CyDKTn-qcC~)6c68Pj7*mz2@TzUHC?#IqeF resourceMap = new HashMap(); + private static HashMap aliasMap = new HashMap(); static { - putResource("window.icon.small", "window.icon.small.png"); - putResource("window.icon.big", "window.icon.big.png"); + aliasMap.put("tab.loading", "tab.loading.gif"); + aliasMap.put("tab.history", "action.find.png"); - putResource("panel.analyze", "panel.analyze.png"); - putResource("panel.rename", "panel.rename.png"); - putResource("panel.create", "panel.create.png"); - putResource("panel.list", "panel.list.png"); - putResource("panel.search", "panel.search.png"); - - putResource("tree.open", "tree.open.png"); - putResource("tree.closed", "tree.closed.png"); - putResource("tree.leaf", "tree.leaf.png"); - - putResource("action.rename", "action.rename.png"); - putResource("action.down", "action.down.png"); - putResource("action.up", "action.up.png"); - putResource("action.save", "action.save.png"); - putResource("action.load", "action.load.png"); - putResource("action.clear", "action.clear.png"); - putResource("action.find", "action.find.png"); - - putResource("action.match.file2name", "action.match.file2name.png"); - putResource("action.match.name2file", "action.match.name2file.png"); - - putResource("message.info", "message.info.png"); - putResource("message.warning", "message.warning.png"); - - putResource("search.anidb", "search.anidb.png"); - putResource("search.tvdotcom", "search.tvdotcom.png"); - putResource("search.tvrage", "search.tvrage.png"); - - putResource("tab.close", "tab.close.png"); - putResource("tab.close.hover", "tab.close.hover.png"); - putResource("tab.loading", "tab.loading.gif"); - putResource("tab.history", "action.find.png"); - - putResource("loading", "loading.gif"); - - putResource("tree.expand", "tree.expand.png"); - putResource("tree.collapse", "tree.collapse.png"); - - putResource("panel.sfv", "panel.sfv.png"); - putResource("status.error", "status.error.png"); - putResource("status.ok", "status.ok.png"); - putResource("status.unknown", "status.unknown.png"); - putResource("status.warning", "status.warning.png"); - - putResource("decoration.header", "decoration.header.png"); + aliasMap.put("loading", "loading.gif"); } - private static void putResource(String name, String file) { - resourceMap.put(name, ResourceManager.class.getResource(file)); - } - - public static Image getImage(String name) { - if (!resourceMap.containsKey(name)) - return null; - try { - return ImageIO.read(resourceMap.get(name)); + return ImageIO.read(getResource(name)); } catch (IOException e) { return null; } @@ -85,7 +33,18 @@ public class ResourceManager { public static ImageIcon getIcon(String name) { - return new ImageIcon(resourceMap.get(name)); + return new ImageIcon(getResource(name)); } + + private static URL getResource(String name) { + String resource = null; + + if (aliasMap.containsKey(name)) + resource = aliasMap.get(name); + else + resource = name + ".png"; + + return ResourceManager.class.getResource(resource); + } } diff --git a/source/net/sourceforge/filebot/resources/search.imdb.png b/source/net/sourceforge/filebot/resources/search.imdb.png new file mode 100644 index 0000000000000000000000000000000000000000..9b12a004e01e9094aacf36f83f2643294f4a8445 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ za0`JjN_dpHnjT@@Bt5+qlAoK)#t?R7a);L`&c+EJ_QabRYA#w-GG214q*&nexr~o4 zrmcQ4Vb`R(z6rq>Y;*H>xajR|VJ-3B@~`!!metLRt?!O1$sYJ`f0^4N&!cmR-|>E+ PKNvh+{an^LB{Ts5GvInk literal 0 HcmV?d00001 diff --git a/source/net/sourceforge/filebot/resources/search.opensubtitles.png b/source/net/sourceforge/filebot/resources/search.opensubtitles.png new file mode 100644 index 0000000000000000000000000000000000000000..41480f854c9bff3307af0c6b7bb874f2b8ca97fb GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ za0`JjD*&{-^GoG$C%z{b&9DyO<^JM?B1KxL5t|`MZ_pKl`{W5f^;la7~IKt!?IA zlk)W2W@mabXIY&8Y}U%qYiM$Q^SWJA78$x#ZN2uTZcez6pw`km41$UdTf<@vk6qZL z1JpXJ>V4*ydt2Y{ZrG!L!}KOE!->0_C+}WfC)2K^w6`?&@^9t$59Vucj^KyV=y>7o?`abcmj6mgY5petQT7X@)6A{a%)g^KZmh=R3HY)I4w+E|;$ z=4S5Pxp!vX_jPeKwYg_`c%J7R4!@%wJv!;qw8QqY&at!Bpl}79w2Q;X^8{-Olp1K_ zxQ0%WO|q;z6i^z=o*fl-HACipTjkVKlQ@LAZ&nBc84R%&5m7^C040izq{H+?ojqd> zj!(g*rB%d}EscmE#`zdyQ3{*`W85GBMZ240gN#?780FW+Hkbb_(B7ScWMq7ts9G6> zh-ODKCe0kBv4nArnTJ{&8%a37kPv8L`@T{nYaBVaA8UnPzu?fg~z^yTsF)r;k+Vq?WuCPRz8J z-XF8Exrw)XG@kADdZcN==_hM^zu4!et2x!a;n)G;lgo-M&6zn6l1spw$77`I@!pqf zXkX*)9*Jk2DY$Z@;Qo6wFB}c{;+LGnS&Ew}f7}pWezwJfdmEg5xX))lB)t83j%cA0 zhNwe_?{;b0!8&j_J~$JzvJP_>N=(}0_2&W(?;GRda>DHUYs{|*jaZ@nC2=c20o~kj zUn}6l*Fyg4DZX0LOgGxhU-WqQLe543)llKwZIrjLazGR)me&hjIiFGK=RC4caqioa zw-)+zoFWQto3}XFj&S6|cgu!1J~k{}y2;nS3t=SqL&`yEYwb|88NtG`p;-&5MI}k* z7($T2GwFK0fykZlN, Object> { private String showName; - private SearchEngine searchEngine; + private EpisodeListClient searchEngine; private int numberOfSeason; private long duration; - public FetchEpisodesTask(SearchEngine searchEngine, String showname, int numberOfSeason) { + public FetchEpisodesTask(EpisodeListClient searchEngine, String showname, int numberOfSeason) { showName = showname; this.searchEngine = searchEngine; this.numberOfSeason = numberOfSeason; @@ -51,7 +51,7 @@ public class FetchEpisodesTask extends SwingWorker, Object> { } - public SearchEngine getSearchEngine() { + public EpisodeListClient getSearchEngine() { return searchEngine; } diff --git a/source/net/sourceforge/filebot/ui/panel/search/SearchPanel.java b/source/net/sourceforge/filebot/ui/panel/search/SearchPanel.java index 949aae79..b0b34904 100644 --- a/source/net/sourceforge/filebot/ui/panel/search/SearchPanel.java +++ b/source/net/sourceforge/filebot/ui/panel/search/SearchPanel.java @@ -38,11 +38,11 @@ import net.sourceforge.filebot.ui.FileBotPanel; import net.sourceforge.filebot.ui.FileBotUtil; import net.sourceforge.filebot.ui.MessageManager; import net.sourceforge.filebot.ui.transfer.SaveAction; -import net.sourceforge.filebot.web.AnidbSearchEngine; +import net.sourceforge.filebot.web.AnidbClient; import net.sourceforge.filebot.web.Episode; -import net.sourceforge.filebot.web.SearchEngine; -import net.sourceforge.filebot.web.TVRageSearchEngine; -import net.sourceforge.filebot.web.TvdotcomSearchEngine; +import net.sourceforge.filebot.web.EpisodeListClient; +import net.sourceforge.filebot.web.TVRageClient; +import net.sourceforge.filebot.web.TvdotcomClient; import net.sourceforge.tuned.ui.SelectButton; import net.sourceforge.tuned.ui.SelectDialog; import net.sourceforge.tuned.ui.SwingWorkerPropertyChangeAdapter; @@ -58,11 +58,11 @@ public class SearchPanel extends FileBotPanel { private SpinnerNumberModel seasonSpinnerModel = new SpinnerNumberModel(SeasonSpinnerEditor.ALL_SEASONS, SeasonSpinnerEditor.ALL_SEASONS, Integer.MAX_VALUE, 1); - private TextFieldWithSelect searchField; + private TextFieldWithSelect searchField; private TextCompletion searchFieldCompletion; - private List searchEngineList = new ArrayList(); + private List episodeListClients = new ArrayList(); private JSpinner seasonSpinner; @@ -70,17 +70,17 @@ public class SearchPanel extends FileBotPanel { public SearchPanel() { super("Search", ResourceManager.getIcon("panel.search")); - searchEngineList.add(new TvdotcomSearchEngine()); - searchEngineList.add(new AnidbSearchEngine()); - searchEngineList.add(new TVRageSearchEngine()); + episodeListClients.add(new TvdotcomClient()); + episodeListClients.add(new AnidbClient()); + episodeListClients.add(new TVRageClient()); - HashMap icons = new HashMap(); + HashMap icons = new HashMap(); - for (SearchEngine searchEngine : searchEngineList) { + for (EpisodeListClient searchEngine : episodeListClients) { icons.put(searchEngine, searchEngine.getIcon()); } - searchField = new TextFieldWithSelect(searchEngineList, icons); + searchField = new TextFieldWithSelect(episodeListClients, icons); searchField.getSelectButton().addPropertyChangeListener(SelectButton.SELECTED_VALUE_PROPERTY, searchFieldListener); searchField.getTextField().setColumns(25); @@ -142,7 +142,7 @@ public class SearchPanel extends FileBotPanel { private final PropertyChangeListener searchFieldListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { - SearchEngine se = searchField.getSelectedValue(); + EpisodeListClient se = searchField.getSelectedValue(); if (!se.isSingleSeasonSupported()) { seasonSpinnerModel.setMaximum(SeasonSpinnerEditor.ALL_SEASONS); @@ -160,7 +160,7 @@ public class SearchPanel extends FileBotPanel { public void actionPerformed(ActionEvent e) { searchField.clearTextSelection(); - SearchEngine searchEngine = searchField.getSelectedValue(); + EpisodeListClient searchEngine = searchField.getSelectedValue(); SearchTask task = new SearchTask(searchEngine, searchField.getTextField().getText(), seasonSpinnerModel.getNumber().intValue()); task.addPropertyChangeListener(new SearchTaskListener()); @@ -230,17 +230,17 @@ public class SearchPanel extends FileBotPanel { public void actionPerformed(ActionEvent e) { - SearchEngine current = searchField.getSelectedValue(); + EpisodeListClient current = searchField.getSelectedValue(); - int nextIndex = searchEngineList.indexOf(current) + spinOffset; - int maxIndex = searchEngineList.size() - 1; + int nextIndex = episodeListClients.indexOf(current) + spinOffset; + int maxIndex = episodeListClients.size() - 1; if (nextIndex < 0) nextIndex = maxIndex; else if (nextIndex > maxIndex) nextIndex = 0; - searchField.getSelectButton().setSelectedValue(searchEngineList.get(nextIndex)); + searchField.getSelectButton().setSelectedValue(episodeListClients.get(nextIndex)); } } @@ -248,11 +248,11 @@ public class SearchPanel extends FileBotPanel { private class SearchTask extends SwingWorker, Object> { private String searchTerm; - private SearchEngine searchEngine; + private EpisodeListClient searchEngine; private int numberOfSeason; - public SearchTask(SearchEngine searchEngine, String searchterm, int numberOfSeason) { + public SearchTask(EpisodeListClient searchEngine, String searchterm, int numberOfSeason) { searchTerm = searchterm; this.searchEngine = searchEngine; this.numberOfSeason = numberOfSeason; @@ -269,7 +269,7 @@ public class SearchPanel extends FileBotPanel { } - public SearchEngine getSearchEngine() { + public EpisodeListClient getSearchEngine() { return searchEngine; } diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/Checksum.java b/source/net/sourceforge/filebot/ui/panel/sfv/Checksum.java index 7fd7786c..bbafc963 100644 --- a/source/net/sourceforge/filebot/ui/panel/sfv/Checksum.java +++ b/source/net/sourceforge/filebot/ui/panel/sfv/Checksum.java @@ -48,15 +48,7 @@ public class Checksum { public String getChecksumString() { - StringBuffer buffer = new StringBuffer(8); - - buffer.append(Long.toHexString(checksum).toUpperCase()); - - while (buffer.length() < 8) { - buffer.insert(0, "0"); - } - - return buffer.toString(); + return String.format("%08x", checksum).toUpperCase(); } diff --git a/source/net/sourceforge/filebot/ui/transferablepolicies/FileTransferablePolicy.java b/source/net/sourceforge/filebot/ui/transferablepolicies/FileTransferablePolicy.java index 17b6181f..109b59c8 100644 --- a/source/net/sourceforge/filebot/ui/transferablepolicies/FileTransferablePolicy.java +++ b/source/net/sourceforge/filebot/ui/transferablepolicies/FileTransferablePolicy.java @@ -12,6 +12,8 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; public abstract class FileTransferablePolicy extends TransferablePolicy { @@ -32,7 +34,8 @@ public abstract class FileTransferablePolicy extends TransferablePolicy { protected List getFilesFromTransferable(Transferable tr) { List files = getFilesFromFileTransferable(tr); - // if there is no file transferable, look if there is a string transferable that contains file uris + // if there is no file transferable, look if there is a string transferable that + // contains file uris if (files == null) files = getFilesFromStringTransferable(tr); @@ -83,7 +86,7 @@ public abstract class FileTransferablePolicy extends TransferablePolicy { if (file.exists()) files.add(file); } catch (URISyntaxException e) { - System.err.println(e); + Logger.getAnonymousLogger().log(Level.WARNING, "Invalid file url: " + line, e); } } diff --git a/source/net/sourceforge/filebot/web/AnidbSearchEngine.java b/source/net/sourceforge/filebot/web/AnidbClient.java similarity index 94% rename from source/net/sourceforge/filebot/web/AnidbSearchEngine.java rename to source/net/sourceforge/filebot/web/AnidbClient.java index e341b53d..f3bb1f1b 100644 --- a/source/net/sourceforge/filebot/web/AnidbSearchEngine.java +++ b/source/net/sourceforge/filebot/web/AnidbClient.java @@ -14,6 +14,8 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.TreeMap; +import java.util.logging.Level; +import java.util.logging.Logger; import net.sourceforge.filebot.resources.ResourceManager; import net.sourceforge.tuned.XPathUtil; @@ -23,14 +25,14 @@ import org.w3c.dom.Node; import org.xml.sax.SAXException; -public class AnidbSearchEngine extends SearchEngine { +public class AnidbClient extends EpisodeListClient { private Map cache = Collections.synchronizedMap(new TreeMap()); private String host = "anidb.info"; - public AnidbSearchEngine() { + public AnidbClient() { super("AniDB", ResourceManager.getIcon("search.anidb"), false); }; @@ -65,7 +67,7 @@ public class AnidbSearchEngine extends SearchEngine { cache.put(title, url); shows.add(title); } catch (MalformedURLException e) { - System.err.println("Invalid href: " + href); + Logger.getAnonymousLogger().log(Level.WARNING, "Invalid href: " + href, e); } } } diff --git a/source/net/sourceforge/filebot/web/SearchEngine.java b/source/net/sourceforge/filebot/web/EpisodeListClient.java similarity index 85% rename from source/net/sourceforge/filebot/web/SearchEngine.java rename to source/net/sourceforge/filebot/web/EpisodeListClient.java index c677adc2..7609d2fd 100644 --- a/source/net/sourceforge/filebot/web/SearchEngine.java +++ b/source/net/sourceforge/filebot/web/EpisodeListClient.java @@ -8,13 +8,15 @@ import java.util.List; import javax.swing.ImageIcon; -public abstract class SearchEngine { +public abstract class EpisodeListClient { + /** + * List of shows + */ public abstract List search(String searchterm) throws Exception; /** - * * @param showname * @param season number of season, 0 for all seasons * @return @@ -35,7 +37,7 @@ public abstract class SearchEngine { private ImageIcon icon; - public SearchEngine(String name, ImageIcon icon, boolean singleSeasonSupported) { + public EpisodeListClient(String name, ImageIcon icon, boolean singleSeasonSupported) { this.name = name; this.icon = icon; this.singleSeasonSupported = singleSeasonSupported; diff --git a/source/net/sourceforge/filebot/web/ImdbSearchEngine.java b/source/net/sourceforge/filebot/web/ImdbSearchEngine.java new file mode 100644 index 00000000..6d38c4eb --- /dev/null +++ b/source/net/sourceforge/filebot/web/ImdbSearchEngine.java @@ -0,0 +1,96 @@ + +package net.sourceforge.filebot.web; + + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.swing.ImageIcon; + +import net.sourceforge.filebot.resources.ResourceManager; +import net.sourceforge.tuned.XPathUtil; + +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.xml.sax.SAXException; + + +public class ImdbSearchEngine { + + private String host = "www.imdb.com"; + + + public List search(String searchterm) throws IOException, SAXException { + + Document dom = HtmlUtil.getHtmlDocument(getSearchUrl(searchterm)); + + List nodes = XPathUtil.selectNodes("id('outerbody')//TABLE//P[position() >= 2 and position() <=3 ]//A[count(child::IMG) <= 0]/..", dom); + + ArrayList movies = new ArrayList(); + + for (Node node : nodes) { + try { + movies.add(parseMovie(node)); + } catch (Exception e) { + Logger.getAnonymousLogger().log(Level.WARNING, "Invalid movie node", e); + } + } + + return movies; + } + + + private Movie parseMovie(Node node) { + // ignore javascript links + Node linkNode = XPathUtil.selectFirstNode("./A[count(@onclick) <= 0]", node); + + String title = XPathUtil.selectString("text()", linkNode); + String href = XPathUtil.selectString("@href", linkNode); + + // match /title/tt0379786/ + Matcher idMatcher = Pattern.compile(".*/tt(\\d+)/.*").matcher(href); + Integer imdbID = null; + + if (idMatcher.matches()) { + imdbID = new Integer(idMatcher.group(1)); + } else { + throw new IllegalArgumentException("Cannot match imdb id: " + href); + } + + String yearString = XPathUtil.selectString("text()[1]", node); + + // match (2005) + Matcher yearMatcher = Pattern.compile(".*\\((\\d+)\\).*").matcher(yearString); + Integer year = null; + + if (yearMatcher.matches()) { + year = new Integer(yearMatcher.group(1)); + } else { + throw new IllegalArgumentException("Cannot match year: " + yearString); + } + + return new Movie(title, year, imdbID); + } + + + private URL getSearchUrl(String searchterm) throws UnsupportedEncodingException, MalformedURLException { + String qs = URLEncoder.encode(searchterm, "UTF-8"); + String file = "/find?q=" + qs + ";s=tt"; + return new URL("http", host, file); + } + + + public ImageIcon getIcon() { + return ResourceManager.getIcon("search.imdb"); + } + +} diff --git a/source/net/sourceforge/filebot/web/Movie.java b/source/net/sourceforge/filebot/web/Movie.java new file mode 100644 index 00000000..e7fdc3f3 --- /dev/null +++ b/source/net/sourceforge/filebot/web/Movie.java @@ -0,0 +1,43 @@ + +package net.sourceforge.filebot.web; + + + + +public class Movie { + + private String title; + private Integer year; + private Integer imdbID; + + + public Movie(String title, Integer year, Integer imdbID) { + this.title = title; + this.imdbID = imdbID; + this.year = year; + } + + + public String getTitle() { + return title; + } + + + public Integer getImdbID() { + return imdbID; + } + + + public Integer getYear() { + return year; + } + + + @Override + public String toString() { + if (year == null) + return title; + + return String.format("%s (%d)", title, year); + } +} diff --git a/source/net/sourceforge/filebot/web/OpenSubtitlesHasher.java b/source/net/sourceforge/filebot/web/OpenSubtitlesHasher.java index 4febdcc3..14534295 100644 --- a/source/net/sourceforge/filebot/web/OpenSubtitlesHasher.java +++ b/source/net/sourceforge/filebot/web/OpenSubtitlesHasher.java @@ -16,7 +16,7 @@ import java.nio.channels.FileChannel.MapMode; * checksum of the first and last 64k (even if they overlap because the file is smaller than * 128k). */ -class OpenSubtitlesHasher { +public class OpenSubtitlesHasher { /** * Size of the chunks that will be hashed in bytes (64 KB) @@ -44,7 +44,8 @@ class OpenSubtitlesHasher { BigInteger bigHash = BigInteger.valueOf(size).add(head.add(tail)); byte[] hash = getTrailingBytes(bigHash.toByteArray(), HASH_SIZE); - return format(new BigInteger(1, hash)); + + return String.format("%0" + HASH_SIZE * 2 + "x", new BigInteger(1, hash)); } @@ -65,22 +66,6 @@ class OpenSubtitlesHasher { } - private static String format(BigInteger hash) { - // 1 byte -> 2 hex digits - int minLength = HASH_SIZE * 2; - - StringBuffer sb = new StringBuffer(minLength); - - sb.append(hash.toString(16)); - - while (sb.length() < minLength) { - sb.insert(0, "0"); - } - - return sb.toString(); - } - - /** * copy the last n bytes to a new array * diff --git a/source/net/sourceforge/filebot/web/TVRageSearchEngine.java b/source/net/sourceforge/filebot/web/TVRageClient.java similarity index 91% rename from source/net/sourceforge/filebot/web/TVRageSearchEngine.java rename to source/net/sourceforge/filebot/web/TVRageClient.java index 08ef5372..b4cab870 100644 --- a/source/net/sourceforge/filebot/web/TVRageSearchEngine.java +++ b/source/net/sourceforge/filebot/web/TVRageClient.java @@ -13,6 +13,8 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.TreeMap; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -24,14 +26,14 @@ import org.w3c.dom.Node; import org.xml.sax.SAXException; -public class TVRageSearchEngine extends SearchEngine { +public class TVRageClient extends EpisodeListClient { private Map cache = Collections.synchronizedMap(new TreeMap()); private String host = "www.tvrage.com"; - public TVRageSearchEngine() { + public TVRageClient() { super("TVRage", ResourceManager.getIcon("search.tvrage"), true); } @@ -44,7 +46,7 @@ public class TVRageSearchEngine extends SearchEngine { Document dom = HtmlUtil.getHtmlDocument(getSearchUrl(searchterm)); - List nodes = XPathUtil.selectNodes("//DIV[@id='search_begin']//TABLE[1]/*/TR/TD/A[1]", dom); + List nodes = XPathUtil.selectNodes("id('search_begin')//TABLE[1]/*/TR/TD/A[1]", dom); ArrayList shows = new ArrayList(nodes.size()); @@ -57,7 +59,7 @@ public class TVRageSearchEngine extends SearchEngine { cache.put(title, url); shows.add(title); } catch (MalformedURLException e) { - System.err.println("Invalid href: " + href); + Logger.getAnonymousLogger().log(Level.WARNING, "Invalid href: " + href, e); } } diff --git a/source/net/sourceforge/filebot/web/TvdotcomSearchEngine.java b/source/net/sourceforge/filebot/web/TvdotcomClient.java similarity index 92% rename from source/net/sourceforge/filebot/web/TvdotcomSearchEngine.java rename to source/net/sourceforge/filebot/web/TvdotcomClient.java index 24425296..37fbe927 100644 --- a/source/net/sourceforge/filebot/web/TvdotcomSearchEngine.java +++ b/source/net/sourceforge/filebot/web/TvdotcomClient.java @@ -14,6 +14,8 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.TreeMap; +import java.util.logging.Level; +import java.util.logging.Logger; import net.sourceforge.filebot.resources.ResourceManager; import net.sourceforge.tuned.XPathUtil; @@ -23,14 +25,14 @@ import org.w3c.dom.Node; import org.xml.sax.SAXException; -public class TvdotcomSearchEngine extends SearchEngine { +public class TvdotcomClient extends EpisodeListClient { private Map cache = Collections.synchronizedMap(new TreeMap()); private String host = "www.tv.com"; - public TvdotcomSearchEngine() { + public TvdotcomClient() { super("TV.com", ResourceManager.getIcon("search.tvdotcom"), true); } @@ -43,7 +45,7 @@ public class TvdotcomSearchEngine extends SearchEngine { Document dom = HtmlUtil.getHtmlDocument(getSearchUrl(searchterm)); - List nodes = XPathUtil.selectNodes("//TABLE[@id='search-results']//SPAN/A", dom); + List nodes = XPathUtil.selectNodes("id('search-results')//SPAN/A", dom); ArrayList shows = new ArrayList(nodes.size()); @@ -61,7 +63,7 @@ public class TvdotcomSearchEngine extends SearchEngine { cache.put(title, url); shows.add(title); } catch (MalformedURLException e) { - System.err.println("Invalid href: " + href); + Logger.getAnonymousLogger().log(Level.WARNING, "Invalid href: " + href, e); } } } diff --git a/source/net/sourceforge/tuned/XPathUtil.java b/source/net/sourceforge/tuned/XPathUtil.java index 3fb672cd..d61ed14e 100644 --- a/source/net/sourceforge/tuned/XPathUtil.java +++ b/source/net/sourceforge/tuned/XPathUtil.java @@ -26,6 +26,11 @@ public class XPathUtil { } + public static Node selectFirstNode(String xpath, Object node) { + return selectNodes(xpath, node).get(0); + } + + public static List selectNodes(String xpath, Object node) { try { XPath xp = XPathFactory.newInstance().newXPath();