From 4d3d2b4ddb88dc43aab20af09faa1c2787cc7a78 Mon Sep 17 00:00:00 2001 From: Alex Kazaiev Date: Mon, 6 Apr 2026 19:35:20 -0500 Subject: [PATCH] fix: use paste-URL auth flow, match redirect URI to spotify app (port 8888) --- __pycache__/musictail_mcp.cpython-311.pyc | Bin 0 -> 18347 bytes musictail_mcp.py | 37 +++++++++++++++++----- 2 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 __pycache__/musictail_mcp.cpython-311.pyc diff --git a/__pycache__/musictail_mcp.cpython-311.pyc b/__pycache__/musictail_mcp.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36bf912148f44a4d03a0b0eecb2acb86f4a73dbe GIT binary patch literal 18347 zcmcJ0du$s?nqQOR`z4VQMLjILZOhifmNb_9w)~JS$zxlVJ(lgc(e4bFR<~r@6sc*F z_J~96@%CnKHI8pbJL`+JyPgb_Eao&>2M~};;5!6}0~~_O9|@XH17;c+K-kL$XCOed z=ULprf93a8^DSx~w@9=2b#*H~>Q`TV{pU`njl*^F4JByo<+#74hy2B2@bFSL za@<2s;3hdiC+I`ES^cD5NB){n&8%V4Fl(GN&YC7oEX)ux&sruev(`x~dp3q_v-U|l z^P57BNeA+oLe5DiySpY`xSK<@vvreoI!@1tdcpFUj^loXzjjT!1?!|ou!*i)_4%-A zyqFxjBz&T@j|15R*?UeW%U0r~LHlZf#qGke+pL9_bkZL&x!W;U&V{pkbM_*K;KAZw*_ z;z8kjb0Ile>;gi@%0e!FVk|Es*M{R_$1k`~^i|_7RfY@C?Q~)m& zcm=`&9}7fdA|D6`Li5pJ)P@w{8Gd3e5(`dK@scl z^2337e&2zEeCN=dgcm=!m+ybA|6rHx1+`n3PBo9Bet74u8r6C_5EU;*1Tmxz-k>ZYi=CoW&QdT#VB|CzCKBjZ>7=Y~~pMbN~^nJXh#Uv0e^i_IPF>)Y3VsP{Ge z_8mQpt8Xe03f%}y-5&kiq*}F-{6Rr==DbmH3O%YiBvA;W_hbIJ6jY5Ec5|X?V^#3a z1t2{R1cd!Jq{v-}&gYOVdKLdHM$n8Xby-z?B&r%%N}KrJ9EKQ)jzj=XHH+apK`9be zYi3ZAY2wVK%Oex2IZC5#ZeBI#q_j&f`H);{0f~~Z@cgT~Vsp$+&GjO+2R!^N>-4-| zdk3iU9dr3?5gErBqGo-PIQrvCwZBPNI}eOvw^ue$WAN*VG@E7ei~Cs zToR+bs&VROFcea)Vpx>WO2H}BHY9GKD@7RFiVcc%E-{gw^YOM(3K0S_1fjJ zbE8+!jh|J`=f0~k4U!n%mX*_GmYAIQCP889nVKEv-BxPqg)CQ_iFdU6Zaja1>bO@!;OCywm zc;w#dZ%-odR3T8S&x?~Uet;mvu+q+u-y#trln4w;-9!kYNqdP<>q~@|q&|=`F*hNA zu9qKx6vg}+CiTf0-~@x9e_S!KP8tzz5)5oY)tBxXCe5Nnv=%XoXcNrT=`6iPunIQ8 z{@78mzp{%Cq;pa_!GM9|!jc!CnGvJ0bK$voEU|^%`00q00|8Mj7V9O(iwWU3f&wNp zqxfD-3XCVNvcWbT48=sO-)uPT#p0hEPJ8*{aM}x|Y&h-Zwc&(2hSOfYFr4->41(eG zxn4C3;&dP$im7&BlPM|4R&3QUi=q93rpUyO@%ZcwQDUG*!ekw#@tvzI-?^{nz-wJE zXjXYaGs@=%=@M?zWe`q5?3N9? zF^4W4O}{SJ_hjmOl=`03Saw_cay(ntkZriNZmi)kwSs&}BsIL)xpY{uZCU4Pj3!19 z37>`Y_?EocI#0IYaMtcv@~oQ;9%Kahl1OS~abTS@P#zG3=X~r@t1wlwy4>DD%(s)< z#}z1AlUl)4kW{n4Wc6{SCcq}zMXTUolImoV>db>%O;lTpq6%~iAXfyez0w6#R2lcGzF84Oa}pGqd~ymfW&JVqa^QLI!!$6S{R$mUr?VX_@by)=7XU1zt$y9AlZus zD)Jf;5&|pYy)0k5E`R53+5Jw&{f^>(heSj+ zyaShE6dp}5r~+kzVL$*~FR5DJPB1o`(6mWRu%OGWs_iQ6I<)?7D)zUw7nzeHn0UmJ z&Q@(v>?2}WQl#0$#j8Q|xD*J_h)4NiIN$mG{rp`~ydCYL=}8F2XIXlLALM5v;n+=z z2t~p(x!`#*AVs^RalD~wi-D(~@f`26eUlCrkxdE^VI5r2t<;zjk?Z(JspHGLb%$)& zQKefOTbIOa-Ii>_6lMh<%?du66?~@D`K6l53864QXnjbfmGxm^QKAL<+xDSg63mY+ z6^jg8m;`HKh-(W``QoJwZ*3uRp|5Mz+EHM#o1++>QLV!d7CU^Jq6*`iK-~@O@dO?_ zO>F~K+*X!|gLDONl<*aYFP1D?DYWH*jaum{k`zbnXrkjBcF9s)+{@3!QRH-7!u~_z zr=`d&j~y;1iWr}WV1Z-uU=Ij)fG6S-_N(7;#M9)U4RIzAH}R+%ZbTxX${|m%OCmyZ zL^K6bE*qz0!>KB=!3MP?_r3l%Z^#qZWcT%q`?})3u8ryIvf+Bha6Q}9wrtGSd9w}2 zAwbO}K+PmT%_d9`4PPTbR3+72+-Bq!-Gny>ByyUF(@;TRwZ1wE%x8=RV_0#qWeNzF z!lC)su|TS|SlQ9iQ?cM3kpi$YH_#-l+Dn#H)if870<+Pn{0;$yv)%I_^>Cmk<+x<#uKyGr-YR#gQdwg?m(&$C0>YLc zmo)uS_ha3HS+JM#l4=D<>2tA`q>>Bk1ShrUjBde_v{Y|7!BtsytZ+cVaY?gKTdbu} zS1udqr$78I`eVVmU=!SFf}tBO!Sex^v98zgN3U%%dKpWo=OVKJ-K46SXIe&J zIGUmvQ>f`MhqI}k6r|w@Q~+VpJqBry!-tttQe!0fQAPkpBFSDRXuh=deu()O}|!@6h(M^D+p;_`R?wE1ubo^0ca1^-5s|h2~*tC zTOH+9F0o}oQdIv)hw0ZPIZz08> z=1c!O?(eWd$*rg0R<El)o>r#+QY20~PG4tT4^Kvd#+~tzyP(f86 zol~t;5CfLLh45+;qgt3y1cj)ogYNG3-GDR`Rm}h}*v>{t#-Mvpbx;|yewBU*cG8~^ z&zcxAx!}WFmt3q%RA+9P)%rn7BiSwdqjrd+*7Cn=;cQzn);7i3mO8yw=XqY&{j9Eg z)%_$X*L7#=#+14-()-juckg-T-m|*>sZ)0E$+*WA_jv03TCF?vI`l!yX2r#)J?ZUf zkK$@iCssR@j-yZdpA0?eS2|8)Tqo8!y>S;Ki#lvC7q8wwwA?A%cfe&G4If>)cL_Z& zJUW|kv@4Ew+0p)w*;?PSe%ZaOzn@IKzHZ{S?p`(hg+q28hlA$H?EK*UbxvnIymaTm z`--pg-(Hk`N8qv+*GJBK&Oe(?kN)z4(tbc`JeaW@QY?pL%b_(Fzjy-`m0jI%>4Vxm zb#~3!E5G@+^5zY>|CZc8@znI!cIDI?@a5diTN&qV*%5*g%wYY|*bl~J_r8pwUorH{ zhW_6)v@Or1Zz@~+R^6F~0i^-kWTWv2BOh88b&ChGp2mk=A9v+MJihvt(svRMnbuPZ zsOOa8Ikjj8tXi6R;99<;)a_n0W?l75!}o75)?_Wtj~w?L%R1S60&Y2;zW!)I^RK?C z-7}VxishtiIhji{|fxxZSYj@C$<*;HoEHk%eul?xAy(3H4GWJ%*-YOefwc*uV zL}&R!9KSZ=5>5F{G(VBs0}rwNaXG@WLbU!E|CfXh{^1nOjyMuc%Uu4 zU?@&grAR4i69}Ia^3w`G!EK&iFcf9H+nCRX{kKwV3T&v{-%VyOg&9TC9Q4&nDcwg1NkQ zKtsAT$>oL%xTmDA%S!=fate*5EiIJQX~8AtWSFcfA7Kl_a1|$YUy;5oSzGORI_Z*jZB|!dYtmIZdP-Xpan>VQeL z08Mcr#9NSP{nH133J8>&kPAvmyf*_#34M2W!g7}JK>_!PHz{P}G_wKds z7K$=7e5n-#KW%ONWJeLLLkhfT*`?vd+KT>={sWRy<)Yt%WL80pKxVGGkKVfX)^elL zyl1uZ>Gs99GR|SeIn0g+m%0@DmgP4UJHVgLcp_VSe5Fz8Iwsd1Cucdn=B!^jr#QDR z-&LF)D>}v5jcj#|OR)zIpiZZoI4|9KnD{u6?p!&Y@%1UbzE%CIdsVOa1~Sh5igUm0 zJTD(UpBhC?YTeIW9nV}HE7pvwUvc&0n9}843KBMLOYi>W-gKMd>PrFd4X*57ZG7A- zI|p;lal8cF?Oq<0-MclHF?1+~4%yK0g{O7-Z2FCir$g~{taC17^KXfKXad9=$aO@w!<0k5yg8%_MU!nZPAwXHa&dv<2RST zyRt9i?NPivi?&?dcRX|LNDriAzdVw0^(d|$;6HEEa?^vi)BWk8bid-=O}SZ7n$)j$ zm;ZEHoucuw}7TaKm=K6)P>xF_eeJ7~soUa_2)E$0iMu`hj8_V&SL zEUzh+*JR6Ug{XmaLiP^8Wi0y@%YNCiKWq1*KdnQ$ti%1$*u62i`Q%E=>d@o1)tJ&X zh$qcu9H$h=DcNx<$7<%>~;Q45Fd|C-A0j6C7jy z%6x_(2h>=GRiR}%MEJ1!dkEG_T#EEt7tBdx_4Lqa*~;rG*hxp0G$z?$@%?T0564I& zk-NaBfJ5_Pbf?LSW;N|1^WDeJ3cfJNEk%0^7NIVw2Yzrfv}#RSt0N`BQ;8YMP-rKtgLg=g0i=>vduuX zo0aWLno)KWVLG9?iiT~+ra4VLY;V5hm zrAQPe0yw?vYJL@782O~$_dr>+M;Wb^K zWiS+&y&(inB({}J(j@>cm*9UPQ2U<4M=k$9F!VUln)@6CbUI-3@sgL+V)(gejrLHMuuS9-oP zVa;z8x)S-cSDEq`tQht#Yb~1Hzoo*o2!W*(a&N@Gnr&=;bt`E&$P?3|{yk;e4U*T9 z4$7^AMI9+Ul{yXil43A!1Yx?+9BySORnt&6ZBTmV#91PhEC4Q!Dn&sPp8|4aP&cQ< zWLQ(ia{G)Ra;~Xk&D$!#CPx*FdeH~fvHrTP$lhI1O=^red+4h5}#odanb@{r| z)|)Z)DW<-4D`%`*cX9RJ=boNto}SgyPY)_*uF9UCjOUu-xt6-HR?vR#c-p88U118) z3B^5;I*)?ty{QXXXVbDzac(CK=OIR*=5%`=dO!9qy_fc6-0h0Hoe&cuK^BLyZJnR` zf9_v-V^x=F>sQ+PSKr9A9bCMytov|$aeTc7iGJhuE!&?rbv)$hp8;hb}fq(;{Addi&{L%U*VmksS-)HN^fNzW)P zy(`gG{Yq4689m z)Xqm4$rY2=v$A3G?rQVnB!)+(bx;BI3@V;Ms9801EPD^rs~x7hwvS}~mAhJ4#&Sfl z9FdvZ45fODD3zHR_-P*>P1u<^0?+Ib%4QHc_oFTE%YTH(egoYoSG4GsMu8J)zTR+E zKZ_O&ScSjxbh&a>CS$5nghZN9AkYG))yx7P85RuTW1C`Do#5DT(ybSq8|qR~R%Ko2 zOuMXX7tWjw?5vljHFgO*an@^KXT7BDEu7O!dZ8BQxpmNgx*2AIHj{LoF=sv}Fs!Nc zoK*d3Lh9J?R369iLQK-2?Cb44S&C zTF5Gzy7t5;40#of6PON7J9I7B=9I&+oWd>;=JQrFB20P$Aq_T-N2FQ6Ei$>}qp`qz z6h{7$C^Om94s~g(*vk(U4Q{lwWTr#*KvB&-RupgEwYlF6e40u&P1AluO`V1qMK z-!aXlhn98A?T^fb0Bz+b#P@9C9ZYX)}#v?Lw>3vJ@E;l^5t382guRRZbaYC}| zpFaGn|NG>l(!P$<$;JAoAEo&-IU}q|=z`-rS!l&^d&$II3N)EYR0G1Kku7VH{~xGu zYjuIhW5R7{80iC4q=@#|F)&m0GSy#+3YoN^(jt)$L7?qS@|O#`Ug(1FQ54g0GK{b3 zI3=YuzXySg&23ySN)V$B*GODpv&Z$93#8hD~xol?4vVmxJh#}wbOC#Rph@#M7P zJGtms+tQi!wm$f7cI&q6R({=T^w@B;>#;4G7ESAQOyk)3%+IVE7{VMuJI@rcrRWYNCXx|?x@86EKh0XGX*yS@7PbbGhbeo(ewlI=XX!Atn+ z!g*{Js?TFN=NL?lR6B__887PAIikPMS@cK2d%%GvjNOq{)DNghrW)A?}0Ed^O=hU;~BEx84XI&SP$E1 zQ!*UgB$&m$D1 z8+-PR8S%s+(Oyc|ferc%?CEnKc;&twB1XN5cP=xPC4ERadTng1kcbrnOHq;U490LW z1r}JvU@XcGslNI{vy)R8RmXdKd%KP%^e1?UfI*yg^R{0<`XLWnC-%muMj#4%AqO=3 z^syncP?!D_y)rvy`Zx66?yHg8cyaa_8q&v(^6@5w7n>6eLROgb+j;shG`2fedUUTIZxz_IxWE2}|3_>&kua)*GQt z@7F$!tD!=8O1^_gJCOj94kAlL&J!V1b!J)3OlWa-M;5ke3Z#P&w(n%q53}LM(aStO z#)GBK9o2~MOR?3Zm0D^e;v+&xLEC$`z^A(Do4ULxiueLBq*~~a`HalW44(wX@ZAa- zz2ZIaRSS!&hdC>}g)r)Q)xc;S<2f~jFOy)xgkGd=Hg5QC30B8+bfY>-xBRMstew;v zDIV4q=v`DtS`lAa1~E_L1GE#;-{TQ;D;Es`a$`5D)2$nS0gq>jm)Bfq84 zFN;x42Av;Mdv&^W4qxaX9-rx%+TZyt;k(9DVd?{;w z&As(&YmGe15yozHXOS!ORkHpA9cOSXCZ5$aXKI?)46f99`en_vO9KxM%jVXMxfR-t zMWgIGmaz;fmO%ClG)Wr*Fxgez=TdKyeJn4tyfZxa`e1dK5>G qoOf$l@JPlnsyIgFyj!!_KQiAle`vjLU1Y!YGw9qFxu%(+`u_*!xLjla literal 0 HcmV?d00001 diff --git a/musictail_mcp.py b/musictail_mcp.py index cf92807..e183663 100644 --- a/musictail_mcp.py +++ b/musictail_mcp.py @@ -32,10 +32,10 @@ def get_spotify_client() -> spotipy.Spotify: auth_manager = SpotifyOAuth( client_id=os.environ.get("SPOTIFY_CLIENT_ID"), client_secret=os.environ.get("SPOTIFY_CLIENT_SECRET"), - redirect_uri="http://127.0.0.1:8889/callback", + redirect_uri="http://127.0.0.1:8888/callback", scope=SCOPES, cache_path=cache_path, - open_browser=True + open_browser=False ) return spotipy.Spotify(auth_manager=auth_manager) @@ -301,11 +301,32 @@ if __name__ == "__main__": import sys if "--auth" in sys.argv: print("šŸŽµ MusicTail — First-time authorization") - print("A browser window will open for Spotify login...") - sp = get_spotify_client() - user = sp.current_user() - print(f"āœ… Authorized as: {user['display_name']} ({user['id']})") - print(f"Token cached at: ~/.musictail_cache") - print("MusicTail is ready! 🦊") + print() + cache_path = os.path.expanduser("~/.musictail_cache") + auth_manager = SpotifyOAuth( + client_id=os.environ.get("SPOTIFY_CLIENT_ID"), + client_secret=os.environ.get("SPOTIFY_CLIENT_SECRET"), + redirect_uri="http://127.0.0.1:8888/callback", + scope=SCOPES, + cache_path=cache_path, + open_browser=False + ) + # Get the auth URL + auth_url = auth_manager.get_authorize_url() + print(f"Open this URL in your browser:\n{auth_url}\n") + print("After authorizing, you'll be redirected to a URL.") + print("Paste the FULL redirect URL here (it will start with http://127.0.0.1:8888/callback?code=...):") + response_url = input("> ").strip() + code = auth_manager.parse_response_code(response_url) + token_info = auth_manager.get_access_token(code) + + if token_info: + sp = spotipy.Spotify(auth_manager=auth_manager) + user = sp.current_user() + print(f"\nāœ… Authorized as: {user['display_name']} ({user['id']})") + print(f"Token cached at: {cache_path}") + print("MusicTail is ready! 🦊") + else: + print("āŒ Authorization failed. Check your credentials.") else: mcp.run() \ No newline at end of file