From c18e2a3f6f591eddec61c31b6d1e49ab6f8cd5aa Mon Sep 17 00:00:00 2001 From: pastak Date: Sun, 6 Sep 2015 03:16:30 +0900 Subject: [PATCH 1/2] fix bug including `"` --- index.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/index.js b/index.js index a44806e..3917118 100644 --- a/index.js +++ b/index.js @@ -17,6 +17,14 @@ var Playback = function() { spawn('cscript', ['//Nologo', scriptPath, command]) : spawn('osascript', [scriptPath, command]); scriptRunner.stdout.on('data', function (data) { + data = (function() { + var res = {}; + var keys=['name', 'artist', 'album']; + data.toString().match(/{(.*)}/)[1].replace(/^"name":"(.*?)","artist":"(.*?)","album":"(.*?)"$/, function(){ + for(i=0; i < 3; i++) res[keys[i]] = arguments[i+1] + }) + return JSON.stringify(res) + })() var result; try { result = JSON.parse(data); From 2dab3d0ef20584c24fc4388e619491b182ff9c62 Mon Sep 17 00:00:00 2001 From: pastak Date: Sun, 6 Sep 2015 05:06:13 +0900 Subject: [PATCH 2/2] rewrite applescript to javascript(JAX) --- applescripts/ApplicationLib.applescript | 4 - applescripts/ApplicationLib.scpt | Bin 1506 -> 0 bytes applescripts/ITunesTransport.applescript | 142 ----------------------- applescripts/ITunesTransport.scpt | Bin 19902 -> 0 bytes applescripts/iTunesTransport.js | 135 +++++++++++++++++++++ index.js | 10 +- 6 files changed, 136 insertions(+), 155 deletions(-) delete mode 100644 applescripts/ApplicationLib.applescript delete mode 100644 applescripts/ApplicationLib.scpt delete mode 100644 applescripts/ITunesTransport.applescript delete mode 100644 applescripts/ITunesTransport.scpt create mode 100644 applescripts/iTunesTransport.js diff --git a/applescripts/ApplicationLib.applescript b/applescripts/ApplicationLib.applescript deleted file mode 100644 index 26389ba..0000000 --- a/applescripts/ApplicationLib.applescript +++ /dev/null @@ -1,4 +0,0 @@ -on ApplicationIsRunning(appName) - tell application "System Events" to set appNameIsRunning to exists (processes where name is appName) - return appNameIsRunning -end ApplicationIsRunning \ No newline at end of file diff --git a/applescripts/ApplicationLib.scpt b/applescripts/ApplicationLib.scpt deleted file mode 100644 index 0727bfb1fabe7de62784f3f35507c861cf2f5ad8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1506 zcmb_cOHUL*5dOM%cifF8j=SN-i6i6r;ep|yXruvH zjtCSq5{e28^~4O#=(FUTd^ND3{n$>R0gZ+taU!-MU(h6*HmANJjLK_- zx*Yp=p+%#GVUn;7g+9&Fft^Uf7z$mcWuYBuIEI2XYuY*agp7Pla_Sf;24(MJ;9Z>z zf|+U&83dEld4o*ELIeFX$jS#qp$FtA6d`;uxoSbD35&H zE6@8yFXZ8phsC=G&vG{#>xupMs4Lzdpuo}3(MKGIx5Fq@Yb{{RpDerOg#xxmEuapR zG+OqnO{UOcLnlkbdjj|#y(2ZU4+@|?&T_!Cn(3U(yPl7_F(Zhq4 zr?xz;``9!yvE**PwI}k}mM3++Yjg$AKFb%LHaN?%%)l9Tl5)Pyhe` diff --git a/applescripts/ITunesTransport.applescript b/applescripts/ITunesTransport.applescript deleted file mode 100644 index 27baaa8..0000000 --- a/applescripts/ITunesTransport.applescript +++ /dev/null @@ -1,142 +0,0 @@ -property ApplicationLib : load script POSIX file "ApplicationLib.scpt" - -on IsRunning() - tell ApplicationLib - return ApplicationIsRunning("iTunes") - end tell -end IsRunning - -on IsPlaying() - tell ApplicationLib - if ApplicationIsRunning("iTunes") then - tell application "iTunes" - return player state is playing - end tell - else - return false - end if - end tell -end IsPlaying - -on GetCurrentTrack() - if IsPlaying() then - tell application "iTunes" - if not (exists current track) then return null - set trackName to (get name of current track) - set trackArtist to (get artist of current track) - set trackAlbum to (get album of current track) - return "{\"name\":\"" & trackName & "\",\"artist\":\"" & trackArtist & "\",\"album\":\"" & trackAlbum & "\"}" - end tell - else - return "null" - end if -end GetCurrentTrack - -on PausePlaying() - if IsRunning() then - tell application "iTunes" - pause - end tell - end if - return "{\"ok\":true}" -end PausePlaying - -on StartPlaying() - tell application "iTunes" - launch - play - end tell - return GetCurrentTrack() -end StartPlaying - -on StopPlaying() - if IsRunning() then - tell application "iTunes" to stop - end if - return "{\"ok\":true}" -end StopPlaying - -on PlayNextTrack() - if not IsRunning() then - tell application "iTunes" - activate - end tell - end if - tell application "iTunes" - next track - end tell - StartPlaying() -end PlayNextTrack - -on PlayPreviousTrack() - if not IsRunning() then - tell application "iTunes" - activate - end tell - end if - tell application "iTunes" - previous track - end tell - StartPlaying() -end PlayPreviousTrack - -on FadeOut() - if IsRunning() and IsPlaying() - tell application "iTunes" - set originalVol to sound volume - set currentVol to sound volume - repeat with currentVol from sound volume to 0 by -1 - set sound volume to currentVol - delay 0.02 - end repeat - end tell - StopPlaying() - tell application "iTunes" - set sound volume to originalVol - end tell - end if -end FadeOut - -on FadeIn() - if not IsRunning() then - tell application "iTunes" - activate - end tell - end if - if not IsPlaying() then - tell application "iTunes" - set originalVol to sound volume - set currentVol to 0 - set sound volume to 0 - play - repeat with currentVol from 0 to originalVol by 1 - set sound volume to currentVol - delay 0.02 - end repeat - end tell - return GetCurrentTrack() - end if -end FadeIn - -on run argv - set command to item 1 of argv - if command is "currenttrack" then - return GetCurrentTrack() - else if command is "play" - StartPlaying() - else if command is "pause" - PausePlaying() - else if command is "stop" - StopPlaying() - else if command is "next" - PlayNextTrack() - else if command is "previous" - PlayPreviousTrack() - else if command is "fadeout" - FadeOut() - else if command is "fadein" - FadeIn() - else - return "{\"error\":\"Unsupported command\"}" - end if -end run \ No newline at end of file diff --git a/applescripts/ITunesTransport.scpt b/applescripts/ITunesTransport.scpt deleted file mode 100644 index 138dcacf7a37970498aa7d126cb939eee91545df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19902 zcmeHvcX(Ar^Z(3AFv&S=l1mo>0Vxt%#EuP=Do9Y82&f?hNC-(t6Hu{tR8+){U_ntt zuw%zAV((o6vG?w)Gr!NAb8o`Sn}qm#zW?w%T;0j;x#!M)c6MgA%`zyre9D;qquTG$ zYmaP8=|q&Ap-N01B{4GOkmnhAZl7e2lJQL=+R1@2Du@TJk zd3%LVlJ!57=7S{rrRB4yI!Ys+iEn_D{B-h(S5pw9fVxnBD#d?AR6u!@OBMKALd7&3 ze0kP%{=xbe5$m5u{;)S4QaWWg5U&6g`*@N` zF(YVF_|f0>H~lrx->F45r4^KyRTdW)6i=hHq2)(KSxCvxsXdrRy)$Tz?Mmr$;t5+d{xK6*SvI%r$jUb3ksPKRId<$tn$?Tc%S> zlU1u2wL+r{Xf#zqI{8%Y=}(63XT#Q%xFp2ZNPi6U#|Ct*2iP9%OsySAwJ3kk@AW&@ zA54nh8~M&e*&1mVYU4mcQKmx{ZK<6DsTSq8`i*`a=(llEmKNpCiHmY%l=bu*gZs6? zZI=*bN7|LzJCNjKLQ!_04%AVR;mvpEc z1ll!5UAGqK=Z5eLL)bAw7^60{J9Tp)VP`jo2(lbyk#`XExH%-#oq9MB-UIlXQ!Cx< z>t@sWkwv2%^@yr%MLX+fzJ5ljK|Y?(7&&UBqi)f6G3Zgx4C=`%Qo|1XKPA&kN@kG9 zlv`9#Zj5;Z1j3Dv$jvJ#t|%#=-hRk{t?FC%fHoV_9dEAf@}6HXy0SRGycbk>tG60f zfk!%fIk@P=-8HvSG3g-4cG^ zEq~mXwnUr`GxE1I7&w#M(A8w1-x|{qDCOb%Vz`_VxS8qHo`%o>^he7rnfBh2C+w^@ zSt~p!Db!@QNG*1Sw)S%1AG$cGv~Kcs6S{kHNlDez+@f*^-qjYmG0=?-vd}hYZEwnU zAk`MSK|j?`ST{f-`l*pm%tEt~_MkovB(%^b(8WDzF9%X>p&#o<`eC3SQ^#z|n3i9W zS6Nn;UtCd9mYX+&G6v^Y92PwoZ4W&C$Qt>fHFB@WItdcnoA%KUXkUj+oNpt2U*FSr z1AV_9%YV;!y=%PoiR>yBlHQN@cOc`YL`@ zTv=4)={xrR+tw8aA{|Bp9EfL%+Yat#APsULA>ww_i3aN{`m#ftIX`@(6Af{Yh*umh z4W+{!4UO=1pxyK(UtcnO#kn&b9UeVzM;-Jx&>2tn5R}Jud@_gt=uE1?3g- z0+^xTVOHSLC>rfRLcrP3pfNPofrNmwp<(0n8GYK(xCpR4Ioi?D5nwBgr(+yQ2zXE0 zTc7gvsSt3{WJgdtbLH8zr#|WHlhuHqF~Cn7;ITD;p9u5`YL!iX1h{B&<;-}#zvVp) z)*emJwT>o4TC_jUOp5)3ZQZm<$my3QyfVA z`-3qNz}zZ7Q9h8S(R2sGHrLu8233#_7l+}lFh+%NZ6{JkIJ{h%iQja@*Bu@FUg(+n z(gFH-ppVz7Esmx}Y!8Gf&Pb;j#VcF?W#RO#95l{+O2qtNIz%4}^s#z- z*I~XF;_e6AoS6=csGv9oye+CLD8f6H_$JQ&_=x?XbeKLG=%e-Yg`;C5<^y1eCF$_^ zU|t%-c#sTcCwscq`gZ^5om9+LXJyc=9fPth47Q^|`2*|3eIr{NMn_PYgGz=v1usYC z=@{nG?G-U7Xe#uo63ScTQ6E@oB~>{PI1yXzkUpXh>qD%MnAtyUwONH>VfxOy+`j3^xpWuTifd89;@PRtKyWzz}tjQrPCZp ze6)<|UAkIV`Fa;dOPeqnNE_5l4EC`+>uTe)$~c`?V^LOw*r<`iBSZu^G;(n8|fT6 z*MU?U(Mr8TSFoRo2dS%`GG-t6e|h=q>{MHfR4uF$29u86ED zhK-vm9bFkIbqqT@OZ0kO9O#k;uE4H0)mUs~DF~g9bQN9gK&lPwI=xn}VZF|5>slk% z*qc`)T|?J8kkG)eRG{l+|#u&ebdy)w|N!x>q5MG5x(q8*!H6bjYmb(K|rrK#uQ zgn8{u*L!q5s#rp3?2?)>>IS+|uh2z~Zb($qNH5ogdRd^C*E2>fv??yMDsD7WWsJ;C z=q7?e-DG@hMHkac^%7m+>!opnGK>j>su`m$F-{AN)6F$w)Upg(w!@aTFI&JFRda)h2Y2Ua0d~FR~gh zG&0}bT!C~4t#lxv33bF4;+?e0fmEB&1$w@o7w84lE}NX0PjUY2_;!jj0~&$i=x8(L zeACSHOfy#{%xHI7?a^vfa~Iw1K;l!qmUIu@tLN%D4w-PngRtq1iQj#RiW}+KdX}CU zC`RNux2?~z3eU6(?~TU4G;EaIPY*bd(5SF~t!L=zdYZ3iz^G;xl;`EYk`5Jfof}K)Mg{B+@rW~);xZBq===B}Sv3)5A zy#keZL$Ou=M&xJA-A>b~njh%2ZMxg3rUv;&rki>_iS#DDCy)3Q8G-Oim@DFpjrs zk24i~FX2PS(EId(9;=faGTxxjYiH1h^pOLJ^KGOPb%Guf=)`)w=mg`9KmbP{MZZfW zr{nc#9T({M`0s20*gCM_X#3qb``rhTyKjQ?sED&m_WybOX!la zf@uZCxkXhtW(*PqyzS9uu>X?2av&jlSUY`9-#CzveH+?UNBcUun*BF5>_-JUDm>JP zAJ!UoKb{Yne+A~>Dh}YjrAFf+`HpDPcX}j!Pe0I)j=qZ;+8g_IKY8>MUjCVWaUda* z-ZeWI4X(#8G?n3z+||I6C~@`p&}%abG=x{?Oq* z{zM@|Q}T;)YZe%%Qt`~m7CaU9lTr^^IQP@RE1R9@>2T}V5kvu6WXEi^ zOTnSFp(Hy~Hy!5duxd&E5V7ut)5pV;^l;OVAEQTE)Ln-r=}=WqkFw_*qvwe1p}#Wd zuN@9`J9DU?LgoHLe>;%S<@BdPIz$KSpg@OgV~=aFX&Ky>M}H&zqXQlN6FH2*@FPO% zKth8VMk5hj$ByAqG264Fa~%-qfOl!xOe{V-n-t5#3M?b$KyU>d?+275bn zZu`gU zLwj%vr#cS9E%5*ckca5OdQhN;P-ZsmWaDr_G3{i-@X%sU54M^Qg5ToQ$ioxma+=3! zVC-|?*iQ`3Ex9o}Jx~vD+_-vy!|9IGBRe5#qW}>-j%9Fchx%`4>VKf=^8u#M0a6p) z%W;!P?OH(_n{qSVQ~NkZ%$&t-wW4<1+;Q_r?OIV=-9xjrcc6RJGqcM!W$A6o(k#;R z4m62dc-#UNw&YfhTSnU0fyVOA+}iQZ(QBP)4DaIcE_kgCw{_em^52~)i`((8j@u2K4RaUdT~eI&2h&_vk@DrJ(9GC;YXyP zjTrc7_dvVXGoA6c1Ne60&W;hkY9VBpr*RkV>KK8mHelF1Eh|ZJBI&qm&2+4ruiX;U zG42c=yK^_kyGQnE)3M#Pt9J2q_rw|#Q|ZJSv*uK?tBJge^=dbyECr0LXl{7`gxXy@ zaS!gvy&NOx)#A(tVodDqac{hw&3iaTD57B=NQZMD-qUfPsNo2K)7=8yt)7NE-ZN^< zAR4M2eeGD?7(_MlUJ60)6*UIqu(s#Dbyr{8*EhH1y(58PoaTK}d7mxkmb+RzJJ{T^ zQ@xntF}xPR)GkTenaq1eO*#aThiwCGTd$Tljz@*|Lrh|uByB_NX=mfoI>Ls4XWlo1 z_ub+CwlDX`t)P_q=`M~D!-|Cp;teP9{*L#L9NajXsI7HpZ53$i2A=osY#Q0h$Sy|q zH22!aa(jU=Za#2d#xUNuW_Hn1TWE9EmiA@~BhBs21CS2XW{wY}aCXs$_U425V8@7A zx0M+_+LRB`CcZX>_2lMPRg@scJ8}i5;@c?3!SNwAJ}VX|qOr3nIk#+Dm0@aPDtvHa z@-dJ5dE5{6_UA(#_m5lv4zBnx9^m+}DE1QfQFtH^ay&4)B!ZA`&E&zpX2Q_(5EJ2e zaAXs>B%&GkpD@*~4rXOd4>WxX5RM1b0CWMS=>fJZ@=9jT%q_;ohsTE^4bjF9<4?HV zn?mz=C?C$lc(`Lo!eaPSF#9-yM>swr;+2A1E{UW z(&eLgl;fi!@YtE)(LBcS=m>lZYN@!|ld?7VF%ft~^zhhpMgZ$-9v9BJ<%vAW@x%yWC)~$K z3N&eJgp(qKov8~So6g4?!sB9m9F7`Gfv*yAd-)zu0Q2KH*YWWY#w_ZM5O35)jTc6 z(;!6)crBq)kMqEKIu|&e9wFS14ib@nN)5vEeI;Vb)=hj`@hss_-yidtA!19G6D;2GKD2 zOa7EU0{Ls($Jp|xVf@1|&O$2Va>r#6#u0QRS8%1{iU{Kf%8}m#`F(4Ql@Z1qOd6`v zxymq}5aSbY?V~g_p(;cxmso#$T#hPc^Bl*sBdnuoy!Qy^PI z4C$VT3QpzI9EZV`giz&a@{{~1KLqkq?c1sHqoMo3(4B^KI-lYA^ax!cmGGH-mScqD z+03z!X2|z}e7`livm$gesF=@A=d%snIWay5Q8Nj2xZ>jR8DM{|eCPPwNSbAIf_y9A z$k%~wvg=IVz>&TKAR=y{IMiz=NWGqOv2L>aiMN3G>6 zp3fKZMSL+Y;7j;YzKj?0<-CZm;4Aqm`BJ`+&t-do6Zx3sE22!EPp#x5 z`A|NP_vJl#SKg7gUBARyuD4659F-|n_3`m)~e)zyitpS`SN-_ zbB{n?`)@sGc@^^;dBw=fMqV=VqLKAR>^_OCGxEHV=ZriHHR20#K~|n&gv9YREYFxK zUtK+c;%nt;dCD>3f@~XxaEJCfUhKFgPEMZW>*a|+p8U6W4;c}1yhPSIUJ}_axXa^# zJRZu(rdxIwCk2`CCXTE%OMAlLEly0TTJutmmx9d=e52zVY^94qj9T(de6!=5qDfXV zwcurZi{oWx*LL5xnLNg~%A>wK1_9T3{fTciDKx_SnY>&ck%t{GCvP9@Roau=_;$y) zkuBa(PLYRvdB|2{WqEMHqpuo?m5yQq6Triym(1b;?I#qvn)XC{y%P2@>64fSfBFDd5Kolb)E7s z+;|(6UshF+mtV`xjrA#JA?Vh|xK8;9()~#Hp&bYP*R{$BYhS`8@Uq;pIelqMu6?PN zrljLuTMXB-=7h7Me7N=Y*aWD8tG8)!Ircbn!vSDhmoIxpynDxM?!9Hjy=$qr=1L~t zh|alF?st4=G+4Ew*1XCwLhekZ5Sk?S1#({lRmzk5O*5Z1@{|oG*HDt&i-GPgmV2$d z8eiNK$UXnkGoCiRyd;7+%65|ig5lBepkz7&OjE08*kC~Ti>0`&s>JXrC{a;yv5;@a2+feO+KV zTsQSmo#l!q$K)y+kyY58a8G66r%mXftPMS&q)9xH0%{#^UIv<%l7+^3P#Lsqqd~pYpq@+f z3>Asu^ICWjE@x|hi!;5IO>`w=B zdV{nzCTCGAcot`k;hd;R_|u(|tVx$ylTM?>a;ludYxxP87occYkL$b&A*Wh{PO-ME zHSz>xe=;qTlW2K>Ox?0SDc+pg?kvP)Uj4FPXh2V-RWeuR@RR(M%nnf8X27{vFs95g zoKG5giWxNqexOGK?`%)QiOl{%7fmCcmD`GO6x`nC++u2&z5~`Op zChVtVbkpV5`f_?&%48Nl&Cf__fMSE=Km`X8p3E`MKjXCQ?VdP$09rW6Ip)-8ql zf;4@Znb6Q$qVxhO+NKmr|CJOLnG|Nwdr~L`{475w(*qQ14bPH7YcbX`nfxp=(`0HO z(?Y#Ygd}YppA^W{dX7Ib`8i6Je3>G7^p{MgKP6X=4_;1+h8kTYJtkF+f%2R}+#V&8?H56X9iiTyZEm1AWRKhNuA zVj#!WvXb@WSQGjr6Z-SWOps#&nXnC^A5*W;*HM~`=a?KV<7BLi;eBMZj0z+X1NXl- zeSJB)9p@OhT<|alF2auD7E`HP9_jq{($T0DEqOYJYfwKGtEYathIV zg<*%82XBO)+_`YcjGAuTjHfAEbYp5b9HaBDw9Y$<50)ckB)`DxCC8Ve(15xQI|4a! zi<1RUMp|#afEoUXKt^owO(w6WrgDS~=NuWvW94u@R)+Fa8N$Ufn5$$E&y#_CwhZ9& zeK`V3Zs!_-4FB)lj6jApNL+y&z71az$k6bOx_7<D% zAOmVKo|xp&DN8J1>>pD+HVpiH=a7J{Vq`g&lYQQvC|yq8XHeLAmM?83 o_=S 0) { + currentVol-- + iTunes.soundVolume = currentVol + delay(0.02) + } + StopPlaying() + iTunes.soundVolume = originalVol + } +} + +function FadeIn () { + var iTunes = Application('iTunes') + if (!IsRunning()) { + iTunes.activate() + } + if (!IsPlaying()) { + var originalVol = iTunes.soundVolume() + var currentVol = 0 + iTunes.soundVolume = currentVol + iTunes.play() + while(currentVol < originalVol) { + currentVol++ + iTunes.soundVolume = currentVol + delay(0.02) + } + return GetCurrentTrack() + } +} + +function run(argv) { + var command = argv[0] + if (command === "currenttrack") { + return GetCurrentTrack() + } else if( command === "play") { + return StartPlaying() + } else if( command === "pause") { + return PausePlaying() + } else if( command === "stop") { + return StopPlaying() + } else if( command === "next") { + return PlayNextTrack() + } else if( command === "previous") { + return PlayPreviousTrack() + } else if( command === "fadeout") { + return FadeOut() + } else if( command === "fadein") { + return FadeIn() + } else { + return JSON.stringify({error: 'this command is not supported'}) + } +} diff --git a/index.js b/index.js index 3917118..02f2fa2 100644 --- a/index.js +++ b/index.js @@ -12,19 +12,11 @@ var Playback = function() { this.runTransportScript = function(command, callback) { var scriptPath = this.isWindows ? path.join(__dirname, 'windows_scripts', 'iTunes.js') : - path.join(__dirname, 'applescripts', 'ITunesTransport.scpt'); + path.join(__dirname, 'applescripts', 'ITunesTransport.js'); var scriptRunner = this.isWindows ? spawn('cscript', ['//Nologo', scriptPath, command]) : spawn('osascript', [scriptPath, command]); scriptRunner.stdout.on('data', function (data) { - data = (function() { - var res = {}; - var keys=['name', 'artist', 'album']; - data.toString().match(/{(.*)}/)[1].replace(/^"name":"(.*?)","artist":"(.*?)","album":"(.*?)"$/, function(){ - for(i=0; i < 3; i++) res[keys[i]] = arguments[i+1] - }) - return JSON.stringify(res) - })() var result; try { result = JSON.parse(data);